From c000e008dd9adacca999e30e6f0513f4b9e5eed2 Mon Sep 17 00:00:00 2001 From: Arun Baskaran Date: Wed, 1 Apr 2020 17:39:37 -0400 Subject: [PATCH 1/7] Added mmsp2csv and mmsp2txt --- utility/Makefile | 8 + utility/mmsp2csv.cpp | 672 +++++++++++++++++++++++++++++++++++++++++++ utility/mmsp2txt.cpp | 672 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1352 insertions(+) create mode 100644 utility/mmsp2csv.cpp create mode 100644 utility/mmsp2txt.cpp diff --git a/utility/Makefile b/utility/Makefile index 05040c5..31f36e5 100644 --- a/utility/Makefile +++ b/utility/Makefile @@ -37,6 +37,14 @@ mmsp2pvd : mmsp2pvd.cpp ../include/MMSP.output.h mmsp2tsv : mmsp2tsv.cpp $(compiler) $(flags) $< -o $@ -lz +# convert MMSP grid file to comma-delimited ASCII (CSV) file type +mmsp2csv : mmsp2csv.cpp + $(compiler) $(flags) $< -o $@ -lz + +# convert MMSP grid file to comma-delimited ASCII (TXT) file type +mmsp2txt : mmsp2txt.cpp + $(compiler) $(flags) $< -o $@ -lz + # convert MMSP grid file to compressed VTK Image file type mmsp2vti : mmsp2vti.cpp ../include/MMSP.output.h $(compiler) $(vtkflags) $< -o $@ $(VTK_LNK) -lz diff --git a/utility/mmsp2csv.cpp b/utility/mmsp2csv.cpp new file mode 100644 index 0000000..4046660 --- /dev/null +++ b/utility/mmsp2csv.cpp @@ -0,0 +1,672 @@ +// mmsp2csv.cpp +// Convert MMSP grid data to comma-delimited ASCII format (CSV) +// Questions/comments to trevor.keller@gmail.com (Trevor Keller) + +#include +#include +#include +#include +#include +#include +#include +#include + +#include"MMSP.hpp" + +template void convert_scalars(const MMSP::grid& GRID, std::ofstream& csvfil); + +template void convert_vectors(const MMSP::grid >& GRID, std::ofstream& csvfil); + +template void convert_sparses(const MMSP::grid >& GRID, std::ofstream& csvfil); + +int main(int argc, char* argv[]) +{ + // command line error check + if (argc < 2) { + std::cout << "Usage: " << argv[0] << " [--help] --contour=n,a[,b,...] [--normal] [--mag|--field|--exclude] infile [outfile]\n"; + std::exit(-1); + } + + // help diagnostic + if (std::string(argv[1]) == "--help") { + std::cout << argv[0] << ": convert MMSP grid data to comma-delimited ASCII (CSV) format.\n"; + std::cout << "Usage: " << argv[0] << " [--help] infile [outfile]\n\n"; + std::cout << "Examples: " << argv[0] << " --help\n" + << " displays this message.\n"; + std::cout << " " << argv[0] << " input.dat\n" + << " converts grid data from input.dat into input.csv.\n"; + std::cout << "Questions/comments to trevor.keller@gmail.com (Trevor Keller).\n"; + std::exit(0); + } + + // file open error check + std::ifstream input(argv[1]); + if (!input) { + std::cerr << "File input error: could not open " << argv[1] << ".\n"; + exit(-1); + } + + // read data type + std::string type; + getline(input, type, '\n'); + + // grid type error check + if (type.substr(0, 4) != "grid") { + std::cerr << "File input error: file does not contain grid data." << std::endl; + exit(-1); + } + + // parse data type + bool bool_type = (type.find("bool") != std::string::npos); + bool char_type = (type.find("char") != std::string::npos); + bool unsigned_char_type = (type.find("unsigned char") != std::string::npos); + bool int_type = (type.find("int") != std::string::npos); + bool unsigned_int_type = (type.find("unsigned int") != std::string::npos); + bool long_type = (type.find("long") != std::string::npos); + bool unsigned_long_type = (type.find("unsigned long") != std::string::npos); + bool short_type = (type.find("short") != std::string::npos); + bool unsigned_short_type = (type.find("unsigned short") != std::string::npos); + bool float_type = (type.find("float") != std::string::npos); + bool double_type = (type.find("double") != std::string::npos); + bool long_double_type = (type.find("long double") != std::string::npos); + + bool scalar_type = (type.find("scalar") != std::string::npos); + bool vector_type = (type.find("vector") != std::string::npos); + bool sparse_type = (type.find("sparse") != std::string::npos); + + if (not bool_type and + not char_type and not unsigned_char_type and + not int_type and not unsigned_int_type and + not long_type and not unsigned_long_type and + not short_type and not unsigned_short_type and + not float_type and + not double_type and not long_double_type) { + std::cerr << "File input error: unknown grid data type." << std::endl; + exit(-1); + } + + // generate output file name + std::stringstream csvname; + if (argc==2) { + std::string datname(argv[1]); + int extpos = datname.find_last_of("."); + if (datname.find_first_of("0123456789",extpos) != std::string::npos) + csvname << datname << ".csv"; + else + csvname << datname.substr(0, extpos) << ".csv"; + } else + csvname << argv[2]; + + // Open output file + std::ofstream csvfil(csvname.str().c_str()); + + // read grid dimension + int dim; + input >> dim; + if (dim < 1 or dim > 3) { + std::cerr << "File input error: grid dimension must be 1, 2, or 3." << std::endl; + exit(-1); + } + + // read number of fields + int fields; + input >> fields; + + // read grid sizes + int x0[3] = {0, 0, 0}; + int x1[3] = {0, 0, 0}; + for (int d=0; d> x0[d] >> x1[d]; + + // read cell spacing + float dx[3] = {1.0, 1.0, 1.0}; + for (int d=0; d> dx[d]; + + // ignore trailing endlines + input.ignore(10, '\n'); + + // write grid data + if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + } + + else if (vector_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + } + + else if (sparse_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + } + + return 0; +} + +template void convert_scalars(const MMSP::grid& GRID, std::ofstream& csvfil) +{ + if (dim==1) { + for (int n=0; n x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d void convert_vectors(const MMSP::grid >& GRID, std::ofstream& csvfil) +{ + + if (dim==1) { + for (int n=0; n x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d void convert_sparses(const MMSP::grid >& GRID, std::ofstream& csvfil) +{ + if (dim==1) { + for (int n=0; n x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d +#include +#include +#include +#include +#include +#include +#include + +#include"MMSP.hpp" + +template void convert_scalars(const MMSP::grid& GRID, std::ofstream& txtfil); + +template void convert_vectors(const MMSP::grid >& GRID, std::ofstream& txtfil); + +template void convert_sparses(const MMSP::grid >& GRID, std::ofstream& txtfil); + +int main(int argc, char* argv[]) +{ + // command line error check + if (argc < 2) { + std::cout << "Usage: " << argv[0] << " [--help] --contour=n,a[,b,...] [--normal] [--mag|--field|--exclude] infile [outfile]\n"; + std::exit(-1); + } + + // help diagnostic + if (std::string(argv[1]) == "--help") { + std::cout << argv[0] << ": convert MMSP grid data to comma-delimited ASCII (txt) format.\n"; + std::cout << "Usage: " << argv[0] << " [--help] infile [outfile]\n\n"; + std::cout << "Examples: " << argv[0] << " --help\n" + << " displays this message.\n"; + std::cout << " " << argv[0] << " input.dat\n" + << " converts grid data from input.dat into input.txt.\n"; + std::cout << "Questions/comments to trevor.keller@gmail.com (Trevor Keller).\n"; + std::exit(0); + } + + // file open error check + std::ifstream input(argv[1]); + if (!input) { + std::cerr << "File input error: could not open " << argv[1] << ".\n"; + exit(-1); + } + + // read data type + std::string type; + getline(input, type, '\n'); + + // grid type error check + if (type.substr(0, 4) != "grid") { + std::cerr << "File input error: file does not contain grid data." << std::endl; + exit(-1); + } + + // parse data type + bool bool_type = (type.find("bool") != std::string::npos); + bool char_type = (type.find("char") != std::string::npos); + bool unsigned_char_type = (type.find("unsigned char") != std::string::npos); + bool int_type = (type.find("int") != std::string::npos); + bool unsigned_int_type = (type.find("unsigned int") != std::string::npos); + bool long_type = (type.find("long") != std::string::npos); + bool unsigned_long_type = (type.find("unsigned long") != std::string::npos); + bool short_type = (type.find("short") != std::string::npos); + bool unsigned_short_type = (type.find("unsigned short") != std::string::npos); + bool float_type = (type.find("float") != std::string::npos); + bool double_type = (type.find("double") != std::string::npos); + bool long_double_type = (type.find("long double") != std::string::npos); + + bool scalar_type = (type.find("scalar") != std::string::npos); + bool vector_type = (type.find("vector") != std::string::npos); + bool sparse_type = (type.find("sparse") != std::string::npos); + + if (not bool_type and + not char_type and not unsigned_char_type and + not int_type and not unsigned_int_type and + not long_type and not unsigned_long_type and + not short_type and not unsigned_short_type and + not float_type and + not double_type and not long_double_type) { + std::cerr << "File input error: unknown grid data type." << std::endl; + exit(-1); + } + + // generate output file name + std::stringstream txtname; + if (argc==2) { + std::string datname(argv[1]); + int extpos = datname.find_last_of("."); + if (datname.find_first_of("0123456789",extpos) != std::string::npos) + txtname << datname << ".txt"; + else + txtname << datname.substr(0, extpos) << ".txt"; + } else + txtname << argv[2]; + + // Open output file + std::ofstream txtfil(txtname.str().c_str()); + + // read grid dimension + int dim; + input >> dim; + if (dim < 1 or dim > 3) { + std::cerr << "File input error: grid dimension must be 1, 2, or 3." << std::endl; + exit(-1); + } + + // read number of fields + int fields; + input >> fields; + + // read grid sizes + int x0[3] = {0, 0, 0}; + int x1[3] = {0, 0, 0}; + for (int d=0; d> x0[d] >> x1[d]; + + // read cell spacing + float dx[3] = {1.0, 1.0, 1.0}; + for (int d=0; d> dx[d]; + + // ignore trailing endlines + input.ignore(10, '\n'); + + // write grid data + if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,bool> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,bool> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,bool> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,unsigned char> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,unsigned char> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,unsigned char> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,char> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,char> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,char> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,unsigned int> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,unsigned int> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,unsigned int> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,int> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,int> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,int> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,unsigned long> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,unsigned long> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,unsigned long> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,long> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,long> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,long> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,unsigned short> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,unsigned short> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,unsigned short> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,short> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,short> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,short> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,float> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,float> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,float> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,long double> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,long double> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,long double> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,double> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,double> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,double> GRID(argv[1]); + convert_scalars(GRID, txtfil); + } + } + } + + else if (vector_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, txtfil); + } + } + } + + else if (sparse_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, txtfil); + } + } + } + + return 0; +} + +template void convert_scalars(const MMSP::grid& GRID, std::ofstream& txtfil) +{ + if (dim==1) { + for (int n=0; n x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d void convert_vectors(const MMSP::grid >& GRID, std::ofstream& txtfil) +{ + + if (dim==1) { + for (int n=0; n x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d void convert_sparses(const MMSP::grid >& GRID, std::ofstream& txtfil) +{ + if (dim==1) { + for (int n=0; n x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d x=MMSP::position(GRID,n); + txtfil << dx(GRID,0)*x[0]; + for (int d=1; d Date: Sat, 22 Aug 2020 11:14:05 -0400 Subject: [PATCH 2/7] Fixed the extra indentation on the file --- utility/mmsp2csv.cpp | 935 +++++++++++++++++++++++-------------------- 1 file changed, 503 insertions(+), 432 deletions(-) diff --git a/utility/mmsp2csv.cpp b/utility/mmsp2csv.cpp index 4046660..ab9ca29 100644 --- a/utility/mmsp2csv.cpp +++ b/utility/mmsp2csv.cpp @@ -127,446 +127,517 @@ int main(int argc, char* argv[]) input.ignore(10, '\n'); // write grid data - if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,bool> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,bool> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,bool> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,unsigned char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,unsigned int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,unsigned long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,unsigned short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,float> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,float> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,float> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,long double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,long double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,long double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } + if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); } } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + } - else if (vector_type) { - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } + else if (vector_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); } } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + } - else if (sparse_type) { - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } + else if (sparse_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); } } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + } return 0; } From 83707ee2879836abfff9f3c0ccc5522bb0ca365f Mon Sep 17 00:00:00 2001 From: ArunBaskaran Date: Sat, 22 Aug 2020 11:15:52 -0400 Subject: [PATCH 3/7] Fixed stray newline --- utility/mmsp2csv.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/utility/mmsp2csv.cpp b/utility/mmsp2csv.cpp index ab9ca29..9fb9496 100644 --- a/utility/mmsp2csv.cpp +++ b/utility/mmsp2csv.cpp @@ -673,7 +673,6 @@ template void convert_scalars(const MMSP::grid& GRI template void convert_vectors(const MMSP::grid >& GRID, std::ofstream& csvfil) { - if (dim==1) { for (int n=0; n x=MMSP::position(GRID,n); From 92b19d46082e280a7d729aea5519787842fd056a Mon Sep 17 00:00:00 2001 From: ArunBaskaran Date: Sat, 22 Aug 2020 11:27:47 -0400 Subject: [PATCH 4/7] Updated the contact list --- utility/mmsp2csv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utility/mmsp2csv.cpp b/utility/mmsp2csv.cpp index 9fb9496..e7e40ad 100644 --- a/utility/mmsp2csv.cpp +++ b/utility/mmsp2csv.cpp @@ -1,6 +1,6 @@ // mmsp2csv.cpp // Convert MMSP grid data to comma-delimited ASCII format (CSV) -// Questions/comments to trevor.keller@gmail.com (Trevor Keller) +// Questions/comments to trevor.keller@gmail.com (Trevor Keller) and arupad@gmail.com (Arun Baskaran) #include #include From b113d08ab13355692e20199c4453e4cfe235a8d7 Mon Sep 17 00:00:00 2001 From: ArunBaskaran Date: Sat, 22 Aug 2020 11:40:33 -0400 Subject: [PATCH 5/7] Removed the extraneous "dim==x" blocks --- utility/mmsp2csv.cpp | 112 ++++++++++--------------------------------- 1 file changed, 25 insertions(+), 87 deletions(-) diff --git a/utility/mmsp2csv.cpp b/utility/mmsp2csv.cpp index e7e40ad..9eaf8ac 100644 --- a/utility/mmsp2csv.cpp +++ b/utility/mmsp2csv.cpp @@ -644,99 +644,37 @@ int main(int argc, char* argv[]) template void convert_scalars(const MMSP::grid& GRID, std::ofstream& csvfil) { - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d void convert_vectors(const MMSP::grid >& GRID, std::ofstream& csvfil) { - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d void convert_sparses(const MMSP::grid >& GRID, std::ofstream& csvfil) { - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d Date: Sat, 22 Aug 2020 22:55:17 -0400 Subject: [PATCH 6/7] Removed mmsp2txt because of redundancy issues --- utility/mmsp2txt.cpp | 672 ------------------------------------------- 1 file changed, 672 deletions(-) delete mode 100644 utility/mmsp2txt.cpp diff --git a/utility/mmsp2txt.cpp b/utility/mmsp2txt.cpp deleted file mode 100644 index 7f99bbc..0000000 --- a/utility/mmsp2txt.cpp +++ /dev/null @@ -1,672 +0,0 @@ -// mmsp2txt.cpp -// Convert MMSP grid data to comma-delimited ASCII format (TXT) -// Questions/comments to trevor.keller@gmail.com (Trevor Keller) - -#include -#include -#include -#include -#include -#include -#include -#include - -#include"MMSP.hpp" - -template void convert_scalars(const MMSP::grid& GRID, std::ofstream& txtfil); - -template void convert_vectors(const MMSP::grid >& GRID, std::ofstream& txtfil); - -template void convert_sparses(const MMSP::grid >& GRID, std::ofstream& txtfil); - -int main(int argc, char* argv[]) -{ - // command line error check - if (argc < 2) { - std::cout << "Usage: " << argv[0] << " [--help] --contour=n,a[,b,...] [--normal] [--mag|--field|--exclude] infile [outfile]\n"; - std::exit(-1); - } - - // help diagnostic - if (std::string(argv[1]) == "--help") { - std::cout << argv[0] << ": convert MMSP grid data to comma-delimited ASCII (txt) format.\n"; - std::cout << "Usage: " << argv[0] << " [--help] infile [outfile]\n\n"; - std::cout << "Examples: " << argv[0] << " --help\n" - << " displays this message.\n"; - std::cout << " " << argv[0] << " input.dat\n" - << " converts grid data from input.dat into input.txt.\n"; - std::cout << "Questions/comments to trevor.keller@gmail.com (Trevor Keller).\n"; - std::exit(0); - } - - // file open error check - std::ifstream input(argv[1]); - if (!input) { - std::cerr << "File input error: could not open " << argv[1] << ".\n"; - exit(-1); - } - - // read data type - std::string type; - getline(input, type, '\n'); - - // grid type error check - if (type.substr(0, 4) != "grid") { - std::cerr << "File input error: file does not contain grid data." << std::endl; - exit(-1); - } - - // parse data type - bool bool_type = (type.find("bool") != std::string::npos); - bool char_type = (type.find("char") != std::string::npos); - bool unsigned_char_type = (type.find("unsigned char") != std::string::npos); - bool int_type = (type.find("int") != std::string::npos); - bool unsigned_int_type = (type.find("unsigned int") != std::string::npos); - bool long_type = (type.find("long") != std::string::npos); - bool unsigned_long_type = (type.find("unsigned long") != std::string::npos); - bool short_type = (type.find("short") != std::string::npos); - bool unsigned_short_type = (type.find("unsigned short") != std::string::npos); - bool float_type = (type.find("float") != std::string::npos); - bool double_type = (type.find("double") != std::string::npos); - bool long_double_type = (type.find("long double") != std::string::npos); - - bool scalar_type = (type.find("scalar") != std::string::npos); - bool vector_type = (type.find("vector") != std::string::npos); - bool sparse_type = (type.find("sparse") != std::string::npos); - - if (not bool_type and - not char_type and not unsigned_char_type and - not int_type and not unsigned_int_type and - not long_type and not unsigned_long_type and - not short_type and not unsigned_short_type and - not float_type and - not double_type and not long_double_type) { - std::cerr << "File input error: unknown grid data type." << std::endl; - exit(-1); - } - - // generate output file name - std::stringstream txtname; - if (argc==2) { - std::string datname(argv[1]); - int extpos = datname.find_last_of("."); - if (datname.find_first_of("0123456789",extpos) != std::string::npos) - txtname << datname << ".txt"; - else - txtname << datname.substr(0, extpos) << ".txt"; - } else - txtname << argv[2]; - - // Open output file - std::ofstream txtfil(txtname.str().c_str()); - - // read grid dimension - int dim; - input >> dim; - if (dim < 1 or dim > 3) { - std::cerr << "File input error: grid dimension must be 1, 2, or 3." << std::endl; - exit(-1); - } - - // read number of fields - int fields; - input >> fields; - - // read grid sizes - int x0[3] = {0, 0, 0}; - int x1[3] = {0, 0, 0}; - for (int d=0; d> x0[d] >> x1[d]; - - // read cell spacing - float dx[3] = {1.0, 1.0, 1.0}; - for (int d=0; d> dx[d]; - - // ignore trailing endlines - input.ignore(10, '\n'); - - // write grid data - if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,bool> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,bool> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,bool> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,unsigned char> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned char> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned char> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,char> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,char> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,char> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,unsigned int> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned int> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned int> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,int> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,int> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,int> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,unsigned long> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned long> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned long> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,long> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,long> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,long> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,unsigned short> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned short> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned short> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,short> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,short> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,short> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,float> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,float> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,float> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,long double> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,long double> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,long double> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,double> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,double> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,double> GRID(argv[1]); - convert_scalars(GRID, txtfil); - } - } - } - - else if (vector_type) { - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, txtfil); - } - } - } - - else if (sparse_type) { - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, txtfil); - } - } - } - - return 0; -} - -template void convert_scalars(const MMSP::grid& GRID, std::ofstream& txtfil) -{ - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d void convert_vectors(const MMSP::grid >& GRID, std::ofstream& txtfil) -{ - - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d void convert_sparses(const MMSP::grid >& GRID, std::ofstream& txtfil) -{ - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - txtfil << dx(GRID,0)*x[0]; - for (int d=1; d Date: Fri, 9 Oct 2020 00:04:53 -0400 Subject: [PATCH 7/7] Adding examples for nucleation and fftw integration --- examples/Integration_with_fftw/Array.h | 1649 +++++++++++ examples/Integration_with_fftw/Makefile | 69 + examples/Integration_with_fftw/Thermo.hpp | 206 ++ .../Integration_with_fftw/definitions_v2.hpp | 366 +++ .../fftw/.libs/libfftw3.so.3 | 1 + .../fftw/.libs/libfftw3.so.3.5.8 | Bin 0 -> 1148280 bytes examples/Integration_with_fftw/fftw/Array.cc | 91 + examples/Integration_with_fftw/fftw/Array.h | 1652 +++++++++++ examples/Integration_with_fftw/fftw/align.h | 123 + .../fftw/api/.deps/apiplan.Plo | 153 + .../fftw/api/.deps/configure.Plo | 160 ++ .../fftw/api/.deps/execute-dft-c2r.Plo | 153 + .../fftw/api/.deps/execute-dft-r2c.Plo | 153 + .../fftw/api/.deps/execute-dft.Plo | 157 ++ .../fftw/api/.deps/execute-r2r.Plo | 153 + .../fftw/api/.deps/execute-split-dft-c2r.Plo | 154 + .../fftw/api/.deps/execute-split-dft-r2c.Plo | 154 + .../fftw/api/.deps/execute-split-dft.Plo | 157 ++ .../fftw/api/.deps/execute.Plo | 153 + .../fftw/api/.deps/export-wisdom-to-file.Plo | 154 + .../api/.deps/export-wisdom-to-string.Plo | 154 + .../fftw/api/.deps/export-wisdom.Plo | 153 + .../fftw/api/.deps/f77api.Plo | 162 ++ .../fftw/api/.deps/flops.Plo | 153 + .../fftw/api/.deps/forget-wisdom.Plo | 153 + .../fftw/api/.deps/import-system-wisdom.Plo | 154 + .../api/.deps/import-wisdom-from-file.Plo | 154 + .../api/.deps/import-wisdom-from-string.Plo | 154 + .../fftw/api/.deps/import-wisdom.Plo | 153 + .../fftw/api/.deps/malloc.Plo | 153 + .../fftw/api/.deps/map-r2r-kind.Plo | 153 + .../fftw/api/.deps/mapflags.Plo | 180 ++ .../fftw/api/.deps/mkprinter-file.Plo | 153 + .../fftw/api/.deps/mkprinter-str.Plo | 153 + .../fftw/api/.deps/mktensor-iodims.Plo | 158 ++ .../fftw/api/.deps/mktensor-iodims64.Plo | 158 ++ .../fftw/api/.deps/mktensor-rowmajor.Plo | 153 + .../fftw/api/.deps/plan-dft-1d.Plo | 157 ++ .../fftw/api/.deps/plan-dft-2d.Plo | 157 ++ .../fftw/api/.deps/plan-dft-3d.Plo | 157 ++ .../fftw/api/.deps/plan-dft-c2r-1d.Plo | 153 + .../fftw/api/.deps/plan-dft-c2r-2d.Plo | 153 + .../fftw/api/.deps/plan-dft-c2r-3d.Plo | 153 + .../fftw/api/.deps/plan-dft-c2r.Plo | 153 + .../fftw/api/.deps/plan-dft-r2c-1d.Plo | 153 + .../fftw/api/.deps/plan-dft-r2c-2d.Plo | 153 + .../fftw/api/.deps/plan-dft-r2c-3d.Plo | 153 + .../fftw/api/.deps/plan-dft-r2c.Plo | 153 + .../fftw/api/.deps/plan-dft.Plo | 153 + .../fftw/api/.deps/plan-guru-dft-c2r.Plo | 158 ++ .../fftw/api/.deps/plan-guru-dft-r2c.Plo | 158 ++ .../fftw/api/.deps/plan-guru-dft.Plo | 162 ++ .../fftw/api/.deps/plan-guru-r2r.Plo | 158 ++ .../api/.deps/plan-guru-split-dft-c2r.Plo | 158 ++ .../api/.deps/plan-guru-split-dft-r2c.Plo | 158 ++ .../fftw/api/.deps/plan-guru-split-dft.Plo | 162 ++ .../fftw/api/.deps/plan-guru64-dft-c2r.Plo | 158 ++ .../fftw/api/.deps/plan-guru64-dft-r2c.Plo | 158 ++ .../fftw/api/.deps/plan-guru64-dft.Plo | 162 ++ .../fftw/api/.deps/plan-guru64-r2r.Plo | 158 ++ .../api/.deps/plan-guru64-split-dft-c2r.Plo | 158 ++ .../api/.deps/plan-guru64-split-dft-r2c.Plo | 158 ++ .../fftw/api/.deps/plan-guru64-split-dft.Plo | 162 ++ .../fftw/api/.deps/plan-many-dft-c2r.Plo | 153 + .../fftw/api/.deps/plan-many-dft-r2c.Plo | 153 + .../fftw/api/.deps/plan-many-dft.Plo | 157 ++ .../fftw/api/.deps/plan-many-r2r.Plo | 153 + .../fftw/api/.deps/plan-r2r-1d.Plo | 153 + .../fftw/api/.deps/plan-r2r-2d.Plo | 153 + .../fftw/api/.deps/plan-r2r-3d.Plo | 153 + .../fftw/api/.deps/plan-r2r.Plo | 153 + .../fftw/api/.deps/print-plan.Plo | 153 + .../fftw/api/.deps/rdft2-pad.Plo | 166 ++ .../fftw/api/.deps/the-planner.Plo | 153 + .../fftw/api/.deps/version.Plo | 153 + .../Integration_with_fftw/fftw/api/Makefile | 846 ++++++ .../fftw/api/Makefile.am | 59 + .../fftw/api/Makefile.in | 846 ++++++ examples/Integration_with_fftw/fftw/api/api.h | 117 + .../Integration_with_fftw/fftw/api/apiplan.c | 198 ++ .../fftw/api/configure.c | 31 + .../fftw/api/execute-dft-c2r.c | 30 + .../fftw/api/execute-dft-r2c.c | 30 + .../fftw/api/execute-dft.c | 32 + .../fftw/api/execute-r2r.c | 29 + .../fftw/api/execute-split-dft-c2r.c | 30 + .../fftw/api/execute-split-dft-r2c.c | 30 + .../fftw/api/execute-split-dft.c | 29 + .../Integration_with_fftw/fftw/api/execute.c | 27 + .../fftw/api/export-wisdom-to-file.c | 40 + .../fftw/api/export-wisdom-to-string.c | 42 + .../fftw/api/export-wisdom.c | 44 + .../Integration_with_fftw/fftw/api/f03api.sh | 42 + .../Integration_with_fftw/fftw/api/f77api.c | 161 ++ .../Integration_with_fftw/fftw/api/f77funcs.h | 458 +++ .../Integration_with_fftw/fftw/api/fftw3.f | 72 + .../Integration_with_fftw/fftw/api/fftw3.f03 | 1254 +++++++++ .../fftw/api/fftw3.f03.in | 1252 +++++++++ .../Integration_with_fftw/fftw/api/fftw3.h | 514 ++++ .../Integration_with_fftw/fftw/api/fftw3l.f03 | 609 ++++ .../Integration_with_fftw/fftw/api/fftw3q.f03 | 609 ++++ .../Integration_with_fftw/fftw/api/flops.c | 43 + .../fftw/api/forget-wisdom.c | 27 + .../Integration_with_fftw/fftw/api/genf03.pl | 213 ++ .../Integration_with_fftw/fftw/api/guru.h | 4 + .../Integration_with_fftw/fftw/api/guru64.h | 4 + .../fftw/api/import-system-wisdom.c | 53 + .../fftw/api/import-wisdom-from-file.c | 81 + .../fftw/api/import-wisdom-from-string.c | 50 + .../fftw/api/import-wisdom.c | 46 + .../Integration_with_fftw/fftw/api/malloc.c | 50 + .../fftw/api/map-r2r-kind.c | 50 + .../Integration_with_fftw/fftw/api/mapflags.c | 166 ++ .../fftw/api/mkprinter-file.c | 59 + .../fftw/api/mkprinter-str.c | 61 + .../fftw/api/mktensor-iodims.c | 2 + .../fftw/api/mktensor-iodims.h | 62 + .../fftw/api/mktensor-iodims64.c | 2 + .../fftw/api/mktensor-rowmajor.c | 61 + .../fftw/api/plan-dft-1d.c | 27 + .../fftw/api/plan-dft-2d.c | 30 + .../fftw/api/plan-dft-3d.c | 32 + .../fftw/api/plan-dft-c2r-1d.c | 26 + .../fftw/api/plan-dft-c2r-2d.c | 29 + .../fftw/api/plan-dft-c2r-3d.c | 31 + .../fftw/api/plan-dft-c2r.c | 27 + .../fftw/api/plan-dft-r2c-1d.c | 26 + .../fftw/api/plan-dft-r2c-2d.c | 29 + .../fftw/api/plan-dft-r2c-3d.c | 31 + .../fftw/api/plan-dft-r2c.c | 29 + .../Integration_with_fftw/fftw/api/plan-dft.c | 30 + .../fftw/api/plan-guru-dft-c2r.c | 2 + .../fftw/api/plan-guru-dft-c2r.h | 44 + .../fftw/api/plan-guru-dft-r2c.c | 2 + .../fftw/api/plan-guru-dft-r2c.h | 43 + .../fftw/api/plan-guru-dft.c | 2 + .../fftw/api/plan-guru-dft.h | 44 + .../fftw/api/plan-guru-r2r.c | 2 + .../fftw/api/plan-guru-r2r.h | 45 + .../fftw/api/plan-guru-split-dft-c2r.c | 2 + .../fftw/api/plan-guru-split-dft-c2r.h | 40 + .../fftw/api/plan-guru-split-dft-r2c.c | 2 + .../fftw/api/plan-guru-split-dft-r2c.h | 39 + .../fftw/api/plan-guru-split-dft.c | 2 + .../fftw/api/plan-guru-split-dft.h | 39 + .../fftw/api/plan-guru64-dft-c2r.c | 2 + .../fftw/api/plan-guru64-dft-r2c.c | 2 + .../fftw/api/plan-guru64-dft.c | 2 + .../fftw/api/plan-guru64-r2r.c | 2 + .../fftw/api/plan-guru64-split-dft-c2r.c | 2 + .../fftw/api/plan-guru64-split-dft-r2c.c | 2 + .../fftw/api/plan-guru64-split-dft.c | 2 + .../fftw/api/plan-many-dft-c2r.c | 59 + .../fftw/api/plan-many-dft-r2c.c | 57 + .../fftw/api/plan-many-dft.c | 51 + .../fftw/api/plan-many-r2r.c | 50 + .../fftw/api/plan-r2r-1d.c | 26 + .../fftw/api/plan-r2r-2d.c | 33 + .../fftw/api/plan-r2r-3d.c | 36 + .../Integration_with_fftw/fftw/api/plan-r2r.c | 28 + .../fftw/api/print-plan.c | 53 + .../fftw/api/rdft2-pad.c | 39 + .../fftw/api/the-planner.c | 49 + .../Integration_with_fftw/fftw/api/version.c | 88 + examples/Integration_with_fftw/fftw/api/x77.h | 69 + examples/Integration_with_fftw/fftw/fftw++.cc | 75 + examples/Integration_with_fftw/fftw/fftw++.h | 1551 ++++++++++ examples/Integration_with_fftw/fftw/seconds.h | 100 + .../Integration_with_fftw/fftw/statistics.h | 49 + examples/Integration_with_fftw/main.cpp | 813 ++++++ .../Integration_with_fftw/strain_modules.hpp | 180 ++ .../Integration_with_fftw/thermo_modules.hpp | 165 ++ examples/Integration_with_fftw/wisdom3.txt | 132 + examples/beginners_diffusion/1stDiffusion | Bin 0 -> 24784 bytes examples/beginners_diffusion/MMSPDiffusion | Bin 0 -> 30624 bytes examples/beginners_diffusion/MMSPDiffusion2D | Bin 0 -> 30568 bytes examples/pfhub_bm8/F.txt | 2 + examples/pfhub_bm8/MMSPNucleation | Bin 0 -> 53704 bytes examples/pfhub_bm8/MMSPNucleation.cpp | 119 + examples/pfhub_bm8/MMSP_for_Beginners.tex | 321 +++ examples/pfhub_bm8/Makefile | 53 + examples/pfhub_bm8/include/MMSP.grid.cpp | 2242 +++++++++++++++ examples/pfhub_bm8/include/MMSP.grid.h | 606 ++++ examples/pfhub_bm8/include/MMSP.hpp | 15 + examples/pfhub_bm8/include/MMSP.main.hpp | 356 +++ examples/pfhub_bm8/include/MMSP.output.cpp | 920 ++++++ examples/pfhub_bm8/include/MMSP.output.h | 51 + examples/pfhub_bm8/include/MMSP.scalar.h | 249 ++ examples/pfhub_bm8/include/MMSP.sparse.cpp | 336 +++ examples/pfhub_bm8/include/MMSP.sparse.h | 287 ++ examples/pfhub_bm8/include/MMSP.utility.cpp | 174 ++ examples/pfhub_bm8/include/MMSP.utility.h | 236 ++ examples/pfhub_bm8/include/MMSP.vector.cpp | 241 ++ examples/pfhub_bm8/include/MMSP.vector.h | 352 +++ examples/pfhub_bm8/output_0.txt | 2500 +++++++++++++++++ examples/pfhub_bm8/output_100.txt | 2500 +++++++++++++++++ examples/pfhubbenchmark-8 | 1 + include/MMSP.grid.cpp | 20 + include/MMSP.grid.h | 2 + utility/mmsp2csv.cpp | 1050 +++---- 200 files changed, 39387 insertions(+), 521 deletions(-) create mode 100644 examples/Integration_with_fftw/Array.h create mode 100644 examples/Integration_with_fftw/Makefile create mode 100644 examples/Integration_with_fftw/Thermo.hpp create mode 100644 examples/Integration_with_fftw/definitions_v2.hpp create mode 120000 examples/Integration_with_fftw/fftw/.libs/libfftw3.so.3 create mode 100755 examples/Integration_with_fftw/fftw/.libs/libfftw3.so.3.5.8 create mode 100644 examples/Integration_with_fftw/fftw/Array.cc create mode 100644 examples/Integration_with_fftw/fftw/Array.h create mode 100644 examples/Integration_with_fftw/fftw/align.h create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/apiplan.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/configure.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/execute-dft-c2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/execute-dft-r2c.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/execute-dft.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/execute-r2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft-c2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft-r2c.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/execute.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/export-wisdom-to-file.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/export-wisdom-to-string.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/export-wisdom.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/f77api.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/flops.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/forget-wisdom.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/import-system-wisdom.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/import-wisdom-from-file.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/import-wisdom-from-string.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/import-wisdom.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/malloc.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/map-r2r-kind.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/mapflags.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/mkprinter-file.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/mkprinter-str.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/mktensor-iodims.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/mktensor-iodims64.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/mktensor-rowmajor.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-1d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-2d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-3d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-1d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-2d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-3d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-1d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-2d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-3d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-dft.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft-c2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft-r2c.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru-r2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft-c2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft-r2c.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft-c2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft-r2c.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-r2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft-c2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft-r2c.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft-c2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft-r2c.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-many-r2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-1d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-2d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-3d.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/plan-r2r.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/print-plan.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/rdft2-pad.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/the-planner.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/.deps/version.Plo create mode 100644 examples/Integration_with_fftw/fftw/api/Makefile create mode 100644 examples/Integration_with_fftw/fftw/api/Makefile.am create mode 100644 examples/Integration_with_fftw/fftw/api/Makefile.in create mode 100644 examples/Integration_with_fftw/fftw/api/api.h create mode 100644 examples/Integration_with_fftw/fftw/api/apiplan.c create mode 100644 examples/Integration_with_fftw/fftw/api/configure.c create mode 100644 examples/Integration_with_fftw/fftw/api/execute-dft-c2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/execute-dft-r2c.c create mode 100644 examples/Integration_with_fftw/fftw/api/execute-dft.c create mode 100644 examples/Integration_with_fftw/fftw/api/execute-r2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/execute-split-dft-c2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/execute-split-dft-r2c.c create mode 100644 examples/Integration_with_fftw/fftw/api/execute-split-dft.c create mode 100644 examples/Integration_with_fftw/fftw/api/execute.c create mode 100644 examples/Integration_with_fftw/fftw/api/export-wisdom-to-file.c create mode 100644 examples/Integration_with_fftw/fftw/api/export-wisdom-to-string.c create mode 100644 examples/Integration_with_fftw/fftw/api/export-wisdom.c create mode 100755 examples/Integration_with_fftw/fftw/api/f03api.sh create mode 100644 examples/Integration_with_fftw/fftw/api/f77api.c create mode 100644 examples/Integration_with_fftw/fftw/api/f77funcs.h create mode 100644 examples/Integration_with_fftw/fftw/api/fftw3.f create mode 100644 examples/Integration_with_fftw/fftw/api/fftw3.f03 create mode 100644 examples/Integration_with_fftw/fftw/api/fftw3.f03.in create mode 100644 examples/Integration_with_fftw/fftw/api/fftw3.h create mode 100644 examples/Integration_with_fftw/fftw/api/fftw3l.f03 create mode 100644 examples/Integration_with_fftw/fftw/api/fftw3q.f03 create mode 100644 examples/Integration_with_fftw/fftw/api/flops.c create mode 100644 examples/Integration_with_fftw/fftw/api/forget-wisdom.c create mode 100755 examples/Integration_with_fftw/fftw/api/genf03.pl create mode 100644 examples/Integration_with_fftw/fftw/api/guru.h create mode 100644 examples/Integration_with_fftw/fftw/api/guru64.h create mode 100644 examples/Integration_with_fftw/fftw/api/import-system-wisdom.c create mode 100644 examples/Integration_with_fftw/fftw/api/import-wisdom-from-file.c create mode 100644 examples/Integration_with_fftw/fftw/api/import-wisdom-from-string.c create mode 100644 examples/Integration_with_fftw/fftw/api/import-wisdom.c create mode 100644 examples/Integration_with_fftw/fftw/api/malloc.c create mode 100644 examples/Integration_with_fftw/fftw/api/map-r2r-kind.c create mode 100644 examples/Integration_with_fftw/fftw/api/mapflags.c create mode 100644 examples/Integration_with_fftw/fftw/api/mkprinter-file.c create mode 100644 examples/Integration_with_fftw/fftw/api/mkprinter-str.c create mode 100644 examples/Integration_with_fftw/fftw/api/mktensor-iodims.c create mode 100644 examples/Integration_with_fftw/fftw/api/mktensor-iodims.h create mode 100644 examples/Integration_with_fftw/fftw/api/mktensor-iodims64.c create mode 100644 examples/Integration_with_fftw/fftw/api/mktensor-rowmajor.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-1d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-2d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-3d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-c2r-1d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-c2r-2d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-c2r-3d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-c2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-r2c-1d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-r2c-2d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-r2c-3d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft-r2c.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-dft.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-dft-c2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-dft-c2r.h create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-dft-r2c.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-dft-r2c.h create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-dft.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-dft.h create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-r2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-r2r.h create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-c2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-c2r.h create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-r2c.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-r2c.h create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-split-dft.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru-split-dft.h create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru64-dft-c2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru64-dft-r2c.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru64-dft.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru64-r2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft-c2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft-r2c.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-many-dft-c2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-many-dft-r2c.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-many-dft.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-many-r2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-r2r-1d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-r2r-2d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-r2r-3d.c create mode 100644 examples/Integration_with_fftw/fftw/api/plan-r2r.c create mode 100644 examples/Integration_with_fftw/fftw/api/print-plan.c create mode 100644 examples/Integration_with_fftw/fftw/api/rdft2-pad.c create mode 100644 examples/Integration_with_fftw/fftw/api/the-planner.c create mode 100644 examples/Integration_with_fftw/fftw/api/version.c create mode 100644 examples/Integration_with_fftw/fftw/api/x77.h create mode 100644 examples/Integration_with_fftw/fftw/fftw++.cc create mode 100644 examples/Integration_with_fftw/fftw/fftw++.h create mode 100644 examples/Integration_with_fftw/fftw/seconds.h create mode 100644 examples/Integration_with_fftw/fftw/statistics.h create mode 100644 examples/Integration_with_fftw/main.cpp create mode 100644 examples/Integration_with_fftw/strain_modules.hpp create mode 100644 examples/Integration_with_fftw/thermo_modules.hpp create mode 100644 examples/Integration_with_fftw/wisdom3.txt create mode 100755 examples/beginners_diffusion/1stDiffusion create mode 100755 examples/beginners_diffusion/MMSPDiffusion create mode 100755 examples/beginners_diffusion/MMSPDiffusion2D create mode 100644 examples/pfhub_bm8/F.txt create mode 100755 examples/pfhub_bm8/MMSPNucleation create mode 100644 examples/pfhub_bm8/MMSPNucleation.cpp create mode 100644 examples/pfhub_bm8/MMSP_for_Beginners.tex create mode 100644 examples/pfhub_bm8/Makefile create mode 100644 examples/pfhub_bm8/include/MMSP.grid.cpp create mode 100644 examples/pfhub_bm8/include/MMSP.grid.h create mode 100644 examples/pfhub_bm8/include/MMSP.hpp create mode 100644 examples/pfhub_bm8/include/MMSP.main.hpp create mode 100644 examples/pfhub_bm8/include/MMSP.output.cpp create mode 100644 examples/pfhub_bm8/include/MMSP.output.h create mode 100644 examples/pfhub_bm8/include/MMSP.scalar.h create mode 100644 examples/pfhub_bm8/include/MMSP.sparse.cpp create mode 100644 examples/pfhub_bm8/include/MMSP.sparse.h create mode 100644 examples/pfhub_bm8/include/MMSP.utility.cpp create mode 100644 examples/pfhub_bm8/include/MMSP.utility.h create mode 100644 examples/pfhub_bm8/include/MMSP.vector.cpp create mode 100644 examples/pfhub_bm8/include/MMSP.vector.h create mode 100644 examples/pfhub_bm8/output_0.txt create mode 100644 examples/pfhub_bm8/output_100.txt create mode 160000 examples/pfhubbenchmark-8 diff --git a/examples/Integration_with_fftw/Array.h b/examples/Integration_with_fftw/Array.h new file mode 100644 index 0000000..37997da --- /dev/null +++ b/examples/Integration_with_fftw/Array.h @@ -0,0 +1,1649 @@ +/* Array.h: A high-performance multi-dimensional C++ array class + Copyright (C) 1997-2016 John C. Bowman, University of Alberta + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef __Array_h__ +#define __Array_h__ 1 + +#define __ARRAY_H_VERSION__ 1.55 + +// Defining NDEBUG improves optimization but disables argument checking. +// Defining __NOARRAY2OPT inhibits special optimization of Array2[]. + +#include +#include +#include +#include +#include + +#ifdef NDEBUG +#define __check(i,n,dim,m) +#define __checkSize() +#define __checkEqual(a,b,dim,m) +#define __checkActivate(i,align) this->Activate(align) +#else +#define __check(i,n,dim,m) this->Check(i,n,dim,m) +#define __checkSize() this->CheckSize() +#define __checkEqual(a,b,dim,m) this->CheckEqual(a,b,dim,m) +#define __checkActivate(i,align) this->CheckActivate(i,align) +#ifndef __NOARRAY2OPT +#define __NOARRAY2OPT +#endif +#endif + +#ifndef HAVE_POSIX_MEMALIGN + +#ifdef __GLIBC_PREREQ +#if __GLIBC_PREREQ(2,3) +#define HAVE_POSIX_MEMALIGN +#endif +#else +#ifdef _POSIX_SOURCE +#define HAVE_POSIX_MEMALIGN +#endif +#endif + +#else + +#ifdef _AIX +extern "C" int posix_memalign(void **memptr, size_t alignment, size_t size); +#endif + +#endif + +namespace Array { +inline std::ostream& _newl(std::ostream& s) {s << '\n'; return s;} + +inline void ArrayExit(const char *x); + +#ifndef __ExternalArrayExit +inline void ArrayExit(const char *x) +{ + std::cerr << _newl << "ERROR: " << x << "." << std::endl; + exit(1); +} +#endif + +#ifndef __fftwpp_h__ + +// Adapted from FFTW aligned malloc/free. Assumes that malloc is at least +// sizeof(void*)-aligned. Allocated memory must be freed with free0. +inline int posix_memalign0(void **memptr, size_t alignment, size_t size) +{ + if(alignment % sizeof (void *) != 0 || (alignment & (alignment - 1)) != 0) + return EINVAL; + void *p0=malloc(size+alignment); + if(!p0) return ENOMEM; + void *p=(void *)(((size_t) p0+alignment)&~(alignment-1)); + *((void **) p-1)=p0; + *memptr=p; + return 0; +} + +inline void free0(void *p) +{ + if(p) free(*((void **) p-1)); +} + +template +inline void newAlign(T *&v, size_t len, size_t align) +{ + void *mem=NULL; + const char *invalid="Invalid alignment requested"; + const char *nomem="Memory limits exceeded"; +#ifdef HAVE_POSIX_MEMALIGN + int rc=posix_memalign(&mem,align,len*sizeof(T)); +#else + int rc=posix_memalign0(&mem,align,len*sizeof(T)); +#endif + if(rc == EINVAL) Array::ArrayExit(invalid); + if(rc == ENOMEM) Array::ArrayExit(nomem); + v=(T *) mem; + for(size_t i=0; i < len; i++) new(v+i) T; +} + +template +inline void deleteAlign(T *v, size_t len) +{ + for(size_t i=len-1; i > 0; i--) v[i].~T(); + v[0].~T(); +#ifdef HAVE_POSIX_MEMALIGN + free(v); +#else + free0(v); +#endif +} + +#endif + +template +class array1 { +protected: + T *v; + unsigned int size; + mutable int state; +public: + enum alloc_state {unallocated=0, allocated=1, temporary=2, aligned=4}; + virtual unsigned int Size() const {return size;} + void CheckSize() const { + if(!test(allocated) && size == 0) + ArrayExit("Operation attempted on unallocated array"); + } + void CheckEqual(int a, int b, unsigned int dim, unsigned int m) const { + if(a != b) { + std::ostringstream buf; + buf << "Array" << dim << " index "; + if(m) buf << m << " "; + buf << "is incompatible in assignment (" << a << " != " << b << ")"; + const std::string& s=buf.str(); + ArrayExit(s.c_str()); + } + } + + int test(int flag) const {return state & flag;} + void clear(int flag) const {state &= ~flag;} + void set(int flag) const {state |= flag;} + void Activate(size_t align=0) { + if(align) { + newAlign(v,size,align); + set(allocated | aligned); + } else { + v=new T[size]; + set(allocated); + } + } + void CheckActivate(int dim, size_t align=0) { + Deallocate(); + Activate(align); + } + void Deallocate() const { + if(test(allocated)) { + if(test(aligned)) deleteAlign(v,size); + else delete [] v; + state=unallocated; + } + } + virtual void Dimension(unsigned int nx0) {size=nx0;} + void Dimension(unsigned int nx0, T *v0) { + Dimension(nx0); v=v0; clear(allocated); + } + void Dimension(const array1& A) { + Dimension(A.size,A.v); state=A.test(temporary); + } + + void CheckActivate(size_t align=0) { + __checkActivate(1,align); + } + + void Allocate(unsigned int nx0, size_t align=0) { + Dimension(nx0); + CheckActivate(align); + } + + void Reallocate(unsigned int nx0, size_t align=0) { + Deallocate(); + Allocate(nx0,align); + } + + array1() : v(NULL), size(0), state(unallocated) {} + array1(const void *) : size(0), state(unallocated) {} + array1(unsigned int nx0, size_t align=0) : state(unallocated) { + Allocate(nx0,align); + } + array1(unsigned int nx0, T *v0) : state(unallocated) {Dimension(nx0,v0);} + array1(T *v0) : state(unallocated) {Dimension(INT_MAX,v0);} + array1(const array1& A) : v(A.v), size(A.size), + state(A.test(temporary)) {} + + virtual ~array1() {Deallocate();} + + void Freeze() {state=unallocated;} + void Hold() {if(test(allocated)) {state=temporary;}} + void Purge() const {if(test(temporary)) {Deallocate(); state=unallocated;}} + + virtual void Check(int i, int n, unsigned int dim, unsigned int m, + int o=0) const { + if(i < 0 || i >= n) { + std::ostringstream buf; + buf << "Array" << dim << " index "; + if(m) buf << m << " "; + buf << "is out of bounds (" << i+o; + if(n == 0) buf << " index given to empty array"; + else { + if(i < 0) buf << " < " << o; + else buf << " > " << n+o-1; + } + buf << ")"; + const std::string& s=buf.str(); + ArrayExit(s.c_str()); + } + } + + unsigned int Nx() const {return size;} + +#ifdef NDEBUG + typedef T *opt; +#else + typedef array1 opt; +#endif + + T& operator [] (int ix) const {__check(ix,size,1,1); return v[ix];} + T& operator () (int ix) const {__check(ix,size,1,1); return v[ix];} + T* operator () () const {return v;} + operator T* () const {return v;} + + array1 operator + (int i) const {return array1(size-i,v+i);} + + void Load(T a) const { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i]=a; + } + void Load(const T *a) const { + for(unsigned int i=0; i < size; i++) v[i]=a[i]; + } + void Store(T *a) const { + for(unsigned int i=0; i < size; i++) a[i]=v[i]; + } + void Set(T *a) {v=a; clear(allocated);} + T Min() { + if(size == 0) + ArrayExit("Cannot take minimum of empty array"); + T min=v[0]; + for(unsigned int i=1; i < size; i++) if(v[i] < min) min=v[i]; + return min; + } + T Max() { + if(size == 0) + ArrayExit("Cannot take maximum of empty array"); + T max=v[0]; + for(unsigned int i=1; i < size; i++) if(v[i] > max) max=v[i]; + return max; + } + + std::istream& Input (std::istream &s) const { + __checkSize(); + for(unsigned int i=0; i < size; i++) s >> v[i]; + return s; + } + + array1& operator = (T a) {Load(a); return *this;} + array1& operator = (const T *a) {Load(a); return *this;} + array1& operator = (const array1& A) { + if(size != A.Size()) { + Deallocate(); + Allocate(A.Size()); + } + Load(A()); + A.Purge(); + return *this; + } + + array1& operator += (const array1& A) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] += A(i); + return *this; + } + array1& operator -= (const array1& A) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] -= A(i); + return *this; + } + array1& operator *= (const array1& A) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] *= A(i); + return *this; + } + array1& operator /= (const array1& A) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] /= A(i); + return *this; + } + + array1& operator += (T a) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] += a; + return *this; + } + array1& operator -= (T a) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] -= a; + return *this; + } + array1& operator *= (T a) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] *= a; + return *this; + } + array1& operator /= (T a) { + __checkSize(); + T ainv=1.0/a; + for(unsigned int i=0; i < size; i++) v[i] *= ainv; + return *this; + } + + double L1() const { + __checkSize(); + double norm=0.0; + for(unsigned int i=0; i < size; i++) norm += abs(v[i]); + return norm; + } +#ifdef __ArrayExtensions + double Abs2() const { + __checkSize(); + double norm=0.0; + for(unsigned int i=0; i < size; i++) norm += abs2(v[i]); + return norm; + } + double L2() const { + return sqrt(Abs2()); + } + double LInfinity() const { + __checkSize(); + double norm=0.0; + for(unsigned int i=0; i < size; i++) { + T a=abs(v[i]); + if(a > norm) norm=a; + } + return norm; + } + double LMinusInfinity() const { + __checkSize(); + double norm=DBL_MAX; + for(unsigned int i=0; i < size; i++) { + T a=abs(v[i]); + if(a < norm) norm=a; + } + return norm; + } +#endif +}; + +template +void swaparray(T& A, T& B) +{ + T C; + C.Dimension(A); + A.Dimension(B); + B.Dimension(C); +} + +template +void leftshiftarray(T& A, T& B, T& C) +{ + T D; + D.Dimension(A); + A.Dimension(B); + B.Dimension(C); + C.Dimension(D); +} + +template +void rightshiftarray(T& A, T& B, T& C) +{ + T D; + D.Dimension(C); + C.Dimension(B); + B.Dimension(A); + A.Dimension(D); +} + +template +std::ostream& operator << (std::ostream& s, const array1& A) +{ + T *p=A(); + for(unsigned int i=0; i < A.Nx(); i++) { + s << *(p++) << " "; + } + return s; +} + +template +std::istream& operator >> (std::istream& s, const array1& A) +{ + return A.Input(s); +} + +template +class array2 : public array1 { +protected: + unsigned int nx; + unsigned int ny; +public: + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0) { + nx=nx0; ny=ny0; + this->size=nx*ny; + } + void Dimension(unsigned int nx0, unsigned int ny0, T *v0) { + Dimension(nx0,ny0); + this->v=v0; + this->clear(this->allocated); + } + void Dimension(const array1 &A) {ArrayExit("Operation not implemented");} + + void Allocate(unsigned int nx0, unsigned int ny0, size_t align=0) { + Dimension(nx0,ny0); + __checkActivate(2,align); + } + + array2() : nx(0), ny(0) {} + array2(unsigned int nx0, unsigned int ny0, size_t align=0) { + Allocate(nx0,ny0,align); + } + array2(unsigned int nx0, unsigned int ny0, T *v0) {Dimension(nx0,ny0,v0);} + + unsigned int Nx() const {return nx;} + unsigned int Ny() const {return ny;} + +#ifndef __NOARRAY2OPT + T *operator [] (int ix) const { + return this->v+ix*ny; + } +#else + array1 operator [] (int ix) const { + __check(ix,nx,2,1); + return array1(ny,this->v+ix*ny); + } +#endif + T& operator () (int ix, int iy) const { + __check(ix,nx,2,1); + __check(iy,ny,2,2); + return this->v[ix*ny+iy]; + } + T& operator () (int i) const { + __check(i,this->size,2,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + + array2& operator = (T a) {this->Load(a); return *this;} + array2& operator = (T *a) {this->Load(a); return *this;} + array2& operator = (const array2& A) { + __checkEqual(nx,A.Nx(),2,1); + __checkEqual(ny,A.Ny(),2,2); + this->Load(A()); + A.Purge(); + return *this; + } + + array2& operator += (const array2& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] += A(i); + return *this; + } + array2& operator -= (const array2& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] -= A(i); + return *this; + } + array2& operator *= (const array2& A); + + array2& operator += (T a) { + __checkSize(); + unsigned int inc=ny+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] += a; + return *this; + } + array2& operator -= (T a) { + __checkSize(); + unsigned int inc=ny+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] -= a; + return *this; + } + array2& operator *= (T a) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] *= a; + return *this; + } + + void Identity() { + this->Load((T) 0); + __checkSize(); + unsigned int inc=ny+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i]=(T) 1; + } +}; + +template +std::ostream& operator << (std::ostream& s, const array2& A) +{ + T *p=A(); + for(unsigned int i=0; i < A.Nx(); i++) { + for(unsigned int j=0; j < A.Ny(); j++) { + s << *(p++) << " "; + } + s << _newl; + } + s << std::flush; + return s; +} + +template +std::istream& operator >> (std::istream& s, const array2& A) +{ + return A.Input(s); +} + +template +class array3 : public array1 { +protected: + unsigned int nx; + unsigned int ny; + unsigned int nz; + unsigned int nyz; +public: + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0) { + nx=nx0; ny=ny0; nz=nz0; nyz=ny*nz; + this->size=nx*nyz; + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, T *v0) { + Dimension(nx0,ny0,nz0); + this->v=v0; + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + size_t align=0) { + Dimension(nx0,ny0,nz0); + __checkActivate(3,align); + } + + array3() : nx(0), ny(0), nz(0), nyz(0) {} + array3(unsigned int nx0, unsigned int ny0, unsigned int nz0, + size_t align=0) { + Allocate(nx0,ny0,nz0,align); + } + array3(unsigned int nx0, unsigned int ny0, unsigned int nz0, T *v0) { + Dimension(nx0,ny0,nz0,v0); + } + + unsigned int Nx() const {return nx;} + unsigned int Ny() const {return ny;} + unsigned int Nz() const {return nz;} + + array2 operator [] (int ix) const { + __check(ix,nx,3,1); + return array2(ny,nz,this->v+ix*nyz); + } + T& operator () (int ix, int iy, int iz) const { + __check(ix,nx,3,1); + __check(iy,ny,3,2); + __check(iz,nz,3,3); + return this->v[ix*nyz+iy*nz+iz]; + } + T& operator () (int i) const { + __check(i,this->size,3,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + + array3& operator = (T a) {this->Load(a); return *this;} + array3& operator = (T *a) {this->Load(a); return *this;} + array3& operator = (const array3& A) { + __checkEqual(nx,A.Nx(),3,1); + __checkEqual(ny,A.Ny(),3,2); + __checkEqual(nz,A.Nz(),3,3); + this->Load(A()); + A.Purge(); + return *this; + } + + array3& operator += (array3& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] += A(i); + return *this; + } + array3& operator -= (array3& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] -= A(i); + return *this; + } + + array3& operator += (T a) { + __checkSize(); + unsigned int inc=nyz+nz+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] += a; + return *this; + } + array3& operator -= (T a) { + __checkSize(); + unsigned int inc=nyz+nz+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] -= a; + return *this; + } +}; + +template +std::ostream& operator << (std::ostream& s, const array3& A) +{ + T *p=A(); + for(unsigned int i=0; i < A.Nx(); i++) { + for(unsigned int j=0; j < A.Ny(); j++) { + for(unsigned int k=0; k < A.Nz(); k++) { + s << *(p++) << " "; + } + s << _newl; + } + s << _newl; + } + s << std::flush; + return s; +} + +template +std::istream& operator >> (std::istream& s, const array3& A) +{ + return A.Input(s); +} + +template +class array4 : public array1 { +protected: + unsigned int nx; + unsigned int ny; + unsigned int nz; + unsigned int nw; + unsigned int nyz; + unsigned int nzw; + unsigned int nyzw; +public: + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0) { + nx=nx0; ny=ny0; nz=nz0; nw=nw0; nzw=nz*nw; nyzw=ny*nzw; + this->size=nx*nyzw; + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, T *v0) { + Dimension(nx0,ny0,nz0,nw0); + this->v=v0; + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, size_t align=0) { + Dimension(nx0,ny0,nz0,nw0); + __checkActivate(4,align); + } + + array4() : nx(0), ny(0), nz(0), nw(0), nyz(0), nzw(0), nyzw(0) {} + array4(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, size_t align=0) {Allocate(nx0,ny0,nz0,nw0,align);} + array4(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, T *v0) { + Dimension(nx0,ny0,nz0,nw0,v0); + } + + unsigned int Nx() const {return nx;} + unsigned int Ny() const {return ny;} + unsigned int Nz() const {return nz;} + unsigned int N4() const {return nw;} + + array3 operator [] (int ix) const { + __check(ix,nx,3,1); + return array3(ny,nz,nw,this->v+ix*nyzw); + } + T& operator () (int ix, int iy, int iz, int iw) const { + __check(ix,nx,4,1); + __check(iy,ny,4,2); + __check(iz,nz,4,3); + __check(iw,nw,4,4); + return this->v[ix*nyzw+iy*nzw+iz*nw+iw]; + } + T& operator () (int i) const { + __check(i,this->size,4,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + + array4& operator = (T a) {this->Load(a); return *this;} + array4& operator = (T *a) {this->Load(a); return *this;} + array4& operator = (const array4& A) { + __checkEqual(nx,A.Nx(),4,1); + __checkEqual(ny,A.Ny(),4,2); + __checkEqual(nz,A.Nz(),4,3); + __checkEqual(nw,A.N4(),4,4); + this->Load(A()); + A.Purge(); + return *this; + } + + array4& operator += (array4& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] += A(i); + return *this; + } + array4& operator -= (array4& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] -= A(i); + return *this; + } + + array4& operator += (T a) { + __checkSize(); + unsigned int inc=nyzw+nzw+nw+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] += a; + return *this; + } + array4& operator -= (T a) { + __checkSize(); + unsigned int inc=nyzw+nzw+nw+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] -= a; + return *this; + } +}; + +template +std::ostream& operator << (std::ostream& s, const array4& A) +{ + T *p=A; + for(unsigned int i=0; i < A.Nx(); i++) { + for(unsigned int j=0; j < A.Ny(); j++) { + for(unsigned int k=0; k < A.Nz(); k++) { + for(unsigned int l=0; l < A.N4(); l++) { + s << *(p++) << " "; + } + s << _newl; + } + s << _newl; + } + s << _newl; + } + s << std::flush; + return s; +} + +template +std::istream& operator >> (std::istream& s, const array4& A) +{ + return A.Input(s); +} + +template +class array5 : public array1 { +protected: + unsigned int nx; + unsigned int ny; + unsigned int nz; + unsigned int nw; + unsigned int nv; + unsigned int nwv; + unsigned int nzwv; + unsigned int nyzwv; +public: + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0) { + nx=nx0; ny=ny0; nz=nz0; nw=nw0; nv=nv0; nwv=nw*nv; nzwv=nz*nwv; + nyzwv=ny*nzwv; + this->size=nx*nyzwv; + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, T *v0) { + Dimension(nx0,ny0,nz0,nw0,nv0); + this->v=v0; + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, size_t align=0) { + Dimension(nx0,ny0,nz0,nw0,nv0); + __checkActivate(5,align); + } + + array5() : nx(0), ny(0), nz(0), nw(0), nv(0), nwv(0), nzwv(0), nyzwv(0) {} + array5(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, size_t align=0) { + Allocate(nx0,ny0,nz0,nw0,nv0,align); + } + array5(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, T *v0) { + Dimension(nx0,ny0,nz0,nw0,nv0,nv0); + } + + unsigned int Nx() const {return nx;} + unsigned int Ny() const {return ny;} + unsigned int Nz() const {return nz;} + unsigned int N4() const {return nw;} + unsigned int N5() const {return nv;} + + array4 operator [] (int ix) const { + __check(ix,nx,4,1); + return array4(ny,nz,nw,nv,this->v+ix*nyzwv); + } + T& operator () (int ix, int iy, int iz, int iw, int iv) const { + __check(ix,nx,5,1); + __check(iy,ny,5,2); + __check(iz,nz,5,3); + __check(iw,nw,5,4); + __check(iv,nv,5,5); + return this->v[ix*nyzwv+iy*nzwv+iz*nwv+iw*nv+iv]; + } + T& operator () (int i) const { + __check(i,this->size,5,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + + array5& operator = (T a) {this->Load(a); return *this;} + array5& operator = (T *a) {this->Load(a); return *this;} + array5& operator = (const array5& A) { + __checkEqual(nx,A.Nx(),5,1); + __checkEqual(ny,A.Ny(),5,2); + __checkEqual(nz,A.Nz(),5,3); + __checkEqual(nw,A.N4(),5,4); + __checkEqual(nv,A.N5(),5,5); + this->Load(A()); + A.Purge(); + return *this; + } + + array5& operator += (array5& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] += A(i); + return *this; + } + array5& operator -= (array5& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] -= A(i); + return *this; + } + + array5& operator += (T a) { + __checkSize(); + unsigned int inc=nyzwv+nzwv+nwv+nv+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] += a; + return *this; + } + array5& operator -= (T a) { + __checkSize(); + unsigned int inc=nyzwv+nzwv+nwv+nv+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] -= a; + return *this; + } +}; + +template +std::ostream& operator << (std::ostream& s, const array5& A) +{ + T *p=A; + for(unsigned int i=0; i < A.Nx(); i++) { + for(unsigned int j=0; j < A.Ny(); j++) { + for(unsigned int k=0; k < A.Nz(); k++) { + for(unsigned int l=0; l < A.N4(); l++) { + for(unsigned int l=0; l < A.N5(); l++) { + s << *(p++) << " "; + } + s << _newl; + } + s << _newl; + } + s << _newl; + } + s << _newl; + } + s << std::flush; + return s; +} + +template +std::istream& operator >> (std::istream& s, const array5& A) +{ + return A.Input(s); +} + +#undef __check + +#ifdef NDEBUG +#define __check(i,n,o,dim,m) +#else +#define __check(i,n,o,dim,m) this->Check(i-o,n,dim,m,o) +#endif + +template +class Array1 : public array1 { +protected: + T *voff; // Offset pointer to memory block + int ox; +public: + void Offsets() { + voff=this->v-ox; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, int ox0=0) { + this->size=nx0; + ox=ox0; + Offsets(); + } + void Dimension(unsigned int nx0, T *v0, int ox0=0) { + this->v=v0; + Dimension(nx0,ox0); + this->clear(this->allocated); + } + void Dimension(const Array1& A) { + Dimension(A.size,A.v,A.ox); this->state=A.test(this->temporary); + } + + void Allocate(unsigned int nx0, int ox0=0, size_t align=0) { + Dimension(nx0,ox0); + __checkActivate(1,align); + Offsets(); + } + + void Reallocate(unsigned int nx0, int ox0=0, size_t align=0) { + this->Deallocate(); + Allocate(nx0,ox0,align); + } + + Array1() : ox(0) {} + Array1(unsigned int nx0, int ox0=0, size_t align=0) { + Allocate(nx0,ox0,align); + } + Array1(unsigned int nx0, T *v0, int ox0=0) { + Dimension(nx0,v0,ox0); + } + Array1(T *v0, int ox0=0) { + Dimension(INT_MAX,v0,ox0); + } + +#ifdef NDEBUG + typedef T *opt; +#else + typedef Array1 opt; +#endif + + T& operator [] (int ix) const {__check(ix,this->size,ox,1,1); return voff[ix];} + T& operator () (int i) const {__check(i,this->size,0,1,1); return this->v[i];} + T* operator () () const {return this->v;} + operator T* () const {return this->v;} + + Array1 operator + (int i) const {return Array1(this->size-i,this->v+i,ox);} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array1& operator = (T a) {this->Load(a); return *this;} + Array1& operator = (const T *a) {this->Load(a); return *this;} + Array1& operator = (const Array1& A) { + __checkEqual(this->size,A.Size(),1,1); + __checkEqual(ox,A.Ox(),1,1); + this->Load(A()); + A.Purge(); + return *this; + } + Array1& operator = (const array1& A) { + __checkEqual(this->size,A.Size(),1,1); + __checkEqual(ox,0,1,1); + this->Load(A()); + A.Purge(); + return *this; + } + + int Ox() const {return ox;} +}; + +template +class Array2 : public array2 { +protected: + T *voff,*vtemp; + int ox,oy; +public: + void Offsets() { + vtemp=this->v-ox*(int) this->ny; + voff=vtemp-oy; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, int ox0=0, int oy0=0) { + this->nx=nx0; this->ny=ny0; + this->size=this->nx*this->ny; + ox=ox0; oy=oy0; + Offsets(); + } + void Dimension(unsigned int nx0, unsigned int ny0, T *v0, int ox0=0, + int oy0=0) { + this->v=v0; + Dimension(nx0,ny0,ox0,oy0); + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, int ox0=0, int oy0=0, + size_t align=0) { + Dimension(nx0,ny0,ox0,oy0); + __checkActivate(2,align); + Offsets(); + } + + Array2() : ox(0), oy(0) {} + Array2(unsigned int nx0, unsigned int ny0, int ox0=0, int oy0=0, + size_t align=0) { + Allocate(nx0,ny0,ox0,oy0,align); + } + Array2(unsigned int nx0, unsigned int ny0, T *v0, int ox0=0, int oy0=0) { + Dimension(nx0,ny0,v0,ox0,oy0); + } + +#ifndef __NOARRAY2OPT + T *operator [] (int ix) const { + return voff+ix*(int) this->ny; + } +#else + Array1 operator [] (int ix) const { + __check(ix,this->nx,ox,2,1); + return Array1(this->ny,vtemp+ix*(int) this->ny,oy); + } +#endif + + T& operator () (int ix, int iy) const { + __check(ix,this->nx,ox,2,1); + __check(iy,this->ny,oy,2,2); + return voff[ix*(int) this->ny+iy]; + } + T& operator () (int i) const { + __check(i,this->size,0,2,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array2& operator = (T a) {this->Load(a); return *this;} + Array2& operator = (T *a) {this->Load(a); return *this;} + Array2& operator = (const Array2& A) { + __checkEqual(this->nx,A.Nx(),2,1); + __checkEqual(this->ny,A.Ny(),2,2); + __checkEqual(ox,A.Ox(),2,1); + __checkEqual(oy,A.Oy(),2,2); + this->Load(A()); + A.Purge(); + return *this; + } + Array2& operator = (const array2& A) { + __checkEqual(this->nx,A.Nx(),2,1); + __checkEqual(this->ny,A.Ny(),2,2); + __checkEqual(ox,0,2,1); + __checkEqual(oy,0,2,2); + this->Load(A()); + A.Purge(); + return *this; + } + + int Ox() const {return ox;} + int Oy() const {return oy;} + +}; + +template +class Array3 : public array3 { +protected: + T *voff,*vtemp; + int ox,oy,oz; +public: + void Offsets() { + vtemp=this->v-ox*(int) this->nyz; + voff=vtemp-oy*(int) this->nz-oz; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + int ox0=0, int oy0=0, int oz0=0) { + this->nx=nx0; this->ny=ny0; this->nz=nz0; this->nyz=this->ny*this->nz; + this->size=this->nx*this->nyz; + ox=ox0; oy=oy0; oz=oz0; + Offsets(); + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + T *v0, int ox0=0, int oy0=0, int oz0=0) { + this->v=v0; + Dimension(nx0,ny0,nz0,ox0,oy0,oz0); + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + int ox0=0, int oy0=0, int oz0=0, size_t align=0) { + Dimension(nx0,ny0,nz0,ox0,oy0,oz0); + __checkActivate(3,align); + Offsets(); + } + + Array3() : ox(0), oy(0), oz(0) {} + Array3(unsigned int nx0, unsigned int ny0, unsigned int nz0, + int ox0=0, int oy0=0, int oz0=0, size_t align=0) { + Allocate(nx0,ny0,nz0,ox0,oy0,oz0,align); + } + Array3(unsigned int nx0, unsigned int ny0, unsigned int nz0, T *v0, + int ox0=0, int oy0=0, int oz0=0) { + Dimension(nx0,ny0,nz0,v0,ox0,oy0,oz0); + } + + Array2 operator [] (int ix) const { + __check(ix,this->nx,ox,3,1); + return Array2(this->ny,this->nz,vtemp+ix*(int) this->nyz,oy,oz); + } + T& operator () (int ix, int iy, int iz) const { + __check(ix,this->nx,ox,3,1); + __check(iy,this->ny,oy,3,2); + __check(iz,this->nz,oz,3,3); + return voff[ix*(int) this->nyz+iy*(int) this->nz+iz]; + } + T& operator () (int i) const { + __check(i,this->size,0,3,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array3& operator = (T a) {this->Load(a); return *this;} + Array3& operator = (T *a) {this->Load(a); return *this;} + Array3& operator = (const Array3& A) { + __checkEqual(this->nx,A.Nx(),3,1); + __checkEqual(this->ny,A.Ny(),3,2); + __checkEqual(this->nz,A.Nz(),3,3); + __checkEqual(ox,A.Ox(),3,1); + __checkEqual(oy,A.Oy(),3,2); + __checkEqual(oz,A.Oz(),3,3); + this->Load(A()); + A.Purge(); + return *this; + } + Array3& operator = (const array3& A) { + __checkEqual(this->nx,A.Nx(),3,1); + __checkEqual(this->ny,A.Ny(),3,2); + __checkEqual(this->nz,A.Nz(),3,3); + __checkEqual(ox,0,3,1); + __checkEqual(oy,0,3,2); + __checkEqual(oz,0,3,3); + this->Load(A()); + A.Purge(); + return *this; + } + + int Ox() const {return ox;} + int Oy() const {return oy;} + int Oz() const {return oz;} + +}; + +template +class Array4 : public array4 { +protected: + T *voff,*vtemp; + int ox,oy,oz,ow; +public: + void Offsets() { + vtemp=this->v-ox*(int) this->nyzw; + voff=vtemp-oy*(int) this->nzw-oz*(int) this->nw-ow; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0) { + this->nx=nx0; this->ny=ny0; this->nz=nz0; this->nw=nw0; + this->nzw=this->nz*this->nw; this->nyzw=this->ny*this->nzw; + this->size=this->nx*this->nyzw; + ox=ox0; oy=oy0; oz=oz0; ow=ow0; + Offsets(); + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, T *v0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0) { + this->v=v0; + Dimension(nx0,ny0,nz0,nw0,ox0,oy0,oz0,ow0); + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, size_t align=0) { + Dimension(nx0,ny0,nz0,nw0,ox0,oy0,oz0,ow0); + __checkActivate(4,align); + Offsets(); + } + + Array4() : ox(0), oy(0), oz(0), ow(0) {} + Array4(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, size_t align=0) { + Allocate(nx0,ny0,nz0,nw0,ox0,oy0,oz0,ow0,align); + } + Array4(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, T *v0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0) { + Dimension(nx0,ny0,nz0,nw0,v0,ox0,oy0,oz0,ow0); + } + + Array3 operator [] (int ix) const { + __check(ix,this->nx,ox,3,1); + return Array3(this->ny,this->nz,this->nw,vtemp+ix*(int) this->nyzw, + oy,oz,ow); + } + T& operator () (int ix, int iy, int iz, int iw) const { + __check(ix,this->nx,ox,4,1); + __check(iy,this->ny,oy,4,2); + __check(iz,this->nz,oz,4,3); + __check(iw,this->nw,ow,4,4); + return voff[ix*(int) this->nyzw+iy*(int) this->nzw+iz*(int) this->nw+iw]; + } + T& operator () (int i) const { + __check(i,this->size,0,4,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array4& operator = (T a) {this->Load(a); return *this;} + Array4& operator = (T *a) {this->Load(a); return *this;} + + Array4& operator = (const Array4& A) { + __checkEqual(this->nx,A.Nx(),4,1); + __checkEqual(this->ny,A.Ny(),4,2); + __checkEqual(this->nz,A.Nz(),4,3); + __checkEqual(this->nw,A.N4(),4,4); + __checkEqual(ox,A.Ox(),4,1); + __checkEqual(oy,A.Oy(),4,2); + __checkEqual(oz,A.Oz(),4,3); + __checkEqual(ow,A.O4(),4,4); + this->Load(A()); + A.Purge(); + return *this; + } + Array4& operator = (const array4& A) { + __checkEqual(this->nx,A.Nx(),4,1); + __checkEqual(this->ny,A.Ny(),4,2); + __checkEqual(this->nz,A.Nz(),4,3); + __checkEqual(this->nw,A.N4(),4,4); + __checkEqual(this->nx,A.Nx(),4,1); + __checkEqual(this->ny,A.Nx(),4,2); + __checkEqual(this->nz,A.Nx(),4,3); + __checkEqual(this->nw,A.Nx(),4,4); + __checkEqual(ox,0,4,1); + __checkEqual(oy,0,4,2); + __checkEqual(oz,0,4,3); + __checkEqual(ow,0,4,4); + this->Load(A()); + A.Purge(); + return *this; + } + + int Ox() const {return ox;} + int Oy() const {return oy;} + int Oz() const {return oz;} + int O4() const {return ow;} +}; + +template +class Array5 : public array5 { +protected: + T *voff,*vtemp; + int ox,oy,oz,ow,ov; +public: + void Offsets() { + vtemp=this->v-ox*(int) this->nyzwv; + voff=vtemp-oy*(int) this->nzwv-oz*(int) this->nwv-ow*(int) this->nv-ov; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, int ov0=0) { + this->nx=nx0; this->ny=ny0; this->nz=nz0; this->nw=nw0; this->nv=nv0; + this->nwv=this->nw*this->nv; this->nzwv=this->nz*this->nwv; + this->nyzwv=this->ny*this->nzwv; + this->size=this->nx*this->nyzwv; + ox=ox0; oy=oy0; oz=oz0; ow=ow0; ov=ov0; + Offsets(); + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, T *v0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, int ov0=0) { + this->v=v0; + Dimension(nx0,ny0,nz0,nw0,nv0,ox0,oy0,oz0,ow0,ov0); + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, int ov0=0, + size_t align=0) { + Dimension(nx0,ny0,nz0,nw0,nv0,ox0,oy0,oz0,ow0,ov0); + __checkActivate(5,align); + Offsets(); + } + + Array5() : ox(0), oy(0), oz(0), ow(0), ov(0) {} + Array5(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, int ox0=0, int oy0=0, + int oz0=0, int ow0=0, int ov0=0, size_t align=0) { + Allocate(nx0,ny0,nz0,nw0,nv0,ox0,oy0,oz0,ow0,ov0,align); + } + Array5(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, T *v0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, int ov0=0) { + Dimension(nx0,ny0,nz0,nw0,nv0,v0,ox0,oy0,oz0,ow0,ov0); + } + + Array4 operator [] (int ix) const { + __check(ix,this->nx,ox,4,1); + return Array4(this->ny,this->nz,this->nw,this->nv, + vtemp+ix*(int) this->nyzwv,oy,oz,ow,ov); + } + T& operator () (int ix, int iy, int iz, int iw, int iv) const { + __check(ix,this->nx,ox,5,1); + __check(iy,this->ny,oy,5,2); + __check(iz,this->nz,oz,5,3); + __check(iw,this->nw,ow,5,4); + __check(iv,this->nv,ov,5,5); + return voff[ix*(int) this->nyzwv+iy*(int) this->nzwv+iz*(int) this->nwv + +iw*(int) this->nv+iv]; + } + T& operator () (int i) const { + __check(i,this->size,0,5,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array5& operator = (T a) {this->Load(a); return *this;} + Array5& operator = (T *a) {this->Load(a); return *this;} + + Array5& operator = (const Array5& A) { + __checkEqual(this->nx,A.Nx(),5,1); + __checkEqual(this->ny,A.Ny(),5,2); + __checkEqual(this->nz,A.Nz(),5,3); + __checkEqual(this->nw,A.N4(),5,4); + __checkEqual(this->nv,A.N5(),5,5); + __checkEqual(ox,A.Ox(),5,1); + __checkEqual(oy,A.Oy(),5,2); + __checkEqual(oz,A.Oz(),5,3); + __checkEqual(ow,A.O4(),5,4); + __checkEqual(ov,A.O5(),5,5); + this->Load(A()); + A.Purge(); + return *this; + } + Array5& operator = (const array5& A) { + __checkEqual(this->nx,A.Nx(),5,1); + __checkEqual(this->ny,A.Ny(),5,2); + __checkEqual(this->nz,A.Nz(),5,3); + __checkEqual(this->nw,A.N4(),5,4); + __checkEqual(this->nv,A.N5(),5,5); + __checkEqual(ox,0,5,1); + __checkEqual(oy,0,5,2); + __checkEqual(oz,0,5,3); + __checkEqual(ow,0,5,4); + __checkEqual(ov,0,5,5); + this->Load(A()); + A.Purge(); + return *this; + } + int Ox() const {return ox;} + int Oy() const {return oy;} + int Oz() const {return oz;} + int O4() const {return ow;} + int O5() const {return ov;} +}; + +template +inline bool Active(array1& A) +{ + return A.Size(); +} + +template +inline bool Active(T *A) +{ + return A; +} + +template +inline void Set(T *&A, T *v) +{ + A=v; +} + +template +inline void Set(array1& A, T *v) +{ + A.Set(v); +} + +template +inline void Set(array1& A, const array1& B) +{ + A.Set(B()); +} + +template +inline void Set(Array1& A, T *v) +{ + A.Set(v); +} + +template +inline void Set(Array1& A, const array1& B) +{ + A.Set(B()); +} + +template +inline void Null(T *&A) +{ + A=NULL; +} + +template +inline void Null(array1& A) +{ + A.Dimension(0); +} + +template +inline void Dimension(T *&, unsigned int) +{ +} + +template +inline void Dimension(array1 &A, unsigned int n) +{ + A.Dimension(n); +} + +template +inline void Dimension(T *&A, unsigned int, T *v) +{ + A=v; +} + +template +inline void Dimension(array1& A, unsigned int n, T *v) +{ + A.Dimension(n,v); +} + +template +inline void Dimension(Array1& A, unsigned int n, T *v) +{ + A.Dimension(n,v,0); +} + +template +inline void Dimension(T *&A, T *v) +{ + A=v; +} + +template +inline void Dimension(array1& A, const array1& B) +{ + A.Dimension(B); +} + +template +inline void Dimension(Array1& A, const Array1& B) +{ + A.Dimension(B); +} + +template +inline void Dimension(Array1& A, const array1& B) +{ + A.Dimension(B); +} + +template +inline void Dimension(array1& A, unsigned int n, const array1& B) +{ + A.Dimension(n,B); +} + +template +inline void Dimension(Array1& A, unsigned int n, const array1& B, int o) +{ + A.Dimension(n,B,o); +} + +template +inline void Dimension(Array1& A, unsigned int n, T *v, int o) +{ + A.Dimension(n,v,o); +} + +template +inline void Dimension(T *&A, unsigned int, T *v, int o) +{ + A=v-o; +} + +template +inline void Allocate(T *&A, unsigned int n, size_t align=0) +{ + if(align) newAlign(A,n,align); + else A=new T[n]; +} + +template +inline void Allocate(array1& A, unsigned int n, size_t align=0) +{ + A.Allocate(n,align); +} + +template +inline void Allocate(Array1& A, unsigned int n, size_t align=0) +{ + A.Allocate(n,align); +} + +template +inline void Allocate(T *&A, unsigned int n, int o, size_t align=0) +{ + Allocate(A,n,align); + A -= o; +} + +template +inline void Allocate(Array1& A, unsigned int n, int o, size_t align=0) +{ + A.Allocate(n,o,align); +} + +template +inline void Deallocate(T *A) +{ + if(A) delete [] A; +} + +template +inline void Deallocate(array1& A) +{ + A.Deallocate(); +} + +template +inline void Deallocate(Array1& A) +{ + A.Deallocate(); +} + +template +inline void Deallocate(T *A, int o) +{ + if(A) delete [] (A+o); +} + +template +inline void Deallocate(Array1& A, int) +{ + A.Deallocate(); +} + +template +inline void Reallocate(T *&A, unsigned int n, size_t align=0) +{ + if(A) delete [] A; + Allocate(A,n,align); +} + +template +inline void Reallocate(array1& A, unsigned int n) +{ + A.Reallocate(n); +} + +template +inline void Reallocate(Array1& A, unsigned int n) +{ + A.Reallocate(n); +} + +template +inline void Reallocate(T *&A, unsigned int n, int o, size_t align=0) +{ + if(A) delete [] A; + Allocate(A,n,align); + A -= o; +} + +template +inline void Reallocate(Array1& A, unsigned int n, int o, size_t align=0) +{ + A.Reallocate(n,o,align); +} + +template +inline void CheckReallocate(T& A, unsigned int n, unsigned int& old, + size_t align=0) +{ + if(n > old) {A.Reallocate(n,align); old=n;} +} + +template +inline void CheckReallocate(T& A, unsigned int n, int o, unsigned int& old, + size_t align=0) +{ + if(n > old) {A.Reallocate(n,o,align); old=n;} +} + +} + +#undef __check +#undef __checkSize +#undef __checkActivate + +#endif diff --git a/examples/Integration_with_fftw/Makefile b/examples/Integration_with_fftw/Makefile new file mode 100644 index 0000000..a50432c --- /dev/null +++ b/examples/Integration_with_fftw/Makefile @@ -0,0 +1,69 @@ +# Makefile + +# includes +MMSP_PATH=/home/arun/mmsp +incdir = $(MMSP_PATH)/include +utildir = $(MMSP_PATH)/utility +algodir = $(MMSP_PATH)/algorithms + +# compilers/flags +compiler = g++ -std=c++11 -O3 +pcompiler = mpic++ -std=c++11 -O3 -Wall -pedantic +flags = -I$(incdir) -I$(algodir) -I$(utildir) +prefourierflags = -I fftw/api -fopenmp +postfourierflags = fftw/fftw++.cc +fourierlinkers = -lfftw3 -lfftw3_omp -lm + + + +# IBM compiler for AMOS +BG_XL = /bgsys/drivers/ppcfloor/comm/xl +BG_INC = -I$(BG_XL)/include +BG_LIB = -L$(BG_XL)/lib +qcompiler = $(BG_XL)/bin/mpixlcxx_r -O3 -qflag=w -qstrict -qmaxmem=-1 +qflags = $(BG_INC) $(BG_LIB) $(flags) -I/bgsys/apps/CCNI/zlib/zlib-1.2.7/include -L/bgsys/apps/CCNI/zlib/zlib-1.2.7/lib + +# dependencies +core = #$Thermo.hpp \ + #$(incdir)/MMSP.main.hpp \ + $(incdir)/MMSP.utility.h \ + $(incdir)/MMSP.grid.h \ + $(incdir)/MMSP.sparse.h \ + +# the program +sparse: $(core) + $(compiler) $(flags) $(prefourierflags) main.cpp $(postfourierflags) $(fourierlinkers) $< -o sparse.out -lz #-include mpi.h + +parallel: $(core) + $(pcompiler) $(flags) main_parallel.cpp $< -o parallel.out -lz #-include mpi.h + +sparse_serial: $(core) + $(compiler) $(flags) $(prefourierflags) main.cpp $(postfourierflags) $(fourierlinkers) $< -o sparse_serial.out -lz # + +bgq: sp-xmpf.cpp $(core) + $(qcompiler) -DBGQ $(qflags) $< -o q_sparse.out -lz + +tool: tool.cpp $(core) /usr/include/IL/devil_cpp_wrapper.hpp + $(pcompiler) $(flags) -I /usr/include/IL -include il.h $< -o $@ -lz -lIL -lILU -lILUT + +mmsp2png : mmsp2png.cpp + $(compiler) $(flags) $< -o $@ -lz -lpng + +# convert MMSP grid file to ParaView Data file type +mmsp2pvd : mmsp2pvd.cpp + $(compiler) $(flags) $< -o $@ -lz + +# convert MMSP grid file to tab-delimited ASCII (TSV) file type +mmsp2tsv : mmsp2tsv.cpp + $(compiler) $(flags) $< -o $@ -lz + +# convert MMSP grid file to VTK Image file type +mmsp2vti : mmsp2vti.cpp + $(compiler) $(flags) $< -o $@ -lz + +# convert MMSP grid file to XYZ point cloud file type +mmsp2xyz : mmsp2xyz.cpp + $(compiler) $(flags) $< -o $@ -lz + +clean: + rm -rf sparse.out output_* pf_* delta* c_* IE* *~ diff --git a/examples/Integration_with_fftw/Thermo.hpp b/examples/Integration_with_fftw/Thermo.hpp new file mode 100644 index 0000000..5115dd6 --- /dev/null +++ b/examples/Integration_with_fftw/Thermo.hpp @@ -0,0 +1,206 @@ +#define L0_BCC_Al_Ti_V (32045.963) +#define L1_BCC_Al_Ti_V 0.0 //(-113926.0 + 40*T) +#define L2_BCC_Al_Ti_V 0.0 //(75972.5 - 150*T) +#define L0_HCP_Al_Ti_V 0.0 +#define L1_HCP_Al_Ti_V 0.0 //(-206074.0 - 40*T) +#define L2_HCP_Al_Ti_V 0 +#define L0_BCC_Ti_V (10500-1.5*T) +#define L1_BCC_Ti_V 0.0 //2025.39 +#define L2_BCC_Ti_V 0.0 +#define L0_HCP_Ti_V 20000.0 +#define L1_HCP_Ti_V 0.0 +#define L2_HCP_Ti_V 0.0 +#define L0_BCC_Al_Ti (-125980.0+39*T) +#define L1_BCC_Al_Ti 0.0 //4890.0 +#define L2_BCC_Al_Ti 0.0 //400.0 +#define L0_HCP_Al_Ti (-128664.0+37.863*T) +#define L1_HCP_Al_Ti 0.0 //(-3475.0 + 0.825*T) +#define L2_HCP_Al_Ti 0.0 //-7756.0 +#define L0_HCP_Al_V (-95000.0+20*T) +#define L1_HCP_Al_V 0.0 +#define L2_HCP_Al_V 0.0 +#define L0_BCC_Al_V (-95000.0+20*T) +#define L1_BCC_Al_V 0.0 //6645.0 +#define L2_BCC_Al_V 0.0 //-68596.0 + +#define Al_alpha_a_1 -2495.15 +#define Al_alpha_b_1 135.29 +#define Al_alpha_c_1 -24.37 +#define Al_alpha_d_1 -0.00188 + +#define Al_alpha_a_2 -5795.24 +#define Al_alpha_b_2 221.25 +#define Al_alpha_c_2 -38.58 +#define Al_alpha_d_2 -0.01853 + +#define Al_alpha_a_3 -5797.36 +#define Al_alpha_b_3 186.88 +#define Al_alpha_c_3 -31.75 +#define Al_alpha_d_3 0.0 + +#define Al_beta_a_1 2106.85 +#define Al_beta_b_1 132.28 +#define Al_beta_c_1 -24.37 +#define Al_beta_d_1 -0.00188 + +#define Al_beta_a_2 -1193.24 +#define Al_beta_b_2 218.24 +#define Al_beta_c_2 -38.58 +#define Al_beta_d_2 -0.01853 + +#define Al_beta_a_3 -1195.36 +#define Al_beta_b_3 183.87 +#define Al_beta_c_3 -31.75 +#define Al_beta_d_3 0.0 + +#define Ti_alpha_a_1 -8059.92 +#define Ti_alpha_b_1 133.62 +#define Ti_alpha_c_1 -23.99 +#define Ti_alpha_d_1 -0.00477 + +#define Ti_alpha_a_2 -7811.82 +#define Ti_alpha_b_2 132.98 +#define Ti_alpha_c_2 -23.98 +#define Ti_alpha_d_2 -0.0042 + +#define Ti_alpha_a_3 908.84 +#define Ti_alpha_b_3 66.98 +#define Ti_alpha_c_3 -14.95 +#define Ti_alpha_d_3 -0.00815 + +#define Ti_alpha_a_4 -124526.79 +#define Ti_alpha_b_4 638.81 +#define Ti_alpha_c_4 -87.22 +#define Ti_alpha_d_4 -0.00821 + +#define Ti_beta_a_1 -1272.06 +#define Ti_beta_b_1 134.71 +#define Ti_beta_c_1 -25.58 +#define Ti_beta_d_1 -0.00066 + +#define Ti_beta_a_2 6667.39 +#define Ti_beta_b_2 105.37 +#define Ti_beta_c_2 -22.37 +#define Ti_beta_d_2 0.00122 + +#define Ti_beta_a_3 26483.26 +#define Ti_beta_b_3 -182.43 +#define Ti_beta_c_3 19.09 +#define Ti_beta_d_3 -22.01 + + +#define V_alpha_a_1 -3930.43 +#define V_alpha_b_1 135.74 +#define V_alpha_c_1 -24.13 +#define V_alpha_d_1 -0.0031 + +#define V_alpha_a_2 -3967.84 +#define V_alpha_b_2 145.69 +#define V_alpha_c_2 -25.90 +#define V_alpha_d_2 0.000063 + +#define V_alpha_a_3 -37689.86 +#define V_alpha_b_3 323.54 +#define V_alpha_c_3 -47.43 +#define V_alpha_d_3 0.0 + +#define V_beta_a_1 -7930.43 +#define V_beta_b_1 133.35 +#define V_beta_c_1 -24.13 +#define V_beta_d_1 -0.0031 + +#define V_beta_a_2 -7967.84 +#define V_beta_b_2 143.29 +#define V_beta_c_2 -25.90 +#define V_beta_d_2 0.000063 + +#define V_beta_a_3 -41689.87 +#define V_beta_b_3 321.14 +#define V_beta_c_3 -47.43 +#define V_beta_d_3 0.0 + + +#define q_alpha_al_al -79800 + R*T*log(2.38e-05) +#define q_alpha_al_v -258550 + R*T*log(4.36e-02) +#define q_alpha_al_ti -193200 + R*T*log(1.0e-08) +#define q_alpha_v_al -79800 + R*T*log(2.38e-05) +#define q_alpha_v_v -258550 + R*T*log(4.36e-02) +#define q_alpha_v_ti -251490 -56*T + +#define a_alpha_al_al_ti -491950 +#define a_alpha_al_ti_v 587700 +#define a_alpha_al_al_v 0.0 +#define a_alpha_v_al_ti -529600 +#define a_alpha_v_al_v 0.0 +#define a_alpha_v_ti_v 0.0 + + +#define q_beta_al_al -215000 -80.2*T +#define q_beta_al_v -268000 -97.2*T +#define q_beta_al_ti R*T*log(5.19e-10*exp(-96000/(R*T))) +#define q_beta_v_al -325008.12 -73.99*T +#define q_beta_v_v -325008.12 -73.99*T +#define q_beta_v_ti -179392.69 - 106.68*T + +#define a_beta_al_al_ti -499946.15 + 333.87*T +#define a1_beta_al_al_ti -407271.50 + 286.27*T +#define a_beta_al_al_v -751405.09 +#define a_beta_al_ti_v 0.0 +#define a_beta_v_al_v -1300707.37 +#define a_beta_v_ti_v +159597.07 - 48.62*T +#define a1_beta_v_ti_v -10551.39 +#define a_beta_v_al_ti 0.0 + +void thermo_auxillary_terms(MMSP::vector gradient, MMSP::vector gradientsq, double c_Al, double c_V) +{ + double grad_cal = 0 ; + double grad_cv = 0 ; + double gradsq_cal = 0 ; + double gradsq_cv = 0 ; + for(int i = 0; i < dim ; i++) + { + grad_cal += gradient[i][20] ; + grad_cv += gradient[i][21] ; + gradsq_cal += gradientsq[i][20] ; + gradsq_cv += gradientsq[i][21] ; + } + dGAlpha_dAl = (G_Al_alpha/G_normalize - G_Ti_alpha/G_normalize) + log(c_Al) - log((1-c_Al-c_V)) + c_V*L0_HCP_Al_V/G_normalize + + (1-2*c_Al-c_V)*L0_HCP_Al_Ti/G_normalize - c_V*L0_HCP_Ti_V/G_normalize ; + dGBeta_dAl = (G_Al_beta/G_normalize - G_Ti_beta/G_normalize) + log(c_Al) - log((1-c_Al-c_V)) + c_V*L0_BCC_Al_V/G_normalize + + (1-2*c_Al-c_V)*L0_BCC_Al_Ti/G_normalize - c_V*L0_BCC_Ti_V/G_normalize + (c_V*(1-c_Al-c_V) + - c_Al*c_V)*L0_BCC_Al_Ti_V/G_normalize ; + dGAlpha_dV = (G_V_alpha/G_normalize - G_Ti_alpha/G_normalize) + log(c_V) - log((1-c_Al-c_V)) + c_Al*L0_HCP_Al_V/G_normalize + + (1-c_Al-2*c_V)*L0_HCP_Ti_V/G_normalize - c_Al*L0_HCP_Al_Ti/G_normalize ; + dGBeta_dV = (G_V_beta/G_normalize - G_Ti_beta/G_normalize) + log(c_V) - log((1-c_Al-c_V)) + c_Al*L0_BCC_Al_V/G_normalize + + (1-c_Al-2*c_V)*L0_BCC_Ti_V/G_normalize - c_Al*L0_BCC_Al_Ti/G_normalize + (c_Al*(1-c_Al-c_V) - + c_Al*c_V)*L0_BCC_Al_Ti_V/G_normalize ; + del_dGAlpha_dAl = grad_cal*(1.0/c_Al + 1.0/(1.0-c_Al-c_V) - 2*L0_HCP_Al_Ti/G_normalize) + grad_cv*(1.0/(1.0-c_Al-c_V) + + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize -L0_HCP_Ti_V/G_normalize) ; + del_dGBeta_dAl = grad_cal*(1.0/c_Al + 1/(1-c_Al-c_V) - 2*L0_BCC_Al_Ti/G_normalize - 2*c_V*L0_BCC_Al_Ti_V/G_normalize) + + grad_cv*(1/(1-c_Al-c_V) + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize -L0_HCP_Ti_V/G_normalize + + (1-2*c_Al-2*c_V)*L0_BCC_Al_Ti_V/G_normalize) ; + del_dGAlpha_dV = grad_cv*(1.0/c_V + 1/(1-c_Al-c_V) - 2*L0_HCP_Ti_V/G_normalize) + grad_cal*(1/(1-c_Al-c_V) + + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize - L0_HCP_Ti_V/G_normalize) ; + del_dGBeta_dV = grad_cv*(1.0/c_V + 1/(1-c_Al-c_V) -2*L0_BCC_Ti_V/G_normalize - 2*c_Al*L0_BCC_Al_Ti_V/G_normalize) + + grad_cal*(1/(1-c_Al-c_V) + L0_BCC_Al_V/G_normalize - L0_BCC_Al_Ti/G_normalize - L0_BCC_Ti_V/G_normalize + + (1-2*c_Al-2*c_V)*L0_BCC_Al_Ti_V/G_normalize) ; + delsq_dGAlpha_dAl = gradsq_cal*(1.0/c_Al + 1/(1-c_Al-c_V) - 2*L0_HCP_Al_Ti/G_normalize) + gradsq_cv*(1/(1-c_Al-c_V) + + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize -L0_HCP_Ti_V/G_normalize) + grad_cal*(-grad_cal/pow(c_Al,2) + + (grad_cal + grad_cv)/pow((1-c_Al-c_V),2)) + grad_cv*((grad_cal + grad_cv)/pow((1-c_Al-c_V),2)) ; + + delsq_dGAlpha_dV = gradsq_cv*(1.0/c_V + 1/(1-c_Al-c_V) - 2*L0_HCP_Ti_V/G_normalize) + gradsq_cal*(1/(1-c_Al-c_V) + + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize - L0_HCP_Ti_V/G_normalize) + grad_cv*(-grad_cv/pow(c_V,2) + + (grad_cal + grad_cv)/pow((1-c_Al-c_V),2)) + grad_cal*((grad_cal + grad_cv)/pow((1-c_Al-c_V),2)) ; + + delsq_dGBeta_dAl = gradsq_cal*(1.0/c_Al + 1/(1-c_Al-c_V) - 2*L0_BCC_Al_Ti/G_normalize - 2*c_V*L0_BCC_Al_Ti_V/G_normalize) + + gradsq_cv*(1/(1-c_Al-c_V) + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize -L0_HCP_Ti_V/G_normalize + + (1-2*c_Al-2*c_V)*L0_BCC_Al_Ti_V/G_normalize) + grad_cal*(-grad_cal/pow(c_Al,2) + (grad_cal + + grad_cv)/pow((1-c_Al-c_V),2) - 2*grad_cv*L0_BCC_Al_Ti_V/G_normalize) + grad_cv*((grad_cal + + grad_cv)/pow((1-c_Al-c_V),2) + (-2*grad_cal*grad_cv)*L0_BCC_Al_Ti_V/G_normalize) ; + delsq_dGBeta_dV = gradsq_cv*(1.0/c_V + 1/(1-c_Al-c_V) -2*L0_BCC_Ti_V/G_normalize - 2*c_Al*L0_BCC_Al_Ti_V/G_normalize) + + gradsq_cal*(1/(1-c_Al-c_V) + L0_BCC_Al_V/G_normalize - L0_BCC_Al_Ti/G_normalize - L0_BCC_Ti_V/G_normalize + + (1-2*c_Al-2*c_V)*L0_BCC_Al_Ti_V/G_normalize) + grad_cv*(-grad_cv/pow(c_V,2) + (grad_cal + + grad_cv)/pow((1-c_Al-c_V),2) - 2*grad_cal*L0_BCC_Al_Ti_V/G_normalize) + grad_cal*((grad_cal + + grad_cv)/pow((1-c_Al-c_V),2) + (-2*grad_cal*grad_cv)*L0_BCC_Al_Ti_V/G_normalize) ; +} + diff --git a/examples/Integration_with_fftw/definitions_v2.hpp b/examples/Integration_with_fftw/definitions_v2.hpp new file mode 100644 index 0000000..c1d5656 --- /dev/null +++ b/examples/Integration_with_fftw/definitions_v2.hpp @@ -0,0 +1,366 @@ + +//------------------------Initialization of global variables/parameters-----------------------// + +double R = 8.314 ; +double T = 1023 ; +double T_orig = 1023; +double cr = 0.0; //Cooling rate (K/s) +double L_orig = 0.139 ; //Phase field mobility +double c_tot = 0.1 ; +double sigma = 0.150; +double V0 = 1.0e-02/60.0 ; +double epsi_sq = 1.0e-07 ; +double L = (sigma*V0)/(epsi_sq*c_tot*R*T); +double G_normalize = R*T ; //Scaling factor for terms having J/mol units +double lold = 9.677*pow(10, -8) ; //Grid size (m) +double lc = 9.677*pow(10,-8) ; //Characteristic length scale, or capillary length +double dx_nd = lold/lc ; // Non-dimensional grid size +double tc = 4.4 ; //Characteristic time scale (s) +double dt_old = 0.44 ; // Dimensional dt (s) +double dt = dt_old/tc; //Non-dimensional dt +double Dalal = 0.001 ; // The next four lines are the components of the Onsager mobility matrix +double Dalv = -0.0008 ; +double Dvv = 0.001 ; +double Dval = -0.0008 ; +double Vm = 0.00001; //Molar volume (m^3/mol) +double w_norm = (R*T)/Vm ; //Scaling factor for the double well height +double epsi_norm = (R*T*pow(lc,2))/Vm; //Scaling factor for the gradient energy coeffcient +int variants = 20 ; // Number of variants : input parameter needed for defining a mmsp-grid +const int dim = 2; //Spatial dimensions +const int nx = 24; +const int ny = 24; +double W_prefac = 6.095 ; //Overall scaling for the double well depth +double W_Al = 0.1 ; //Relative magnitudes of double well depths for the three components +double W_V = 0.1 ; +double W_Ti = 0.15 ; +double scaling = 1.0/(2*3.14*3.14) ; //Scaling factor, needed for Fourier Transformation integrals. +int steps = 10000 ; //Number of simulation steps. +double kappa1 = 0.001 ; +double alpha = 1.0 ; +double gammanuc = 0.5 ; +double kappa_c = 0.076 ; + +//------------------------Definition of global containers/arrays-----------------------// + +const int node_total = nx*ny; +double G_Alpha[node_total], G_Beta[node_total], W[node_total] ; +double hphi[node_total][12], hphiprime[node_total][12], hphidoubleprime[node_total][12]; +double gphi[node_total][12], gphiprime[node_total][12], gphidoubleprime[node_total][12]; +double strain_energy[node_total][3]; +double intenergy[13][nx][ny]; +double dGAlpha_dAl, dGBeta_dAl, dGAlpha_dV, dGBeta_dV, del_dGAlpha_dAl, del_dGBeta_dAl, del_dGAlpha_dV, del_dGBeta_dV, delsq_dGAlpha_dAl, delsq_dGAlpha_dV, delsq_dGBeta_dAl, delsq_dGBeta_dV ; +double G_Al_alpha, G_Ti_alpha, G_V_alpha, G_Al_beta, G_Ti_beta, G_V_beta ; +double epsi[12][3][3] ; + + +//-----------------------Controlling the number and type of output files----------------// + +// If a particular file is not needed, change the value to 0 +bool output_pfsq = 1 ; +bool output_cal = 1 ; +bool output_cv = 1 ; +bool output_chemnuc = 1 ; +bool output_strainintnuc = 1 ; + +//---------------------Definition of functions-------------------------// +void thermo_auxillary_terms(MMSP::vector gradient, MMSP::vector gradientsq, double c_Al, double c_V) ; +void customoutput(int t) ; +void calculate_strains() ; +void fft(CArray& x) ; +void ifft(CArray& x) ; +void intstrain(); +double nodesum() ; + + +//---------------------Definition of grids and grid variables-----------------------// +MMSP::grid grid(variants, 0, nx, 0, ny) ; +MMSP::grid nuc_grid(variants, 0, nx, 0, ny) ; +MMSP::grid gradsqcal_grid(variants, 0, nx, 0, ny) ; +MMSP::grid gradsqcv_grid(variants, 0, nx, 0, ny) ; +MMSP::grid intenergies(variants, 0, nx, 0, ny) ; +MMSP::grid selfenergies(variants, 0, nx, 0, ny) ; + +const double Lx = g1(grid,0) - g0(grid,0) ; +const double Ly = g1(grid,1) - g0(grid,1) ; +const double dx = MMSP::dx(grid, 0) ; +const double dy = MMSP::dx(grid, 1) ; +double fs = nx/Lx; +double k[nx], fk[nx] ; + +//-------------------Definition of user-defined classes---------------------------------// +class sfts +{ + + public: + double e[6] ; + + sfts() + { + e[0] = 0.0 ; + e[1] = 0.0 ; + e[2] = 0.0 ; + e[3] = 0.0 ; + e[4] = 0.0 ; + e[5] = 0.0 ; + + } +}; + +sfts eigen_alpha[12]; + + + +//----------Including the various modules-----------// + +#include "Array.h" +#include "/home/arun/Documents/mmsp-arun/fftw++-2.05/fftw++.h" + +using namespace utils; +using namespace Array; +using namespace fftwpp; + + + +#include "thermo_modules.hpp" +#include "strain_modules.hpp" + + + +//---------User defined functions--------------// + +double nodesum(MMSP::grid grid, MMSP::vector s) +{ + double phisum = 0 ; + for(int h = 0 ; h < length(grid(s)) ; h++) + { + int hindex = MMSP::index(grid(s),h) ; + if((hindex <= 12)) + { + if(grid(s)[hindex] > 0.0001) + { + phisum += grid(s)[hindex] ; + } + } + } + return phisum ; +} + + + +void initialize_epsi() +{ + +epsi[0][0][0] = 0.0806 ; +epsi[0][0][1] = 0.0301 ; +epsi[0][0][2] = -0.0642 ; +epsi[0][1][0] = 0.0301 ; +epsi[0][1][1] = 0.0806 ; +epsi[0][1][2] = -0.0277 ; +epsi[0][2][0] = -0.0642 ; +epsi[0][2][1] = -0.0277 ; +epsi[0][2][2] = 0.3834 ; + +epsi[1][0][0] = 0.3445 ; +epsi[1][0][1] = -0.1183 ; +epsi[1][0][2] = -0.0486 ; +epsi[1][1][0] = -0.1183 ; +epsi[1][1][1] = 0.1056 ; +epsi[1][1][2] = 0.0011 ; +epsi[1][2][0] = -0.0486 ; +epsi[1][2][1] = 0.0011 ; +epsi[1][2][2] = 0.0999 ; + +epsi[2][0][0] = 0.0895 ; +epsi[2][0][1] = -0.0300 ; +epsi[2][0][2] = -0.0635 ; +epsi[2][1][0] = -0.0300 ; +epsi[2][1][1] = 0.0759 ; +epsi[2][1][2] = 0.0214 ; +epsi[2][2][0] = -0.0635 ; +epsi[2][2][1] = 0.0214 ; +epsi[2][2][2] = 0.3847 ; + +epsi[3][0][0] = 0.0895 ; +epsi[3][0][1] = 0.0300 ; +epsi[3][0][2] = -0.0635 ; +epsi[3][1][0] = 0.0300 ; +epsi[3][1][1] = 0.0759 ; +epsi[3][1][2] = -0.0214 ; +epsi[3][2][0] = -0.0635 ; +epsi[3][2][1] = -0.0214 ; +epsi[3][2][2] = 0.3847 ; + +epsi[4][0][0] = 0.0989 ; +epsi[4][0][1] = -0.0021 ; +epsi[4][0][2] = -0.0226 ; +epsi[4][1][0] = -0.0021 ; +epsi[4][1][1] = 0.1575 ; +epsi[4][1][2] = 0.1592 ; +epsi[4][2][0] = -0.0227 ; +epsi[4][2][1] = 0.1592 ; +epsi[4][2][2] = 0.2936 ; + +epsi[5][0][0] = 0.0806 ; +epsi[5][0][1] = -0.0301 ; +epsi[5][0][2] = -0.0642 ; +epsi[5][1][0] = -0.0301 ; +epsi[5][1][1] = 0.0860 ; +epsi[5][1][2] = 0.0277 ; +epsi[5][2][0] = -0.0642 ; +epsi[5][2][1] = 0.0277 ; +epsi[5][2][2] = 0.3834 ; + +epsi[6][0][0] = 0.3240 ; +epsi[6][0][1] = -0.1376 ; +epsi[6][0][2] = -0.0411 ; +epsi[6][1][0] = -0.1376 ; +epsi[6][1][1] = 0.1322 ; +epsi[6][1][2] = -0.0016 ; +epsi[6][2][0] = -0.0411 ; +epsi[6][2][1] = -0.0016 ; +epsi[6][2][2] = 0.0938 ; + +epsi[7][0][0] = 0.0938 ; +epsi[7][0][1] = 0.0016 ; +epsi[7][0][2] = -0.0411 ; +epsi[7][1][0] = 0.0016 ; +epsi[7][1][1] = 0.1322 ; +epsi[7][1][2] = 0.1376 ; +epsi[7][2][0] = -0.0411 ; +epsi[7][2][1] = 0.1376 ; +epsi[7][2][2] = 0.3240 ; + +epsi[8][0][0] = 0.0758 ; +epsi[8][0][1] = -0.0259 ; +epsi[8][0][2] = -0.0278 ; +epsi[8][1][0] = -0.0259 ; +epsi[8][1][1] = 0.0771 ; +epsi[8][1][2] = 0.0101 ; +epsi[8][2][0] = -0.0278 ; +epsi[8][2][1] = 0.0101 ; +epsi[8][2][2] = 0.3971 ; + +epsi[9][0][0] = 0.3456 ; +epsi[9][0][1] = -0.1251 ; +epsi[9][0][2] = -0.0102 ; +epsi[9][1][0] = -0.1251 ; +epsi[9][1][1] = 0.1123 ; +epsi[9][1][2] = -0.0155 ; +epsi[9][2][0] = -0.0102 ; +epsi[9][2][1] = -0.0155 ; +epsi[9][2][2] = 0.0121 ; + +epsi[10][0][0] = 0.0758 ; +epsi[10][0][1] = 0.0259 ; +epsi[10][0][2] = -0.0278 ; +epsi[10][1][0] = 0.0259 ; +epsi[10][1][1] = 0.0771 ; +epsi[10][1][2] = -0.0101 ; +epsi[10][2][0] = -0.0278 ; +epsi[10][2][1] = -0.0101 ; +epsi[10][2][2] = 0.3971 ; + +epsi[11][0][0] = 0.0863 ; +epsi[11][0][1] = 0.0177 ; +epsi[11][0][2] = -0.0254 ; +epsi[11][1][0] = 0.0177 ; +epsi[11][1][1] = 0.0819 ; +epsi[11][1][2] = 0.0729 ; +epsi[11][2][0] = -0.0254 ; +epsi[11][2][1] = 0.0729 ; +epsi[11][2][2] = 0.3818 ; + +} + + +void initialize_alpha_eigen() +{ + +eigen_alpha[0].e[0] = -0.083 ; +eigen_alpha[0].e[5] = 0.0095 ; +eigen_alpha[0].e[4] = 0.0 ; +eigen_alpha[0].e[1] = 0.123 ; +eigen_alpha[0].e[3] = 0.0 ; +eigen_alpha[0].e[2] = 0.035 ; + +eigen_alpha[1].e[0] = -0.083 ; +eigen_alpha[1].e[5] = 0.0 ; +eigen_alpha[1].e[4] = 0.0095 ; +eigen_alpha[1].e[1] = 0.035 ; +eigen_alpha[1].e[3] = 0.0 ; +eigen_alpha[1].e[2] = 0.123 ; + +eigen_alpha[2].e[0] = 0.079 ; +eigen_alpha[2].e[5] = -0.0359 ; +eigen_alpha[2].e[4] = -0.0264 ; +eigen_alpha[2].e[1] = 0.0047 ; +eigen_alpha[2].e[3] = 0.0810 ; +eigen_alpha[2].e[2] = -0.0087 ; + +eigen_alpha[3].e[0] = -0.079 ; +eigen_alpha[3].e[5] = 0.0359 ; +eigen_alpha[3].e[4] = 0.0264 ; +eigen_alpha[3].e[1] = 0.0047 ; +eigen_alpha[3].e[3] = 0.0810 ; +eigen_alpha[3].e[2] = -0.0087 ; + +eigen_alpha[4].e[0] = 0.079 ; +eigen_alpha[4].e[5] = -0.0359 ; +eigen_alpha[4].e[4] = 0.0264 ; +eigen_alpha[4].e[1] = 0.0047 ; +eigen_alpha[4].e[3] = -0.0810 ; +eigen_alpha[4].e[2] = -0.0087 ; + +eigen_alpha[5].e[0] = 0.079 ; +eigen_alpha[5].e[5] = 0.0359 ; +eigen_alpha[5].e[4] = -0.0264 ; +eigen_alpha[5].e[1] = 0.0047 ; +eigen_alpha[5].e[3] = -0.0810 ; +eigen_alpha[5].e[2] = -0.0087 ; + +eigen_alpha[6].e[0] = -0.083 ; +eigen_alpha[6].e[5] = -0.0095 ; +eigen_alpha[6].e[4] = 0.0 ; +eigen_alpha[6].e[1] = 0.123 ; +eigen_alpha[6].e[3] = 0.0 ; +eigen_alpha[6].e[2] = 0.035 ; + +eigen_alpha[7].e[0] = -0.083 ; +eigen_alpha[7].e[5] = 0.0 ; +eigen_alpha[7].e[4] = -0.0095 ; +eigen_alpha[7].e[1] = 0.035 ; +eigen_alpha[7].e[3] = 0.0 ; +eigen_alpha[7].e[2] = 0.123 ; + +eigen_alpha[8].e[0] = 0.079 ; +eigen_alpha[8].e[5] = -0.0264 ; +eigen_alpha[8].e[4] = -0.0359 ; +eigen_alpha[8].e[1] = -0.0087 ; +eigen_alpha[8].e[3] = 0.0810 ; +eigen_alpha[8].e[2] = 0.0047 ; + +eigen_alpha[9].e[0] = 0.079 ; +eigen_alpha[9].e[5] = 0.0264 ; +eigen_alpha[9].e[4] = 0.0359 ; +eigen_alpha[9].e[1] = -0.0087 ; +eigen_alpha[9].e[3] = 0.0810 ; +eigen_alpha[9].e[2] = 0.0047 ; + +eigen_alpha[10].e[0] = 0.079 ; +eigen_alpha[10].e[5] = -0.0264 ; +eigen_alpha[10].e[4] = 0.0359 ; +eigen_alpha[10].e[1] = -0.0087 ; +eigen_alpha[10].e[3] = -0.0810 ; +eigen_alpha[10].e[2] = 0.0047 ; + +eigen_alpha[11].e[0] = 0.079 ; +eigen_alpha[11].e[5] = 0.0264 ; +eigen_alpha[11].e[4] = -0.0359 ; +eigen_alpha[11].e[1] = -0.0087 ; +eigen_alpha[11].e[3] = -0.0810 ; +eigen_alpha[11].e[2] = 0.0047 ; +} + + + + diff --git a/examples/Integration_with_fftw/fftw/.libs/libfftw3.so.3 b/examples/Integration_with_fftw/fftw/.libs/libfftw3.so.3 new file mode 120000 index 0000000..849153d --- /dev/null +++ b/examples/Integration_with_fftw/fftw/.libs/libfftw3.so.3 @@ -0,0 +1 @@ +libfftw3.so.3.5.8 \ No newline at end of file diff --git a/examples/Integration_with_fftw/fftw/.libs/libfftw3.so.3.5.8 b/examples/Integration_with_fftw/fftw/.libs/libfftw3.so.3.5.8 new file mode 100755 index 0000000000000000000000000000000000000000..73412e8f6e89de0b721cb6907542572045a3ddd5 GIT binary patch literal 1148280 zcmeFacYIXE_s4yy21Hy?At>ll4M^DpDT?4CprPris8Q4;gg_!GO9})*T@*ElWfe;l z%VLcpy7pLEzv|c6*Gd$X*f6N*+G9bUGj~3doO^b!zu)ux`~1e&Ff;G@+;h*AJGW-N zV8)zdJ9g+`nb66aV%eo!&HSjSIlq^YSbl4wl}7*ew+^zko!e@XGtoKPj!7+#)+pLV zWdpiirac4u*g})??d<(Ud)oDuNL$8fdnV=Eb)_w0U+-&g7yI3r28y&fZ;4LLb{(mx zwzH0f#t6hb)9M?h0!`m`nQVe$AZ3_RBKrk*nSD6FH`+wO2d@S0l$=Xc0BUKDJ?}_ znVPEpq0pJw=af#TcsS+z(l(z_eh9_2R6d&GWfXf;Ih&#ims44VXGlAm@|RF*`cd)g zsBFR}$`?~%FKn~ZRJf$M(3$E!lzABTDw*A(EU&ax6qivfq3u^tdM?G46vvb9d`gd? zbOhB+q4a2qeu_NIr@Fxe>L~W7x(rGmqI3kMBPpr_?mm@Lcu^;gf3s-&X%weZJeJ~E zirEx>6jOzM1g{{QM^XJAN>#Xp(nF~{6=lViB7Y|3*D63^oldOtsIGwGM@+A(-lw>l z>>MokkJwHnov3~yrAJbnL~%03DHK(x5ZiSZ<>N_nC1Vdzp3Jp{pHR1oL)2cCg0*dk zOu_%4i9&ZR>27C!D10}{?;<^&*oCCahs`d;*AV+ii7BiAzf>2kiBvxs+bX11s|?Z{ zLFo|2zoq;+tgN&qWD`%P!odbmn&zTypt^xBb&KJfGBcOu_fmku1f5t%BRv$UO1xw< zLFwa^j)wiWkoI6Yp1lqAg=}A{z8U-`q1Nd5L;4*Q z_aXKU*gll@q_{6d55-;-FQxheDE*tXyD9!d@jZ&_blQnxXNoFp)rtM@t;pYxI#V^9 z%DbrW6vd}0K11QuJi4x)4>?9>YVam4RsY$bGI+D|v+ zPiFPgi21bsSrpHvm`l-5F`wcI6ay4hSV^`{(pl?HZ2K^kbBLR84DmH67Z7|5 zx>~Sfsr)3x{$>M~UW9xlw96>H80>f2rUv|S*!&JDGvUa-NcD?AZiMz4he8+TqV7Ya zMMdvJ6eH5Rd zcsteSQaXU53Rya_##4GF^a{NVem$lCrFbL7W2pXqNxu26 zcsb=~QLGg8zlyRcE;SiS{|nz0x&ZrL&gyHaemyiB!5326MDb3FS!{b%eGiq-QyB`= zD2}6es%TS?%1;pQPU&%!&ZGD_Z8w9`uP7Zyd?%&fP<)NpiIlFPIFi|Ukhlt?i2X`+ zDy*aQ7M-esk;S~P?SGWUhzX9bL zl;@!<%9jE5W%V9nH`8_p61$qx(^%b!%*g5BC$W99>bC3{)bHI!bY?#BI*L8W&Yz<0 z-V`>kA$AS(MQyU1*dvr)Ew<;y!D5>;M44;lWY(Kh7i9G_Se|R=rQjE*@P}`c zDt{R4jAQmDu)Nu3JF#=YUrAAKbV(`sG|ELkRETR_bV~LE)5ckzXK&(#{~;e|`+9(B zUnBkyE2qi^0oPO8y28$Psf5JFvoYC2<%>vv3fLV~K8woLOygqaU-1I?U_{%HdC34u z8=2-*#(B06(~;UZF32; z$u%mU&U8If=nhK3jE&W_?V)UY!&O=Y9u@UVxQOz@C>FcyV+U=!zt~=EZWm8=(e!iS zYNJ0WdQ}Et;lF5=JNtvo($v# zkzXL}s_Gla_SqD#6IxR|%4CqfCCa9_6t>?0xPWYaK#_+|ypSUQF|n%zpO?aCA^F$h zxh~u9C44hRP80lnR^D6KI$xBPjXcKwplw&da1QJgnjKO4G*}nL{w=$e^j(=?7Pe=| zIw}QwkJwE3<)`#Gigyt^gW`I=G3B?5^1l_YrOFRe2*!~8sn}nNY6p6hO4G@YvxWWu zQ8pV5r%X>%NRbXATdz{ANm2Lz2JOSd-N={I$>z@#c?h7qpWsT9pMssnH>P}o4v2J0 z{ShRU3y}J3=bnn>9>gJ8~zR&V_t!P@Pt9NRb6@zGT z&+F29h~@3r%~~ExvrbyQpZ}ei`ReJ^ppMz;w7_++I;QSxYeJ@B}1PV&<|M28_=J9oA^j{9f8 zf!4Jhr+2En^fS-MjSX_~pD_dn~^{+M%=GYUu2>A{Tm^hlH#S zRyWVPz8P!0-j4t2H1*`Wj~o*6r**X#&>$0FVBz9STD0|*TQ#uW59^7F~ zr|iE6TU~z}X!XfErVp9;yi3|3|1q`nD7Qn`4#xy6njs6WpSs!`EwW}rx;5{&asL6e z*?%17KcLqOo!8d&uJd=ZXxCPD%Y1YoUW(L5NntRNp%jNvJd~n3R%j3QJFrod@-UhTV*q@-0{P4o?05D7~EG z6)4N|ahUkks8i1_)%io62d<}h1H~IDs-W&aHrToLe{QC%c|LV(JO0<)ZLBte{6@xZ zr~I81@1l4&<0^X(#d^W+MfpC#H=(?l(g!IvFQhbWy z(-fbf_$#t?0;WE{$-@Phhm2gbS+M? zGsP|xQw4L+tF9;0D0UON?xL)oi}s+{lj6Pdob!1G0z7Ff(@cn-9rvRc_`9hNY#B`2J-C|b#6HE5vWtoQASd9 zd)A@07!9q;t7mvVikTGU^K@0Oo;{kNp3RJ>IDz6sijyc#p?EY!KSdL!Qhpl6=@e%$ zuIi6v;wh?(m?^=#7Ir>px>b?>0A6V-LKdj6=MXQ+EC z6>=%fLp~p=uAy@V$_ptiq_~LUVv6Q|+UR6jOqz2js!)Pd*1*`DG~A zP`ZMmdX}}4;wp;gQ8eLvmRIZoQ8u~|_-dpV3f)CizJ#$$DPPOV%Fbm}UI%ssrD5dN zGh!apb6Os*rSc6FZ=`q=#SIiyP|uieMgBIVif^R+9Vp*P>D?6TDc(!*K8pX_unF4x zkv>4_gA}6_9|2Rg9!35!#vZ491H~u7oW~l;6V2G31|TOl|WY zD!%~sBGQ*AeHnSBX+-`NN?)b;8pYQszCrOViYmmBzKv9|cPOv!Ek9sPaTT_vU`>pD zg#0#2KSur&N`xAA4Bi&8u9+mH?-?8v#LHt>fdB>ve zO?go76xDMI^&O51^7)>62dLgF^+LV+KEb>LH1BEBQK!B?Q15B@_Xl1o52QGVq6+H$ z2Y-G!6kOG*_jT%O7+do(G-uNIGy4Qis~5%-9NWI7nx0Y6XsCsjH0;I|Z^A5=PW70*?EM{6$N4MOrLA?)DVF}ZeuzV@Y zD_t3t%LP+B2&SI(Rivn|BvwUn8S0iJtwE}6qzWrgZ=Thu?>bai#kM<-^6Gh;dPl#S zaizP6mDjMms=JuV>RI@u6zN$*TUd+yWk}Z{y_{)`SbdLmC3u+9tC7EkQuW^BT9iNQ z+`Z_t+iv@F+N{e*-?ewI58vNDBvg>+6m>JYC39TC6!P6cx&S@%D?P8{>5{K1b1y)@ZH9@?(IBxV7Kl?op%208@Kb(zi)V~ zSL24qPk;E#T{|Bf^+x)R(G<5^uWj{FYCSc(cq!R<_xL%J->3Ki#h3Tpc0|9$kMx>t z&73@o;z75UN9R(i;t7Z+QmW$M&;Hp~_}$B+TRp!#^Ca!(4@&=}I4OMH)W0a*jrb3x z7tsFqQ2KW7%F}*+ar&)8dcA+jb+qs5OOBm9tZe&l%P5^dJ};+q1>#Cd&!zZupR0GD zN9pcYpFi!N{f`0bLhcFm>-4*E0y zHrn4qlossMz35>|_bdPAp~om);qjln?aTf}pFDN?!=vV{Y5e|C?-{pUJ$d68%10>8 zpE3O4Ov;a?co&st27)K-TsHI7*?n3DTzAOOoO>_nw__8<9(fy|-%RO)6t|G>v$2=l ze9EM}C#oaIH}{)<&e+2uI|od8^NM>;xa*?rp2oFf^SwPk99#azVf*=B+*U~W-CI`zKKO!Ny14 z3m1H{=zNJU+(|n>Vmqv$j-1ItM=@*VAZgDDL?s!DRa+y>*rT4`19?dJ$oK^ z!|~rQUv<@{z3=}0^B2GBUwuWFPomGR`ShFm?{dlJXKPPiHTJrT4tS!f@VS?1+Yhro z-u7C*=pnOj?(t~pn-A|Ev*w%&f@y(m`I$$(+G+Z}M?HFYS*-KjZ+}#M;jvdu>U-n) zpM2Q!!|fEK1J?EHP;vU%Ur_#uOU`+5$#ctsn?IPhY+v85uDuZVqqH~0vG?CsdH|(E zdOiGuO8ZjWntMRQZrZjyC;VIHd*9DG@zQ=f3h$l0{oXU@pK@RCje&13_r0p(F2wIC zJ>j3>Z`tYPmEZnIiOZ+$k5DpV<&~W-O|6; z{f})KJ8Dnm{G*rU59l!bgB@=_^z8G~{@gO>v2*YEdM_%k$SGL!N2kK04*BZj(hi?q zdT;@4JDBpPtUhDVwyN-=+isY)s(jntUu_&UyVy72zV!oXn?u!hHyk^8CE`(!7oE0> z^1DlGe*5^P4_2!DWMUUks^V&j7b>4N4EXt!k?;Ij*yrt2C!E%`dDaunf^%+4Q^Sn_f*U$}JG?y;1=i}p8;(g_q#zw*GpzJ2$Hp8sU7|MG(E z8~1d`TL0xkw6Aw-<9$0(z6-@S27LWl$!-2CpIvy=<~Gy89bzbQ$6nBxWAM&pF{SdOXk;)If@X?x~ zl)tyrZ3C}b_tm1zm3O~faQuZiJIKcMWV7$sH{RKL%;S6iwR6@jm*t)D+takoRaZ=C z^{kEeUH#RX)mb|}&3WgL{|=o-HrDsPf9k~(K6o=@?V7FkQlE_cu>1aVzFGDC8((g` zziiL;AAY#}{V#slQ69~_WW+~rAF_Vw?WeEZ`o*CejvjhS-yOq#U2h#qX$HmOywVpA zqx5FaH}!A)_oeT8{CdM7rEg{S-cI}8(*Nb&8>g>${@cbY*T3Gm|LeEhxp((H)9;*c z;%hffj8oa4=$ptaSoZ4+7Y)sxK{lQs8y~e?^2lt;?|oCzre~@A!v{CiZLG+;cfY5y zZW!KuzuB){cunT6X&-O9t>FIOI`q1;<>D{jDfs>RuFb`?%}1nPIpWr;r%8X?-orAV zr?kT-uOB}4pP|=R7Pfxe`I@T>eqHVt;v$C4{p1EXm@h2ah zyZr?J>K`vUdenyc1I}OF@533_OBUxssBFo!-bn(dH;a-SH6E-mph*(?c7INPJ8yj|Kx6={Auw+7WRLt&s%R$+itu0 z{T;q{uNt+H(#jhjzj-X>@1p#j6gxlu#LO;B_v zpJm*+Gi!Za*$W-NIJEMm_uj59|6G!m=ZxyL`Gnt|e|z}BUy$vuPV{`(Lh+B? zSM44(_oVZ_-*jVZ&&}Q$Kdit0@+qH9T6@6_m%p{T^y9nVJ#pd>2kh=Y^@fxC?EiS) zkMDJ*>y54JA9=6gvhV@jD6irf2VT&7Z%S3%hhh(k=g~e7soT18(5O3izEG2Y;D37F zx})-jy0YpIf;D}Yy!2Jwm5==KO8@=G{?%{X_yLyKCyo&2y%8FWzy$mGe&h zx^Bo_!^zHuS023ivXb2o-}hztuD_brWnb~c$m}zxgkKp&b=$8S`0zEahVx(ebIf%+ z(@I9qI;Cml{M-}9Z&`K!gs*pev~qYx!^qjBd$4DuZtNwSrdF=nP%`tD_jfG$H1FGW z*{i-q|tATqCAR|4XoUiVF4I zF%|Dm+?ztLp4s+F!H+vMwVmN=$&Yv#!C+(kF|466QT;2Y9 zQ?&OQVyXH~J)2I&k8#=WRG0St<_2im-KIP^hF50vr$ zSa5HelMkZFW{*pi_H#Due297C!#p`1e8(`Y4=g5w6wF+`#LoAyLQAwiW*l$sto2d# zpp}9d_qnj+Tcqt!(GIoXaqzC-@6q&Ael}mLEvJL8r}=4fJop+2UWxvR9F`&Cth&JMH`g?w{f0 z&td+AF@Ipj{<|-`y_nC3qg_AJfo$_f$N>tbf1ZK;xW{RKFumwk`uJ;3eRuHaQ%-(| zX%`;gn*KQn^Q3v5?zdOq&wA)Xcz8%|*x^%}#%jOOGCd!LgC9l*tj#gs4h9cn++$+g zcMZ|{NPoRwWB*h#Xt%3Yb8^oPi@}3fH_U$fV83~5wLSy-1a+XY<9%>1o0xH*(hvMc zC->~FxgQU&&3oET&?g>s>IY^}(Z!2@5zp9hbqhrCSxE_fUdevSSsaDS##pGm`^ z`XPuHG$U+l^gMJd`WfeuQt-q2Xdd22uSmxJxtLcL=8qTpqoEJ=bm~tA5AN&abF#F3 zZ%FssX|S^x`eu()zY;vq+sUs2kL>T{cYyo*IQcOn(JtZt6UKf&r+y69RiAo^Md4MQ zSX=18QT-WOqWw4Lh4Z_iU3hsg6z!Ufc^+vc0R=P9dmaLRp3w8(^z(zHvFB}`-k~{O zywK-8>C_*Hbt8;*!|XT9=%04#r-MhIbMjM-{y$D$1Rid5@^cM;!^szqLA%6t&gDk` zzEgkTXswT4q5JbuyO-!&51-~iv2Gklo2&lu{-gWnWavjzM=2h?UUO}Y-p7y9JhogD z(?3HU!#dcH;Jh;)d;)cd>Ytce04bR3=O;#MZi)V^fXuf@>d%%oWT5%o^VZNFE>^)4|i4(db=s*Ot$BQELqDQJ2?K&5F zYl2f>jO*}3h3;qd97lz#jDC_+A2RFn1G?XqXt_0xWNN=&d;l;I`~=KfKjy6-WqNmw z^~5LElK{p&D#m>=Etqz@?$Yft=a)Y4Cl4PJrD4D7I}%&JSo^sEycp+^X0hKpG4A0( z&T(%Xq3!rFf4s1xzAI7o^NO7If5Q3Ex=#1!d(i)icKO8m9EU$%aeQqTiV!V8toa1#Lj(5+M+Rkj~)q0@(_u#tdIPgDUC;Yh6&QSDoAgJx! z3;mmBp4{csPbT-2{bpQ0m~puV=RuD+4=zQ!ygPKe%zE_~?Bv~|_p58^+aS6@Q1<-? z>V7uIS3T^6w`%1;__+<|h4`&nUkR?JtKAQqwf!%_e;J{99>(3AkH#IYdEjPk=XqlX z_CvUTSqk3sP_2(&to1ZK>~JUgEi}W~Z%@FVM5*>C2l{9)ZO4C$Zr3{SA8{R(5c4V* z{`-S^zvem2dpI6FIKR-cW`|SYfA|KiUk_f3=UTyAoaei0%&XWs?dM54v5ui-&>k0j zC}z%6`|q!Lb6ERN&9TFMm=9htALi2muI$9{vDMMguN$O!AnLrX*a+@<(#bcW|0Cz< zcA4|z7WkRhhdP|Xfw2Ds?08>x+W8v&77_O;CsVtXpUwHY15CethxIBvU$@sBcU!#B zPuKSM!+t*ikIr!NUEr}}oxJlvZO5PO*AKtY;h_36@?8g8w;g)_XmD{}cmnHo zY?*W2UQYer%j#=26i|kOS$}p=hb#NRcXYc(!v1FLSN-9O3e+4stiW>^zq)~?V8-hz zaIeqF?*jK_I{DM!(JUu_+t@kW$+M|Bc0b@b!!&#E^c^Ae!SPQ0-dLByH|cr)BlNqW z4^4FH_oD$-_G6Qr{F1TyJ|*ufZHEp+JE(8kl-`Tyw6rYP;cm=x>v-Ltrr(aHfN;~wAX9QTW%58^{uJ(~0#ewMZq$93a8?Duq>kAk>Q)T5@q*|z%)$0MC4?C>Pk z+d#f^y*(M{Yj2HiZw>Uhv{2aXy_Oa_3TE5~ne_zEu}_7*)vSlN>UnFVfKF-s`neh^}PDFQH5sAhdkVmWNU04M-5bd`qYaF3UoNwVIs~K)$3I&S^(|PigPBL>rh1JA=%+ z_o7pOIC%UOCqEWE`nHqbLq%mjiurJ&cGEf(>wn;CJ%5hU)6^O|SnKop>Um<;?Kt$I zX00C#KRaUFgIDVL^E~Wt#P}w}_^ze_QvP_$wH;cH?4Z8eRJ zkNtY_Jl4#&1L*mrdM}wrf4->#b&DO=!%k2>9WcWhho0v4RX%6@m}p` z;3>Uwn)$W{Jl;{SdxoDpM(ac3`t8PHXfN(J&3@m<{E1=ynDeRnPG9v;yij+16#YLF z`whpO{+x_)^quJ($9Xu9cyH0;^^o0K`kNuF1D>Uto97ju;XGnpm1Zl=d^ntTXU{A3 z@jV6VE<32#3W|p>)%<+;`J1tGwbM=m=BFp3g(a}FH{K&hu663Y;Gr9x{4MZk7u{pV zPnr(o5A{Jrw+rU2{z8g;+vqtCL`>uF`*hx>PPT&U&C z-Y>@eQuzPIQ0Onzc6!i!Qeo(D&EvSvT%@seEFCzuecT6`_C+ zLtrOyv(rvLvtQhI8-IpiJ+ZK!nD!os{;|T^|DCXZ55_%+{?tbk{T-$`9yfNdm3KkE z1LNL2$~o?@QN8MiAg%}K_S_EL;b-DHZD$(zb`mJP_hap0F?a{~@54Gw%ak2PqyMe{ zI{U3Nu1f>QYCAVUzup{o9h~FUWwhRJHSw}Kebo%cY8i?alALs=1L#Hyfy3OYP8pTr?&Gv{J9wC$2>gu@PhBgI0k=m z`qRIcwjV9fd@l6khHD^ET^EIpr-?)%q&Kq)sNt%go69s93;p;}u!Hx2BfxLPJn`YZ%y{qs?EA+$ z?Pt-1RQB`II@-#IpnsYc9L1v;@Oj|7NT&VK?L7h9U71Z{&uu6U1|MJxl5D@6bO9{L$uo=tJlqPl@gydOcx>M==jWSbwerSC_BKeq^oI z(=@Zg)!1(ge@JM?z4kDz_g|&kWyb3pb9`ku`z`3zdTWo9UqI7I?KhyH_i?zGG*?o)q|Nx^XSze};# z$$5GmqvqRT0Q4U92b&a(-UseI*~zDY=czxkWcrPn@JGy_vFL|HxgHmD{d20ZU*xn? z3?9WFL>hnY9;>gzLwLUTj=gvKy*7-Cg>f4y$DPX)yF+b$Yk14TDPc6;}u1A&5R?cGnGFf z@!eWDOY`QCv!DNf-h=C|)$o5bov@UhJaJw-1^sVfyegnS2gjXtn6_{Hxf*t&!cOB} z+I|Ap=L=xx5zL?F^PKbNRdDZ>PCgFjshF5oKjZo&i0hNVusF}|`li-2hocw6CHz?Y>hc;BlkzYLTeG~m3#q|ji>nj}Z&G-&&E%v*U zPBh9N^J62XUDa4O!k_7NV*~X0uoK2}41E;S^MCNrc0GTNf&L!&9~1ujaD5)b`O&QZ zZ=s+4=x4f|v%@!-CvhC7dN1^QDSfp6@q@I|9H%c1M?bIE^Jl7VhP4&`Gz)*4VJG5s z+W8ecIM~Vmi~b3S>-O$=Z{o{v>JI^L9_i$VgNM|GD+S~KOz_}1C%+i;HgKAA-p-)Y zgc?Ubo`0J2!Y3m%Z^ro|!`=)1b`qIY`WUX0j{{#nR$oUg!F3e6&AJZfmpINZheO{R z{T#vbt3lu&(G8cfAL_6B-?Zx~%ug$%Ez>e$hka-Y+IsZoWbksVGa;-qlfVbjiAm}6 zuF>|V!_ng?RXm=r0i8zea4oKXLRaXSb29iE2YxcVq$FCRPD_)BImXLc&@5lWw zO(#1XNbV^ffS+{u*g<{vub!XRJ*wNQXEpr>6UNu7(tIfN9@t6X`g}8Z77d)eU%c1T zThVWTnd3{nxTj#o_Xybc;rl@I9OFy$n@{w^TJVGzuP10nYQN$8o$LG-dwuR{`Na1> zhoV0{c>ZjT$8lKyV;gl3nDfH7uoHkC(?7M;A!@(PN9vZEahVM}{!LChPvZFX;QBcm z{gw}XbAwaA3*+d)`Y;{(g?s7!Ch+}+Io@x^x|CR^?U;UkZ?x8X#Coef2U6#+sJIUN z0PXdQe)|H)MKhi|ZG}HCVctf?d&6z;KZg4hv3Fhsw&>xkdxgY*#gP%huVx{+< zrB^WXzT-mhK(3SD1fEyme>c*LZu`>hhjpI6P4feYTycvHF^$xiDGfCx7Kzxt7 z3&&COT0IXI#kWD=P~ts*1_KMft@gg$rSAQAHsPW1DtRtg=3Bgp%4RLh4dxeDX!*H?73G;6vt7?LK7Ems2m+8 zl~onxE9mf{BZa2EHepxUvkUbMv-wt7k{_%rT$o!~TvmW7SXo}Otgs@ty3$NZ>hN5e zy`_aTn=1-RF$~4DTbiRZlm+E&Q?f9>vbv%$x3H$LpxQooNCGq3?=sUD%0DU?@3nW> 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%0D)$@`#@pd$4{dmPxA_aW7mMJ#EpP`Bz2 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

nLNUq3U7Y@4!) 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 z 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
mp$gOvjbOZ4%QqW= zG!oU!&twe=o(jd{B6riF%;!c{W|4!Fw#`#=c1T{x-!y4!Vs$cZ2*br``R2)PJ}aZu ze>RPZ{4I{)Oaud4GbZ(I7%&9B%IZr6+GP0h7KwAs*MYvU!mcH!Wk?#h0`|136c5sL zd0t-WoB=_g6y_$q8Xah-hgc{u%P2D>7P+I9>WcA@o%qfuW*3BgRe5W-$$XCUsRNle z&O-2@W|19gP@lqx44WU)Yx+3Kw7Ce=3l$ak*DPy!6Dur}Gk?SJm{b>stL$^s5 zOc1Pk)ykI}?I*EjFa8qrUwrVX&l1=y%_7y#+Vc##j5R!@dn2r=v(7ZSI|f-I0iGtS2SIVYYu2X%IIfpP8fwoBniO3)Wz{Ng-iFmE zW)CB^^xd8#XR|=rvO*;T1a$7w%v&J`kPCYf=PC9y)HEIk8vJ9ouiyF8s`+&R1o`>12MmCqtPEF-e>vA8T zO)3V~BO`2E&Jfj&P7h^cauZbB5XU;1cuvMZC{wj&nyvYoUy#ix@@qIVvWz6-C&LXo z_;$ak^(_n7<>6|Fm^h1YeLXjdkuw_1Nw8yTk5xp-sL&G5z#ByKu}&AvA~?hs>O7X( z90%m%8riPQ6J?!Wl)a9{&9p@YxrVH@XmO00k?e%%6e1ti}O)4Gx;L9 zVSZuv%XvtaT8Qki5t^53ITy6cJ7VZ{bg_y*X(>rS=;e}`;I8ulsx*$SCnf&S?a1_9 z$;}$krX5LcfoTpi2NReq`>}TOXm9O?EX??`=LpV?YJ^Uzw*6l)k!gC5@)L17h#lLH zjGS|hT*eiu%dkJuAW$>Vp}xjs&5*5dkj}y0eC*J~^?8b{N%!@#vZ>$nOq*!1KZrE4 zPA}vy-31%AKLzBXPbbq^yqb(jP*{^+*A8pn;uQHg&a|mRuGF3?Mdgq#Eq2#xX4&ja z*7Dn&X^uKG1Q|U>?7GZN*kMp&+xdtq@Flv`c(6d%eTG$tdi2~Fj2WXHFmp6O*>)sU zp_e1>i^N~E<&s}JJU|r38!}79OiaTz^%Sg}W7E&t550klVk3H%(jhHa=P5;P%NqE) zF?O~-;VPrj^Qw0GMq4pChu?`1=J~FkLb~R_NZOuXt zu@ZR@8U{w%4VlW&4swPQbck7bC0CYNi=S<|7&#yEG0W_vSx#cKU7)gyeR1Yna@mr# zR1d5jJ-&_FHkYqG(#!I~jJ~?sG@aaE(&cI5oiB~X7!n}L4v?m>EaVwN8_f+cxq)V` z57Dxy$V`mrP~j*r%#{XJkkwb4IxLhhZX3LfE;`)@w|q2I**{sSqd=6u4EMs7*%E^9 zZcT>_wG!KdV@fRTj7=HL0%InbOB*#U@w_s75h+Y7zf%~aSx0`&%*q}b$=eXJvcBCp z>3ch2_p53|MT9ajpcjH-N_|8x>#z@3COI2yM*{9vlcc|SU`~9W99s=PPV;Q{{6fD? zPWP7&%nMm!N9pGJ^$s6F`m(E%v6>h-% z|95dd@ z_xe2^pXS@u<14i7e3;+KLjLDm`bVyKdLHF-ANEuEH4Wu=G)d&M776buHjVT=j=shz zWBsxG7bCsOp}%(zdkJ}b;4zMCdfh{u`7?b*FiqjRkIM=7lgE*Ca>stGcV3UnNj`lq z(($;;4|pI!PjsA#(yzbB<>#>%^gK|09<>?d^G{Mw&*Ocg{=FZjXa2mtG)}(^fpLt) zx4L3lJub?h=16-;R*(Y6^M~bT?$?_;*VEU^Uq1b=pLlv6PvnOckS^B$o1*lK5AiR- z@HqV~B*cMwBf2annm_Gp^>?0r^{0M}^%bXoSCoDY>DT^?>2HnFuOt0B()Yed2y(yP z+_|3KA%AMSls|bsBtG4b>o5oEjqwlD1R@~_aOZ$Zy-T0jy!x>PBi}l0UVkBX%P-}SQ@>h*O~3+Xh)I% z$G+~Mb^|*_(JVLpf_#A@lRcL_`TZ09D+O + +// Turning off argument checking with -DNDEBUG improves optimization. + +#include "Array.h" +using namespace Array; +using namespace std; + +int n=2,m=3,p=4; + +typedef array1::opt vector; +typedef Array1::opt Vector; + +using std::cout; + +void f(double *x) {cout << x[0] << endl; return;} + +template +void g(T x) {cout << x << endl; return;} + +template +double h(typename array1::opt& x) {return x[0];} + +int main() +{ + array3 A(n,m,p); + double sum=0.0; + +// Sequential access: + int size=A.Size(); + for(int i=0; i < size; i++) A(i)=i; + +// Random access: + for(int i=0; i < n; i++) { + +// The following statements are equivalent, but the first one optimizes better. + array2 Ai=A[i]; +// array2 Ai(m,p); Ai=A[i]; // This does an extra memory copy. + + for(int j=0; j < m; j++) { +// array1 Aij=Ai[j]; +// For 1D arrays: many compilers optimize array1<>::opt better than array1<>. + vector Aij=Ai[j]; + + for(int k=0; k < p; k++) { +// The following statements are equivalent, but the first one optimizes better. + sum=sum+Aij[k]; +// sum=sum+A(i,j,k); // This does extra index multiplication. + } + } + } + + cout << sum << endl; + + f(A); + g(A); + + vector x; + Allocate(x,1); + x[0]=1.0; + cout << h(x) << endl; + + cout << endl; + +// Arrays with offsets: + + const int offx=-1; + const int offy=-1; + + Array1 B(n,offx); // B(offx)...B(n-1+offx) + Array2 C(n,m,offx,offy); + Array1 D(5); // Functionally equivalent to array1 D(n); + + B=1.0; + C=2.0; + D=3.0; + + for(int i=offx; i < n+offx; i++) cout << B[i] << endl; + + cout << endl; + + for(int i=offx; i < n+offx; i++) { + Vector Ci=C[i]; + for(int j=offy; j < m+offy; j++) + cout << Ci[j] << endl; + } + + cout << D << endl; + + return 0; +} diff --git a/examples/Integration_with_fftw/fftw/Array.h b/examples/Integration_with_fftw/fftw/Array.h new file mode 100644 index 0000000..e32f968 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/Array.h @@ -0,0 +1,1652 @@ +/* Array.h: A high-performance multi-dimensional C++ array class + Copyright (C) 1997-2016 John C. Bowman, University of Alberta + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef __Array_h__ +#define __Array_h__ 1 + +#define __ARRAY_H_VERSION__ 1.52 + +// Defining NDEBUG improves optimization but disables argument checking. +// Defining __NOARRAY2OPT inhibits special optimization of Array2[]. + +#include +#include +#include +#include +#include + +#ifdef NDEBUG +#define __check(i,n,dim,m) +#define __checkSize() +#define __checkEqual(a,b,dim,m) +#define __checkActivate(i,align) this->Activate(align) +#else +#define __check(i,n,dim,m) this->Check(i,n,dim,m) +#define __checkSize() this->CheckSize() +#define __checkEqual(a,b,dim,m) this->CheckEqual(a,b,dim,m) +#define __checkActivate(i,align) this->CheckActivate(i,align) +#ifndef __NOARRAY2OPT +#define __NOARRAY2OPT +#endif +#endif + +#ifndef HAVE_POSIX_MEMALIGN + +#ifdef __GLIBC_PREREQ +#if __GLIBC_PREREQ(2,3) +#define HAVE_POSIX_MEMALIGN +#endif +#else +#ifdef _POSIX_SOURCE +#define HAVE_POSIX_MEMALIGN +#endif +#endif + +#else + +#ifdef _AIX +extern "C" int posix_memalign(void **memptr, size_t alignment, size_t size); +#endif + +#endif + +namespace Array { +inline std::ostream& _newl(std::ostream& s) {s << '\n'; return s;} + +inline void ArrayExit(const char *x); + +#ifndef __ExternalArrayExit +inline void ArrayExit(const char *x) +{ + std::cerr << _newl << "ERROR: " << x << "." << std::endl; + exit(1); +} +#endif + +#ifndef __fftwpp_h__ + +// Adapted from FFTW aligned malloc/free. Assumes that malloc is at least +// sizeof(void*)-aligned. Allocated memory must be freed with free0. +inline int posix_memalign0(void **memptr, size_t alignment, size_t size) +{ + if(alignment % sizeof (void *) != 0 || (alignment & (alignment - 1)) != 0) + return EINVAL; + void *p0=malloc(size+alignment); + if(!p0) return ENOMEM; + void *p=(void *)(((size_t) p0+alignment)&~(alignment-1)); + *((void **) p-1)=p0; + *memptr=p; + return 0; +} + +inline void free0(void *p) +{ + if(p) free(*((void **) p-1)); +} + +template +inline void newAlign(T *&v, size_t len, size_t align) +{ + void *mem=NULL; + const char *invalid="Invalid alignment requested"; + const char *nomem="Memory limits exceeded"; +#ifdef HAVE_POSIX_MEMALIGN + int rc=posix_memalign(&mem,align,len*sizeof(T)); +#else + int rc=posix_memalign0(&mem,align,len*sizeof(T)); +#endif + if(rc == EINVAL) Array::ArrayExit(invalid); + if(rc == ENOMEM) Array::ArrayExit(nomem); + v=(T *) mem; + for(size_t i=0; i < len; i++) new(v+i) T; +} + +template +inline void deleteAlign(T *v, size_t len) +{ + for(size_t i=len-1; i > 0; i--) v[i].~T(); + v[0].~T(); +#ifdef HAVE_POSIX_MEMALIGN + free(v); +#else + free0(v); +#endif +} + +#endif + +template +class array1 { +protected: + T *v; + unsigned int size; + mutable int state; +public: + enum alloc_state {unallocated=0, allocated=1, temporary=2, aligned=4}; + virtual unsigned int Size() const {return size;} + void CheckSize() const { + if(!test(allocated) && size == 0) + ArrayExit("Operation attempted on unallocated array"); + } + void CheckEqual(int a, int b, unsigned int dim, unsigned int m) const { + if(a != b) { + std::ostringstream buf; + buf << "Array" << dim << " index "; + if(m) buf << m << " "; + buf << "is incompatible in assignment (" << a << " != " << b << ")"; + const std::string& s=buf.str(); + ArrayExit(s.c_str()); + } + } + + int test(int flag) const {return state & flag;} + void clear(int flag) const {state &= ~flag;} + void set(int flag) const {state |= flag;} + void Activate(size_t align=0) { + if(align) { + newAlign(v,size,align); + set(allocated | aligned); + } else { + v=new T[size]; + set(allocated); + } + } + void CheckActivate(int dim, size_t align=0) { + if (test(allocated)) { + std::ostringstream buf; + buf << "Reallocation of Array" << dim + << " attempted (must Deallocate first)"; + const std::string& s=buf.str(); + ArrayExit(s.c_str()); + } + Activate(align); + } + void Deallocate() const { + if(test(allocated)) { + if(test(aligned)) deleteAlign(v,size); + else delete [] v; + state=unallocated; + } + } + virtual void Dimension(unsigned int nx0) {size=nx0;} + void Dimension(unsigned int nx0, T *v0) { + Dimension(nx0); v=v0; clear(allocated); + } + void Dimension(const array1& A) { + Dimension(A.size,A.v); state=A.test(temporary); + } + + void CheckActivate(size_t align=0) { + __checkActivate(1,align); + } + + void Allocate(unsigned int nx0, size_t align=0) { + Dimension(nx0); + CheckActivate(align); + } + + void Reallocate(unsigned int nx0, size_t align=0) { + Deallocate(); + Allocate(nx0,align); + } + + array1() : size(0), state(unallocated) {} + array1(const void *) : size(0), state(unallocated) {} + array1(unsigned int nx0, size_t align=0) : state(unallocated) { + Allocate(nx0,align); + } + array1(unsigned int nx0, T *v0) : state(unallocated) {Dimension(nx0,v0);} + array1(T *v0) : state(unallocated) {Dimension(INT_MAX,v0);} + array1(const array1& A) : v(A.v), size(A.size), + state(A.test(temporary)) {} + + virtual ~array1() {Deallocate();} + + void Freeze() {state=unallocated;} + void Hold() {if(test(allocated)) {state=temporary;}} + void Purge() const {if(test(temporary)) {Deallocate(); state=unallocated;}} + + virtual void Check(int i, int n, unsigned int dim, unsigned int m, + int o=0) const { + if(i < 0 || i >= n) { + std::ostringstream buf; + buf << "Array" << dim << " index "; + if(m) buf << m << " "; + buf << "is out of bounds (" << i+o; + if(n == 0) buf << " index given to empty array"; + else { + if(i < 0) buf << " < " << o; + else buf << " > " << n+o-1; + } + buf << ")"; + const std::string& s=buf.str(); + ArrayExit(s.c_str()); + } + } + + unsigned int Nx() const {return size;} + +#ifdef NDEBUG + typedef T *opt; +#else + typedef array1 opt; +#endif + + T& operator [] (int ix) const {__check(ix,size,1,1); return v[ix];} + T& operator () (int ix) const {__check(ix,size,1,1); return v[ix];} + T* operator () () const {return v;} + operator T* () const {return v;} + + array1 operator + (int i) const {return array1(size-i,v+i);} + + void Load(T a) const { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i]=a; + } + void Load(const T *a) const { + for(unsigned int i=0; i < size; i++) v[i]=a[i]; + } + void Store(T *a) const { + for(unsigned int i=0; i < size; i++) a[i]=v[i]; + } + void Set(T *a) {v=a; clear(allocated);} + T Min() { + if(size == 0) + ArrayExit("Cannot take minimum of empty array"); + T min=v[0]; + for(unsigned int i=1; i < size; i++) if(v[i] < min) min=v[i]; + return min; + } + T Max() { + if(size == 0) + ArrayExit("Cannot take maximum of empty array"); + T max=v[0]; + for(unsigned int i=1; i < size; i++) if(v[i] > max) max=v[i]; + return max; + } + + std::istream& Input (std::istream &s) const { + __checkSize(); + for(unsigned int i=0; i < size; i++) s >> v[i]; + return s; + } + + array1& operator = (T a) {Load(a); return *this;} + array1& operator = (const T *a) {Load(a); return *this;} + array1& operator = (const array1& A) { + __checkEqual(size,A.Size(),1,1); + Load(A()); + A.Purge(); + return *this; + } + + array1& operator += (const array1& A) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] += A(i); + return *this; + } + array1& operator -= (const array1& A) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] -= A(i); + return *this; + } + array1& operator *= (const array1& A) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] *= A(i); + return *this; + } + array1& operator /= (const array1& A) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] /= A(i); + return *this; + } + + array1& operator += (T a) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] += a; + return *this; + } + array1& operator -= (T a) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] -= a; + return *this; + } + array1& operator *= (T a) { + __checkSize(); + for(unsigned int i=0; i < size; i++) v[i] *= a; + return *this; + } + array1& operator /= (T a) { + __checkSize(); + T ainv=1.0/a; + for(unsigned int i=0; i < size; i++) v[i] *= ainv; + return *this; + } + + double L1() const { + __checkSize(); + double norm=0.0; + for(unsigned int i=0; i < size; i++) norm += abs(v[i]); + return norm; + } +#ifdef __ArrayExtensions + double Abs2() const { + __checkSize(); + double norm=0.0; + for(unsigned int i=0; i < size; i++) norm += abs2(v[i]); + return norm; + } + double L2() const { + return sqrt(Abs2()); + } + double LInfinity() const { + __checkSize(); + double norm=0.0; + for(unsigned int i=0; i < size; i++) { + T a=abs(v[i]); + if(a > norm) norm=a; + } + return norm; + } + double LMinusInfinity() const { + __checkSize(); + double norm=DBL_MAX; + for(unsigned int i=0; i < size; i++) { + T a=abs(v[i]); + if(a < norm) norm=a; + } + return norm; + } +#endif +}; + +template +void swaparray(T& A, T& B) +{ + T C; + C.Dimension(A); + A.Dimension(B); + B.Dimension(C); +} + +template +void leftshiftarray(T& A, T& B, T& C) +{ + T D; + D.Dimension(A); + A.Dimension(B); + B.Dimension(C); + C.Dimension(D); +} + +template +void rightshiftarray(T& A, T& B, T& C) +{ + T D; + D.Dimension(C); + C.Dimension(B); + B.Dimension(A); + A.Dimension(D); +} + +template +std::ostream& operator << (std::ostream& s, const array1& A) +{ + T *p=A(); + for(unsigned int i=0; i < A.Nx(); i++) { + s << *(p++) << " "; + } + return s; +} + +template +std::istream& operator >> (std::istream& s, const array1& A) +{ + return A.Input(s); +} + +template +class array2 : public array1 { +protected: + unsigned int nx; + unsigned int ny; +public: + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0) { + nx=nx0; ny=ny0; + this->size=nx*ny; + } + void Dimension(unsigned int nx0, unsigned int ny0, T *v0) { + Dimension(nx0,ny0); + this->v=v0; + this->clear(this->allocated); + } + void Dimension(const array1 &A) {ArrayExit("Operation not implemented");} + + void Allocate(unsigned int nx0, unsigned int ny0, size_t align=0) { + Dimension(nx0,ny0); + __checkActivate(2,align); + } + + array2() : nx(0), ny(0) {} + array2(unsigned int nx0, unsigned int ny0, size_t align=0) { + Allocate(nx0,ny0,align); + } + array2(unsigned int nx0, unsigned int ny0, T *v0) {Dimension(nx0,ny0,v0);} + + unsigned int Nx() const {return nx;} + unsigned int Ny() const {return ny;} + +#ifndef __NOARRAY2OPT + T *operator [] (int ix) const { + return this->v+ix*ny; + } +#else + array1 operator [] (int ix) const { + __check(ix,nx,2,1); + return array1(ny,this->v+ix*ny); + } +#endif + T& operator () (int ix, int iy) const { + __check(ix,nx,2,1); + __check(iy,ny,2,2); + return this->v[ix*ny+iy]; + } + T& operator () (int i) const { + __check(i,this->size,2,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + + array2& operator = (T a) {this->Load(a); return *this;} + array2& operator = (T *a) {this->Load(a); return *this;} + array2& operator = (const array2& A) { + __checkEqual(nx,A.Nx(),2,1); + __checkEqual(ny,A.Ny(),2,2); + this->Load(A()); + A.Purge(); + return *this; + } + + array2& operator += (const array2& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] += A(i); + return *this; + } + array2& operator -= (const array2& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] -= A(i); + return *this; + } + array2& operator *= (const array2& A); + + array2& operator += (T a) { + __checkSize(); + unsigned int inc=ny+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] += a; + return *this; + } + array2& operator -= (T a) { + __checkSize(); + unsigned int inc=ny+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] -= a; + return *this; + } + array2& operator *= (T a) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] *= a; + return *this; + } + + void Identity() { + this->Load((T) 0); + __checkSize(); + unsigned int inc=ny+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i]=(T) 1; + } +}; + +template +std::ostream& operator << (std::ostream& s, const array2& A) +{ + T *p=A(); + for(unsigned int i=0; i < A.Nx(); i++) { + for(unsigned int j=0; j < A.Ny(); j++) { + s << *(p++) << " "; + } + s << _newl; + } + s << std::flush; + return s; +} + +template +std::istream& operator >> (std::istream& s, const array2& A) +{ + return A.Input(s); +} + +template +class array3 : public array1 { +protected: + unsigned int nx; + unsigned int ny; + unsigned int nz; + unsigned int nyz; +public: + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0) { + nx=nx0; ny=ny0; nz=nz0; nyz=ny*nz; + this->size=nx*nyz; + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, T *v0) { + Dimension(nx0,ny0,nz0); + this->v=v0; + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + size_t align=0) { + Dimension(nx0,ny0,nz0); + __checkActivate(3,align); + } + + array3() : nx(0), ny(0), nz(0), nyz(0) {} + array3(unsigned int nx0, unsigned int ny0, unsigned int nz0, + size_t align=0) { + Allocate(nx0,ny0,nz0,align); + } + array3(unsigned int nx0, unsigned int ny0, unsigned int nz0, T *v0) { + Dimension(nx0,ny0,nz0,v0); + } + + unsigned int Nx() const {return nx;} + unsigned int Ny() const {return ny;} + unsigned int Nz() const {return nz;} + + array2 operator [] (int ix) const { + __check(ix,nx,3,1); + return array2(ny,nz,this->v+ix*nyz); + } + T& operator () (int ix, int iy, int iz) const { + __check(ix,nx,3,1); + __check(iy,ny,3,2); + __check(iz,nz,3,3); + return this->v[ix*nyz+iy*nz+iz]; + } + T& operator () (int i) const { + __check(i,this->size,3,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + + array3& operator = (T a) {this->Load(a); return *this;} + array3& operator = (T *a) {this->Load(a); return *this;} + array3& operator = (const array3& A) { + __checkEqual(nx,A.Nx(),3,1); + __checkEqual(ny,A.Ny(),3,2); + __checkEqual(nz,A.Nz(),3,3); + this->Load(A()); + A.Purge(); + return *this; + } + + array3& operator += (array3& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] += A(i); + return *this; + } + array3& operator -= (array3& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] -= A(i); + return *this; + } + + array3& operator += (T a) { + __checkSize(); + unsigned int inc=nyz+nz+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] += a; + return *this; + } + array3& operator -= (T a) { + __checkSize(); + unsigned int inc=nyz+nz+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] -= a; + return *this; + } +}; + +template +std::ostream& operator << (std::ostream& s, const array3& A) +{ + T *p=A(); + for(unsigned int i=0; i < A.Nx(); i++) { + for(unsigned int j=0; j < A.Ny(); j++) { + for(unsigned int k=0; k < A.Nz(); k++) { + s << *(p++) << " "; + } + s << _newl; + } + s << _newl; + } + s << std::flush; + return s; +} + +template +std::istream& operator >> (std::istream& s, const array3& A) +{ + return A.Input(s); +} + +template +class array4 : public array1 { +protected: + unsigned int nx; + unsigned int ny; + unsigned int nz; + unsigned int nw; + unsigned int nyz; + unsigned int nzw; + unsigned int nyzw; +public: + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0) { + nx=nx0; ny=ny0; nz=nz0; nw=nw0; nzw=nz*nw; nyzw=ny*nzw; + this->size=nx*nyzw; + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, T *v0) { + Dimension(nx0,ny0,nz0,nw0); + this->v=v0; + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, size_t align=0) { + Dimension(nx0,ny0,nz0,nw0); + __checkActivate(4,align); + } + + array4() : nx(0), ny(0), nz(0), nw(0), nyz(0), nzw(0), nyzw(0) {} + array4(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, size_t align=0) {Allocate(nx0,ny0,nz0,nw0,align);} + array4(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, T *v0) { + Dimension(nx0,ny0,nz0,nw0,v0); + } + + unsigned int Nx() const {return nx;} + unsigned int Ny() const {return ny;} + unsigned int Nz() const {return nz;} + unsigned int N4() const {return nw;} + + array3 operator [] (int ix) const { + __check(ix,nx,3,1); + return array3(ny,nz,nw,this->v+ix*nyzw); + } + T& operator () (int ix, int iy, int iz, int iw) const { + __check(ix,nx,4,1); + __check(iy,ny,4,2); + __check(iz,nz,4,3); + __check(iw,nw,4,4); + return this->v[ix*nyzw+iy*nzw+iz*nw+iw]; + } + T& operator () (int i) const { + __check(i,this->size,4,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + + array4& operator = (T a) {this->Load(a); return *this;} + array4& operator = (T *a) {this->Load(a); return *this;} + array4& operator = (const array4& A) { + __checkEqual(nx,A.Nx(),4,1); + __checkEqual(ny,A.Ny(),4,2); + __checkEqual(nz,A.Nz(),4,3); + __checkEqual(nw,A.N4(),4,4); + this->Load(A()); + A.Purge(); + return *this; + } + + array4& operator += (array4& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] += A(i); + return *this; + } + array4& operator -= (array4& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] -= A(i); + return *this; + } + + array4& operator += (T a) { + __checkSize(); + unsigned int inc=nyzw+nzw+nw+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] += a; + return *this; + } + array4& operator -= (T a) { + __checkSize(); + unsigned int inc=nyzw+nzw+nw+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] -= a; + return *this; + } +}; + +template +std::ostream& operator << (std::ostream& s, const array4& A) +{ + T *p=A; + for(unsigned int i=0; i < A.Nx(); i++) { + for(unsigned int j=0; j < A.Ny(); j++) { + for(unsigned int k=0; k < A.Nz(); k++) { + for(unsigned int l=0; l < A.N4(); l++) { + s << *(p++) << " "; + } + s << _newl; + } + s << _newl; + } + s << _newl; + } + s << std::flush; + return s; +} + +template +std::istream& operator >> (std::istream& s, const array4& A) +{ + return A.Input(s); +} + +template +class array5 : public array1 { +protected: + unsigned int nx; + unsigned int ny; + unsigned int nz; + unsigned int nw; + unsigned int nv; + unsigned int nwv; + unsigned int nzwv; + unsigned int nyzwv; +public: + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0) { + nx=nx0; ny=ny0; nz=nz0; nw=nw0; nv=nv0; nwv=nw*nv; nzwv=nz*nwv; + nyzwv=ny*nzwv; + this->size=nx*nyzwv; + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, T *v0) { + Dimension(nx0,ny0,nz0,nw0,nv0); + this->v=v0; + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, size_t align=0) { + Dimension(nx0,ny0,nz0,nw0,nv0); + __checkActivate(5,align); + } + + array5() : nx(0), ny(0), nz(0), nw(0), nv(0), nwv(0), nzwv(0), nyzwv(0) {} + array5(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, size_t align=0) { + Allocate(nx0,ny0,nz0,nw0,nv0,align); + } + array5(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, T *v0) { + Dimension(nx0,ny0,nz0,nw0,nv0,nv0); + } + + unsigned int Nx() const {return nx;} + unsigned int Ny() const {return ny;} + unsigned int Nz() const {return ny;} + unsigned int N4() const {return nw;} + unsigned int N5() const {return nv;} + + array4 operator [] (int ix) const { + __check(ix,nx,4,1); + return array4(ny,nz,nw,nv,this->v+ix*nyzwv); + } + T& operator () (int ix, int iy, int iz, int iw, int iv) const { + __check(ix,nx,5,1); + __check(iy,ny,5,2); + __check(iz,nz,5,3); + __check(iw,nw,5,4); + __check(iv,nv,5,5); + return this->v[ix*nyzwv+iy*nzwv+iz*nwv+iw*nv+iv]; + } + T& operator () (int i) const { + __check(i,this->size,5,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + + array5& operator = (T a) {this->Load(a); return *this;} + array5& operator = (T *a) {this->Load(a); return *this;} + array5& operator = (const array5& A) { + __checkEqual(nx,A.Nx(),5,1); + __checkEqual(ny,A.Ny(),5,2); + __checkEqual(nz,A.Nz(),5,3); + __checkEqual(nw,A.N4(),5,4); + __checkEqual(nv,A.N5(),5,5); + this->Load(A()); + A.Purge(); + return *this; + } + + array5& operator += (array5& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] += A(i); + return *this; + } + array5& operator -= (array5& A) { + __checkSize(); + for(unsigned int i=0; i < this->size; i++) this->v[i] -= A(i); + return *this; + } + + array5& operator += (T a) { + __checkSize(); + unsigned int inc=nyzwv+nzwv+nwv+nv+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] += a; + return *this; + } + array5& operator -= (T a) { + __checkSize(); + unsigned int inc=nyzwv+nzwv+nwv+nv+1; + for(unsigned int i=0; i < this->size; i += inc) this->v[i] -= a; + return *this; + } +}; + +template +std::ostream& operator << (std::ostream& s, const array5& A) +{ + T *p=A; + for(unsigned int i=0; i < A.Nx(); i++) { + for(unsigned int j=0; j < A.Ny(); j++) { + for(unsigned int k=0; k < A.Nz(); k++) { + for(unsigned int l=0; l < A.N4(); l++) { + for(unsigned int l=0; l < A.N5(); l++) { + s << *(p++) << " "; + } + s << _newl; + } + s << _newl; + } + s << _newl; + } + s << _newl; + } + s << std::flush; + return s; +} + +template +std::istream& operator >> (std::istream& s, const array5& A) +{ + return A.Input(s); +} + +#undef __check + +#ifdef NDEBUG +#define __check(i,n,o,dim,m) +#else +#define __check(i,n,o,dim,m) this->Check(i-o,n,dim,m,o) +#endif + +template +class Array1 : public array1 { +protected: + T *voff; // Offset pointer to memory block + int ox; +public: + void Offsets() { + voff=this->v-ox; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, int ox0=0) { + this->size=nx0; + ox=ox0; + Offsets(); + } + void Dimension(unsigned int nx0, T *v0, int ox0=0) { + this->v=v0; + Dimension(nx0,ox0); + this->clear(this->allocated); + } + void Dimension(const Array1& A) { + Dimension(A.size,A.v,A.ox); this->state=A.test(this->temporary); + } + + void Allocate(unsigned int nx0, int ox0=0, size_t align=0) { + Dimension(nx0,ox0); + __checkActivate(1,align); + Offsets(); + } + + void Reallocate(unsigned int nx0, int ox0=0, size_t align=0) { + this->Deallocate(); + Allocate(nx0,ox0,align); + } + + Array1() : ox(0) {} + Array1(unsigned int nx0, int ox0=0, size_t align=0) { + Allocate(nx0,ox0,align); + } + Array1(unsigned int nx0, T *v0, int ox0=0) { + Dimension(nx0,v0,ox0); + } + Array1(T *v0, int ox0=0) { + Dimension(INT_MAX,v0,ox0); + } + +#ifdef NDEBUG + typedef T *opt; +#else + typedef Array1 opt; +#endif + + T& operator [] (int ix) const {__check(ix,this->size,ox,1,1); return voff[ix];} + T& operator () (int i) const {__check(i,this->size,0,1,1); return this->v[i];} + T* operator () () const {return this->v;} + operator T* () const {return this->v;} + + Array1 operator + (int i) const {return Array1(this->size-i,this->v+i,ox);} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array1& operator = (T a) {this->Load(a); return *this;} + Array1& operator = (const T *a) {this->Load(a); return *this;} + Array1& operator = (const Array1& A) { + __checkEqual(this->size,A.Size(),1,1); + __checkEqual(ox,A.Ox(),1,1); + this->Load(A()); + A.Purge(); + return *this; + } + Array1& operator = (const array1& A) { + __checkEqual(this->size,A.Size(),1,1); + __checkEqual(ox,0,1,1); + this->Load(A()); + A.Purge(); + return *this; + } + + int Ox() const {return ox;} +}; + +template +class Array2 : public array2 { +protected: + T *voff,*vtemp; + int ox,oy; +public: + void Offsets() { + vtemp=this->v-ox*(int) this->ny; + voff=vtemp-oy; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, int ox0=0, int oy0=0) { + this->nx=nx0; this->ny=ny0; + this->size=this->nx*this->ny; + ox=ox0; oy=oy0; + Offsets(); + } + void Dimension(unsigned int nx0, unsigned int ny0, T *v0, int ox0=0, + int oy0=0) { + this->v=v0; + Dimension(nx0,ny0,ox0,oy0); + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, int ox0=0, int oy0=0, + size_t align=0) { + Dimension(nx0,ny0,ox0,oy0); + __checkActivate(2,align); + Offsets(); + } + + Array2() : ox(0), oy(0) {} + Array2(unsigned int nx0, unsigned int ny0, int ox0=0, int oy0=0, + size_t align=0) { + Allocate(nx0,ny0,ox0,oy0,align); + } + Array2(unsigned int nx0, unsigned int ny0, T *v0, int ox0=0, int oy0=0) { + Dimension(nx0,ny0,v0,ox0,oy0); + } + +#ifndef __NOARRAY2OPT + T *operator [] (int ix) const { + return voff+ix*(int) this->ny; + } +#else + Array1 operator [] (int ix) const { + __check(ix,this->nx,ox,2,1); + return Array1(this->ny,vtemp+ix*(int) this->ny,oy); + } +#endif + + T& operator () (int ix, int iy) const { + __check(ix,this->nx,ox,2,1); + __check(iy,this->ny,oy,2,2); + return voff[ix*(int) this->ny+iy]; + } + T& operator () (int i) const { + __check(i,this->size,0,2,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array2& operator = (T a) {this->Load(a); return *this;} + Array2& operator = (T *a) {this->Load(a); return *this;} + Array2& operator = (const Array2& A) { + __checkEqual(this->nx,A.Nx(),2,1); + __checkEqual(this->ny,A.Ny(),2,2); + __checkEqual(ox,A.Ox(),2,1); + __checkEqual(oy,A.Oy(),2,2); + this->Load(A()); + A.Purge(); + return *this; + } + Array2& operator = (const array2& A) { + __checkEqual(this->nx,A.Nx(),2,1); + __checkEqual(this->ny,A.Ny(),2,2); + __checkEqual(ox,0,2,1); + __checkEqual(oy,0,2,2); + this->Load(A()); + A.Purge(); + return *this; + } + + int Ox() const {return ox;} + int Oy() const {return oy;} + +}; + +template +class Array3 : public array3 { +protected: + T *voff,*vtemp; + int ox,oy,oz; +public: + void Offsets() { + vtemp=this->v-ox*(int) this->nyz; + voff=vtemp-oy*(int) this->nz-oz; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + int ox0=0, int oy0=0, int oz0=0) { + this->nx=nx0; this->ny=ny0; this->nz=nz0; this->nyz=this->ny*this->nz; + this->size=this->nx*this->nyz; + ox=ox0; oy=oy0; oz=oz0; + Offsets(); + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + T *v0, int ox0=0, int oy0=0, int oz0=0) { + this->v=v0; + Dimension(nx0,ny0,nz0,ox0,oy0,oz0); + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + int ox0=0, int oy0=0, int oz0=0, size_t align=0) { + Dimension(nx0,ny0,nz0,ox0,oy0,oz0); + __checkActivate(3,align); + Offsets(); + } + + Array3() : ox(0), oy(0), oz(0) {} + Array3(unsigned int nx0, unsigned int ny0, unsigned int nz0, + int ox0=0, int oy0=0, int oz0=0, size_t align=0) { + Allocate(nx0,ny0,nz0,ox0,oy0,oz0,align); + } + Array3(unsigned int nx0, unsigned int ny0, unsigned int nz0, T *v0, + int ox0=0, int oy0=0, int oz0=0) { + Dimension(nx0,ny0,nz0,v0,ox0,oy0,oz0); + } + + Array2 operator [] (int ix) const { + __check(ix,this->nx,ox,3,1); + return Array2(this->ny,this->nz,vtemp+ix*(int) this->nyz,oy,oz); + } + T& operator () (int ix, int iy, int iz) const { + __check(ix,this->nx,ox,3,1); + __check(iy,this->ny,oy,3,2); + __check(iz,this->nz,oz,3,3); + return voff[ix*(int) this->nyz+iy*(int) this->nz+iz]; + } + T& operator () (int i) const { + __check(i,this->size,0,3,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array3& operator = (T a) {this->Load(a); return *this;} + Array3& operator = (T *a) {this->Load(a); return *this;} + Array3& operator = (const Array3& A) { + __checkEqual(this->nx,A.Nx(),3,1); + __checkEqual(this->ny,A.Ny(),3,2); + __checkEqual(this->nz,A.Nz(),3,3); + __checkEqual(ox,A.Ox(),3,1); + __checkEqual(oy,A.Oy(),3,2); + __checkEqual(oz,A.Oz(),3,3); + this->Load(A()); + A.Purge(); + return *this; + } + Array3& operator = (const array3& A) { + __checkEqual(this->nx,A.Nx(),3,1); + __checkEqual(this->ny,A.Ny(),3,2); + __checkEqual(this->nz,A.Nz(),3,3); + __checkEqual(ox,0,3,1); + __checkEqual(oy,0,3,2); + __checkEqual(oz,0,3,3); + this->Load(A()); + A.Purge(); + return *this; + } + + int Ox() const {return ox;} + int Oy() const {return oy;} + int Oz() const {return oz;} + +}; + +template +class Array4 : public array4 { +protected: + T *voff,*vtemp; + int ox,oy,oz,ow; +public: + void Offsets() { + vtemp=this->v-ox*(int) this->nyzw; + voff=vtemp-oy*(int) this->nzw-oz*(int) this->nw-ow; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0) { + this->nx=nx0; this->ny=ny0; this->nz=nz0; this->nw=nw0; + this->nzw=this->nz*this->nw; this->nyzw=this->ny*this->nzw; + this->size=this->nx*this->nyzw; + ox=ox0; oy=oy0; oz=oz0; ow=ow0; + Offsets(); + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, T *v0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0) { + this->v=v0; + Dimension(nx0,ny0,nz0,nw0,ox0,oy0,oz0,ow0); + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, size_t align=0) { + Dimension(nx0,ny0,nz0,nw0,ox0,oy0,oz0,ow0); + __checkActivate(4,align); + Offsets(); + } + + Array4() : ox(0), oy(0), oz(0), ow(0) {} + Array4(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, size_t align=0) { + Allocate(nx0,ny0,nz0,nw0,ox0,oy0,oz0,ow0,align); + } + Array4(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, T *v0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0) { + Dimension(nx0,ny0,nz0,nw0,v0,ox0,oy0,oz0,ow0); + } + + Array3 operator [] (int ix) const { + __check(ix,this->nx,ox,3,1); + return Array3(this->ny,this->nz,this->nw,vtemp+ix*(int) this->nyzw, + oy,oz,ow); + } + T& operator () (int ix, int iy, int iz, int iw) const { + __check(ix,this->nx,ox,4,1); + __check(iy,this->ny,oy,4,2); + __check(iz,this->nz,oz,4,3); + __check(iw,this->nw,ow,4,4); + return voff[ix*(int) this->nyzw+iy*(int) this->nzw+iz*(int) this->nw+iw]; + } + T& operator () (int i) const { + __check(i,this->size,0,4,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array4& operator = (T a) {this->Load(a); return *this;} + Array4& operator = (T *a) {this->Load(a); return *this;} + + Array4& operator = (const Array4& A) { + __checkEqual(this->nx,A.Nx(),4,1); + __checkEqual(this->ny,A.Ny(),4,2); + __checkEqual(this->nz,A.Nz(),4,3); + __checkEqual(this->nw,A.N4(),4,4); + __checkEqual(ox,A.Ox(),4,1); + __checkEqual(oy,A.Oy(),4,2); + __checkEqual(oz,A.Oz(),4,3); + __checkEqual(ow,A.O4(),4,4); + this->Load(A()); + A.Purge(); + return *this; + } + Array4& operator = (const array4& A) { + __checkEqual(this->nx,A.Nx(),4,1); + __checkEqual(this->ny,A.Ny(),4,2); + __checkEqual(this->nz,A.Nz(),4,3); + __checkEqual(this->nw,A.N4(),4,4); + __checkEqual(this->nx,A.Nx(),4,1); + __checkEqual(this->ny,A.Nx(),4,2); + __checkEqual(this->nz,A.Nx(),4,3); + __checkEqual(this->nw,A.Nx(),4,4); + __checkEqual(ox,0,4,1); + __checkEqual(oy,0,4,2); + __checkEqual(oz,0,4,3); + __checkEqual(ow,0,4,4); + this->Load(A()); + A.Purge(); + return *this; + } + + int Ox() const {return ox;} + int Oy() const {return oy;} + int Oz() const {return oz;} + int O4() const {return ow;} +}; + +template +class Array5 : public array5 { +protected: + T *voff,*vtemp; + int ox,oy,oz,ow,ov; +public: + void Offsets() { + vtemp=this->v-ox*(int) this->nyzwv; + voff=vtemp-oy*(int) this->nzwv-oz*(int) this->nwv-ow*(int) this->nv-ov; + } + using array1::Dimension; + + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, int ov0=0) { + this->nx=nx0; this->ny=ny0; this->nz=nz0; this->nw=nw0; this->nv=nv0; + this->nwv=this->nw*this->nv; this->nzwv=this->nz*this->nwv; + this->nyzwv=this->ny*this->nzwv; + this->size=this->nx*this->nyzwv; + ox=ox0; oy=oy0; oz=oz0; ow=ow0; ov=ov0; + Offsets(); + } + void Dimension(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, T *v0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, int ov0=0) { + this->v=v0; + Dimension(nx0,ny0,nz0,nw0,nv0,ox0,oy0,oz0,ow0,ov0); + this->clear(this->allocated); + } + + void Allocate(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, int ov0=0, + size_t align=0) { + Dimension(nx0,ny0,nz0,nw0,nv0,ox0,oy0,oz0,ow0,ov0); + __checkActivate(5,align); + Offsets(); + } + + Array5() : ox(0), oy(0), oz(0), ow(0), ov(0) {} + Array5(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, int ox0=0, int oy0=0, + int oz0=0, int ow0=0, int ov0=0, size_t align=0) { + Allocate(nx0,ny0,nz0,nw0,nv0,ox0,oy0,oz0,ow0,ov0,align); + } + Array5(unsigned int nx0, unsigned int ny0, unsigned int nz0, + unsigned int nw0, unsigned int nv0, T *v0, + int ox0=0, int oy0=0, int oz0=0, int ow0=0, int ov0=0) { + Dimension(nx0,ny0,nz0,nw0,nv0,v0,ox0,oy0,oz0,ow0,ov0); + } + + Array4 operator [] (int ix) const { + __check(ix,this->nx,ox,4,1); + return Array4(this->ny,this->nz,this->nw,this->nv, + vtemp+ix*(int) this->nyzwv,oy,oz,ow,ov); + } + T& operator () (int ix, int iy, int iz, int iw, int iv) const { + __check(ix,this->nx,ox,5,1); + __check(iy,this->ny,oy,5,2); + __check(iz,this->nz,oz,5,3); + __check(iw,this->nw,ow,5,4); + __check(iv,this->nv,ov,5,5); + return voff[ix*(int) this->nyzwv+iy*(int) this->nzwv+iz*(int) this->nwv + +iw*(int) this->nv+iv]; + } + T& operator () (int i) const { + __check(i,this->size,0,5,0); + return this->v[i]; + } + T* operator () () const {return this->v;} + void Set(T *a) {this->v=a; Offsets(); this->clear(this->allocated);} + + Array5& operator = (T a) {this->Load(a); return *this;} + Array5& operator = (T *a) {this->Load(a); return *this;} + + Array5& operator = (const Array5& A) { + __checkEqual(this->nx,A.Nx(),5,1); + __checkEqual(this->ny,A.Ny(),5,2); + __checkEqual(this->nz,A.Nz(),5,3); + __checkEqual(this->nw,A.N4(),5,4); + __checkEqual(this->nv,A.N5(),5,5); + __checkEqual(ox,A.Ox(),5,1); + __checkEqual(oy,A.Oy(),5,2); + __checkEqual(oz,A.Oz(),5,3); + __checkEqual(ow,A.O4(),5,4); + __checkEqual(ov,A.O5(),5,5); + this->Load(A()); + A.Purge(); + return *this; + } + Array5& operator = (const array5& A) { + __checkEqual(this->nx,A.Nx(),5,1); + __checkEqual(this->ny,A.Ny(),5,2); + __checkEqual(this->nz,A.Nz(),5,3); + __checkEqual(this->nw,A.N4(),5,4); + __checkEqual(this->nv,A.N5(),5,5); + __checkEqual(ox,0,5,1); + __checkEqual(oy,0,5,2); + __checkEqual(oz,0,5,3); + __checkEqual(ow,0,5,4); + __checkEqual(ov,0,5,5); + this->Load(A()); + A.Purge(); + return *this; + } + int Ox() const {return ox;} + int Oy() const {return oy;} + int Oz() const {return oz;} + int O4() const {return ow;} + int O5() const {return ov;} +}; + +template +inline bool Active(array1& A) +{ + return A.Size(); +} + +template +inline bool Active(T *A) +{ + return A; +} + +template +inline void Set(T *&A, T *v) +{ + A=v; +} + +template +inline void Set(array1& A, T *v) +{ + A.Set(v); +} + +template +inline void Set(array1& A, const array1& B) +{ + A.Set(B()); +} + +template +inline void Set(Array1& A, T *v) +{ + A.Set(v); +} + +template +inline void Set(Array1& A, const array1& B) +{ + A.Set(B()); +} + +template +inline void Null(T *&A) +{ + A=NULL; +} + +template +inline void Null(array1& A) +{ + A.Dimension(0); +} + +template +inline void Dimension(T *&, unsigned int) +{ +} + +template +inline void Dimension(array1 &A, unsigned int n) +{ + A.Dimension(n); +} + +template +inline void Dimension(T *&A, unsigned int, T *v) +{ + A=v; +} + +template +inline void Dimension(array1& A, unsigned int n, T *v) +{ + A.Dimension(n,v); +} + +template +inline void Dimension(Array1& A, unsigned int n, T *v) +{ + A.Dimension(n,v,0); +} + +template +inline void Dimension(T *&A, T *v) +{ + A=v; +} + +template +inline void Dimension(array1& A, const array1& B) +{ + A.Dimension(B); +} + +template +inline void Dimension(Array1& A, const Array1& B) +{ + A.Dimension(B); +} + +template +inline void Dimension(Array1& A, const array1& B) +{ + A.Dimension(B); +} + +template +inline void Dimension(array1& A, unsigned int n, const array1& B) +{ + A.Dimension(n,B); +} + +template +inline void Dimension(Array1& A, unsigned int n, const array1& B, int o) +{ + A.Dimension(n,B,o); +} + +template +inline void Dimension(Array1& A, unsigned int n, T *v, int o) +{ + A.Dimension(n,v,o); +} + +template +inline void Dimension(T *&A, unsigned int, T *v, int o) +{ + A=v-o; +} + +template +inline void Allocate(T *&A, unsigned int n, size_t align=0) +{ + if(align) newAlign(A,n,align); + else A=new T[n]; +} + +template +inline void Allocate(array1& A, unsigned int n, size_t align=0) +{ + A.Allocate(n,align); +} + +template +inline void Allocate(Array1& A, unsigned int n, size_t align=0) +{ + A.Allocate(n,align); +} + +template +inline void Allocate(T *&A, unsigned int n, int o, size_t align=0) +{ + Allocate(A,n,align); + A -= o; +} + +template +inline void Allocate(Array1& A, unsigned int n, int o, size_t align=0) +{ + A.Allocate(n,o,align); +} + +template +inline void Deallocate(T *A) +{ + if(A) delete [] A; +} + +template +inline void Deallocate(array1& A) +{ + A.Deallocate(); +} + +template +inline void Deallocate(Array1& A) +{ + A.Deallocate(); +} + +template +inline void Deallocate(T *A, int o) +{ + if(A) delete [] (A+o); +} + +template +inline void Deallocate(Array1& A, int) +{ + A.Deallocate(); +} + +template +inline void Reallocate(T *&A, unsigned int n, size_t align=0) +{ + if(A) delete [] A; + Allocate(A,n,align); +} + +template +inline void Reallocate(array1& A, unsigned int n) +{ + A.Reallocate(n); +} + +template +inline void Reallocate(Array1& A, unsigned int n) +{ + A.Reallocate(n); +} + +template +inline void Reallocate(T *&A, unsigned int n, int o, size_t align=0) +{ + if(A) delete [] A; + Allocate(A,n,align); + A -= o; +} + +template +inline void Reallocate(Array1& A, unsigned int n, int o, size_t align=0) +{ + A.Reallocate(n,o,align); +} + +template +inline void CheckReallocate(T& A, unsigned int n, unsigned int& old, + size_t align=0) +{ + if(n > old) {A.Reallocate(n,align); old=n;} +} + +template +inline void CheckReallocate(T& A, unsigned int n, int o, unsigned int& old, + size_t align=0) +{ + if(n > old) {A.Reallocate(n,o,align); old=n;} +} + +} + +#undef __check +#undef __checkSize +#undef __checkActivate + +#endif diff --git a/examples/Integration_with_fftw/fftw/align.h b/examples/Integration_with_fftw/fftw/align.h new file mode 100644 index 0000000..f6f2e94 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/align.h @@ -0,0 +1,123 @@ +#ifndef __align_h__ +#define __align_h__ 1 + +#ifndef HAVE_POSIX_MEMALIGN + +#ifdef __GLIBC_PREREQ +#if __GLIBC_PREREQ(2,3) +#define HAVE_POSIX_MEMALIGN +#endif +#else +#ifdef _POSIX_SOURCE +#define HAVE_POSIX_MEMALIGN +#endif +#endif + +#endif + +#ifdef __Array_h__ + +namespace Array { +static const array1 NULL1; +static const array2 NULL2; +static const array3 NULL3; +} + +#else + +#ifdef HAVE_POSIX_MEMALIGN +#ifdef _AIX +extern "C" int posix_memalign(void **memptr, size_t alignment, size_t size); +#endif +#else +namespace Array { + +// Adapted from FFTW aligned malloc/free. Assumes that malloc is at least +// sizeof(void*)-aligned. Allocated memory must be freed with free0. +inline int posix_memalign0(void **memptr, size_t alignment, size_t size) +{ + if(alignment % sizeof (void *) != 0 || (alignment & (alignment - 1)) != 0) + return EINVAL; + void *p0=malloc(size+alignment); + if(!p0) return ENOMEM; + void *p=(void *)(((size_t) p0+alignment)&~(alignment-1)); + *((void **) p-1)=p0; + *memptr=p; + return 0; +} + +inline void free0(void *p) +{ + if(p) free(*((void **) p-1)); +} + +} +#endif + +namespace Array { + +template +inline void newAlign(T *&v, size_t len, size_t align) +{ + void *mem=NULL; + const char *invalid="Invalid alignment requested"; + const char *nomem="Memory limits exceeded"; +#ifdef HAVE_POSIX_MEMALIGN + int rc=posix_memalign(&mem,align,len*sizeof(T)); +#else + int rc=posix_memalign0(&mem,align,len*sizeof(T)); +#endif + if(rc == EINVAL) std::cerr << invalid << std::endl; + if(rc == ENOMEM) std::cerr << nomem << std::endl; + v=(T *) mem; + for(size_t i=0; i < len; i++) new(v+i) T; +} + +template +inline void deleteAlign(T *v, size_t len) +{ + for(size_t i=len; i-- > 0;) v[i].~T(); +#ifdef HAVE_POSIX_MEMALIGN + free(v); +#else + free0(v); +#endif +} +} + +#endif + +namespace utils { + +inline unsigned int ceilquotient(unsigned int a, unsigned int b) +{ + return (a+b-1)/b; +} + +inline Complex *ComplexAlign(size_t size) +{ + Complex *v; + Array::newAlign(v,size,sizeof(Complex)); + return v; +} + +inline double *doubleAlign(size_t size) +{ + double *v; + Array::newAlign(v,size,sizeof(Complex)); + return v; +} + +template +inline void deleteAlign(T *p) +{ +#ifdef HAVE_POSIX_MEMALIGN + free(p); +#else + Array::free0(p); +#endif +} + +} + +#endif diff --git a/examples/Integration_with_fftw/fftw/api/.deps/apiplan.Plo b/examples/Integration_with_fftw/fftw/api/.deps/apiplan.Plo new file mode 100644 index 0000000..3e5be72 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/apiplan.Plo @@ -0,0 +1,153 @@ +apiplan.lo: apiplan.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/configure.Plo b/examples/Integration_with_fftw/fftw/api/.deps/configure.Plo new file mode 100644 index 0000000..611232f --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/configure.Plo @@ -0,0 +1,160 @@ +configure.lo: configure.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h \ + ../reodft/reodft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: + +../reodft/reodft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/execute-dft-c2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/execute-dft-c2r.Plo new file mode 100644 index 0000000..8362478 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/execute-dft-c2r.Plo @@ -0,0 +1,153 @@ +execute-dft-c2r.lo: execute-dft-c2r.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/execute-dft-r2c.Plo b/examples/Integration_with_fftw/fftw/api/.deps/execute-dft-r2c.Plo new file mode 100644 index 0000000..deb58f2 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/execute-dft-r2c.Plo @@ -0,0 +1,153 @@ +execute-dft-r2c.lo: execute-dft-r2c.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/execute-dft.Plo b/examples/Integration_with_fftw/fftw/api/.deps/execute-dft.Plo new file mode 100644 index 0000000..26e9089 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/execute-dft.Plo @@ -0,0 +1,157 @@ +execute-dft.lo: execute-dft.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/execute-r2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/execute-r2r.Plo new file mode 100644 index 0000000..b28aa06 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/execute-r2r.Plo @@ -0,0 +1,153 @@ +execute-r2r.lo: execute-r2r.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft-c2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft-c2r.Plo new file mode 100644 index 0000000..1cbfac5 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft-c2r.Plo @@ -0,0 +1,154 @@ +execute-split-dft-c2r.lo: execute-split-dft-c2r.c ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft-r2c.Plo b/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft-r2c.Plo new file mode 100644 index 0000000..01d127b --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft-r2c.Plo @@ -0,0 +1,154 @@ +execute-split-dft-r2c.lo: execute-split-dft-r2c.c ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft.Plo b/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft.Plo new file mode 100644 index 0000000..9a8bd75 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/execute-split-dft.Plo @@ -0,0 +1,157 @@ +execute-split-dft.lo: execute-split-dft.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/execute.Plo b/examples/Integration_with_fftw/fftw/api/.deps/execute.Plo new file mode 100644 index 0000000..e58d135 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/execute.Plo @@ -0,0 +1,153 @@ +execute.lo: execute.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom-to-file.Plo b/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom-to-file.Plo new file mode 100644 index 0000000..ec8f6d9 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom-to-file.Plo @@ -0,0 +1,154 @@ +export-wisdom-to-file.lo: export-wisdom-to-file.c ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom-to-string.Plo b/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom-to-string.Plo new file mode 100644 index 0000000..186bbca --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom-to-string.Plo @@ -0,0 +1,154 @@ +export-wisdom-to-string.lo: export-wisdom-to-string.c ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom.Plo b/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom.Plo new file mode 100644 index 0000000..37ae45d --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/export-wisdom.Plo @@ -0,0 +1,153 @@ +export-wisdom.lo: export-wisdom.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/f77api.Plo b/examples/Integration_with_fftw/fftw/api/.deps/f77api.Plo new file mode 100644 index 0000000..5c3b746 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/f77api.Plo @@ -0,0 +1,162 @@ +f77api.lo: f77api.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h \ + ../api/x77.h f77funcs.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: + +../api/x77.h: + +f77funcs.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/flops.Plo b/examples/Integration_with_fftw/fftw/api/.deps/flops.Plo new file mode 100644 index 0000000..f6dc912 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/flops.Plo @@ -0,0 +1,153 @@ +flops.lo: flops.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/forget-wisdom.Plo b/examples/Integration_with_fftw/fftw/api/.deps/forget-wisdom.Plo new file mode 100644 index 0000000..f153edf --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/forget-wisdom.Plo @@ -0,0 +1,153 @@ +forget-wisdom.lo: forget-wisdom.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/import-system-wisdom.Plo b/examples/Integration_with_fftw/fftw/api/.deps/import-system-wisdom.Plo new file mode 100644 index 0000000..8929e88 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/import-system-wisdom.Plo @@ -0,0 +1,154 @@ +import-system-wisdom.lo: import-system-wisdom.c ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom-from-file.Plo b/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom-from-file.Plo new file mode 100644 index 0000000..3d0fe52 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom-from-file.Plo @@ -0,0 +1,154 @@ +import-wisdom-from-file.lo: import-wisdom-from-file.c ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom-from-string.Plo b/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom-from-string.Plo new file mode 100644 index 0000000..c3cae42 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom-from-string.Plo @@ -0,0 +1,154 @@ +import-wisdom-from-string.lo: import-wisdom-from-string.c ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom.Plo b/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom.Plo new file mode 100644 index 0000000..c58e79f --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/import-wisdom.Plo @@ -0,0 +1,153 @@ +import-wisdom.lo: import-wisdom.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/malloc.Plo b/examples/Integration_with_fftw/fftw/api/.deps/malloc.Plo new file mode 100644 index 0000000..7c5353e --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/malloc.Plo @@ -0,0 +1,153 @@ +malloc.lo: malloc.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/map-r2r-kind.Plo b/examples/Integration_with_fftw/fftw/api/.deps/map-r2r-kind.Plo new file mode 100644 index 0000000..c49cf4d --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/map-r2r-kind.Plo @@ -0,0 +1,153 @@ +map-r2r-kind.lo: map-r2r-kind.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/mapflags.Plo b/examples/Integration_with_fftw/fftw/api/.deps/mapflags.Plo new file mode 100644 index 0000000..4315f95 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/mapflags.Plo @@ -0,0 +1,180 @@ +mapflags.lo: mapflags.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/math.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/huge_val.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/huge_valf.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/huge_vall.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/inf.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/nan.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/mathdef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/mathcalls.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/mathinline.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/math.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/huge_val.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/huge_valf.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/huge_vall.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/inf.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/nan.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/mathdef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/mathcalls.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/mathinline.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/mkprinter-file.Plo b/examples/Integration_with_fftw/fftw/api/.deps/mkprinter-file.Plo new file mode 100644 index 0000000..1340a29 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/mkprinter-file.Plo @@ -0,0 +1,153 @@ +mkprinter-file.lo: mkprinter-file.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/mkprinter-str.Plo b/examples/Integration_with_fftw/fftw/api/.deps/mkprinter-str.Plo new file mode 100644 index 0000000..daab9ea --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/mkprinter-str.Plo @@ -0,0 +1,153 @@ +mkprinter-str.lo: mkprinter-str.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/mktensor-iodims.Plo b/examples/Integration_with_fftw/fftw/api/.deps/mktensor-iodims.Plo new file mode 100644 index 0000000..a9932b2 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/mktensor-iodims.Plo @@ -0,0 +1,158 @@ +mktensor-iodims.lo: mktensor-iodims.c guru.h mktensor-iodims.h \ + ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru.h: + +mktensor-iodims.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/mktensor-iodims64.Plo b/examples/Integration_with_fftw/fftw/api/.deps/mktensor-iodims64.Plo new file mode 100644 index 0000000..2806889 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/mktensor-iodims64.Plo @@ -0,0 +1,158 @@ +mktensor-iodims64.lo: mktensor-iodims64.c guru64.h mktensor-iodims.h \ + ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru64.h: + +mktensor-iodims.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/mktensor-rowmajor.Plo b/examples/Integration_with_fftw/fftw/api/.deps/mktensor-rowmajor.Plo new file mode 100644 index 0000000..02ceb54 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/mktensor-rowmajor.Plo @@ -0,0 +1,153 @@ +mktensor-rowmajor.lo: mktensor-rowmajor.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-1d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-1d.Plo new file mode 100644 index 0000000..f910c7f --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-1d.Plo @@ -0,0 +1,157 @@ +plan-dft-1d.lo: plan-dft-1d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-2d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-2d.Plo new file mode 100644 index 0000000..0fe18d8 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-2d.Plo @@ -0,0 +1,157 @@ +plan-dft-2d.lo: plan-dft-2d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-3d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-3d.Plo new file mode 100644 index 0000000..3dfcd78 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-3d.Plo @@ -0,0 +1,157 @@ +plan-dft-3d.lo: plan-dft-3d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-1d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-1d.Plo new file mode 100644 index 0000000..15a19a5 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-1d.Plo @@ -0,0 +1,153 @@ +plan-dft-c2r-1d.lo: plan-dft-c2r-1d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-2d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-2d.Plo new file mode 100644 index 0000000..9d61e89 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-2d.Plo @@ -0,0 +1,153 @@ +plan-dft-c2r-2d.lo: plan-dft-c2r-2d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-3d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-3d.Plo new file mode 100644 index 0000000..c889187 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r-3d.Plo @@ -0,0 +1,153 @@ +plan-dft-c2r-3d.lo: plan-dft-c2r-3d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r.Plo new file mode 100644 index 0000000..9d7c4c6 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-c2r.Plo @@ -0,0 +1,153 @@ +plan-dft-c2r.lo: plan-dft-c2r.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-1d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-1d.Plo new file mode 100644 index 0000000..c54890a --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-1d.Plo @@ -0,0 +1,153 @@ +plan-dft-r2c-1d.lo: plan-dft-r2c-1d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-2d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-2d.Plo new file mode 100644 index 0000000..76f9e53 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-2d.Plo @@ -0,0 +1,153 @@ +plan-dft-r2c-2d.lo: plan-dft-r2c-2d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-3d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-3d.Plo new file mode 100644 index 0000000..d2a9ba1 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c-3d.Plo @@ -0,0 +1,153 @@ +plan-dft-r2c-3d.lo: plan-dft-r2c-3d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c.Plo new file mode 100644 index 0000000..255196b --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft-r2c.Plo @@ -0,0 +1,153 @@ +plan-dft-r2c.lo: plan-dft-r2c.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-dft.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft.Plo new file mode 100644 index 0000000..a5a7d38 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-dft.Plo @@ -0,0 +1,153 @@ +plan-dft.lo: plan-dft.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft-c2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft-c2r.Plo new file mode 100644 index 0000000..d1c5490 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft-c2r.Plo @@ -0,0 +1,158 @@ +plan-guru-dft-c2r.lo: plan-guru-dft-c2r.c guru.h plan-guru-dft-c2r.h \ + ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru.h: + +plan-guru-dft-c2r.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft-r2c.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft-r2c.Plo new file mode 100644 index 0000000..ad9a5d4 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft-r2c.Plo @@ -0,0 +1,158 @@ +plan-guru-dft-r2c.lo: plan-guru-dft-r2c.c guru.h plan-guru-dft-r2c.h \ + ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru.h: + +plan-guru-dft-r2c.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft.Plo new file mode 100644 index 0000000..6feeeab --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-dft.Plo @@ -0,0 +1,162 @@ +plan-guru-dft.lo: plan-guru-dft.c guru.h plan-guru-dft.h ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +guru.h: + +plan-guru-dft.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-r2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-r2r.Plo new file mode 100644 index 0000000..434135d --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-r2r.Plo @@ -0,0 +1,158 @@ +plan-guru-r2r.lo: plan-guru-r2r.c guru.h plan-guru-r2r.h ../api/api.h \ + ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru.h: + +plan-guru-r2r.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft-c2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft-c2r.Plo new file mode 100644 index 0000000..9b2622a --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft-c2r.Plo @@ -0,0 +1,158 @@ +plan-guru-split-dft-c2r.lo: plan-guru-split-dft-c2r.c guru.h \ + plan-guru-split-dft-c2r.h ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru.h: + +plan-guru-split-dft-c2r.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft-r2c.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft-r2c.Plo new file mode 100644 index 0000000..509239d --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft-r2c.Plo @@ -0,0 +1,158 @@ +plan-guru-split-dft-r2c.lo: plan-guru-split-dft-r2c.c guru.h \ + plan-guru-split-dft-r2c.h ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru.h: + +plan-guru-split-dft-r2c.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft.Plo new file mode 100644 index 0000000..853db0b --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru-split-dft.Plo @@ -0,0 +1,162 @@ +plan-guru-split-dft.lo: plan-guru-split-dft.c guru.h \ + plan-guru-split-dft.h ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +guru.h: + +plan-guru-split-dft.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft-c2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft-c2r.Plo new file mode 100644 index 0000000..68c9151 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft-c2r.Plo @@ -0,0 +1,158 @@ +plan-guru64-dft-c2r.lo: plan-guru64-dft-c2r.c guru64.h \ + plan-guru-dft-c2r.h ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru64.h: + +plan-guru-dft-c2r.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft-r2c.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft-r2c.Plo new file mode 100644 index 0000000..87965c5 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft-r2c.Plo @@ -0,0 +1,158 @@ +plan-guru64-dft-r2c.lo: plan-guru64-dft-r2c.c guru64.h \ + plan-guru-dft-r2c.h ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru64.h: + +plan-guru-dft-r2c.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft.Plo new file mode 100644 index 0000000..72c7952 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-dft.Plo @@ -0,0 +1,162 @@ +plan-guru64-dft.lo: plan-guru64-dft.c guru64.h plan-guru-dft.h \ + ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +guru64.h: + +plan-guru-dft.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-r2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-r2r.Plo new file mode 100644 index 0000000..fae924e --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-r2r.Plo @@ -0,0 +1,158 @@ +plan-guru64-r2r.lo: plan-guru64-r2r.c guru64.h plan-guru-r2r.h \ + ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru64.h: + +plan-guru-r2r.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft-c2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft-c2r.Plo new file mode 100644 index 0000000..a30c6a0 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft-c2r.Plo @@ -0,0 +1,158 @@ +plan-guru64-split-dft-c2r.lo: plan-guru64-split-dft-c2r.c guru64.h \ + plan-guru-split-dft-c2r.h ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru64.h: + +plan-guru-split-dft-c2r.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft-r2c.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft-r2c.Plo new file mode 100644 index 0000000..1ff31b9 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft-r2c.Plo @@ -0,0 +1,158 @@ +plan-guru64-split-dft-r2c.lo: plan-guru64-split-dft-r2c.c guru64.h \ + plan-guru-split-dft-r2c.h ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +guru64.h: + +plan-guru-split-dft-r2c.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft.Plo new file mode 100644 index 0000000..b6ca6b0 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-guru64-split-dft.Plo @@ -0,0 +1,162 @@ +plan-guru64-split-dft.lo: plan-guru64-split-dft.c guru64.h \ + plan-guru-split-dft.h ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +guru64.h: + +plan-guru-split-dft.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft-c2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft-c2r.Plo new file mode 100644 index 0000000..4ad665c --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft-c2r.Plo @@ -0,0 +1,153 @@ +plan-many-dft-c2r.lo: plan-many-dft-c2r.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft-r2c.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft-r2c.Plo new file mode 100644 index 0000000..a933f46 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft-r2c.Plo @@ -0,0 +1,153 @@ +plan-many-dft-r2c.lo: plan-many-dft-r2c.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft.Plo new file mode 100644 index 0000000..7822579 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-many-dft.Plo @@ -0,0 +1,157 @@ +plan-many-dft.lo: plan-many-dft.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h ../dft/dft.h ../dft/codelet-dft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: + +../dft/dft.h: + +../dft/codelet-dft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-many-r2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-many-r2r.Plo new file mode 100644 index 0000000..08d98c1 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-many-r2r.Plo @@ -0,0 +1,153 @@ +plan-many-r2r.lo: plan-many-r2r.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-1d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-1d.Plo new file mode 100644 index 0000000..08f7bea --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-1d.Plo @@ -0,0 +1,153 @@ +plan-r2r-1d.lo: plan-r2r-1d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-2d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-2d.Plo new file mode 100644 index 0000000..c4cf6dc --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-2d.Plo @@ -0,0 +1,153 @@ +plan-r2r-2d.lo: plan-r2r-2d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-3d.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-3d.Plo new file mode 100644 index 0000000..8b73688 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r-3d.Plo @@ -0,0 +1,153 @@ +plan-r2r-3d.lo: plan-r2r-3d.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r.Plo b/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r.Plo new file mode 100644 index 0000000..37695c4 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/plan-r2r.Plo @@ -0,0 +1,153 @@ +plan-r2r.lo: plan-r2r.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/print-plan.Plo b/examples/Integration_with_fftw/fftw/api/.deps/print-plan.Plo new file mode 100644 index 0000000..a3746dd --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/print-plan.Plo @@ -0,0 +1,153 @@ +print-plan.lo: print-plan.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/rdft2-pad.Plo b/examples/Integration_with_fftw/fftw/api/.deps/rdft2-pad.Plo new file mode 100644 index 0000000..274d595 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/rdft2-pad.Plo @@ -0,0 +1,166 @@ +rdft2-pad.lo: rdft2-pad.c \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/string.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/string.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/string2.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/string3.h \ + ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/string.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/string.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/string2.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/string3.h: + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/the-planner.Plo b/examples/Integration_with_fftw/fftw/api/.deps/the-planner.Plo new file mode 100644 index 0000000..9faaaa4 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/the-planner.Plo @@ -0,0 +1,153 @@ +the-planner.lo: the-planner.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/.deps/version.Plo b/examples/Integration_with_fftw/fftw/api/.deps/version.Plo new file mode 100644 index 0000000..7b7de3a --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/.deps/version.Plo @@ -0,0 +1,153 @@ +version.lo: version.c ../api/api.h ../api/fftw3.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h \ + ../kernel/ifftw.h ../config.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h \ + /home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h \ + /home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h \ + ../rdft/rdft.h ../rdft/codelet-rdft.h + +../api/api.h: + +../api/fftw3.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/features.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/cdefs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wordsize.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/gnu/stubs-64.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stddef.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/typesizes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/libio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/_G_config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/wchar.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdarg.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sys_errlist.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdio2.h: + +../kernel/ifftw.h: + +../config.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdlib.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitflags.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/waitstatus.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/endian.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/byteswap.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/types.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/select.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/sigset.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/sysmacros.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/alloca.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/stdlib.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/limits.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include-fixed/syslimits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix1_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/local_lim.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/linux/limits.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/posix2_lim.h: + +/home/arun/anaconda3/lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/stdint.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/bits/wchar.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/inttypes.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/sys/time.h: + +/home/arun/anaconda3/x86_64-conda_cos6-linux-gnu/sysroot/usr/include/xlocale.h: + +../rdft/rdft.h: + +../rdft/codelet-rdft.h: diff --git a/examples/Integration_with_fftw/fftw/api/Makefile b/examples/Integration_with_fftw/fftw/api/Makefile new file mode 100644 index 0000000..5600418 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/Makefile @@ -0,0 +1,846 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# api/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + + +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/fftw +pkgincludedir = $(includedir)/fftw +pkglibdir = $(libdir)/fftw +pkglibexecdir = $(libexecdir)/fftw +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +subdir = api +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libapi_la_LIBADD = +am_libapi_la_OBJECTS = apiplan.lo configure.lo execute-dft-c2r.lo \ + execute-dft-r2c.lo execute-dft.lo execute-r2r.lo \ + execute-split-dft-c2r.lo execute-split-dft-r2c.lo \ + execute-split-dft.lo execute.lo export-wisdom-to-file.lo \ + export-wisdom-to-string.lo export-wisdom.lo f77api.lo flops.lo \ + forget-wisdom.lo import-system-wisdom.lo \ + import-wisdom-from-file.lo import-wisdom-from-string.lo \ + import-wisdom.lo malloc.lo map-r2r-kind.lo mapflags.lo \ + mkprinter-file.lo mkprinter-str.lo mktensor-iodims.lo \ + mktensor-rowmajor.lo plan-dft-1d.lo plan-dft-2d.lo \ + plan-dft-3d.lo plan-dft-c2r-1d.lo plan-dft-c2r-2d.lo \ + plan-dft-c2r-3d.lo plan-dft-c2r.lo plan-dft-r2c-1d.lo \ + plan-dft-r2c-2d.lo plan-dft-r2c-3d.lo plan-dft-r2c.lo \ + plan-dft.lo plan-guru-dft-c2r.lo plan-guru-dft-r2c.lo \ + plan-guru-dft.lo plan-guru-r2r.lo plan-guru-split-dft-c2r.lo \ + plan-guru-split-dft-r2c.lo plan-guru-split-dft.lo \ + plan-many-dft-c2r.lo plan-many-dft-r2c.lo plan-many-dft.lo \ + plan-many-r2r.lo plan-r2r-1d.lo plan-r2r-2d.lo plan-r2r-3d.lo \ + plan-r2r.lo print-plan.lo rdft2-pad.lo the-planner.lo \ + version.lo plan-guru64-dft-c2r.lo plan-guru64-dft-r2c.lo \ + plan-guru64-dft.lo plan-guru64-r2r.lo \ + plan-guru64-split-dft-c2r.lo plan-guru64-split-dft-r2c.lo \ + plan-guru64-split-dft.lo mktensor-iodims64.lo +libapi_la_OBJECTS = $(am_libapi_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I. -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libapi_la_SOURCES) +DIST_SOURCES = $(libapi_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" +HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /home/arun/Documents/mmsp-arun/fftw-3.3.8/missing aclocal-1.15 +ALLOCA = +ALTIVEC_CFLAGS = +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 1 +AR = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-ar +AS = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-as +AUTOCONF = ${SHELL} /home/arun/Documents/mmsp-arun/fftw-3.3.8/missing autoconf +AUTOHEADER = ${SHELL} /home/arun/Documents/mmsp-arun/fftw-3.3.8/missing autoheader +AUTOMAKE = ${SHELL} /home/arun/Documents/mmsp-arun/fftw-3.3.8/missing automake-1.15 +AVX2_CFLAGS = +AVX512_CFLAGS = +AVX_128_FMA_CFLAGS = +AVX_CFLAGS = +AWK = mawk +CC = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-cc +CCDEPMODE = depmode=gcc3 +CFLAGS = -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/arun/anaconda3/include +CHECK_PL_OPTS = +CPP = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-cpp +CPPFLAGS = -DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/arun/anaconda3/include +CYGPATH_W = echo +C_FFTW_R2R_KIND = C_INT32_T +C_MPI_FINT = +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = dlltool +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /bin/grep -E +EXEEXT = +F77 = f77 +FFLAGS = -g -O2 +FGREP = /bin/grep -F +FLIBS = -L/home/arun/anaconda3/lib -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. -lgfortran -lm -lquadmath +GREP = /bin/grep +INDENT = +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +KCVI_CFLAGS = +LD = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-ld -m elf_x86_64 +LDFLAGS = -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,--gc-sections -Wl,-rpath,/home/arun/anaconda3/lib -Wl,-rpath-link,/home/arun/anaconda3/lib -L/home/arun/anaconda3/lib +LIBOBJS = +LIBQUADMATH = +LIBS = -lm +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +MAINT = # +MAKEINFO = ${SHELL} /home/arun/Documents/mmsp-arun/fftw-3.3.8/missing makeinfo +MANIFEST_TOOL = : +MKDIR_P = /bin/mkdir -p +MPICC = +MPILIBS = +MPIRUN = +NEON_CFLAGS = +NM = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-nm +NMEDIT = +OBJDUMP = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-objdump +OBJEXT = o +OCAMLBUILD = +OPENMP_CFLAGS = +OTOOL = +OTOOL64 = +PACKAGE = fftw +PACKAGE_BUGREPORT = fftw@fftw.org +PACKAGE_NAME = fftw +PACKAGE_STRING = fftw 3.3.8 +PACKAGE_TARNAME = fftw +PACKAGE_URL = +PACKAGE_VERSION = 3.3.8 +PATH_SEPARATOR = : +POW_LIB = +PRECISION = d +PREC_SUFFIX = +PTHREAD_CC = +PTHREAD_CFLAGS = +PTHREAD_LIBS = +RANLIB = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-ranlib +SED = /bin/sed +SET_MAKE = +SHARED_VERSION_INFO = 8:8:5 +SHELL = /bin/bash +SSE2_CFLAGS = +STACK_ALIGN_CFLAGS = +STRIP = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-strip +THREADLIBS = +VERSION = 3.3.8 +VSX_CFLAGS = +abs_builddir = /home/arun/Documents/mmsp-arun/fftw-3.3.8/api +abs_srcdir = /home/arun/Documents/mmsp-arun/fftw-3.3.8/api +abs_top_builddir = /home/arun/Documents/mmsp-arun/fftw-3.3.8 +abs_top_srcdir = /home/arun/Documents/mmsp-arun/fftw-3.3.8 +ac_ct_AR = +ac_ct_CC = /home/arun/anaconda3/bin/x86_64-conda_cos6-linux-gnu-cc +ac_ct_DUMPBIN = +ac_ct_F77 = f77 +acx_pthread_config = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /home/arun/Documents/mmsp-arun/fftw-3.3.8/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../ +top_builddir = .. +top_srcdir = .. +AM_CPPFLAGS = -I $(top_srcdir) +AM_CFLAGS = $(STACK_ALIGN_CFLAGS) +EXTRA_DIST = f03api.sh genf03.pl fftw3.f03.in +include_HEADERS = fftw3.h fftw3.f fftw3l.f03 fftw3q.f03 +nodist_include_HEADERS = fftw3.f03 +noinst_LTLIBRARIES = libapi.la +libapi_la_SOURCES = apiplan.c configure.c execute-dft-c2r.c \ +execute-dft-r2c.c execute-dft.c execute-r2r.c execute-split-dft-c2r.c \ +execute-split-dft-r2c.c execute-split-dft.c execute.c \ +export-wisdom-to-file.c export-wisdom-to-string.c export-wisdom.c \ +f77api.c flops.c forget-wisdom.c import-system-wisdom.c \ +import-wisdom-from-file.c import-wisdom-from-string.c import-wisdom.c \ +malloc.c map-r2r-kind.c mapflags.c mkprinter-file.c mkprinter-str.c \ +mktensor-iodims.c mktensor-rowmajor.c plan-dft-1d.c plan-dft-2d.c \ +plan-dft-3d.c plan-dft-c2r-1d.c plan-dft-c2r-2d.c plan-dft-c2r-3d.c \ +plan-dft-c2r.c plan-dft-r2c-1d.c plan-dft-r2c-2d.c plan-dft-r2c-3d.c \ +plan-dft-r2c.c plan-dft.c plan-guru-dft-c2r.c plan-guru-dft-r2c.c \ +plan-guru-dft.c plan-guru-r2r.c plan-guru-split-dft-c2r.c \ +plan-guru-split-dft-r2c.c plan-guru-split-dft.c plan-many-dft-c2r.c \ +plan-many-dft-r2c.c plan-many-dft.c plan-many-r2r.c plan-r2r-1d.c \ +plan-r2r-2d.c plan-r2r-3d.c plan-r2r.c print-plan.c rdft2-pad.c \ +the-planner.c version.c api.h f77funcs.h fftw3.h x77.h guru.h \ +guru64.h mktensor-iodims.h plan-guru-dft-c2r.h plan-guru-dft-r2c.h \ +plan-guru-dft.h plan-guru-r2r.h plan-guru-split-dft-c2r.h \ +plan-guru-split-dft-r2c.h plan-guru-split-dft.h plan-guru64-dft-c2r.c \ +plan-guru64-dft-r2c.c plan-guru64-dft.c plan-guru64-r2r.c \ +plan-guru64-split-dft-c2r.c plan-guru64-split-dft-r2c.c \ +plan-guru64-split-dft.c mktensor-iodims64.c + +BUILT_SOURCES = fftw3.f fftw3.f03.in fftw3.f03 fftw3l.f03 fftw3q.f03 +CLEANFILES = fftw3.f03 +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu api/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu api/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libapi.la: $(libapi_la_OBJECTS) $(libapi_la_DEPENDENCIES) $(EXTRA_libapi_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libapi_la_OBJECTS) $(libapi_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/apiplan.Plo +include ./$(DEPDIR)/configure.Plo +include ./$(DEPDIR)/execute-dft-c2r.Plo +include ./$(DEPDIR)/execute-dft-r2c.Plo +include ./$(DEPDIR)/execute-dft.Plo +include ./$(DEPDIR)/execute-r2r.Plo +include ./$(DEPDIR)/execute-split-dft-c2r.Plo +include ./$(DEPDIR)/execute-split-dft-r2c.Plo +include ./$(DEPDIR)/execute-split-dft.Plo +include ./$(DEPDIR)/execute.Plo +include ./$(DEPDIR)/export-wisdom-to-file.Plo +include ./$(DEPDIR)/export-wisdom-to-string.Plo +include ./$(DEPDIR)/export-wisdom.Plo +include ./$(DEPDIR)/f77api.Plo +include ./$(DEPDIR)/flops.Plo +include ./$(DEPDIR)/forget-wisdom.Plo +include ./$(DEPDIR)/import-system-wisdom.Plo +include ./$(DEPDIR)/import-wisdom-from-file.Plo +include ./$(DEPDIR)/import-wisdom-from-string.Plo +include ./$(DEPDIR)/import-wisdom.Plo +include ./$(DEPDIR)/malloc.Plo +include ./$(DEPDIR)/map-r2r-kind.Plo +include ./$(DEPDIR)/mapflags.Plo +include ./$(DEPDIR)/mkprinter-file.Plo +include ./$(DEPDIR)/mkprinter-str.Plo +include ./$(DEPDIR)/mktensor-iodims.Plo +include ./$(DEPDIR)/mktensor-iodims64.Plo +include ./$(DEPDIR)/mktensor-rowmajor.Plo +include ./$(DEPDIR)/plan-dft-1d.Plo +include ./$(DEPDIR)/plan-dft-2d.Plo +include ./$(DEPDIR)/plan-dft-3d.Plo +include ./$(DEPDIR)/plan-dft-c2r-1d.Plo +include ./$(DEPDIR)/plan-dft-c2r-2d.Plo +include ./$(DEPDIR)/plan-dft-c2r-3d.Plo +include ./$(DEPDIR)/plan-dft-c2r.Plo +include ./$(DEPDIR)/plan-dft-r2c-1d.Plo +include ./$(DEPDIR)/plan-dft-r2c-2d.Plo +include ./$(DEPDIR)/plan-dft-r2c-3d.Plo +include ./$(DEPDIR)/plan-dft-r2c.Plo +include ./$(DEPDIR)/plan-dft.Plo +include ./$(DEPDIR)/plan-guru-dft-c2r.Plo +include ./$(DEPDIR)/plan-guru-dft-r2c.Plo +include ./$(DEPDIR)/plan-guru-dft.Plo +include ./$(DEPDIR)/plan-guru-r2r.Plo +include ./$(DEPDIR)/plan-guru-split-dft-c2r.Plo +include ./$(DEPDIR)/plan-guru-split-dft-r2c.Plo +include ./$(DEPDIR)/plan-guru-split-dft.Plo +include ./$(DEPDIR)/plan-guru64-dft-c2r.Plo +include ./$(DEPDIR)/plan-guru64-dft-r2c.Plo +include ./$(DEPDIR)/plan-guru64-dft.Plo +include ./$(DEPDIR)/plan-guru64-r2r.Plo +include ./$(DEPDIR)/plan-guru64-split-dft-c2r.Plo +include ./$(DEPDIR)/plan-guru64-split-dft-r2c.Plo +include ./$(DEPDIR)/plan-guru64-split-dft.Plo +include ./$(DEPDIR)/plan-many-dft-c2r.Plo +include ./$(DEPDIR)/plan-many-dft-r2c.Plo +include ./$(DEPDIR)/plan-many-dft.Plo +include ./$(DEPDIR)/plan-many-r2r.Plo +include ./$(DEPDIR)/plan-r2r-1d.Plo +include ./$(DEPDIR)/plan-r2r-2d.Plo +include ./$(DEPDIR)/plan-r2r-3d.Plo +include ./$(DEPDIR)/plan-r2r.Plo +include ./$(DEPDIR)/print-plan.Plo +include ./$(DEPDIR)/rdft2-pad.Plo +include ./$(DEPDIR)/the-planner.Plo +include ./$(DEPDIR)/version.Plo + +.c.o: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +# $(AM_V_CC)source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS install-nodist_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS uninstall-nodist_includeHEADERS + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-man install-nodist_includeHEADERS install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-includeHEADERS \ + uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile + + +fftw3.f03: fftw3.f03.in + (echo "! Generated automatically. DO NOT EDIT!"; echo; \ + echo " integer, parameter :: C_FFTW_R2R_KIND = C_INT32_T"; \ + grep -v "Generated automatically" $(srcdir)/fftw3.f03.in) > $@ + +# convert constants to F77 PARAMETER statements +#fftw3.f: fftw3.h +# rm -f $@ +# perl -pe 's/([A-Z0-9_]+)=([+-]?[0-9]+)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' > $@ +# perl -pe 's/#define +([A-Z0-9_]+) +\(([+-]?[0-9]+)U?\)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' >> $@ +# perl -pe 'if (/#define +([A-Z0-9_]+) +\(([0-9]+)U? *<< *([0-9]+)\)/) { print "\n INTEGER $$1\n PARAMETER ($$1=",$$2 << $$3,")\n"; }' $< |egrep 'PARAMETER|INTEGER' >> $@ + +#fftw3.f03.in: fftw3.h f03api.sh genf03.pl +# sh $(srcdir)/f03api.sh d f > $@ + +#fftw3l.f03: fftw3.h f03api.sh genf03.pl +# sh $(srcdir)/f03api.sh l | grep -v parameter > $@ + +#fftw3q.f03: fftw3.h f03api.sh genf03.pl +# sh $(srcdir)/f03api.sh q | grep -v parameter > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/examples/Integration_with_fftw/fftw/api/Makefile.am b/examples/Integration_with_fftw/fftw/api/Makefile.am new file mode 100644 index 0000000..5cb1082 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/Makefile.am @@ -0,0 +1,59 @@ +AM_CPPFLAGS = -I $(top_srcdir) +AM_CFLAGS = $(STACK_ALIGN_CFLAGS) + +EXTRA_DIST = f03api.sh genf03.pl fftw3.f03.in + +include_HEADERS = fftw3.h fftw3.f fftw3l.f03 fftw3q.f03 +nodist_include_HEADERS = fftw3.f03 +noinst_LTLIBRARIES = libapi.la + +libapi_la_SOURCES = apiplan.c configure.c execute-dft-c2r.c \ +execute-dft-r2c.c execute-dft.c execute-r2r.c execute-split-dft-c2r.c \ +execute-split-dft-r2c.c execute-split-dft.c execute.c \ +export-wisdom-to-file.c export-wisdom-to-string.c export-wisdom.c \ +f77api.c flops.c forget-wisdom.c import-system-wisdom.c \ +import-wisdom-from-file.c import-wisdom-from-string.c import-wisdom.c \ +malloc.c map-r2r-kind.c mapflags.c mkprinter-file.c mkprinter-str.c \ +mktensor-iodims.c mktensor-rowmajor.c plan-dft-1d.c plan-dft-2d.c \ +plan-dft-3d.c plan-dft-c2r-1d.c plan-dft-c2r-2d.c plan-dft-c2r-3d.c \ +plan-dft-c2r.c plan-dft-r2c-1d.c plan-dft-r2c-2d.c plan-dft-r2c-3d.c \ +plan-dft-r2c.c plan-dft.c plan-guru-dft-c2r.c plan-guru-dft-r2c.c \ +plan-guru-dft.c plan-guru-r2r.c plan-guru-split-dft-c2r.c \ +plan-guru-split-dft-r2c.c plan-guru-split-dft.c plan-many-dft-c2r.c \ +plan-many-dft-r2c.c plan-many-dft.c plan-many-r2r.c plan-r2r-1d.c \ +plan-r2r-2d.c plan-r2r-3d.c plan-r2r.c print-plan.c rdft2-pad.c \ +the-planner.c version.c api.h f77funcs.h fftw3.h x77.h guru.h \ +guru64.h mktensor-iodims.h plan-guru-dft-c2r.h plan-guru-dft-r2c.h \ +plan-guru-dft.h plan-guru-r2r.h plan-guru-split-dft-c2r.h \ +plan-guru-split-dft-r2c.h plan-guru-split-dft.h plan-guru64-dft-c2r.c \ +plan-guru64-dft-r2c.c plan-guru64-dft.c plan-guru64-r2r.c \ +plan-guru64-split-dft-c2r.c plan-guru64-split-dft-r2c.c \ +plan-guru64-split-dft.c mktensor-iodims64.c + +BUILT_SOURCES = fftw3.f fftw3.f03.in fftw3.f03 fftw3l.f03 fftw3q.f03 +CLEANFILES = fftw3.f03 + +fftw3.f03: fftw3.f03.in + (echo "! Generated automatically. DO NOT EDIT!"; echo; \ + echo " integer, parameter :: C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@"; \ + grep -v "Generated automatically" $(srcdir)/fftw3.f03.in) > $@ + +if MAINTAINER_MODE + +# convert constants to F77 PARAMETER statements +fftw3.f: fftw3.h + rm -f $@ + perl -pe 's/([A-Z0-9_]+)=([+-]?[0-9]+)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' > $@ + perl -pe 's/#define +([A-Z0-9_]+) +\(([+-]?[0-9]+)U?\)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' >> $@ + perl -pe 'if (/#define +([A-Z0-9_]+) +\(([0-9]+)U? *<< *([0-9]+)\)/) { print "\n INTEGER $$1\n PARAMETER ($$1=",$$2 << $$3,")\n"; }' $< |egrep 'PARAMETER|INTEGER' >> $@ + +fftw3.f03.in: fftw3.h f03api.sh genf03.pl + sh $(srcdir)/f03api.sh d f > $@ + +fftw3l.f03: fftw3.h f03api.sh genf03.pl + sh $(srcdir)/f03api.sh l | grep -v parameter > $@ + +fftw3q.f03: fftw3.h f03api.sh genf03.pl + sh $(srcdir)/f03api.sh q | grep -v parameter > $@ + +endif # MAINTAINER_MODE diff --git a/examples/Integration_with_fftw/fftw/api/Makefile.in b/examples/Integration_with_fftw/fftw/api/Makefile.in new file mode 100644 index 0000000..bf01c48 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/Makefile.in @@ -0,0 +1,846 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = api +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libapi_la_LIBADD = +am_libapi_la_OBJECTS = apiplan.lo configure.lo execute-dft-c2r.lo \ + execute-dft-r2c.lo execute-dft.lo execute-r2r.lo \ + execute-split-dft-c2r.lo execute-split-dft-r2c.lo \ + execute-split-dft.lo execute.lo export-wisdom-to-file.lo \ + export-wisdom-to-string.lo export-wisdom.lo f77api.lo flops.lo \ + forget-wisdom.lo import-system-wisdom.lo \ + import-wisdom-from-file.lo import-wisdom-from-string.lo \ + import-wisdom.lo malloc.lo map-r2r-kind.lo mapflags.lo \ + mkprinter-file.lo mkprinter-str.lo mktensor-iodims.lo \ + mktensor-rowmajor.lo plan-dft-1d.lo plan-dft-2d.lo \ + plan-dft-3d.lo plan-dft-c2r-1d.lo plan-dft-c2r-2d.lo \ + plan-dft-c2r-3d.lo plan-dft-c2r.lo plan-dft-r2c-1d.lo \ + plan-dft-r2c-2d.lo plan-dft-r2c-3d.lo plan-dft-r2c.lo \ + plan-dft.lo plan-guru-dft-c2r.lo plan-guru-dft-r2c.lo \ + plan-guru-dft.lo plan-guru-r2r.lo plan-guru-split-dft-c2r.lo \ + plan-guru-split-dft-r2c.lo plan-guru-split-dft.lo \ + plan-many-dft-c2r.lo plan-many-dft-r2c.lo plan-many-dft.lo \ + plan-many-r2r.lo plan-r2r-1d.lo plan-r2r-2d.lo plan-r2r-3d.lo \ + plan-r2r.lo print-plan.lo rdft2-pad.lo the-planner.lo \ + version.lo plan-guru64-dft-c2r.lo plan-guru64-dft-r2c.lo \ + plan-guru64-dft.lo plan-guru64-r2r.lo \ + plan-guru64-split-dft-c2r.lo plan-guru64-split-dft-r2c.lo \ + plan-guru64-split-dft.lo mktensor-iodims64.lo +libapi_la_OBJECTS = $(am_libapi_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libapi_la_SOURCES) +DIST_SOURCES = $(libapi_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" +HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +AM_CFLAGS = $(STACK_ALIGN_CFLAGS) +EXTRA_DIST = f03api.sh genf03.pl fftw3.f03.in +include_HEADERS = fftw3.h fftw3.f fftw3l.f03 fftw3q.f03 +nodist_include_HEADERS = fftw3.f03 +noinst_LTLIBRARIES = libapi.la +libapi_la_SOURCES = apiplan.c configure.c execute-dft-c2r.c \ +execute-dft-r2c.c execute-dft.c execute-r2r.c execute-split-dft-c2r.c \ +execute-split-dft-r2c.c execute-split-dft.c execute.c \ +export-wisdom-to-file.c export-wisdom-to-string.c export-wisdom.c \ +f77api.c flops.c forget-wisdom.c import-system-wisdom.c \ +import-wisdom-from-file.c import-wisdom-from-string.c import-wisdom.c \ +malloc.c map-r2r-kind.c mapflags.c mkprinter-file.c mkprinter-str.c \ +mktensor-iodims.c mktensor-rowmajor.c plan-dft-1d.c plan-dft-2d.c \ +plan-dft-3d.c plan-dft-c2r-1d.c plan-dft-c2r-2d.c plan-dft-c2r-3d.c \ +plan-dft-c2r.c plan-dft-r2c-1d.c plan-dft-r2c-2d.c plan-dft-r2c-3d.c \ +plan-dft-r2c.c plan-dft.c plan-guru-dft-c2r.c plan-guru-dft-r2c.c \ +plan-guru-dft.c plan-guru-r2r.c plan-guru-split-dft-c2r.c \ +plan-guru-split-dft-r2c.c plan-guru-split-dft.c plan-many-dft-c2r.c \ +plan-many-dft-r2c.c plan-many-dft.c plan-many-r2r.c plan-r2r-1d.c \ +plan-r2r-2d.c plan-r2r-3d.c plan-r2r.c print-plan.c rdft2-pad.c \ +the-planner.c version.c api.h f77funcs.h fftw3.h x77.h guru.h \ +guru64.h mktensor-iodims.h plan-guru-dft-c2r.h plan-guru-dft-r2c.h \ +plan-guru-dft.h plan-guru-r2r.h plan-guru-split-dft-c2r.h \ +plan-guru-split-dft-r2c.h plan-guru-split-dft.h plan-guru64-dft-c2r.c \ +plan-guru64-dft-r2c.c plan-guru64-dft.c plan-guru64-r2r.c \ +plan-guru64-split-dft-c2r.c plan-guru64-split-dft-r2c.c \ +plan-guru64-split-dft.c mktensor-iodims64.c + +BUILT_SOURCES = fftw3.f fftw3.f03.in fftw3.f03 fftw3l.f03 fftw3q.f03 +CLEANFILES = fftw3.f03 +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu api/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu api/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libapi.la: $(libapi_la_OBJECTS) $(libapi_la_DEPENDENCIES) $(EXTRA_libapi_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libapi_la_OBJECTS) $(libapi_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apiplan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/configure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-split-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-split-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-split-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export-wisdom-to-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export-wisdom-to-string.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export-wisdom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/f77api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flops.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forget-wisdom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import-system-wisdom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import-wisdom-from-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import-wisdom-from-string.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import-wisdom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map-r2r-kind.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapflags.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkprinter-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkprinter-str.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktensor-iodims.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktensor-iodims64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktensor-rowmajor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-c2r-1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-c2r-2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-c2r-3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-r2c-1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-r2c-2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-r2c-3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-split-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-split-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-split-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-split-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-split-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-split-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-many-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-many-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-many-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-many-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-r2r-1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-r2r-2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-r2r-3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-plan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-pad.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/the-planner.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS install-nodist_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS uninstall-nodist_includeHEADERS + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-man install-nodist_includeHEADERS install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-includeHEADERS \ + uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile + + +fftw3.f03: fftw3.f03.in + (echo "! Generated automatically. DO NOT EDIT!"; echo; \ + echo " integer, parameter :: C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@"; \ + grep -v "Generated automatically" $(srcdir)/fftw3.f03.in) > $@ + +# convert constants to F77 PARAMETER statements +@MAINTAINER_MODE_TRUE@fftw3.f: fftw3.h +@MAINTAINER_MODE_TRUE@ rm -f $@ +@MAINTAINER_MODE_TRUE@ perl -pe 's/([A-Z0-9_]+)=([+-]?[0-9]+)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' > $@ +@MAINTAINER_MODE_TRUE@ perl -pe 's/#define +([A-Z0-9_]+) +\(([+-]?[0-9]+)U?\)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' >> $@ +@MAINTAINER_MODE_TRUE@ perl -pe 'if (/#define +([A-Z0-9_]+) +\(([0-9]+)U? *<< *([0-9]+)\)/) { print "\n INTEGER $$1\n PARAMETER ($$1=",$$2 << $$3,")\n"; }' $< |egrep 'PARAMETER|INTEGER' >> $@ + +@MAINTAINER_MODE_TRUE@fftw3.f03.in: fftw3.h f03api.sh genf03.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03api.sh d f > $@ + +@MAINTAINER_MODE_TRUE@fftw3l.f03: fftw3.h f03api.sh genf03.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03api.sh l | grep -v parameter > $@ + +@MAINTAINER_MODE_TRUE@fftw3q.f03: fftw3.h f03api.sh genf03.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03api.sh q | grep -v parameter > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/examples/Integration_with_fftw/fftw/api/api.h b/examples/Integration_with_fftw/fftw/api/api.h new file mode 100644 index 0000000..e3e94dd --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/api.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* internal API definitions */ +#ifndef __API_H__ +#define __API_H__ + +#ifndef CALLING_FFTW /* defined in hook.c, when calling internal functions */ +# define COMPILING_FFTW /* used for DLL symbol exporting in fftw3.h */ +#endif + +/* When compiling with GNU libtool on Windows, DLL_EXPORT is #defined + for compiling the shared-library code. In this case, we'll #define + FFTW_DLL to add dllexport attributes to the specified functions in + fftw3.h. + + If we don't specify dllexport explicitly, then libtool + automatically exports all symbols. However, if we specify + dllexport explicitly for any functions, then libtool apparently + doesn't do any automatic exporting. (Not documented, grrr, but + this is the observed behavior with libtool 1.5.8.) Thus, using + this forces us to correctly dllexport every exported symbol, or + linking bench.exe will fail. This has the advantage of forcing + us to mark things correctly, which is necessary for other compilers + (such as MS VC++). */ +#ifdef DLL_EXPORT +# define FFTW_DLL +#endif + +/* just in case: force not to use C99 complex numbers + (we need this for IBM xlc because _Complex_I is treated specially + and is defined even if is not included) */ +#define FFTW_NO_Complex + +#include "api/fftw3.h" +#include "kernel/ifftw.h" +#include "rdft/rdft.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* the API ``plan'' contains both the kernel plan and problem */ +struct X(plan_s) { + plan *pln; + problem *prb; + int sign; +}; + +/* shorthand */ +typedef struct X(plan_s) apiplan; + +/* complex type for internal use */ +typedef R C[2]; + +#define EXTRACT_REIM(sign, c, r, i) X(extract_reim)(sign, (c)[0], r, i) + +#define TAINT_UNALIGNED(p, flg) TAINT(p, ((flg) & FFTW_UNALIGNED) != 0) + +tensor *X(mktensor_rowmajor)(int rnk, const int *n, + const int *niphys, const int *nophys, + int is, int os); + +tensor *X(mktensor_iodims)(int rank, const X(iodim) *dims, int is, int os); +tensor *X(mktensor_iodims64)(int rank, const X(iodim64) *dims, int is, int os); +const int *X(rdft2_pad)(int rnk, const int *n, const int *nembed, + int inplace, int cmplx, int **nfree); + +int X(many_kosherp)(int rnk, const int *n, int howmany); +int X(guru_kosherp)(int rank, const X(iodim) *dims, + int howmany_rank, const X(iodim) *howmany_dims); +int X(guru64_kosherp)(int rank, const X(iodim64) *dims, + int howmany_rank, const X(iodim64) *howmany_dims); + +/* Note: FFTW_EXTERN is used for "internal" functions used in tests/hook.c */ + +FFTW_EXTERN printer *X(mkprinter_file)(FILE *f); + +printer *X(mkprinter_cnt)(size_t *cnt); +printer *X(mkprinter_str)(char *s); + +FFTW_EXTERN planner *X(the_planner)(void); +void X(configure_planner)(planner *plnr); + +void X(mapflags)(planner *, unsigned); + +apiplan *X(mkapiplan)(int sign, unsigned flags, problem *prb); + +rdft_kind *X(map_r2r_kind)(int rank, const X(r2r_kind) * kind); + +typedef void (*planner_hook_t)(void); + +void X(set_planner_hooks)(planner_hook_t before, planner_hook_t after); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* __API_H__ */ diff --git a/examples/Integration_with_fftw/fftw/api/apiplan.c b/examples/Integration_with_fftw/fftw/api/apiplan.c new file mode 100644 index 0000000..b8642a9 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/apiplan.c @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +static planner_hook_t before_planner_hook = 0, after_planner_hook = 0; + +void X(set_planner_hooks)(planner_hook_t before, planner_hook_t after) +{ + before_planner_hook = before; + after_planner_hook = after; +} + +static plan *mkplan0(planner *plnr, unsigned flags, + const problem *prb, unsigned hash_info, + wisdom_state_t wisdom_state) +{ + /* map API flags into FFTW flags */ + X(mapflags)(plnr, flags); + + plnr->flags.hash_info = hash_info; + plnr->wisdom_state = wisdom_state; + + /* create plan */ + return plnr->adt->mkplan(plnr, prb); +} + +static unsigned force_estimator(unsigned flags) +{ + flags &= ~(FFTW_MEASURE | FFTW_PATIENT | FFTW_EXHAUSTIVE); + return (flags | FFTW_ESTIMATE); +} + +static plan *mkplan(planner *plnr, unsigned flags, + const problem *prb, unsigned hash_info) +{ + plan *pln; + + pln = mkplan0(plnr, flags, prb, hash_info, WISDOM_NORMAL); + + if (plnr->wisdom_state == WISDOM_NORMAL && !pln) { + /* maybe the planner failed because of inconsistent wisdom; + plan again ignoring infeasible wisdom */ + pln = mkplan0(plnr, force_estimator(flags), prb, + hash_info, WISDOM_IGNORE_INFEASIBLE); + } + + if (plnr->wisdom_state == WISDOM_IS_BOGUS) { + /* if the planner detected a wisdom inconsistency, + forget all wisdom and plan again */ + plnr->adt->forget(plnr, FORGET_EVERYTHING); + + A(!pln); + pln = mkplan0(plnr, flags, prb, hash_info, WISDOM_NORMAL); + + if (plnr->wisdom_state == WISDOM_IS_BOGUS) { + /* if it still fails, plan without wisdom */ + plnr->adt->forget(plnr, FORGET_EVERYTHING); + + A(!pln); + pln = mkplan0(plnr, force_estimator(flags), + prb, hash_info, WISDOM_IGNORE_ALL); + } + } + + return pln; +} + +apiplan *X(mkapiplan)(int sign, unsigned flags, problem *prb) +{ + apiplan *p = 0; + plan *pln; + unsigned flags_used_for_planning; + planner *plnr; + static const unsigned int pats[] = {FFTW_ESTIMATE, FFTW_MEASURE, + FFTW_PATIENT, FFTW_EXHAUSTIVE}; + int pat, pat_max; + double pcost = 0; + + if (before_planner_hook) + before_planner_hook(); + + plnr = X(the_planner)(); + + if (flags & FFTW_WISDOM_ONLY) { + /* Special mode that returns a plan only if wisdom is present, + and returns 0 otherwise. This is now documented in the manual, + as a way to detect whether wisdom is available for a problem. */ + flags_used_for_planning = flags; + pln = mkplan0(plnr, flags, prb, 0, WISDOM_ONLY); + } else { + pat_max = flags & FFTW_ESTIMATE ? 0 : + (flags & FFTW_EXHAUSTIVE ? 3 : + (flags & FFTW_PATIENT ? 2 : 1)); + pat = plnr->timelimit >= 0 ? 0 : pat_max; + + flags &= ~(FFTW_ESTIMATE | FFTW_MEASURE | + FFTW_PATIENT | FFTW_EXHAUSTIVE); + + plnr->start_time = X(get_crude_time)(); + + /* plan at incrementally increasing patience until we run + out of time */ + for (pln = 0, flags_used_for_planning = 0; pat <= pat_max; ++pat) { + plan *pln1; + unsigned tmpflags = flags | pats[pat]; + pln1 = mkplan(plnr, tmpflags, prb, 0u); + + if (!pln1) { + /* don't bother continuing if planner failed or timed out */ + A(!pln || plnr->timed_out); + break; + } + + X(plan_destroy_internal)(pln); + pln = pln1; + flags_used_for_planning = tmpflags; + pcost = pln->pcost; + } + } + + if (pln) { + /* build apiplan */ + p = (apiplan *) MALLOC(sizeof(apiplan), PLANS); + p->prb = prb; + p->sign = sign; /* cache for execute_dft */ + + /* re-create plan from wisdom, adding blessing */ + p->pln = mkplan(plnr, flags_used_for_planning, prb, BLESSING); + + /* record pcost from most recent measurement for use in X(cost) */ + p->pln->pcost = pcost; + + if (sizeof(trigreal) > sizeof(R)) { + /* this is probably faster, and we have enough trigreal + bits to maintain accuracy */ + X(plan_awake)(p->pln, AWAKE_SQRTN_TABLE); + } else { + /* more accurate */ + X(plan_awake)(p->pln, AWAKE_SINCOS); + } + + /* we don't use pln for p->pln, above, since by re-creating the + plan we might use more patient wisdom from a timed-out mkplan */ + X(plan_destroy_internal)(pln); + } else + X(problem_destroy)(prb); + + /* discard all information not necessary to reconstruct the plan */ + plnr->adt->forget(plnr, FORGET_ACCURSED); + +#ifdef FFTW_RANDOM_ESTIMATOR + X(random_estimate_seed)++; /* subsequent "random" plans are distinct */ +#endif + + if (after_planner_hook) + after_planner_hook(); + + return p; +} + +void X(destroy_plan)(X(plan) p) +{ + if (p) { + if (before_planner_hook) + before_planner_hook(); + + X(plan_awake)(p->pln, SLEEPY); + X(plan_destroy_internal)(p->pln); + X(problem_destroy)(p->prb); + X(ifree)(p); + + if (after_planner_hook) + after_planner_hook(); + } +} + +int X(alignment_of)(R *p) +{ + return X(ialignment_of(p)); +} diff --git a/examples/Integration_with_fftw/fftw/api/configure.c b/examples/Integration_with_fftw/fftw/api/configure.c new file mode 100644 index 0000000..08b074c --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/configure.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" +#include "rdft/rdft.h" +#include "reodft/reodft.h" + +void X(configure_planner)(planner *plnr) +{ + X(dft_conf_standard)(plnr); + X(rdft_conf_standard)(plnr); + X(reodft_conf_standard)(plnr); +} diff --git a/examples/Integration_with_fftw/fftw/api/execute-dft-c2r.c b/examples/Integration_with_fftw/fftw/api/execute-dft-c2r.c new file mode 100644 index 0000000..436cfea --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/execute-dft-c2r.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_dft_c2r)(const X(plan) p, C *in, R *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) p->pln; + problem_rdft2 *prb = (problem_rdft2 *) p->prb; + pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), in[0], in[0]+1); +} diff --git a/examples/Integration_with_fftw/fftw/api/execute-dft-r2c.c b/examples/Integration_with_fftw/fftw/api/execute-dft-r2c.c new file mode 100644 index 0000000..0ba2c18 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/execute-dft-r2c.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_dft_r2c)(const X(plan) p, R *in, C *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) p->pln; + problem_rdft2 *prb = (problem_rdft2 *) p->prb; + pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), out[0], out[0]+1); +} diff --git a/examples/Integration_with_fftw/fftw/api/execute-dft.c b/examples/Integration_with_fftw/fftw/api/execute-dft.c new file mode 100644 index 0000000..56e3afe --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/execute-dft.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +/* guru interface: requires care in alignment etcetera. */ +void X(execute_dft)(const X(plan) p, C *in, C *out) +{ + plan_dft *pln = (plan_dft *) p->pln; + if (p->sign == FFT_SIGN) + pln->apply((plan *) pln, in[0], in[0]+1, out[0], out[0]+1); + else + pln->apply((plan *) pln, in[0]+1, in[0], out[0]+1, out[0]); +} diff --git a/examples/Integration_with_fftw/fftw/api/execute-r2r.c b/examples/Integration_with_fftw/fftw/api/execute-r2r.c new file mode 100644 index 0000000..2f9beab --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/execute-r2r.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, etcetera. */ +void X(execute_r2r)(const X(plan) p, R *in, R *out) +{ + plan_rdft *pln = (plan_rdft *) p->pln; + pln->apply((plan *) pln, in, out); +} diff --git a/examples/Integration_with_fftw/fftw/api/execute-split-dft-c2r.c b/examples/Integration_with_fftw/fftw/api/execute-split-dft-c2r.c new file mode 100644 index 0000000..f44e002 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/execute-split-dft-c2r.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_split_dft_c2r)(const X(plan) p, R *ri, R *ii, R *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) p->pln; + problem_rdft2 *prb = (problem_rdft2 *) p->prb; + pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), ri, ii); +} diff --git a/examples/Integration_with_fftw/fftw/api/execute-split-dft-r2c.c b/examples/Integration_with_fftw/fftw/api/execute-split-dft-r2c.c new file mode 100644 index 0000000..d8f0d62 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/execute-split-dft-r2c.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_split_dft_r2c)(const X(plan) p, R *in, R *ro, R *io) +{ + plan_rdft2 *pln = (plan_rdft2 *) p->pln; + problem_rdft2 *prb = (problem_rdft2 *) p->prb; + pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), ro, io); +} diff --git a/examples/Integration_with_fftw/fftw/api/execute-split-dft.c b/examples/Integration_with_fftw/fftw/api/execute-split-dft.c new file mode 100644 index 0000000..819b9f4 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/execute-split-dft.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_split_dft)(const X(plan) p, R *ri, R *ii, R *ro, R *io) +{ + plan_dft *pln = (plan_dft *) p->pln; + pln->apply((plan *) pln, ri, ii, ro, io); +} diff --git a/examples/Integration_with_fftw/fftw/api/execute.c b/examples/Integration_with_fftw/fftw/api/execute.c new file mode 100644 index 0000000..079b8aa --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/execute.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +void X(execute)(const X(plan) p) +{ + plan *pln = p->pln; + pln->adt->solve(pln, p->prb); +} diff --git a/examples/Integration_with_fftw/fftw/api/export-wisdom-to-file.c b/examples/Integration_with_fftw/fftw/api/export-wisdom-to-file.c new file mode 100644 index 0000000..39dcbaa --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/export-wisdom-to-file.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +void X(export_wisdom_to_file)(FILE *output_file) +{ + printer *p = X(mkprinter_file)(output_file); + planner *plnr = X(the_planner)(); + plnr->adt->exprt(plnr, p); + X(printer_destroy)(p); +} + +int X(export_wisdom_to_filename)(const char *filename) +{ + FILE *f = fopen(filename, "w"); + int ret; + if (!f) return 0; /* error opening file */ + X(export_wisdom_to_file)(f); + ret = !ferror(f); + if (fclose(f)) ret = 0; /* error closing file */ + return ret; +} diff --git a/examples/Integration_with_fftw/fftw/api/export-wisdom-to-string.c b/examples/Integration_with_fftw/fftw/api/export-wisdom-to-string.c new file mode 100644 index 0000000..f1fe7ab --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/export-wisdom-to-string.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +char *X(export_wisdom_to_string)(void) +{ + printer *p; + planner *plnr = X(the_planner)(); + size_t cnt; + char *s; + + p = X(mkprinter_cnt)(&cnt); + plnr->adt->exprt(plnr, p); + X(printer_destroy)(p); + + s = (char *) malloc(sizeof(char) * (cnt + 1)); + if (s) { + p = X(mkprinter_str)(s); + plnr->adt->exprt(plnr, p); + X(printer_destroy)(p); + } + + return s; +} diff --git a/examples/Integration_with_fftw/fftw/api/export-wisdom.c b/examples/Integration_with_fftw/fftw/api/export-wisdom.c new file mode 100644 index 0000000..baa2f35 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/export-wisdom.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +typedef struct { + printer super; + void (*write_char)(char c, void *); + void *data; +} P; + +static void putchr_generic(printer * p_, char c) +{ + P *p = (P *) p_; + (p->write_char)(c, p->data); +} + +void X(export_wisdom)(void (*write_char)(char c, void *), void *data) +{ + P *p = (P *) X(mkprinter)(sizeof(P), putchr_generic, 0); + planner *plnr = X(the_planner)(); + + p->write_char = write_char; + p->data = data; + plnr->adt->exprt(plnr, (printer *) p); + X(printer_destroy)((printer *) p); +} diff --git a/examples/Integration_with_fftw/fftw/api/f03api.sh b/examples/Integration_with_fftw/fftw/api/f03api.sh new file mode 100755 index 0000000..caaacaf --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/f03api.sh @@ -0,0 +1,42 @@ +#! /bin/sh + +# Script to generate Fortran 2003 interface declarations for FFTW from +# the fftw3.h header file. + +# This is designed so that the Fortran caller can do: +# use, intrinsic :: iso_c_binding +# implicit none +# include 'fftw3.f03' +# and then call the C FFTW functions directly, with type checking. + +echo "! Generated automatically. DO NOT EDIT!" +echo + +# C_FFTW_R2R_KIND is determined by configure and inserted by the Makefile +# echo " integer, parameter :: C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@" + +# Extract constants +perl -pe 's/([A-Z0-9_]+)=([+-]?[0-9]+)/\n integer\(C_INT\), parameter :: \1 = \2\n/g' < fftw3.h | grep 'integer(C_INT)' +perl -pe 's/#define +([A-Z0-9_]+) +\(([+-]?[0-9]+)U?\)/\n integer\(C_INT\), parameter :: \1 = \2\n/g' < fftw3.h | grep 'integer(C_INT)' +perl -pe 'if (/#define +([A-Z0-9_]+) +\(([0-9]+)U? *<< *([0-9]+)\)/) { print "\n integer\(C_INT\), parameter :: $1 = ",$2 << $3,"\n"; }' < fftw3.h | grep 'integer(C_INT)' + +# Extract function declarations +for p in $*; do + if test "$p" = "d"; then p=""; fi + + echo + cat <f77_write_char(&c, ad->data); +} + +typedef struct { + void (*f77_read_char)(int *, void *); + void *data; +} read_char_data; + +static int read_char(void *d) +{ + read_char_data *ed = (read_char_data *) d; + int c; + ed->f77_read_char(&c, ed->data); + return (c < 0 ? EOF : c); +} + +static X(r2r_kind) *ints2kinds(int rnk, const int *ik) +{ + if (!FINITE_RNK(rnk) || rnk == 0) + return 0; + else { + int i; + X(r2r_kind) *k; + + k = (X(r2r_kind) *) MALLOC(sizeof(X(r2r_kind)) * (unsigned)rnk, PROBLEMS); + /* reverse order for Fortran -> C */ + for (i = 0; i < rnk; ++i) + k[i] = (X(r2r_kind)) ik[rnk - 1 - i]; + return k; + } +} + +/*-----------------------------------------------------------------------*/ + +#define F77(a, A) F77x(x77(a), X77(A)) + +#ifndef WINDOWS_F77_MANGLING + +#if defined(F77_FUNC) +# define F77x(a, A) F77_FUNC(a, A) +# include "f77funcs.h" +#endif + +/* If identifiers with underscores are mangled differently than those + without underscores, then we include *both* mangling versions. The + reason is that the only Fortran compiler that does such differing + mangling is currently g77 (which adds an extra underscore to names + with underscores), whereas other compilers running on the same + machine are likely to use non-underscored mangling. (I'm sick + of users complaining that FFTW works with g77 but not with e.g. + pgf77 or ifc on the same machine.) Note that all FFTW identifiers + contain underscores, and configure picks g77 by default. */ +#if defined(F77_FUNC_) && !defined(F77_FUNC_EQUIV) +# undef F77x +# define F77x(a, A) F77_FUNC_(a, A) +# include "f77funcs.h" +#endif + +#else /* WINDOWS_F77_MANGLING */ + +/* Various mangling conventions common (?) under Windows. */ + +/* g77 */ +# define WINDOWS_F77_FUNC(a, A) a ## __ +# define F77x(a, A) WINDOWS_F77_FUNC(a, A) +# include "f77funcs.h" + +/* Intel, etc. */ +# undef WINDOWS_F77_FUNC +# define WINDOWS_F77_FUNC(a, A) a ## _ +# include "f77funcs.h" + +/* Digital/Compaq/HP Visual Fortran, Intel Fortran. stdcall attribute + is apparently required to adjust for calling conventions (callee + pops stack in stdcall). See also: + http://msdn.microsoft.com/library/en-us/vccore98/html/_core_mixed.2d.language_programming.3a_.overview.asp +*/ +# undef WINDOWS_F77_FUNC +# if defined(__GNUC__) +# define WINDOWS_F77_FUNC(a, A) __attribute__((stdcall)) A +# elif defined(_MSC_VER) || defined(_ICC) || defined(_STDCALL_SUPPORTED) +# define WINDOWS_F77_FUNC(a, A) __stdcall A +# else +# define WINDOWS_F77_FUNC(a, A) A /* oh well */ +# endif +# include "f77funcs.h" + +#endif /* WINDOWS_F77_MANGLING */ + +#endif /* F77_FUNC */ diff --git a/examples/Integration_with_fftw/fftw/api/f77funcs.h b/examples/Integration_with_fftw/fftw/api/f77funcs.h new file mode 100644 index 0000000..1e557dc --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/f77funcs.h @@ -0,0 +1,458 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Functions in the FFTW Fortran API, mangled according to the + F77(...) macro. This file is designed to be #included by + f77api.c, possibly multiple times in order to support multiple + compiler manglings (via redefinition of F77). */ + +FFTW_VOIDFUNC F77(execute, EXECUTE)(X(plan) * const p) +{ + plan *pln = (*p)->pln; + pln->adt->solve(pln, (*p)->prb); +} + +FFTW_VOIDFUNC F77(destroy_plan, DESTROY_PLAN)(X(plan) *p) +{ + X(destroy_plan)(*p); +} + +FFTW_VOIDFUNC F77(cleanup, CLEANUP)(void) +{ + X(cleanup)(); +} + +FFTW_VOIDFUNC F77(forget_wisdom, FORGET_WISDOM)(void) +{ + X(forget_wisdom)(); +} + +FFTW_VOIDFUNC F77(export_wisdom, EXPORT_WISDOM)(void (*f77_write_char)(char *, void *), + void *data) +{ + write_char_data ad; + ad.f77_write_char = f77_write_char; + ad.data = data; + X(export_wisdom)(write_char, (void *) &ad); +} + +FFTW_VOIDFUNC F77(import_wisdom, IMPORT_WISDOM)(int *isuccess, + void (*f77_read_char)(int *, void *), + void *data) +{ + read_char_data ed; + ed.f77_read_char = f77_read_char; + ed.data = data; + *isuccess = X(import_wisdom)(read_char, (void *) &ed); +} + +FFTW_VOIDFUNC F77(import_system_wisdom, IMPORT_SYSTEM_WISDOM)(int *isuccess) +{ + *isuccess = X(import_system_wisdom)(); +} + +FFTW_VOIDFUNC F77(print_plan, PRINT_PLAN)(X(plan) * const p) +{ + X(print_plan)(*p); + fflush(stdout); +} + +FFTW_VOIDFUNC F77(flops,FLOPS)(X(plan) *p, double *add, double *mul, double *fma) +{ + X(flops)(*p, add, mul, fma); +} + +FFTW_VOIDFUNC F77(estimate_cost,ESTIMATE_COST)(double *cost, X(plan) * const p) +{ + *cost = X(estimate_cost)(*p); +} + +FFTW_VOIDFUNC F77(cost,COST)(double *cost, X(plan) * const p) +{ + *cost = X(cost)(*p); +} + +FFTW_VOIDFUNC F77(set_timelimit,SET_TIMELIMIT)(double *t) +{ + X(set_timelimit)(*t); +} + +/******************************** DFT ***********************************/ + +FFTW_VOIDFUNC F77(plan_dft, PLAN_DFT)(X(plan) *p, int *rank, const int *n, + C *in, C *out, int *sign, int *flags) +{ + int *nrev = reverse_n(*rank, n); + *p = X(plan_dft)(*rank, nrev, in, out, *sign, *flags); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_dft_1d, PLAN_DFT_1D)(X(plan) *p, int *n, C *in, C *out, + int *sign, int *flags) +{ + *p = X(plan_dft_1d)(*n, in, out, *sign, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_2d, PLAN_DFT_2D)(X(plan) *p, int *nx, int *ny, + C *in, C *out, int *sign, int *flags) +{ + *p = X(plan_dft_2d)(*ny, *nx, in, out, *sign, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_3d, PLAN_DFT_3D)(X(plan) *p, int *nx, int *ny, int *nz, + C *in, C *out, + int *sign, int *flags) +{ + *p = X(plan_dft_3d)(*nz, *ny, *nx, in, out, *sign, *flags); +} + +FFTW_VOIDFUNC F77(plan_many_dft, PLAN_MANY_DFT)(X(plan) *p, int *rank, const int *n, + int *howmany, + C *in, const int *inembed, + int *istride, int *idist, + C *out, const int *onembed, + int *ostride, int *odist, + int *sign, int *flags) +{ + int *nrev = reverse_n(*rank, n); + int *inembedrev = reverse_n(*rank, inembed); + int *onembedrev = reverse_n(*rank, onembed); + *p = X(plan_many_dft)(*rank, nrev, *howmany, + in, inembedrev, *istride, *idist, + out, onembedrev, *ostride, *odist, + *sign, *flags); + X(ifree0)(onembedrev); + X(ifree0)(inembedrev); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_guru_dft, PLAN_GURU_DFT)(X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + C *in, C *out, int *sign, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_dft)(*rank, dims, *howmany_rank, howmany_dims, + in, out, *sign, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(plan_guru_split_dft, PLAN_GURU_SPLIT_DFT)(X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *ri, R *ii, R *ro, R *io, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_split_dft)(*rank, dims, *howmany_rank, howmany_dims, + ri, ii, ro, io, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(execute_dft, EXECUTE_DFT)(X(plan) * const p, C *in, C *out) +{ + plan_dft *pln = (plan_dft *) (*p)->pln; + if ((*p)->sign == FFT_SIGN) + pln->apply((plan *) pln, in[0], in[0]+1, out[0], out[0]+1); + else + pln->apply((plan *) pln, in[0]+1, in[0], out[0]+1, out[0]); +} + +FFTW_VOIDFUNC F77(execute_split_dft, EXECUTE_SPLIT_DFT)(X(plan) * const p, + R *ri, R *ii, R *ro, R *io) +{ + plan_dft *pln = (plan_dft *) (*p)->pln; + pln->apply((plan *) pln, ri, ii, ro, io); +} + +/****************************** DFT r2c *********************************/ + +FFTW_VOIDFUNC F77(plan_dft_r2c, PLAN_DFT_R2C)(X(plan) *p, int *rank, const int *n, + R *in, C *out, int *flags) +{ + int *nrev = reverse_n(*rank, n); + *p = X(plan_dft_r2c)(*rank, nrev, in, out, *flags); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_dft_r2c_1d, PLAN_DFT_R2C_1D)(X(plan) *p, int *n, R *in, C *out, + int *flags) +{ + *p = X(plan_dft_r2c_1d)(*n, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_r2c_2d, PLAN_DFT_R2C_2D)(X(plan) *p, int *nx, int *ny, + R *in, C *out, int *flags) +{ + *p = X(plan_dft_r2c_2d)(*ny, *nx, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_r2c_3d, PLAN_DFT_R2C_3D)(X(plan) *p, + int *nx, int *ny, int *nz, + R *in, C *out, + int *flags) +{ + *p = X(plan_dft_r2c_3d)(*nz, *ny, *nx, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_many_dft_r2c, PLAN_MANY_DFT_R2C)( + X(plan) *p, int *rank, const int *n, + int *howmany, + R *in, const int *inembed, int *istride, int *idist, + C *out, const int *onembed, int *ostride, int *odist, + int *flags) +{ + int *nrev = reverse_n(*rank, n); + int *inembedrev = reverse_n(*rank, inembed); + int *onembedrev = reverse_n(*rank, onembed); + *p = X(plan_many_dft_r2c)(*rank, nrev, *howmany, + in, inembedrev, *istride, *idist, + out, onembedrev, *ostride, *odist, + *flags); + X(ifree0)(onembedrev); + X(ifree0)(inembedrev); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_guru_dft_r2c, PLAN_GURU_DFT_R2C)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *in, C *out, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_dft_r2c)(*rank, dims, *howmany_rank, howmany_dims, + in, out, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(plan_guru_split_dft_r2c, PLAN_GURU_SPLIT_DFT_R2C)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *in, R *ro, R *io, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_split_dft_r2c)(*rank, dims, *howmany_rank, howmany_dims, + in, ro, io, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(execute_dft_r2c, EXECUTE_DFT_R2C)(X(plan) * const p, R *in, C *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln; + problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb; + pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), out[0], out[0]+1); +} + +FFTW_VOIDFUNC F77(execute_split_dft_r2c, EXECUTE_SPLIT_DFT_R2C)(X(plan) * const p, + R *in, R *ro, R *io) +{ + plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln; + problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb; + pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), ro, io); +} + +/****************************** DFT c2r *********************************/ + +FFTW_VOIDFUNC F77(plan_dft_c2r, PLAN_DFT_C2R)(X(plan) *p, int *rank, const int *n, + C *in, R *out, int *flags) +{ + int *nrev = reverse_n(*rank, n); + *p = X(plan_dft_c2r)(*rank, nrev, in, out, *flags); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_dft_c2r_1d, PLAN_DFT_C2R_1D)(X(plan) *p, int *n, C *in, R *out, + int *flags) +{ + *p = X(plan_dft_c2r_1d)(*n, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_c2r_2d, PLAN_DFT_C2R_2D)(X(plan) *p, int *nx, int *ny, + C *in, R *out, int *flags) +{ + *p = X(plan_dft_c2r_2d)(*ny, *nx, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_c2r_3d, PLAN_DFT_C2R_3D)(X(plan) *p, + int *nx, int *ny, int *nz, + C *in, R *out, + int *flags) +{ + *p = X(plan_dft_c2r_3d)(*nz, *ny, *nx, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_many_dft_c2r, PLAN_MANY_DFT_C2R)( + X(plan) *p, int *rank, const int *n, + int *howmany, + C *in, const int *inembed, int *istride, int *idist, + R *out, const int *onembed, int *ostride, int *odist, + int *flags) +{ + int *nrev = reverse_n(*rank, n); + int *inembedrev = reverse_n(*rank, inembed); + int *onembedrev = reverse_n(*rank, onembed); + *p = X(plan_many_dft_c2r)(*rank, nrev, *howmany, + in, inembedrev, *istride, *idist, + out, onembedrev, *ostride, *odist, + *flags); + X(ifree0)(onembedrev); + X(ifree0)(inembedrev); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_guru_dft_c2r, PLAN_GURU_DFT_C2R)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + C *in, R *out, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_dft_c2r)(*rank, dims, *howmany_rank, howmany_dims, + in, out, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(plan_guru_split_dft_c2r, PLAN_GURU_SPLIT_DFT_C2R)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *ri, R *ii, R *out, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_split_dft_c2r)(*rank, dims, *howmany_rank, howmany_dims, + ri, ii, out, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(execute_dft_c2r, EXECUTE_DFT_C2R)(X(plan) * const p, C *in, R *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln; + problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb; + pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), in[0], in[0]+1); +} + +FFTW_VOIDFUNC F77(execute_split_dft_c2r, EXECUTE_SPLIT_DFT_C2R)(X(plan) * const p, + R *ri, R *ii, R *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln; + problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb; + pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), ri, ii); +} + +/****************************** r2r *********************************/ + +FFTW_VOIDFUNC F77(plan_r2r, PLAN_R2R)(X(plan) *p, int *rank, const int *n, + R *in, R *out, + int *kind, int *flags) +{ + int *nrev = reverse_n(*rank, n); + X(r2r_kind) *k = ints2kinds(*rank, kind); + *p = X(plan_r2r)(*rank, nrev, in, out, k, *flags); + X(ifree0)(k); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_r2r_1d, PLAN_R2R_1D)(X(plan) *p, int *n, R *in, R *out, + int *kind, int *flags) +{ + *p = X(plan_r2r_1d)(*n, in, out, (X(r2r_kind)) *kind, *flags); +} + +FFTW_VOIDFUNC F77(plan_r2r_2d, PLAN_R2R_2D)(X(plan) *p, int *nx, int *ny, + R *in, R *out, + int *kindx, int *kindy, int *flags) +{ + *p = X(plan_r2r_2d)(*ny, *nx, in, out, + (X(r2r_kind)) *kindy, (X(r2r_kind)) *kindx, *flags); +} + +FFTW_VOIDFUNC F77(plan_r2r_3d, PLAN_R2R_3D)(X(plan) *p, + int *nx, int *ny, int *nz, + R *in, R *out, + int *kindx, int *kindy, int *kindz, + int *flags) +{ + *p = X(plan_r2r_3d)(*nz, *ny, *nx, in, out, + (X(r2r_kind)) *kindz, (X(r2r_kind)) *kindy, + (X(r2r_kind)) *kindx, *flags); +} + +FFTW_VOIDFUNC F77(plan_many_r2r, PLAN_MANY_R2R)( + X(plan) *p, int *rank, const int *n, + int *howmany, + R *in, const int *inembed, int *istride, int *idist, + R *out, const int *onembed, int *ostride, int *odist, + int *kind, int *flags) +{ + int *nrev = reverse_n(*rank, n); + int *inembedrev = reverse_n(*rank, inembed); + int *onembedrev = reverse_n(*rank, onembed); + X(r2r_kind) *k = ints2kinds(*rank, kind); + *p = X(plan_many_r2r)(*rank, nrev, *howmany, + in, inembedrev, *istride, *idist, + out, onembedrev, *ostride, *odist, + k, *flags); + X(ifree0)(k); + X(ifree0)(onembedrev); + X(ifree0)(inembedrev); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_guru_r2r, PLAN_GURU_R2R)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *in, R *out, int *kind, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + X(r2r_kind) *k = ints2kinds(*rank, kind); + *p = X(plan_guru_r2r)(*rank, dims, *howmany_rank, howmany_dims, + in, out, k, *flags); + X(ifree0)(k); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(execute_r2r, EXECUTE_R2R)(X(plan) * const p, R *in, R *out) +{ + plan_rdft *pln = (plan_rdft *) (*p)->pln; + pln->apply((plan *) pln, in, out); +} diff --git a/examples/Integration_with_fftw/fftw/api/fftw3.f b/examples/Integration_with_fftw/fftw/api/fftw3.f new file mode 100644 index 0000000..72d1aaf --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/fftw3.f @@ -0,0 +1,72 @@ + INTEGER FFTW_R2HC + PARAMETER (FFTW_R2HC=0) + INTEGER FFTW_HC2R + PARAMETER (FFTW_HC2R=1) + INTEGER FFTW_DHT + PARAMETER (FFTW_DHT=2) + INTEGER FFTW_REDFT00 + PARAMETER (FFTW_REDFT00=3) + INTEGER FFTW_REDFT01 + PARAMETER (FFTW_REDFT01=4) + INTEGER FFTW_REDFT10 + PARAMETER (FFTW_REDFT10=5) + INTEGER FFTW_REDFT11 + PARAMETER (FFTW_REDFT11=6) + INTEGER FFTW_RODFT00 + PARAMETER (FFTW_RODFT00=7) + INTEGER FFTW_RODFT01 + PARAMETER (FFTW_RODFT01=8) + INTEGER FFTW_RODFT10 + PARAMETER (FFTW_RODFT10=9) + INTEGER FFTW_RODFT11 + PARAMETER (FFTW_RODFT11=10) + INTEGER FFTW_FORWARD + PARAMETER (FFTW_FORWARD=-1) + INTEGER FFTW_BACKWARD + PARAMETER (FFTW_BACKWARD=+1) + INTEGER FFTW_MEASURE + PARAMETER (FFTW_MEASURE=0) + INTEGER FFTW_DESTROY_INPUT + PARAMETER (FFTW_DESTROY_INPUT=1) + INTEGER FFTW_UNALIGNED + PARAMETER (FFTW_UNALIGNED=2) + INTEGER FFTW_CONSERVE_MEMORY + PARAMETER (FFTW_CONSERVE_MEMORY=4) + INTEGER FFTW_EXHAUSTIVE + PARAMETER (FFTW_EXHAUSTIVE=8) + INTEGER FFTW_PRESERVE_INPUT + PARAMETER (FFTW_PRESERVE_INPUT=16) + INTEGER FFTW_PATIENT + PARAMETER (FFTW_PATIENT=32) + INTEGER FFTW_ESTIMATE + PARAMETER (FFTW_ESTIMATE=64) + INTEGER FFTW_WISDOM_ONLY + PARAMETER (FFTW_WISDOM_ONLY=2097152) + INTEGER FFTW_ESTIMATE_PATIENT + PARAMETER (FFTW_ESTIMATE_PATIENT=128) + INTEGER FFTW_BELIEVE_PCOST + PARAMETER (FFTW_BELIEVE_PCOST=256) + INTEGER FFTW_NO_DFT_R2HC + PARAMETER (FFTW_NO_DFT_R2HC=512) + INTEGER FFTW_NO_NONTHREADED + PARAMETER (FFTW_NO_NONTHREADED=1024) + INTEGER FFTW_NO_BUFFERING + PARAMETER (FFTW_NO_BUFFERING=2048) + INTEGER FFTW_NO_INDIRECT_OP + PARAMETER (FFTW_NO_INDIRECT_OP=4096) + INTEGER FFTW_ALLOW_LARGE_GENERIC + PARAMETER (FFTW_ALLOW_LARGE_GENERIC=8192) + INTEGER FFTW_NO_RANK_SPLITS + PARAMETER (FFTW_NO_RANK_SPLITS=16384) + INTEGER FFTW_NO_VRANK_SPLITS + PARAMETER (FFTW_NO_VRANK_SPLITS=32768) + INTEGER FFTW_NO_VRECURSE + PARAMETER (FFTW_NO_VRECURSE=65536) + INTEGER FFTW_NO_SIMD + PARAMETER (FFTW_NO_SIMD=131072) + INTEGER FFTW_NO_SLOW + PARAMETER (FFTW_NO_SLOW=262144) + INTEGER FFTW_NO_FIXED_RADIX_LARGE_N + PARAMETER (FFTW_NO_FIXED_RADIX_LARGE_N=524288) + INTEGER FFTW_ALLOW_PRUNING + PARAMETER (FFTW_ALLOW_PRUNING=1048576) diff --git a/examples/Integration_with_fftw/fftw/api/fftw3.f03 b/examples/Integration_with_fftw/fftw/api/fftw3.f03 new file mode 100644 index 0000000..85ba1b6 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/fftw3.f03 @@ -0,0 +1,1254 @@ +! Generated automatically. DO NOT EDIT! + + integer, parameter :: C_FFTW_R2R_KIND = C_INT32_T + + integer(C_INT), parameter :: FFTW_R2HC = 0 + integer(C_INT), parameter :: FFTW_HC2R = 1 + integer(C_INT), parameter :: FFTW_DHT = 2 + integer(C_INT), parameter :: FFTW_REDFT00 = 3 + integer(C_INT), parameter :: FFTW_REDFT01 = 4 + integer(C_INT), parameter :: FFTW_REDFT10 = 5 + integer(C_INT), parameter :: FFTW_REDFT11 = 6 + integer(C_INT), parameter :: FFTW_RODFT00 = 7 + integer(C_INT), parameter :: FFTW_RODFT01 = 8 + integer(C_INT), parameter :: FFTW_RODFT10 = 9 + integer(C_INT), parameter :: FFTW_RODFT11 = 10 + integer(C_INT), parameter :: FFTW_FORWARD = -1 + integer(C_INT), parameter :: FFTW_BACKWARD = +1 + integer(C_INT), parameter :: FFTW_MEASURE = 0 + integer(C_INT), parameter :: FFTW_DESTROY_INPUT = 1 + integer(C_INT), parameter :: FFTW_UNALIGNED = 2 + integer(C_INT), parameter :: FFTW_CONSERVE_MEMORY = 4 + integer(C_INT), parameter :: FFTW_EXHAUSTIVE = 8 + integer(C_INT), parameter :: FFTW_PRESERVE_INPUT = 16 + integer(C_INT), parameter :: FFTW_PATIENT = 32 + integer(C_INT), parameter :: FFTW_ESTIMATE = 64 + integer(C_INT), parameter :: FFTW_WISDOM_ONLY = 2097152 + integer(C_INT), parameter :: FFTW_ESTIMATE_PATIENT = 128 + integer(C_INT), parameter :: FFTW_BELIEVE_PCOST = 256 + integer(C_INT), parameter :: FFTW_NO_DFT_R2HC = 512 + integer(C_INT), parameter :: FFTW_NO_NONTHREADED = 1024 + integer(C_INT), parameter :: FFTW_NO_BUFFERING = 2048 + integer(C_INT), parameter :: FFTW_NO_INDIRECT_OP = 4096 + integer(C_INT), parameter :: FFTW_ALLOW_LARGE_GENERIC = 8192 + integer(C_INT), parameter :: FFTW_NO_RANK_SPLITS = 16384 + integer(C_INT), parameter :: FFTW_NO_VRANK_SPLITS = 32768 + integer(C_INT), parameter :: FFTW_NO_VRECURSE = 65536 + integer(C_INT), parameter :: FFTW_NO_SIMD = 131072 + integer(C_INT), parameter :: FFTW_NO_SLOW = 262144 + integer(C_INT), parameter :: FFTW_NO_FIXED_RADIX_LARGE_N = 524288 + integer(C_INT), parameter :: FFTW_ALLOW_PRUNING = 1048576 + + type, bind(C) :: fftw_iodim + integer(C_INT) n, is, os + end type fftw_iodim + type, bind(C) :: fftw_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftw_iodim64 + + interface + type(C_PTR) function fftw_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftw_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft + + type(C_PTR) function fftw_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftw_plan_dft_1d') + import + integer(C_INT), value :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_1d + + type(C_PTR) function fftw_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftw_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_2d + + type(C_PTR) function fftw_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftw_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_3d + + type(C_PTR) function fftw_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftw_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_many_dft + + type(C_PTR) function fftw_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftw_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_guru_dft + + type(C_PTR) function fftw_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftw_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft + + type(C_PTR) function fftw_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftw_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft + + type(C_PTR) function fftw_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftw_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft + + subroutine fftw_execute_dft(p,in,out) bind(C, name='fftw_execute_dft') + import + type(C_PTR), value :: p + complex(C_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft + + subroutine fftw_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftw_execute_split_dft') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: ri + real(C_DOUBLE), dimension(*), intent(inout) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftw_execute_split_dft + + type(C_PTR) function fftw_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftw_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftw_plan_many_dft_r2c + + type(C_PTR) function fftw_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftw_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c + + type(C_PTR) function fftw_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftw_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_1d + + type(C_PTR) function fftw_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftw_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_2d + + type(C_PTR) function fftw_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftw_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_3d + + type(C_PTR) function fftw_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftw_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftw_plan_many_dft_c2r + + type(C_PTR) function fftw_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftw_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r + + type(C_PTR) function fftw_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftw_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_1d + + type(C_PTR) function fftw_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftw_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_2d + + type(C_PTR) function fftw_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftw_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_3d + + type(C_PTR) function fftw_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_dft_r2c + + type(C_PTR) function fftw_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_dft_c2r + + type(C_PTR) function fftw_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftw_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft_r2c + + type(C_PTR) function fftw_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftw_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft_c2r + + type(C_PTR) function fftw_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft_r2c + + type(C_PTR) function fftw_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft_c2r + + type(C_PTR) function fftw_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftw_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft_r2c + + type(C_PTR) function fftw_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftw_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft_c2r + + subroutine fftw_execute_dft_r2c(p,in,out) bind(C, name='fftw_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft_r2c + + subroutine fftw_execute_dft_c2r(p,in,out) bind(C, name='fftw_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft_c2r + + subroutine fftw_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftw_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftw_execute_split_dft_r2c + + subroutine fftw_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftw_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: ri + real(C_DOUBLE), dimension(*), intent(inout) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_split_dft_c2r + + type(C_PTR) function fftw_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftw_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_many_r2r + + type(C_PTR) function fftw_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftw_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_r2r + + type(C_PTR) function fftw_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftw_plan_r2r_1d') + import + integer(C_INT), value :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftw_plan_r2r_1d + + type(C_PTR) function fftw_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftw_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftw_plan_r2r_2d + + type(C_PTR) function fftw_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftw_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftw_plan_r2r_3d + + type(C_PTR) function fftw_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftw_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_guru_r2r + + type(C_PTR) function fftw_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftw_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_guru64_r2r + + subroutine fftw_execute_r2r(p,in,out) bind(C, name='fftw_execute_r2r') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_r2r + + subroutine fftw_destroy_plan(p) bind(C, name='fftw_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftw_destroy_plan + + subroutine fftw_forget_wisdom() bind(C, name='fftw_forget_wisdom') + import + end subroutine fftw_forget_wisdom + + subroutine fftw_cleanup() bind(C, name='fftw_cleanup') + import + end subroutine fftw_cleanup + + subroutine fftw_set_timelimit(t) bind(C, name='fftw_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftw_set_timelimit + + subroutine fftw_plan_with_nthreads(nthreads) bind(C, name='fftw_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftw_plan_with_nthreads + + integer(C_INT) function fftw_init_threads() bind(C, name='fftw_init_threads') + import + end function fftw_init_threads + + subroutine fftw_cleanup_threads() bind(C, name='fftw_cleanup_threads') + import + end subroutine fftw_cleanup_threads + + subroutine fftw_make_planner_thread_safe() bind(C, name='fftw_make_planner_thread_safe') + import + end subroutine fftw_make_planner_thread_safe + + integer(C_INT) function fftw_export_wisdom_to_filename(filename) bind(C, name='fftw_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftw_export_wisdom_to_filename + + subroutine fftw_export_wisdom_to_file(output_file) bind(C, name='fftw_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftw_export_wisdom_to_file + + type(C_PTR) function fftw_export_wisdom_to_string() bind(C, name='fftw_export_wisdom_to_string') + import + end function fftw_export_wisdom_to_string + + subroutine fftw_export_wisdom(write_char,data) bind(C, name='fftw_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftw_export_wisdom + + integer(C_INT) function fftw_import_system_wisdom() bind(C, name='fftw_import_system_wisdom') + import + end function fftw_import_system_wisdom + + integer(C_INT) function fftw_import_wisdom_from_filename(filename) bind(C, name='fftw_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftw_import_wisdom_from_filename + + integer(C_INT) function fftw_import_wisdom_from_file(input_file) bind(C, name='fftw_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftw_import_wisdom_from_file + + integer(C_INT) function fftw_import_wisdom_from_string(input_string) bind(C, name='fftw_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftw_import_wisdom_from_string + + integer(C_INT) function fftw_import_wisdom(read_char,data) bind(C, name='fftw_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftw_import_wisdom + + subroutine fftw_fprint_plan(p,output_file) bind(C, name='fftw_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftw_fprint_plan + + subroutine fftw_print_plan(p) bind(C, name='fftw_print_plan') + import + type(C_PTR), value :: p + end subroutine fftw_print_plan + + type(C_PTR) function fftw_sprint_plan(p) bind(C, name='fftw_sprint_plan') + import + type(C_PTR), value :: p + end function fftw_sprint_plan + + type(C_PTR) function fftw_malloc(n) bind(C, name='fftw_malloc') + import + integer(C_SIZE_T), value :: n + end function fftw_malloc + + type(C_PTR) function fftw_alloc_real(n) bind(C, name='fftw_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftw_alloc_real + + type(C_PTR) function fftw_alloc_complex(n) bind(C, name='fftw_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftw_alloc_complex + + subroutine fftw_free(p) bind(C, name='fftw_free') + import + type(C_PTR), value :: p + end subroutine fftw_free + + subroutine fftw_flops(p,add,mul,fmas) bind(C, name='fftw_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftw_flops + + real(C_DOUBLE) function fftw_estimate_cost(p) bind(C, name='fftw_estimate_cost') + import + type(C_PTR), value :: p + end function fftw_estimate_cost + + real(C_DOUBLE) function fftw_cost(p) bind(C, name='fftw_cost') + import + type(C_PTR), value :: p + end function fftw_cost + + integer(C_INT) function fftw_alignment_of(p) bind(C, name='fftw_alignment_of') + import + real(C_DOUBLE), dimension(*), intent(out) :: p + end function fftw_alignment_of + + end interface + + type, bind(C) :: fftwf_iodim + integer(C_INT) n, is, os + end type fftwf_iodim + type, bind(C) :: fftwf_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftwf_iodim64 + + interface + type(C_PTR) function fftwf_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwf_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft + + type(C_PTR) function fftwf_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwf_plan_dft_1d') + import + integer(C_INT), value :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_1d + + type(C_PTR) function fftwf_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwf_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_2d + + type(C_PTR) function fftwf_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwf_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_3d + + type(C_PTR) function fftwf_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftwf_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_many_dft + + type(C_PTR) function fftwf_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwf_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft + + type(C_PTR) function fftwf_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwf_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft + + type(C_PTR) function fftwf_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwf_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft + + type(C_PTR) function fftwf_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwf_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft + + subroutine fftwf_execute_dft(p,in,out) bind(C, name='fftwf_execute_dft') + import + type(C_PTR), value :: p + complex(C_FLOAT_COMPLEX), dimension(*), intent(inout) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft + + subroutine fftwf_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwf_execute_split_dft') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: ri + real(C_FLOAT), dimension(*), intent(inout) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + end subroutine fftwf_execute_split_dft + + type(C_PTR) function fftwf_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwf_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_FLOAT), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwf_plan_many_dft_r2c + + type(C_PTR) function fftwf_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwf_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c + + type(C_PTR) function fftwf_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_1d + + type(C_PTR) function fftwf_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_2d + + type(C_PTR) function fftwf_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_3d + + type(C_PTR) function fftwf_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwf_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwf_plan_many_dft_c2r + + type(C_PTR) function fftwf_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwf_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r + + type(C_PTR) function fftwf_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_1d + + type(C_PTR) function fftwf_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_2d + + type(C_PTR) function fftwf_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_3d + + type(C_PTR) function fftwf_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft_r2c + + type(C_PTR) function fftwf_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft_c2r + + type(C_PTR) function fftwf_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwf_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft_r2c + + type(C_PTR) function fftwf_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwf_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft_c2r + + type(C_PTR) function fftwf_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft_r2c + + type(C_PTR) function fftwf_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft_c2r + + type(C_PTR) function fftwf_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwf_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft_r2c + + type(C_PTR) function fftwf_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwf_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft_c2r + + subroutine fftwf_execute_dft_r2c(p,in,out) bind(C, name='fftwf_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft_r2c + + subroutine fftwf_execute_dft_c2r(p,in,out) bind(C, name='fftwf_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_FLOAT_COMPLEX), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft_c2r + + subroutine fftwf_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwf_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + end subroutine fftwf_execute_split_dft_r2c + + subroutine fftwf_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwf_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: ri + real(C_FLOAT), dimension(*), intent(inout) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_split_dft_c2r + + type(C_PTR) function fftwf_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftwf_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_FLOAT), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_many_r2r + + type(C_PTR) function fftwf_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwf_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_r2r + + type(C_PTR) function fftwf_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwf_plan_r2r_1d') + import + integer(C_INT), value :: n + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftwf_plan_r2r_1d + + type(C_PTR) function fftwf_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwf_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftwf_plan_r2r_2d + + type(C_PTR) function fftwf_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwf_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftwf_plan_r2r_3d + + type(C_PTR) function fftwf_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwf_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_guru_r2r + + type(C_PTR) function fftwf_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwf_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_guru64_r2r + + subroutine fftwf_execute_r2r(p,in,out) bind(C, name='fftwf_execute_r2r') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_r2r + + subroutine fftwf_destroy_plan(p) bind(C, name='fftwf_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftwf_destroy_plan + + subroutine fftwf_forget_wisdom() bind(C, name='fftwf_forget_wisdom') + import + end subroutine fftwf_forget_wisdom + + subroutine fftwf_cleanup() bind(C, name='fftwf_cleanup') + import + end subroutine fftwf_cleanup + + subroutine fftwf_set_timelimit(t) bind(C, name='fftwf_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftwf_set_timelimit + + subroutine fftwf_plan_with_nthreads(nthreads) bind(C, name='fftwf_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftwf_plan_with_nthreads + + integer(C_INT) function fftwf_init_threads() bind(C, name='fftwf_init_threads') + import + end function fftwf_init_threads + + subroutine fftwf_cleanup_threads() bind(C, name='fftwf_cleanup_threads') + import + end subroutine fftwf_cleanup_threads + + subroutine fftwf_make_planner_thread_safe() bind(C, name='fftwf_make_planner_thread_safe') + import + end subroutine fftwf_make_planner_thread_safe + + integer(C_INT) function fftwf_export_wisdom_to_filename(filename) bind(C, name='fftwf_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwf_export_wisdom_to_filename + + subroutine fftwf_export_wisdom_to_file(output_file) bind(C, name='fftwf_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftwf_export_wisdom_to_file + + type(C_PTR) function fftwf_export_wisdom_to_string() bind(C, name='fftwf_export_wisdom_to_string') + import + end function fftwf_export_wisdom_to_string + + subroutine fftwf_export_wisdom(write_char,data) bind(C, name='fftwf_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftwf_export_wisdom + + integer(C_INT) function fftwf_import_system_wisdom() bind(C, name='fftwf_import_system_wisdom') + import + end function fftwf_import_system_wisdom + + integer(C_INT) function fftwf_import_wisdom_from_filename(filename) bind(C, name='fftwf_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwf_import_wisdom_from_filename + + integer(C_INT) function fftwf_import_wisdom_from_file(input_file) bind(C, name='fftwf_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftwf_import_wisdom_from_file + + integer(C_INT) function fftwf_import_wisdom_from_string(input_string) bind(C, name='fftwf_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftwf_import_wisdom_from_string + + integer(C_INT) function fftwf_import_wisdom(read_char,data) bind(C, name='fftwf_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftwf_import_wisdom + + subroutine fftwf_fprint_plan(p,output_file) bind(C, name='fftwf_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftwf_fprint_plan + + subroutine fftwf_print_plan(p) bind(C, name='fftwf_print_plan') + import + type(C_PTR), value :: p + end subroutine fftwf_print_plan + + type(C_PTR) function fftwf_sprint_plan(p) bind(C, name='fftwf_sprint_plan') + import + type(C_PTR), value :: p + end function fftwf_sprint_plan + + type(C_PTR) function fftwf_malloc(n) bind(C, name='fftwf_malloc') + import + integer(C_SIZE_T), value :: n + end function fftwf_malloc + + type(C_PTR) function fftwf_alloc_real(n) bind(C, name='fftwf_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftwf_alloc_real + + type(C_PTR) function fftwf_alloc_complex(n) bind(C, name='fftwf_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftwf_alloc_complex + + subroutine fftwf_free(p) bind(C, name='fftwf_free') + import + type(C_PTR), value :: p + end subroutine fftwf_free + + subroutine fftwf_flops(p,add,mul,fmas) bind(C, name='fftwf_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftwf_flops + + real(C_DOUBLE) function fftwf_estimate_cost(p) bind(C, name='fftwf_estimate_cost') + import + type(C_PTR), value :: p + end function fftwf_estimate_cost + + real(C_DOUBLE) function fftwf_cost(p) bind(C, name='fftwf_cost') + import + type(C_PTR), value :: p + end function fftwf_cost + + integer(C_INT) function fftwf_alignment_of(p) bind(C, name='fftwf_alignment_of') + import + real(C_FLOAT), dimension(*), intent(out) :: p + end function fftwf_alignment_of + + end interface diff --git a/examples/Integration_with_fftw/fftw/api/fftw3.f03.in b/examples/Integration_with_fftw/fftw/api/fftw3.f03.in new file mode 100644 index 0000000..c18e3c9 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/fftw3.f03.in @@ -0,0 +1,1252 @@ +! Generated automatically. DO NOT EDIT! + + integer(C_INT), parameter :: FFTW_R2HC = 0 + integer(C_INT), parameter :: FFTW_HC2R = 1 + integer(C_INT), parameter :: FFTW_DHT = 2 + integer(C_INT), parameter :: FFTW_REDFT00 = 3 + integer(C_INT), parameter :: FFTW_REDFT01 = 4 + integer(C_INT), parameter :: FFTW_REDFT10 = 5 + integer(C_INT), parameter :: FFTW_REDFT11 = 6 + integer(C_INT), parameter :: FFTW_RODFT00 = 7 + integer(C_INT), parameter :: FFTW_RODFT01 = 8 + integer(C_INT), parameter :: FFTW_RODFT10 = 9 + integer(C_INT), parameter :: FFTW_RODFT11 = 10 + integer(C_INT), parameter :: FFTW_FORWARD = -1 + integer(C_INT), parameter :: FFTW_BACKWARD = +1 + integer(C_INT), parameter :: FFTW_MEASURE = 0 + integer(C_INT), parameter :: FFTW_DESTROY_INPUT = 1 + integer(C_INT), parameter :: FFTW_UNALIGNED = 2 + integer(C_INT), parameter :: FFTW_CONSERVE_MEMORY = 4 + integer(C_INT), parameter :: FFTW_EXHAUSTIVE = 8 + integer(C_INT), parameter :: FFTW_PRESERVE_INPUT = 16 + integer(C_INT), parameter :: FFTW_PATIENT = 32 + integer(C_INT), parameter :: FFTW_ESTIMATE = 64 + integer(C_INT), parameter :: FFTW_WISDOM_ONLY = 2097152 + integer(C_INT), parameter :: FFTW_ESTIMATE_PATIENT = 128 + integer(C_INT), parameter :: FFTW_BELIEVE_PCOST = 256 + integer(C_INT), parameter :: FFTW_NO_DFT_R2HC = 512 + integer(C_INT), parameter :: FFTW_NO_NONTHREADED = 1024 + integer(C_INT), parameter :: FFTW_NO_BUFFERING = 2048 + integer(C_INT), parameter :: FFTW_NO_INDIRECT_OP = 4096 + integer(C_INT), parameter :: FFTW_ALLOW_LARGE_GENERIC = 8192 + integer(C_INT), parameter :: FFTW_NO_RANK_SPLITS = 16384 + integer(C_INT), parameter :: FFTW_NO_VRANK_SPLITS = 32768 + integer(C_INT), parameter :: FFTW_NO_VRECURSE = 65536 + integer(C_INT), parameter :: FFTW_NO_SIMD = 131072 + integer(C_INT), parameter :: FFTW_NO_SLOW = 262144 + integer(C_INT), parameter :: FFTW_NO_FIXED_RADIX_LARGE_N = 524288 + integer(C_INT), parameter :: FFTW_ALLOW_PRUNING = 1048576 + + type, bind(C) :: fftw_iodim + integer(C_INT) n, is, os + end type fftw_iodim + type, bind(C) :: fftw_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftw_iodim64 + + interface + type(C_PTR) function fftw_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftw_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft + + type(C_PTR) function fftw_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftw_plan_dft_1d') + import + integer(C_INT), value :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_1d + + type(C_PTR) function fftw_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftw_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_2d + + type(C_PTR) function fftw_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftw_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_3d + + type(C_PTR) function fftw_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftw_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_many_dft + + type(C_PTR) function fftw_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftw_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_guru_dft + + type(C_PTR) function fftw_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftw_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft + + type(C_PTR) function fftw_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftw_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft + + type(C_PTR) function fftw_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftw_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft + + subroutine fftw_execute_dft(p,in,out) bind(C, name='fftw_execute_dft') + import + type(C_PTR), value :: p + complex(C_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft + + subroutine fftw_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftw_execute_split_dft') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: ri + real(C_DOUBLE), dimension(*), intent(inout) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftw_execute_split_dft + + type(C_PTR) function fftw_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftw_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftw_plan_many_dft_r2c + + type(C_PTR) function fftw_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftw_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c + + type(C_PTR) function fftw_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftw_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_1d + + type(C_PTR) function fftw_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftw_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_2d + + type(C_PTR) function fftw_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftw_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_3d + + type(C_PTR) function fftw_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftw_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftw_plan_many_dft_c2r + + type(C_PTR) function fftw_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftw_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r + + type(C_PTR) function fftw_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftw_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_1d + + type(C_PTR) function fftw_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftw_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_2d + + type(C_PTR) function fftw_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftw_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_3d + + type(C_PTR) function fftw_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_dft_r2c + + type(C_PTR) function fftw_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_dft_c2r + + type(C_PTR) function fftw_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftw_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft_r2c + + type(C_PTR) function fftw_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftw_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft_c2r + + type(C_PTR) function fftw_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft_r2c + + type(C_PTR) function fftw_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft_c2r + + type(C_PTR) function fftw_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftw_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft_r2c + + type(C_PTR) function fftw_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftw_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft_c2r + + subroutine fftw_execute_dft_r2c(p,in,out) bind(C, name='fftw_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft_r2c + + subroutine fftw_execute_dft_c2r(p,in,out) bind(C, name='fftw_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft_c2r + + subroutine fftw_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftw_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftw_execute_split_dft_r2c + + subroutine fftw_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftw_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: ri + real(C_DOUBLE), dimension(*), intent(inout) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_split_dft_c2r + + type(C_PTR) function fftw_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftw_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_many_r2r + + type(C_PTR) function fftw_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftw_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_r2r + + type(C_PTR) function fftw_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftw_plan_r2r_1d') + import + integer(C_INT), value :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftw_plan_r2r_1d + + type(C_PTR) function fftw_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftw_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftw_plan_r2r_2d + + type(C_PTR) function fftw_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftw_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftw_plan_r2r_3d + + type(C_PTR) function fftw_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftw_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_guru_r2r + + type(C_PTR) function fftw_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftw_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_guru64_r2r + + subroutine fftw_execute_r2r(p,in,out) bind(C, name='fftw_execute_r2r') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_r2r + + subroutine fftw_destroy_plan(p) bind(C, name='fftw_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftw_destroy_plan + + subroutine fftw_forget_wisdom() bind(C, name='fftw_forget_wisdom') + import + end subroutine fftw_forget_wisdom + + subroutine fftw_cleanup() bind(C, name='fftw_cleanup') + import + end subroutine fftw_cleanup + + subroutine fftw_set_timelimit(t) bind(C, name='fftw_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftw_set_timelimit + + subroutine fftw_plan_with_nthreads(nthreads) bind(C, name='fftw_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftw_plan_with_nthreads + + integer(C_INT) function fftw_init_threads() bind(C, name='fftw_init_threads') + import + end function fftw_init_threads + + subroutine fftw_cleanup_threads() bind(C, name='fftw_cleanup_threads') + import + end subroutine fftw_cleanup_threads + + subroutine fftw_make_planner_thread_safe() bind(C, name='fftw_make_planner_thread_safe') + import + end subroutine fftw_make_planner_thread_safe + + integer(C_INT) function fftw_export_wisdom_to_filename(filename) bind(C, name='fftw_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftw_export_wisdom_to_filename + + subroutine fftw_export_wisdom_to_file(output_file) bind(C, name='fftw_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftw_export_wisdom_to_file + + type(C_PTR) function fftw_export_wisdom_to_string() bind(C, name='fftw_export_wisdom_to_string') + import + end function fftw_export_wisdom_to_string + + subroutine fftw_export_wisdom(write_char,data) bind(C, name='fftw_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftw_export_wisdom + + integer(C_INT) function fftw_import_system_wisdom() bind(C, name='fftw_import_system_wisdom') + import + end function fftw_import_system_wisdom + + integer(C_INT) function fftw_import_wisdom_from_filename(filename) bind(C, name='fftw_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftw_import_wisdom_from_filename + + integer(C_INT) function fftw_import_wisdom_from_file(input_file) bind(C, name='fftw_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftw_import_wisdom_from_file + + integer(C_INT) function fftw_import_wisdom_from_string(input_string) bind(C, name='fftw_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftw_import_wisdom_from_string + + integer(C_INT) function fftw_import_wisdom(read_char,data) bind(C, name='fftw_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftw_import_wisdom + + subroutine fftw_fprint_plan(p,output_file) bind(C, name='fftw_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftw_fprint_plan + + subroutine fftw_print_plan(p) bind(C, name='fftw_print_plan') + import + type(C_PTR), value :: p + end subroutine fftw_print_plan + + type(C_PTR) function fftw_sprint_plan(p) bind(C, name='fftw_sprint_plan') + import + type(C_PTR), value :: p + end function fftw_sprint_plan + + type(C_PTR) function fftw_malloc(n) bind(C, name='fftw_malloc') + import + integer(C_SIZE_T), value :: n + end function fftw_malloc + + type(C_PTR) function fftw_alloc_real(n) bind(C, name='fftw_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftw_alloc_real + + type(C_PTR) function fftw_alloc_complex(n) bind(C, name='fftw_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftw_alloc_complex + + subroutine fftw_free(p) bind(C, name='fftw_free') + import + type(C_PTR), value :: p + end subroutine fftw_free + + subroutine fftw_flops(p,add,mul,fmas) bind(C, name='fftw_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftw_flops + + real(C_DOUBLE) function fftw_estimate_cost(p) bind(C, name='fftw_estimate_cost') + import + type(C_PTR), value :: p + end function fftw_estimate_cost + + real(C_DOUBLE) function fftw_cost(p) bind(C, name='fftw_cost') + import + type(C_PTR), value :: p + end function fftw_cost + + integer(C_INT) function fftw_alignment_of(p) bind(C, name='fftw_alignment_of') + import + real(C_DOUBLE), dimension(*), intent(out) :: p + end function fftw_alignment_of + + end interface + + type, bind(C) :: fftwf_iodim + integer(C_INT) n, is, os + end type fftwf_iodim + type, bind(C) :: fftwf_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftwf_iodim64 + + interface + type(C_PTR) function fftwf_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwf_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft + + type(C_PTR) function fftwf_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwf_plan_dft_1d') + import + integer(C_INT), value :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_1d + + type(C_PTR) function fftwf_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwf_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_2d + + type(C_PTR) function fftwf_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwf_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_3d + + type(C_PTR) function fftwf_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftwf_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_many_dft + + type(C_PTR) function fftwf_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwf_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft + + type(C_PTR) function fftwf_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwf_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft + + type(C_PTR) function fftwf_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwf_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft + + type(C_PTR) function fftwf_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwf_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft + + subroutine fftwf_execute_dft(p,in,out) bind(C, name='fftwf_execute_dft') + import + type(C_PTR), value :: p + complex(C_FLOAT_COMPLEX), dimension(*), intent(inout) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft + + subroutine fftwf_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwf_execute_split_dft') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: ri + real(C_FLOAT), dimension(*), intent(inout) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + end subroutine fftwf_execute_split_dft + + type(C_PTR) function fftwf_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwf_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_FLOAT), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwf_plan_many_dft_r2c + + type(C_PTR) function fftwf_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwf_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c + + type(C_PTR) function fftwf_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_1d + + type(C_PTR) function fftwf_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_2d + + type(C_PTR) function fftwf_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_3d + + type(C_PTR) function fftwf_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwf_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwf_plan_many_dft_c2r + + type(C_PTR) function fftwf_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwf_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r + + type(C_PTR) function fftwf_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_1d + + type(C_PTR) function fftwf_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_2d + + type(C_PTR) function fftwf_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_3d + + type(C_PTR) function fftwf_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft_r2c + + type(C_PTR) function fftwf_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft_c2r + + type(C_PTR) function fftwf_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwf_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft_r2c + + type(C_PTR) function fftwf_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwf_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft_c2r + + type(C_PTR) function fftwf_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft_r2c + + type(C_PTR) function fftwf_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft_c2r + + type(C_PTR) function fftwf_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwf_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft_r2c + + type(C_PTR) function fftwf_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwf_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft_c2r + + subroutine fftwf_execute_dft_r2c(p,in,out) bind(C, name='fftwf_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft_r2c + + subroutine fftwf_execute_dft_c2r(p,in,out) bind(C, name='fftwf_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_FLOAT_COMPLEX), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft_c2r + + subroutine fftwf_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwf_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + end subroutine fftwf_execute_split_dft_r2c + + subroutine fftwf_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwf_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: ri + real(C_FLOAT), dimension(*), intent(inout) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_split_dft_c2r + + type(C_PTR) function fftwf_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftwf_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_FLOAT), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_many_r2r + + type(C_PTR) function fftwf_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwf_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_r2r + + type(C_PTR) function fftwf_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwf_plan_r2r_1d') + import + integer(C_INT), value :: n + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftwf_plan_r2r_1d + + type(C_PTR) function fftwf_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwf_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftwf_plan_r2r_2d + + type(C_PTR) function fftwf_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwf_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftwf_plan_r2r_3d + + type(C_PTR) function fftwf_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwf_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_guru_r2r + + type(C_PTR) function fftwf_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwf_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_guru64_r2r + + subroutine fftwf_execute_r2r(p,in,out) bind(C, name='fftwf_execute_r2r') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_r2r + + subroutine fftwf_destroy_plan(p) bind(C, name='fftwf_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftwf_destroy_plan + + subroutine fftwf_forget_wisdom() bind(C, name='fftwf_forget_wisdom') + import + end subroutine fftwf_forget_wisdom + + subroutine fftwf_cleanup() bind(C, name='fftwf_cleanup') + import + end subroutine fftwf_cleanup + + subroutine fftwf_set_timelimit(t) bind(C, name='fftwf_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftwf_set_timelimit + + subroutine fftwf_plan_with_nthreads(nthreads) bind(C, name='fftwf_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftwf_plan_with_nthreads + + integer(C_INT) function fftwf_init_threads() bind(C, name='fftwf_init_threads') + import + end function fftwf_init_threads + + subroutine fftwf_cleanup_threads() bind(C, name='fftwf_cleanup_threads') + import + end subroutine fftwf_cleanup_threads + + subroutine fftwf_make_planner_thread_safe() bind(C, name='fftwf_make_planner_thread_safe') + import + end subroutine fftwf_make_planner_thread_safe + + integer(C_INT) function fftwf_export_wisdom_to_filename(filename) bind(C, name='fftwf_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwf_export_wisdom_to_filename + + subroutine fftwf_export_wisdom_to_file(output_file) bind(C, name='fftwf_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftwf_export_wisdom_to_file + + type(C_PTR) function fftwf_export_wisdom_to_string() bind(C, name='fftwf_export_wisdom_to_string') + import + end function fftwf_export_wisdom_to_string + + subroutine fftwf_export_wisdom(write_char,data) bind(C, name='fftwf_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftwf_export_wisdom + + integer(C_INT) function fftwf_import_system_wisdom() bind(C, name='fftwf_import_system_wisdom') + import + end function fftwf_import_system_wisdom + + integer(C_INT) function fftwf_import_wisdom_from_filename(filename) bind(C, name='fftwf_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwf_import_wisdom_from_filename + + integer(C_INT) function fftwf_import_wisdom_from_file(input_file) bind(C, name='fftwf_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftwf_import_wisdom_from_file + + integer(C_INT) function fftwf_import_wisdom_from_string(input_string) bind(C, name='fftwf_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftwf_import_wisdom_from_string + + integer(C_INT) function fftwf_import_wisdom(read_char,data) bind(C, name='fftwf_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftwf_import_wisdom + + subroutine fftwf_fprint_plan(p,output_file) bind(C, name='fftwf_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftwf_fprint_plan + + subroutine fftwf_print_plan(p) bind(C, name='fftwf_print_plan') + import + type(C_PTR), value :: p + end subroutine fftwf_print_plan + + type(C_PTR) function fftwf_sprint_plan(p) bind(C, name='fftwf_sprint_plan') + import + type(C_PTR), value :: p + end function fftwf_sprint_plan + + type(C_PTR) function fftwf_malloc(n) bind(C, name='fftwf_malloc') + import + integer(C_SIZE_T), value :: n + end function fftwf_malloc + + type(C_PTR) function fftwf_alloc_real(n) bind(C, name='fftwf_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftwf_alloc_real + + type(C_PTR) function fftwf_alloc_complex(n) bind(C, name='fftwf_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftwf_alloc_complex + + subroutine fftwf_free(p) bind(C, name='fftwf_free') + import + type(C_PTR), value :: p + end subroutine fftwf_free + + subroutine fftwf_flops(p,add,mul,fmas) bind(C, name='fftwf_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftwf_flops + + real(C_DOUBLE) function fftwf_estimate_cost(p) bind(C, name='fftwf_estimate_cost') + import + type(C_PTR), value :: p + end function fftwf_estimate_cost + + real(C_DOUBLE) function fftwf_cost(p) bind(C, name='fftwf_cost') + import + type(C_PTR), value :: p + end function fftwf_cost + + integer(C_INT) function fftwf_alignment_of(p) bind(C, name='fftwf_alignment_of') + import + real(C_FLOAT), dimension(*), intent(out) :: p + end function fftwf_alignment_of + + end interface diff --git a/examples/Integration_with_fftw/fftw/api/fftw3.h b/examples/Integration_with_fftw/fftw/api/fftw3.h new file mode 100644 index 0000000..7bd4c6e --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/fftw3.h @@ -0,0 +1,514 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * The following statement of license applies *only* to this header file, + * and *not* to the other files distributed with FFTW or derived therefrom: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/***************************** NOTE TO USERS ********************************* + * + * THIS IS A HEADER FILE, NOT A MANUAL + * + * If you want to know how to use FFTW, please read the manual, + * online at http://www.fftw.org/doc/ and also included with FFTW. + * For a quick start, see the manual's tutorial section. + * + * (Reading header files to learn how to use a library is a habit + * stemming from code lacking a proper manual. Arguably, it's a + * *bad* habit in most cases, because header files can contain + * interfaces that are not part of the public, stable API.) + * + ****************************************************************************/ + +#ifndef FFTW3_H +#define FFTW3_H + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* If is included, use the C99 complex type. Otherwise + define a type bit-compatible with C99 complex */ +#if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) +# define FFTW_DEFINE_COMPLEX(R, C) typedef R _Complex C +#else +# define FFTW_DEFINE_COMPLEX(R, C) typedef R C[2] +#endif + +#define FFTW_CONCAT(prefix, name) prefix ## name +#define FFTW_MANGLE_DOUBLE(name) FFTW_CONCAT(fftw_, name) +#define FFTW_MANGLE_FLOAT(name) FFTW_CONCAT(fftwf_, name) +#define FFTW_MANGLE_LONG_DOUBLE(name) FFTW_CONCAT(fftwl_, name) +#define FFTW_MANGLE_QUAD(name) FFTW_CONCAT(fftwq_, name) + +/* IMPORTANT: for Windows compilers, you should add a line + #define FFTW_DLL + here and in kernel/ifftw.h if you are compiling/using FFTW as a + DLL, in order to do the proper importing/exporting, or + alternatively compile with -DFFTW_DLL or the equivalent + command-line flag. This is not necessary under MinGW/Cygwin, where + libtool does the imports/exports automatically. */ +#if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__)) + /* annoying Windows syntax for shared-library declarations */ +# if defined(COMPILING_FFTW) /* defined in api.h when compiling FFTW */ +# define FFTW_EXTERN extern __declspec(dllexport) +# else /* user is calling FFTW; import symbol */ +# define FFTW_EXTERN extern __declspec(dllimport) +# endif +#else +# define FFTW_EXTERN extern +#endif + +/* specify calling convention (Windows only) */ +#if defined(_WIN32) || defined(__WIN32__) +# define FFTW_CDECL __cdecl +#else +# define FFTW_CDECL +#endif + +enum fftw_r2r_kind_do_not_use_me { + FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2, + FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6, + FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10 +}; + +struct fftw_iodim_do_not_use_me { + int n; /* dimension size */ + int is; /* input stride */ + int os; /* output stride */ +}; + +#include /* for ptrdiff_t */ +struct fftw_iodim64_do_not_use_me { + ptrdiff_t n; /* dimension size */ + ptrdiff_t is; /* input stride */ + ptrdiff_t os; /* output stride */ +}; + +typedef void (FFTW_CDECL *fftw_write_char_func_do_not_use_me)(char c, void *); +typedef int (FFTW_CDECL *fftw_read_char_func_do_not_use_me)(void *); + +/* + huge second-order macro that defines prototypes for all API + functions. We expand this macro for each supported precision + + X: name-mangling macro + R: real data type + C: complex data type +*/ + +#define FFTW_DEFINE_API(X, R, C) \ + \ +FFTW_DEFINE_COMPLEX(R, C); \ + \ +typedef struct X(plan_s) *X(plan); \ + \ +typedef struct fftw_iodim_do_not_use_me X(iodim); \ +typedef struct fftw_iodim64_do_not_use_me X(iodim64); \ + \ +typedef enum fftw_r2r_kind_do_not_use_me X(r2r_kind); \ + \ +typedef fftw_write_char_func_do_not_use_me X(write_char_func); \ +typedef fftw_read_char_func_do_not_use_me X(read_char_func); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute)(const X(plan) p); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft)(int rank, const int *n, \ + C *in, C *out, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_1d)(int n, C *in, C *out, int sign, \ + unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_2d)(int n0, int n1, \ + C *in, C *out, int sign, unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_3d)(int n0, int n1, int n2, \ + C *in, C *out, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_many_dft)(int rank, const int *n, \ + int howmany, \ + C *in, const int *inembed, \ + int istride, int idist, \ + C *out, const int *onembed, \ + int ostride, int odist, \ + int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_dft)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + C *in, C *out, \ + int sign, unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_split_dft)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *ri, R *ii, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_dft)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + C *in, C *out, \ + int sign, unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_split_dft)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *ri, R *ii, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_dft)(const X(plan) p, C *in, C *out); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_split_dft)(const X(plan) p, R *ri, R *ii, \ + R *ro, R *io); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_many_dft_r2c)(int rank, const int *n, \ + int howmany, \ + R *in, const int *inembed, \ + int istride, int idist, \ + C *out, const int *onembed, \ + int ostride, int odist, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_r2c)(int rank, const int *n, \ + R *in, C *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_r2c_1d)(int n,R *in,C *out,unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_r2c_2d)(int n0, int n1, \ + R *in, C *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_r2c_3d)(int n0, int n1, \ + int n2, \ + R *in, C *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_many_dft_c2r)(int rank, const int *n, \ + int howmany, \ + C *in, const int *inembed, \ + int istride, int idist, \ + R *out, const int *onembed, \ + int ostride, int odist, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_c2r)(int rank, const int *n, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_c2r_1d)(int n,C *in,R *out,unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_c2r_2d)(int n0, int n1, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_c2r_3d)(int n0, int n1, \ + int n2, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_dft_r2c)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, C *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_dft_c2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + C *in, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_split_dft_r2c)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_split_dft_c2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *ri, R *ii, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_dft_r2c)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, C *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_dft_c2r)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + C *in, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_split_dft_r2c)(int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, R *ro, R *io, \ + unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_split_dft_c2r)(int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *ri, R *ii, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_dft_r2c)(const X(plan) p, R *in, C *out); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_dft_c2r)(const X(plan) p, C *in, R *out); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_split_dft_r2c)(const X(plan) p, \ + R *in, R *ro, R *io); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_split_dft_c2r)(const X(plan) p, \ + R *ri, R *ii, R *out); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_many_r2r)(int rank, const int *n, \ + int howmany, \ + R *in, const int *inembed, \ + int istride, int idist, \ + R *out, const int *onembed, \ + int ostride, int odist, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_r2r)(int rank, const int *n, R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_r2r_1d)(int n, R *in, R *out, \ + X(r2r_kind) kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_r2r_2d)(int n0, int n1, R *in, R *out, \ + X(r2r_kind) kind0, X(r2r_kind) kind1, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_r2r_3d)(int n0, int n1, int n2, \ + R *in, R *out, X(r2r_kind) kind0, \ + X(r2r_kind) kind1, X(r2r_kind) kind2, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_r2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_r2r)(int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_r2r)(const X(plan) p, R *in, R *out); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(destroy_plan)(X(plan) p); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(forget_wisdom)(void); \ +FFTW_EXTERN void \ +FFTW_CDECL X(cleanup)(void); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(set_timelimit)(double t); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(plan_with_nthreads)(int nthreads); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(init_threads)(void); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(cleanup_threads)(void); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(make_planner_thread_safe)(void); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(export_wisdom_to_filename)(const char *filename); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(export_wisdom_to_file)(FILE *output_file); \ + \ +FFTW_EXTERN char * \ +FFTW_CDECL X(export_wisdom_to_string)(void); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(export_wisdom)(X(write_char_func) write_char, \ + void *data); \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_system_wisdom)(void); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_wisdom_from_filename)(const char *filename); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_wisdom_from_file)(FILE *input_file); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_wisdom_from_string)(const char *input_string); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_wisdom)(X(read_char_func) read_char, void *data); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(fprint_plan)(const X(plan) p, FILE *output_file); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(print_plan)(const X(plan) p); \ + \ +FFTW_EXTERN char * \ +FFTW_CDECL X(sprint_plan)(const X(plan) p); \ + \ +FFTW_EXTERN void * \ +FFTW_CDECL X(malloc)(size_t n); \ + \ +FFTW_EXTERN R * \ +FFTW_CDECL X(alloc_real)(size_t n); \ +FFTW_EXTERN C * \ +FFTW_CDECL X(alloc_complex)(size_t n); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(free)(void *p); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(flops)(const X(plan) p, \ + double *add, double *mul, double *fmas); \ +FFTW_EXTERN double \ +FFTW_CDECL X(estimate_cost)(const X(plan) p); \ + \ +FFTW_EXTERN double \ +FFTW_CDECL X(cost)(const X(plan) p); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(alignment_of)(R *p); \ + \ +FFTW_EXTERN const char X(version)[]; \ +FFTW_EXTERN const char X(cc)[]; \ +FFTW_EXTERN const char X(codelet_optim)[]; + + +/* end of FFTW_DEFINE_API macro */ + +FFTW_DEFINE_API(FFTW_MANGLE_DOUBLE, double, fftw_complex) +FFTW_DEFINE_API(FFTW_MANGLE_FLOAT, float, fftwf_complex) +FFTW_DEFINE_API(FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex) + +/* __float128 (quad precision) is a gcc extension on i386, x86_64, and ia64 + for gcc >= 4.6 (compiled in FFTW with --enable-quad-precision) */ +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) \ + && !(defined(__ICC) || defined(__INTEL_COMPILER) || defined(__CUDACC__) || defined(__PGI)) \ + && (defined(__i386__) || defined(__x86_64__) || defined(__ia64__)) +# if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) +/* note: __float128 is a typedef, which is not supported with the _Complex + keyword in gcc, so instead we use this ugly __attribute__ version. + However, we can't simply pass the __attribute__ version to + FFTW_DEFINE_API because the __attribute__ confuses gcc in pointer + types. Hence redefining FFTW_DEFINE_COMPLEX. Ugh. */ +# undef FFTW_DEFINE_COMPLEX +# define FFTW_DEFINE_COMPLEX(R, C) typedef _Complex float __attribute__((mode(TC))) C +# endif +FFTW_DEFINE_API(FFTW_MANGLE_QUAD, __float128, fftwq_complex) +#endif + +#define FFTW_FORWARD (-1) +#define FFTW_BACKWARD (+1) + +#define FFTW_NO_TIMELIMIT (-1.0) + +/* documented flags */ +#define FFTW_MEASURE (0U) +#define FFTW_DESTROY_INPUT (1U << 0) +#define FFTW_UNALIGNED (1U << 1) +#define FFTW_CONSERVE_MEMORY (1U << 2) +#define FFTW_EXHAUSTIVE (1U << 3) /* NO_EXHAUSTIVE is default */ +#define FFTW_PRESERVE_INPUT (1U << 4) /* cancels FFTW_DESTROY_INPUT */ +#define FFTW_PATIENT (1U << 5) /* IMPATIENT is default */ +#define FFTW_ESTIMATE (1U << 6) +#define FFTW_WISDOM_ONLY (1U << 21) + +/* undocumented beyond-guru flags */ +#define FFTW_ESTIMATE_PATIENT (1U << 7) +#define FFTW_BELIEVE_PCOST (1U << 8) +#define FFTW_NO_DFT_R2HC (1U << 9) +#define FFTW_NO_NONTHREADED (1U << 10) +#define FFTW_NO_BUFFERING (1U << 11) +#define FFTW_NO_INDIRECT_OP (1U << 12) +#define FFTW_ALLOW_LARGE_GENERIC (1U << 13) /* NO_LARGE_GENERIC is default */ +#define FFTW_NO_RANK_SPLITS (1U << 14) +#define FFTW_NO_VRANK_SPLITS (1U << 15) +#define FFTW_NO_VRECURSE (1U << 16) +#define FFTW_NO_SIMD (1U << 17) +#define FFTW_NO_SLOW (1U << 18) +#define FFTW_NO_FIXED_RADIX_LARGE_N (1U << 19) +#define FFTW_ALLOW_PRUNING (1U << 20) + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FFTW3_H */ diff --git a/examples/Integration_with_fftw/fftw/api/fftw3l.f03 b/examples/Integration_with_fftw/fftw/api/fftw3l.f03 new file mode 100644 index 0000000..59e7ed2 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/fftw3l.f03 @@ -0,0 +1,609 @@ +! Generated automatically. DO NOT EDIT! + + + type, bind(C) :: fftwl_iodim + integer(C_INT) n, is, os + end type fftwl_iodim + type, bind(C) :: fftwl_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftwl_iodim64 + + interface + type(C_PTR) function fftwl_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwl_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_dft + + type(C_PTR) function fftwl_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwl_plan_dft_1d') + import + integer(C_INT), value :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_dft_1d + + type(C_PTR) function fftwl_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwl_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_dft_2d + + type(C_PTR) function fftwl_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwl_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_dft_3d + + type(C_PTR) function fftwl_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftwl_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_many_dft + + type(C_PTR) function fftwl_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwl_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_guru_dft + + type(C_PTR) function fftwl_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwl_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwl_plan_guru_split_dft + + type(C_PTR) function fftwl_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwl_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_guru64_dft + + type(C_PTR) function fftwl_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwl_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwl_plan_guru64_split_dft + + subroutine fftwl_execute_dft(p,in,out) bind(C, name='fftwl_execute_dft') + import + type(C_PTR), value :: p + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwl_execute_dft + + subroutine fftwl_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwl_execute_split_dft') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftwl_execute_split_dft + + type(C_PTR) function fftwl_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwl_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwl_plan_many_dft_r2c + + type(C_PTR) function fftwl_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwl_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_r2c + + type(C_PTR) function fftwl_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_r2c_1d + + type(C_PTR) function fftwl_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_r2c_2d + + type(C_PTR) function fftwl_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_r2c_3d + + type(C_PTR) function fftwl_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwl_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwl_plan_many_dft_c2r + + type(C_PTR) function fftwl_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwl_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_c2r + + type(C_PTR) function fftwl_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_c2r_1d + + type(C_PTR) function fftwl_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_c2r_2d + + type(C_PTR) function fftwl_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_c2r_3d + + type(C_PTR) function fftwl_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwl_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru_dft_r2c + + type(C_PTR) function fftwl_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwl_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru_dft_c2r + + type(C_PTR) function fftwl_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwl_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwl_plan_guru_split_dft_r2c + + type(C_PTR) function fftwl_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwl_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru_split_dft_c2r + + type(C_PTR) function fftwl_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwl_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru64_dft_r2c + + type(C_PTR) function fftwl_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwl_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru64_dft_c2r + + type(C_PTR) function fftwl_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwl_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwl_plan_guru64_split_dft_r2c + + type(C_PTR) function fftwl_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwl_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru64_split_dft_c2r + + subroutine fftwl_execute_dft_r2c(p,in,out) bind(C, name='fftwl_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwl_execute_dft_r2c + + subroutine fftwl_execute_dft_c2r(p,in,out) bind(C, name='fftwl_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftwl_execute_dft_c2r + + subroutine fftwl_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwl_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftwl_execute_split_dft_r2c + + subroutine fftwl_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwl_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftwl_execute_split_dft_c2r + + type(C_PTR) function fftwl_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftwl_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_plan_many_r2r + + type(C_PTR) function fftwl_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwl_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_plan_r2r + + type(C_PTR) function fftwl_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwl_plan_r2r_1d') + import + integer(C_INT), value :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftwl_plan_r2r_1d + + type(C_PTR) function fftwl_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwl_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftwl_plan_r2r_2d + + type(C_PTR) function fftwl_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwl_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftwl_plan_r2r_3d + + type(C_PTR) function fftwl_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwl_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_plan_guru_r2r + + type(C_PTR) function fftwl_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwl_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_plan_guru64_r2r + + subroutine fftwl_execute_r2r(p,in,out) bind(C, name='fftwl_execute_r2r') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftwl_execute_r2r + + subroutine fftwl_destroy_plan(p) bind(C, name='fftwl_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftwl_destroy_plan + + subroutine fftwl_forget_wisdom() bind(C, name='fftwl_forget_wisdom') + import + end subroutine fftwl_forget_wisdom + + subroutine fftwl_cleanup() bind(C, name='fftwl_cleanup') + import + end subroutine fftwl_cleanup + + subroutine fftwl_set_timelimit(t) bind(C, name='fftwl_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftwl_set_timelimit + + subroutine fftwl_plan_with_nthreads(nthreads) bind(C, name='fftwl_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftwl_plan_with_nthreads + + integer(C_INT) function fftwl_init_threads() bind(C, name='fftwl_init_threads') + import + end function fftwl_init_threads + + subroutine fftwl_cleanup_threads() bind(C, name='fftwl_cleanup_threads') + import + end subroutine fftwl_cleanup_threads + + subroutine fftwl_make_planner_thread_safe() bind(C, name='fftwl_make_planner_thread_safe') + import + end subroutine fftwl_make_planner_thread_safe + + integer(C_INT) function fftwl_export_wisdom_to_filename(filename) bind(C, name='fftwl_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwl_export_wisdom_to_filename + + subroutine fftwl_export_wisdom_to_file(output_file) bind(C, name='fftwl_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftwl_export_wisdom_to_file + + type(C_PTR) function fftwl_export_wisdom_to_string() bind(C, name='fftwl_export_wisdom_to_string') + import + end function fftwl_export_wisdom_to_string + + subroutine fftwl_export_wisdom(write_char,data) bind(C, name='fftwl_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftwl_export_wisdom + + integer(C_INT) function fftwl_import_system_wisdom() bind(C, name='fftwl_import_system_wisdom') + import + end function fftwl_import_system_wisdom + + integer(C_INT) function fftwl_import_wisdom_from_filename(filename) bind(C, name='fftwl_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwl_import_wisdom_from_filename + + integer(C_INT) function fftwl_import_wisdom_from_file(input_file) bind(C, name='fftwl_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftwl_import_wisdom_from_file + + integer(C_INT) function fftwl_import_wisdom_from_string(input_string) bind(C, name='fftwl_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftwl_import_wisdom_from_string + + integer(C_INT) function fftwl_import_wisdom(read_char,data) bind(C, name='fftwl_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftwl_import_wisdom + + subroutine fftwl_fprint_plan(p,output_file) bind(C, name='fftwl_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftwl_fprint_plan + + subroutine fftwl_print_plan(p) bind(C, name='fftwl_print_plan') + import + type(C_PTR), value :: p + end subroutine fftwl_print_plan + + type(C_PTR) function fftwl_sprint_plan(p) bind(C, name='fftwl_sprint_plan') + import + type(C_PTR), value :: p + end function fftwl_sprint_plan + + type(C_PTR) function fftwl_malloc(n) bind(C, name='fftwl_malloc') + import + integer(C_SIZE_T), value :: n + end function fftwl_malloc + + type(C_PTR) function fftwl_alloc_real(n) bind(C, name='fftwl_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftwl_alloc_real + + type(C_PTR) function fftwl_alloc_complex(n) bind(C, name='fftwl_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftwl_alloc_complex + + subroutine fftwl_free(p) bind(C, name='fftwl_free') + import + type(C_PTR), value :: p + end subroutine fftwl_free + + subroutine fftwl_flops(p,add,mul,fmas) bind(C, name='fftwl_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftwl_flops + + real(C_DOUBLE) function fftwl_estimate_cost(p) bind(C, name='fftwl_estimate_cost') + import + type(C_PTR), value :: p + end function fftwl_estimate_cost + + real(C_DOUBLE) function fftwl_cost(p) bind(C, name='fftwl_cost') + import + type(C_PTR), value :: p + end function fftwl_cost + + integer(C_INT) function fftwl_alignment_of(p) bind(C, name='fftwl_alignment_of') + import + real(C_LONG_DOUBLE), dimension(*), intent(out) :: p + end function fftwl_alignment_of + + end interface diff --git a/examples/Integration_with_fftw/fftw/api/fftw3q.f03 b/examples/Integration_with_fftw/fftw/api/fftw3q.f03 new file mode 100644 index 0000000..61dacd6 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/fftw3q.f03 @@ -0,0 +1,609 @@ +! Generated automatically. DO NOT EDIT! + + + type, bind(C) :: fftwq_iodim + integer(C_INT) n, is, os + end type fftwq_iodim + type, bind(C) :: fftwq_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftwq_iodim64 + + interface + type(C_PTR) function fftwq_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwq_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_dft + + type(C_PTR) function fftwq_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwq_plan_dft_1d') + import + integer(C_INT), value :: n + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_dft_1d + + type(C_PTR) function fftwq_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwq_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_dft_2d + + type(C_PTR) function fftwq_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwq_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_dft_3d + + type(C_PTR) function fftwq_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftwq_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(16), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(16), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_many_dft + + type(C_PTR) function fftwq_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwq_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_guru_dft + + type(C_PTR) function fftwq_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwq_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: ri + real(16), dimension(*), intent(out) :: ii + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwq_plan_guru_split_dft + + type(C_PTR) function fftwq_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwq_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_guru64_dft + + type(C_PTR) function fftwq_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwq_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: ri + real(16), dimension(*), intent(out) :: ii + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwq_plan_guru64_split_dft + + subroutine fftwq_execute_dft(p,in,out) bind(C, name='fftwq_execute_dft') + import + type(C_PTR), value :: p + complex(16), dimension(*), intent(inout) :: in + complex(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_dft + + subroutine fftwq_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwq_execute_split_dft') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: ri + real(16), dimension(*), intent(inout) :: ii + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + end subroutine fftwq_execute_split_dft + + type(C_PTR) function fftwq_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwq_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(16), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(16), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwq_plan_many_dft_r2c + + type(C_PTR) function fftwq_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwq_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_r2c + + type(C_PTR) function fftwq_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_r2c_1d + + type(C_PTR) function fftwq_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_r2c_2d + + type(C_PTR) function fftwq_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_r2c_3d + + type(C_PTR) function fftwq_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwq_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(16), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(16), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwq_plan_many_dft_c2r + + type(C_PTR) function fftwq_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwq_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_c2r + + type(C_PTR) function fftwq_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_c2r_1d + + type(C_PTR) function fftwq_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_c2r_2d + + type(C_PTR) function fftwq_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_c2r_3d + + type(C_PTR) function fftwq_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwq_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru_dft_r2c + + type(C_PTR) function fftwq_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwq_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru_dft_c2r + + type(C_PTR) function fftwq_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwq_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwq_plan_guru_split_dft_r2c + + type(C_PTR) function fftwq_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwq_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: ri + real(16), dimension(*), intent(out) :: ii + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru_split_dft_c2r + + type(C_PTR) function fftwq_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwq_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru64_dft_r2c + + type(C_PTR) function fftwq_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwq_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru64_dft_c2r + + type(C_PTR) function fftwq_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwq_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwq_plan_guru64_split_dft_r2c + + type(C_PTR) function fftwq_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwq_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: ri + real(16), dimension(*), intent(out) :: ii + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru64_split_dft_c2r + + subroutine fftwq_execute_dft_r2c(p,in,out) bind(C, name='fftwq_execute_dft_r2c') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: in + complex(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_dft_r2c + + subroutine fftwq_execute_dft_c2r(p,in,out) bind(C, name='fftwq_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(16), dimension(*), intent(inout) :: in + real(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_dft_c2r + + subroutine fftwq_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwq_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: in + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + end subroutine fftwq_execute_split_dft_r2c + + subroutine fftwq_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwq_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: ri + real(16), dimension(*), intent(inout) :: ii + real(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_split_dft_c2r + + type(C_PTR) function fftwq_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftwq_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(16), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(16), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwq_plan_many_r2r + + type(C_PTR) function fftwq_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwq_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwq_plan_r2r + + type(C_PTR) function fftwq_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwq_plan_r2r_1d') + import + integer(C_INT), value :: n + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftwq_plan_r2r_1d + + type(C_PTR) function fftwq_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwq_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftwq_plan_r2r_2d + + type(C_PTR) function fftwq_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwq_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftwq_plan_r2r_3d + + type(C_PTR) function fftwq_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwq_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwq_plan_guru_r2r + + type(C_PTR) function fftwq_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwq_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwq_plan_guru64_r2r + + subroutine fftwq_execute_r2r(p,in,out) bind(C, name='fftwq_execute_r2r') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: in + real(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_r2r + + subroutine fftwq_destroy_plan(p) bind(C, name='fftwq_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftwq_destroy_plan + + subroutine fftwq_forget_wisdom() bind(C, name='fftwq_forget_wisdom') + import + end subroutine fftwq_forget_wisdom + + subroutine fftwq_cleanup() bind(C, name='fftwq_cleanup') + import + end subroutine fftwq_cleanup + + subroutine fftwq_set_timelimit(t) bind(C, name='fftwq_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftwq_set_timelimit + + subroutine fftwq_plan_with_nthreads(nthreads) bind(C, name='fftwq_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftwq_plan_with_nthreads + + integer(C_INT) function fftwq_init_threads() bind(C, name='fftwq_init_threads') + import + end function fftwq_init_threads + + subroutine fftwq_cleanup_threads() bind(C, name='fftwq_cleanup_threads') + import + end subroutine fftwq_cleanup_threads + + subroutine fftwq_make_planner_thread_safe() bind(C, name='fftwq_make_planner_thread_safe') + import + end subroutine fftwq_make_planner_thread_safe + + integer(C_INT) function fftwq_export_wisdom_to_filename(filename) bind(C, name='fftwq_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwq_export_wisdom_to_filename + + subroutine fftwq_export_wisdom_to_file(output_file) bind(C, name='fftwq_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftwq_export_wisdom_to_file + + type(C_PTR) function fftwq_export_wisdom_to_string() bind(C, name='fftwq_export_wisdom_to_string') + import + end function fftwq_export_wisdom_to_string + + subroutine fftwq_export_wisdom(write_char,data) bind(C, name='fftwq_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftwq_export_wisdom + + integer(C_INT) function fftwq_import_system_wisdom() bind(C, name='fftwq_import_system_wisdom') + import + end function fftwq_import_system_wisdom + + integer(C_INT) function fftwq_import_wisdom_from_filename(filename) bind(C, name='fftwq_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwq_import_wisdom_from_filename + + integer(C_INT) function fftwq_import_wisdom_from_file(input_file) bind(C, name='fftwq_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftwq_import_wisdom_from_file + + integer(C_INT) function fftwq_import_wisdom_from_string(input_string) bind(C, name='fftwq_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftwq_import_wisdom_from_string + + integer(C_INT) function fftwq_import_wisdom(read_char,data) bind(C, name='fftwq_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftwq_import_wisdom + + subroutine fftwq_fprint_plan(p,output_file) bind(C, name='fftwq_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftwq_fprint_plan + + subroutine fftwq_print_plan(p) bind(C, name='fftwq_print_plan') + import + type(C_PTR), value :: p + end subroutine fftwq_print_plan + + type(C_PTR) function fftwq_sprint_plan(p) bind(C, name='fftwq_sprint_plan') + import + type(C_PTR), value :: p + end function fftwq_sprint_plan + + type(C_PTR) function fftwq_malloc(n) bind(C, name='fftwq_malloc') + import + integer(C_SIZE_T), value :: n + end function fftwq_malloc + + type(C_PTR) function fftwq_alloc_real(n) bind(C, name='fftwq_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftwq_alloc_real + + type(C_PTR) function fftwq_alloc_complex(n) bind(C, name='fftwq_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftwq_alloc_complex + + subroutine fftwq_free(p) bind(C, name='fftwq_free') + import + type(C_PTR), value :: p + end subroutine fftwq_free + + subroutine fftwq_flops(p,add,mul,fmas) bind(C, name='fftwq_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftwq_flops + + real(C_DOUBLE) function fftwq_estimate_cost(p) bind(C, name='fftwq_estimate_cost') + import + type(C_PTR), value :: p + end function fftwq_estimate_cost + + real(C_DOUBLE) function fftwq_cost(p) bind(C, name='fftwq_cost') + import + type(C_PTR), value :: p + end function fftwq_cost + + integer(C_INT) function fftwq_alignment_of(p) bind(C, name='fftwq_alignment_of') + import + real(16), dimension(*), intent(out) :: p + end function fftwq_alignment_of + + end interface diff --git a/examples/Integration_with_fftw/fftw/api/flops.c b/examples/Integration_with_fftw/fftw/api/flops.c new file mode 100644 index 0000000..7145ab5 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/flops.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +void X(flops)(const X(plan) p, double *add, double *mul, double *fma) +{ + planner *plnr = X(the_planner)(); + opcnt *o = &p->pln->ops; + *add = o->add; *mul = o->mul; *fma = o->fma; + if (plnr->cost_hook) { + *add = plnr->cost_hook(p->prb, *add, COST_SUM); + *mul = plnr->cost_hook(p->prb, *mul, COST_SUM); + *fma = plnr->cost_hook(p->prb, *fma, COST_SUM); + } +} + +double X(estimate_cost)(const X(plan) p) +{ + return X(iestimate_cost)(X(the_planner)(), p->pln, p->prb); +} + +double X(cost)(const X(plan) p) +{ + return p->pln->pcost; +} diff --git a/examples/Integration_with_fftw/fftw/api/forget-wisdom.c b/examples/Integration_with_fftw/fftw/api/forget-wisdom.c new file mode 100644 index 0000000..09a0e85 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/forget-wisdom.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +void X(forget_wisdom)(void) +{ + planner *plnr = X(the_planner)(); + plnr->adt->forget(plnr, FORGET_EVERYTHING); +} diff --git a/examples/Integration_with_fftw/fftw/api/genf03.pl b/examples/Integration_with_fftw/fftw/api/genf03.pl new file mode 100755 index 0000000..1905d9c --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/genf03.pl @@ -0,0 +1,213 @@ +#!/usr/bin/perl -w +# Generate Fortran 2003 interfaces from a sequence of C function declarations +# of the form (one per line): +# extern (...args...) +# extern (...args...) +# ... +# with no line breaks within a given function. (It's too much work to +# write a general parser, since we just have to handle FFTW's header files.) + +sub canonicalize_type { + my($type); + ($type) = @_; + $type =~ s/ +/ /g; + $type =~ s/^ //; + $type =~ s/ $//; + $type =~ s/([^\* ])\*/$1 \*/g; + return $type; +} + +# C->Fortran map of supported return types +%return_types = ( + "int" => "integer(C_INT)", + "ptrdiff_t" => "integer(C_INTPTR_T)", + "size_t" => "integer(C_SIZE_T)", + "double" => "real(C_DOUBLE)", + "float" => "real(C_FLOAT)", + "long double" => "real(C_LONG_DOUBLE)", + "__float128" => "real(16)", + "fftw_plan" => "type(C_PTR)", + "fftwf_plan" => "type(C_PTR)", + "fftwl_plan" => "type(C_PTR)", + "fftwq_plan" => "type(C_PTR)", + "void *" => "type(C_PTR)", + "char *" => "type(C_PTR)", + "double *" => "type(C_PTR)", + "float *" => "type(C_PTR)", + "long double *" => "type(C_PTR)", + "__float128 *" => "type(C_PTR)", + "fftw_complex *" => "type(C_PTR)", + "fftwf_complex *" => "type(C_PTR)", + "fftwl_complex *" => "type(C_PTR)", + "fftwq_complex *" => "type(C_PTR)", + ); + +# C->Fortran map of supported argument types +%arg_types = ( + "int" => "integer(C_INT), value", + "unsigned" => "integer(C_INT), value", + "size_t" => "integer(C_SIZE_T), value", + "ptrdiff_t" => "integer(C_INTPTR_T), value", + + "fftw_r2r_kind" => "integer(C_FFTW_R2R_KIND), value", + "fftwf_r2r_kind" => "integer(C_FFTW_R2R_KIND), value", + "fftwl_r2r_kind" => "integer(C_FFTW_R2R_KIND), value", + "fftwq_r2r_kind" => "integer(C_FFTW_R2R_KIND), value", + + "double" => "real(C_DOUBLE), value", + "float" => "real(C_FLOAT), value", + "long double" => "real(C_LONG_DOUBLE), value", + "__float128" => "real(16), value", + + "fftw_complex" => "complex(C_DOUBLE_COMPLEX), value", + "fftwf_complex" => "complex(C_DOUBLE_COMPLEX), value", + "fftwl_complex" => "complex(C_LONG_DOUBLE), value", + "fftwq_complex" => "complex(16), value", + + "fftw_plan" => "type(C_PTR), value", + "fftwf_plan" => "type(C_PTR), value", + "fftwl_plan" => "type(C_PTR), value", + "fftwq_plan" => "type(C_PTR), value", + "const fftw_plan" => "type(C_PTR), value", + "const fftwf_plan" => "type(C_PTR), value", + "const fftwl_plan" => "type(C_PTR), value", + "const fftwq_plan" => "type(C_PTR), value", + + "const int *" => "integer(C_INT), dimension(*), intent(in)", + "ptrdiff_t *" => "integer(C_INTPTR_T), intent(out)", + "const ptrdiff_t *" => "integer(C_INTPTR_T), dimension(*), intent(in)", + + "const fftw_r2r_kind *" => "integer(C_FFTW_R2R_KIND), dimension(*), intent(in)", + "const fftwf_r2r_kind *" => "integer(C_FFTW_R2R_KIND), dimension(*), intent(in)", + "const fftwl_r2r_kind *" => "integer(C_FFTW_R2R_KIND), dimension(*), intent(in)", + "const fftwq_r2r_kind *" => "integer(C_FFTW_R2R_KIND), dimension(*), intent(in)", + + "double *" => "real(C_DOUBLE), dimension(*), intent(out)", + "float *" => "real(C_FLOAT), dimension(*), intent(out)", + "long double *" => "real(C_LONG_DOUBLE), dimension(*), intent(out)", + "__float128 *" => "real(16), dimension(*), intent(out)", + + "fftw_complex *" => "complex(C_DOUBLE_COMPLEX), dimension(*), intent(out)", + "fftwf_complex *" => "complex(C_FLOAT_COMPLEX), dimension(*), intent(out)", + "fftwl_complex *" => "complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out)", + "fftwq_complex *" => "complex(16), dimension(*), intent(out)", + + "const fftw_iodim *" => "type(fftw_iodim), dimension(*), intent(in)", + "const fftwf_iodim *" => "type(fftwf_iodim), dimension(*), intent(in)", + "const fftwl_iodim *" => "type(fftwl_iodim), dimension(*), intent(in)", + "const fftwq_iodim *" => "type(fftwq_iodim), dimension(*), intent(in)", + + "const fftw_iodim64 *" => "type(fftw_iodim64), dimension(*), intent(in)", + "const fftwf_iodim64 *" => "type(fftwf_iodim64), dimension(*), intent(in)", + "const fftwl_iodim64 *" => "type(fftwl_iodim64), dimension(*), intent(in)", + "const fftwq_iodim64 *" => "type(fftwq_iodim64), dimension(*), intent(in)", + + "void *" => "type(C_PTR), value", + "FILE *" => "type(C_PTR), value", + + "const char *" => "character(C_CHAR), dimension(*), intent(in)", + + "fftw_write_char_func" => "type(C_FUNPTR), value", + "fftwf_write_char_func" => "type(C_FUNPTR), value", + "fftwl_write_char_func" => "type(C_FUNPTR), value", + "fftwq_write_char_func" => "type(C_FUNPTR), value", + "fftw_read_char_func" => "type(C_FUNPTR), value", + "fftwf_read_char_func" => "type(C_FUNPTR), value", + "fftwl_read_char_func" => "type(C_FUNPTR), value", + "fftwq_read_char_func" => "type(C_FUNPTR), value", + + # Although the MPI standard defines this type as simply "integer", + # if we use integer without a 'C_' kind in a bind(C) interface then + # gfortran complains. Instead, since MPI also requires the C type + # MPI_Fint to match Fortran integers, we use the size of this type + # (extracted by configure and substituted by the Makefile). + "MPI_Comm" => "integer(C_MPI_FINT), value" + ); + +while (<>) { + next if /^ *$/; + if (/^ *extern +([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *\((.*)\) *$/) { + $ret = &canonicalize_type($1); + $name = $2; + + $args = $3; + $args =~ s/^ *void *$//; + + $bad = ($ret ne "void") && !exists($return_types{$ret}); + foreach $arg (split(/ *, */, $args)) { + $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/; + $argtype = &canonicalize_type($1); + $bad = 1 if !exists($arg_types{$argtype}); + } + if ($bad) { + print "! Unable to generate Fortran interface for $name\n"; + next; + } + + # any function taking an MPI_Comm arg needs a C wrapper (grr). + if ($args =~ /MPI_Comm/) { + $cname = $name . "_f03"; + } + else { + $cname = $name; + } + + # Fortran has a 132-character line-length limit by default (grr) + $len = 0; + + print " "; $len = $len + length(" "); + if ($ret eq "void") { + $kind = "subroutine" + } + else { + print "$return_types{$ret} "; + $len = $len + length("$return_types{$ret} "); + $kind = "function" + } + print "$kind $name("; $len = $len + length("$kind $name("); + $len0 = $len; + + $argnames = $args; + $argnames =~ s/([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) */$2/g; + $comma = ""; + foreach $argname (split(/ *, */, $argnames)) { + if ($len + length("$comma$argname") + 3 > 132) { + printf ", &\n%*s", $len0, ""; + $len = $len0; + $comma = ""; + } + print "$comma$argname"; + $len = $len + length("$comma$argname"); + $comma = ","; + } + print ") "; $len = $len + 2; + + if ($len + length("bind(C, name='$cname')") > 132) { + printf "&\n%*s", $len0 - length("$name("), ""; + } + print "bind(C, name='$cname')\n"; + + print " import\n"; + foreach $arg (split(/ *, */, $args)) { + $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/; + $argtype = &canonicalize_type($1); + $argname = $2; + $ftype = $arg_types{$argtype}; + + # Various special cases for argument types: + if ($name =~ /_flops$/ && $argtype eq "double *") { + $ftype = "real(C_DOUBLE), intent(out)" + } + if ($name =~ /_execute/ && ($argname eq "ri" || + $argname eq "ii" || + $argname eq "in")) { + $ftype =~ s/intent\(out\)/intent(inout)/; + } + + print " $ftype :: $argname\n" + } + + print " end $kind $name\n"; + print " \n"; + } +} diff --git a/examples/Integration_with_fftw/fftw/api/guru.h b/examples/Integration_with_fftw/fftw/api/guru.h new file mode 100644 index 0000000..c54262d --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/guru.h @@ -0,0 +1,4 @@ +#define XGURU(name) X(plan_guru_ ## name) +#define IODIM X(iodim) +#define MKTENSOR_IODIMS X(mktensor_iodims) +#define GURU_KOSHERP X(guru_kosherp) diff --git a/examples/Integration_with_fftw/fftw/api/guru64.h b/examples/Integration_with_fftw/fftw/api/guru64.h new file mode 100644 index 0000000..376ef2d --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/guru64.h @@ -0,0 +1,4 @@ +#define XGURU(name) X(plan_guru64_ ## name) +#define IODIM X(iodim64) +#define MKTENSOR_IODIMS X(mktensor_iodims64) +#define GURU_KOSHERP X(guru64_kosherp) diff --git a/examples/Integration_with_fftw/fftw/api/import-system-wisdom.c b/examples/Integration_with_fftw/fftw/api/import-system-wisdom.c new file mode 100644 index 0000000..b30521a --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/import-system-wisdom.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +#if defined(FFTW_SINGLE) +# define WISDOM_NAME "wisdomf" +#elif defined(FFTW_LDOUBLE) +# define WISDOM_NAME "wisdoml" +#else +# define WISDOM_NAME "wisdom" +#endif + +/* OS-specific configuration-file directory */ +#if defined(__DJGPP__) +# define WISDOM_DIR "/dev/env/DJDIR/etc/fftw/" +#else +# define WISDOM_DIR "/etc/fftw/" +#endif + +int X(import_system_wisdom)(void) +{ +#if defined(__WIN32__) || defined(WIN32) || defined(_WINDOWS) + return 0; /* TODO? */ +#else + + FILE *f; + f = fopen(WISDOM_DIR WISDOM_NAME, "r"); + if (f) { + int ret = X(import_wisdom_from_file)(f); + fclose(f); + return ret; + } else + return 0; +#endif +} diff --git a/examples/Integration_with_fftw/fftw/api/import-wisdom-from-file.c b/examples/Integration_with_fftw/fftw/api/import-wisdom-from-file.c new file mode 100644 index 0000000..f6b293c --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/import-wisdom-from-file.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include + +/* getc()/putc() are *unbelievably* slow on linux. Looks like glibc + is grabbing a lock for each call to getc()/putc(), or something + like that. You pay the price for these idiotic posix threads + whether you use them or not. + + So, we do our own buffering. This completely defeats the purpose + of having stdio in the first place, of course. +*/ + +#define BUFSZ 256 + +typedef struct { + scanner super; + FILE *f; + char buf[BUFSZ]; + char *bufr, *bufw; +} S; + +static int getchr_file(scanner * sc_) +{ + S *sc = (S *) sc_; + + if (sc->bufr >= sc->bufw) { + sc->bufr = sc->buf; + sc->bufw = sc->buf + fread(sc->buf, 1, BUFSZ, sc->f); + if (sc->bufr >= sc->bufw) + return EOF; + } + + return *(sc->bufr++); +} + +static scanner *mkscanner_file(FILE *f) +{ + S *sc = (S *) X(mkscanner)(sizeof(S), getchr_file); + sc->f = f; + sc->bufr = sc->bufw = sc->buf; + return &sc->super; +} + +int X(import_wisdom_from_file)(FILE *input_file) +{ + scanner *s = mkscanner_file(input_file); + planner *plnr = X(the_planner)(); + int ret = plnr->adt->imprt(plnr, s); + X(scanner_destroy)(s); + return ret; +} + +int X(import_wisdom_from_filename)(const char *filename) +{ + FILE *f = fopen(filename, "r"); + int ret; + if (!f) return 0; /* error opening file */ + ret = X(import_wisdom_from_file)(f); + if (fclose(f)) ret = 0; /* error closing file */ + return ret; +} diff --git a/examples/Integration_with_fftw/fftw/api/import-wisdom-from-string.c b/examples/Integration_with_fftw/fftw/api/import-wisdom-from-string.c new file mode 100644 index 0000000..9eb3a0b --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/import-wisdom-from-string.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +typedef struct { + scanner super; + const char *s; +} S_str; + +static int getchr_str(scanner * sc_) +{ + S_str *sc = (S_str *) sc_; + if (!*sc->s) + return EOF; + return *sc->s++; +} + +static scanner *mkscanner_str(const char *s) +{ + S_str *sc = (S_str *) X(mkscanner)(sizeof(S_str), getchr_str); + sc->s = s; + return &sc->super; +} + +int X(import_wisdom_from_string)(const char *input_string) +{ + scanner *s = mkscanner_str(input_string); + planner *plnr = X(the_planner)(); + int ret = plnr->adt->imprt(plnr, s); + X(scanner_destroy)(s); + return ret; +} diff --git a/examples/Integration_with_fftw/fftw/api/import-wisdom.c b/examples/Integration_with_fftw/fftw/api/import-wisdom.c new file mode 100644 index 0000000..834fc04 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/import-wisdom.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +typedef struct { + scanner super; + int (*read_char)(void *); + void *data; +} S; + +static int getchr_generic(scanner * s_) +{ + S *s = (S *) s_; + return (s->read_char)(s->data); +} + +int X(import_wisdom)(int (*read_char)(void *), void *data) +{ + S *s = (S *) X(mkscanner)(sizeof(S), getchr_generic); + planner *plnr = X(the_planner)(); + int ret; + + s->read_char = read_char; + s->data = data; + ret = plnr->adt->imprt(plnr, (scanner *) s); + X(scanner_destroy)((scanner *) s); + return ret; +} diff --git a/examples/Integration_with_fftw/fftw/api/malloc.c b/examples/Integration_with_fftw/fftw/api/malloc.c new file mode 100644 index 0000000..3994b4a --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/malloc.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + + +void *X(malloc)(size_t n) +{ + return X(kernel_malloc)(n); +} + +void X(free)(void *p) +{ + X(kernel_free)(p); +} + +/* The following two routines are mainly for the convenience of + the Fortran 2003 API, although C users may find them convienent + as well. The problem is that, although Fortran 2003 has a + c_sizeof intrinsic that is equivalent to sizeof, it is broken + in some gfortran versions, and in any case is a bit unnatural + in a Fortran context. So we provide routines to allocate real + and complex arrays, which are all that are really needed by FFTW. */ + +R *X(alloc_real)(size_t n) +{ + return (R *) X(malloc)(sizeof(R) * n); +} + +C *X(alloc_complex)(size_t n) +{ + return (C *) X(malloc)(sizeof(C) * n); +} diff --git a/examples/Integration_with_fftw/fftw/api/map-r2r-kind.c b/examples/Integration_with_fftw/fftw/api/map-r2r-kind.c new file mode 100644 index 0000000..c17c69e --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/map-r2r-kind.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +rdft_kind *X(map_r2r_kind)(int rank, const X(r2r_kind) * kind) +{ + int i; + rdft_kind *k; + + A(FINITE_RNK(rank)); + k = (rdft_kind *) MALLOC((unsigned)rank * sizeof(rdft_kind), PROBLEMS); + for (i = 0; i < rank; ++i) { + rdft_kind m; + switch (kind[i]) { + case FFTW_R2HC: m = R2HC; break; + case FFTW_HC2R: m = HC2R; break; + case FFTW_DHT: m = DHT; break; + case FFTW_REDFT00: m = REDFT00; break; + case FFTW_REDFT01: m = REDFT01; break; + case FFTW_REDFT10: m = REDFT10; break; + case FFTW_REDFT11: m = REDFT11; break; + case FFTW_RODFT00: m = RODFT00; break; + case FFTW_RODFT01: m = RODFT01; break; + case FFTW_RODFT10: m = RODFT10; break; + case FFTW_RODFT11: m = RODFT11; break; + default: m = R2HC; A(0); + } + k[i] = m; + } + return k; +} diff --git a/examples/Integration_with_fftw/fftw/api/mapflags.c b/examples/Integration_with_fftw/fftw/api/mapflags.c new file mode 100644 index 0000000..de8d8df --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/mapflags.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include + +/* a flag operation: x is either a flag, in which case xm == 0, or + a mask, in which case xm == x; using this we can compactly code + the various bit operations via (flags & x) ^ xm or (flags | x) ^ xm. */ +typedef struct { + unsigned x, xm; +} flagmask; + +typedef struct { + flagmask flag; + flagmask op; +} flagop; + +#define FLAGP(f, msk)(((f) & (msk).x) ^ (msk).xm) +#define OP(f, msk)(((f) | (msk).x) ^ (msk).xm) + +#define YES(x) {x, 0} +#define NO(x) {x, x} +#define IMPLIES(predicate, consequence) { predicate, consequence } +#define EQV(a, b) IMPLIES(YES(a), YES(b)), IMPLIES(NO(a), NO(b)) +#define NEQV(a, b) IMPLIES(YES(a), NO(b)), IMPLIES(NO(a), YES(b)) + +static void map_flags(unsigned *iflags, unsigned *oflags, + const flagop flagmap[], size_t nmap) +{ + size_t i; + for (i = 0; i < nmap; ++i) + if (FLAGP(*iflags, flagmap[i].flag)) + *oflags = OP(*oflags, flagmap[i].op); +} + +/* encoding of the planner timelimit into a BITS_FOR_TIMELIMIT-bits + nonnegative integer, such that we can still view the integer as + ``impatience'': higher means *lower* time limit, and 0 is the + highest possible value (about 1 year of calendar time) */ +static unsigned timelimit_to_flags(double timelimit) +{ + const double tmax = 365 * 24 * 3600; + const double tstep = 1.05; + const int nsteps = (1 << BITS_FOR_TIMELIMIT); + int x; + + if (timelimit < 0 || timelimit >= tmax) + return 0; + if (timelimit <= 1.0e-10) + return nsteps - 1; + + x = (int) (0.5 + (log(tmax / timelimit) / log(tstep))); + + if (x < 0) x = 0; + if (x >= nsteps) x = nsteps - 1; + return x; +} + +void X(mapflags)(planner *plnr, unsigned flags) +{ + unsigned l, u, t; + + /* map of api flags -> api flags, to implement consistency rules + and combination flags */ + const flagop self_flagmap[] = { + /* in some cases (notably for halfcomplex->real transforms), + DESTROY_INPUT is the default, so we need to support + an inverse flag to disable it. + + (PRESERVE, DESTROY) -> (PRESERVE, DESTROY) + (0, 0) (1, 0) + (0, 1) (0, 1) + (1, 0) (1, 0) + (1, 1) (1, 0) + */ + IMPLIES(YES(FFTW_PRESERVE_INPUT), NO(FFTW_DESTROY_INPUT)), + IMPLIES(NO(FFTW_DESTROY_INPUT), YES(FFTW_PRESERVE_INPUT)), + + IMPLIES(YES(FFTW_EXHAUSTIVE), YES(FFTW_PATIENT)), + + IMPLIES(YES(FFTW_ESTIMATE), NO(FFTW_PATIENT)), + IMPLIES(YES(FFTW_ESTIMATE), + YES(FFTW_ESTIMATE_PATIENT + | FFTW_NO_INDIRECT_OP + | FFTW_ALLOW_PRUNING)), + + IMPLIES(NO(FFTW_EXHAUSTIVE), + YES(FFTW_NO_SLOW)), + + /* a canonical set of fftw2-like impatience flags */ + IMPLIES(NO(FFTW_PATIENT), + YES(FFTW_NO_VRECURSE + | FFTW_NO_RANK_SPLITS + | FFTW_NO_VRANK_SPLITS + | FFTW_NO_NONTHREADED + | FFTW_NO_DFT_R2HC + | FFTW_NO_FIXED_RADIX_LARGE_N + | FFTW_BELIEVE_PCOST)) + }; + + /* map of (processed) api flags to internal problem/planner flags */ + const flagop l_flagmap[] = { + EQV(FFTW_PRESERVE_INPUT, NO_DESTROY_INPUT), + EQV(FFTW_NO_SIMD, NO_SIMD), + EQV(FFTW_CONSERVE_MEMORY, CONSERVE_MEMORY), + EQV(FFTW_NO_BUFFERING, NO_BUFFERING), + NEQV(FFTW_ALLOW_LARGE_GENERIC, NO_LARGE_GENERIC) + }; + + const flagop u_flagmap[] = { + IMPLIES(YES(FFTW_EXHAUSTIVE), NO(0xFFFFFFFF)), + IMPLIES(NO(FFTW_EXHAUSTIVE), YES(NO_UGLY)), + + /* the following are undocumented, "beyond-guru" flags that + require some understanding of FFTW internals */ + EQV(FFTW_ESTIMATE_PATIENT, ESTIMATE), + EQV(FFTW_ALLOW_PRUNING, ALLOW_PRUNING), + EQV(FFTW_BELIEVE_PCOST, BELIEVE_PCOST), + EQV(FFTW_NO_DFT_R2HC, NO_DFT_R2HC), + EQV(FFTW_NO_NONTHREADED, NO_NONTHREADED), + EQV(FFTW_NO_INDIRECT_OP, NO_INDIRECT_OP), + EQV(FFTW_NO_RANK_SPLITS, NO_RANK_SPLITS), + EQV(FFTW_NO_VRANK_SPLITS, NO_VRANK_SPLITS), + EQV(FFTW_NO_VRECURSE, NO_VRECURSE), + EQV(FFTW_NO_SLOW, NO_SLOW), + EQV(FFTW_NO_FIXED_RADIX_LARGE_N, NO_FIXED_RADIX_LARGE_N) + }; + + map_flags(&flags, &flags, self_flagmap, NELEM(self_flagmap)); + + l = u = 0; + map_flags(&flags, &l, l_flagmap, NELEM(l_flagmap)); + map_flags(&flags, &u, u_flagmap, NELEM(u_flagmap)); + + /* enforce l <= u */ + PLNR_L(plnr) = l; + PLNR_U(plnr) = u | l; + + /* assert that the conversion didn't lose bits */ + A(PLNR_L(plnr) == l); + A(PLNR_U(plnr) == (u | l)); + + /* compute flags representation of the timelimit */ + t = timelimit_to_flags(plnr->timelimit); + + PLNR_TIMELIMIT_IMPATIENCE(plnr) = t; + A(PLNR_TIMELIMIT_IMPATIENCE(plnr) == t); +} diff --git a/examples/Integration_with_fftw/fftw/api/mkprinter-file.c b/examples/Integration_with_fftw/fftw/api/mkprinter-file.c new file mode 100644 index 0000000..df44b2f --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/mkprinter-file.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include + +#define BUFSZ 256 + +typedef struct { + printer super; + FILE *f; + char buf[BUFSZ]; + char *bufw; +} P; + +static void myflush(P *p) +{ + fwrite(p->buf, 1, p->bufw - p->buf, p->f); + p->bufw = p->buf; +} + +static void myputchr(printer *p_, char c) +{ + P *p = (P *) p_; + if (p->bufw >= p->buf + BUFSZ) + myflush(p); + *p->bufw++ = c; +} + +static void mycleanup(printer *p_) +{ + P *p = (P *) p_; + myflush(p); +} + +printer *X(mkprinter_file)(FILE *f) +{ + P *p = (P *) X(mkprinter)(sizeof(P), myputchr, mycleanup); + p->f = f; + p->bufw = p->buf; + return &p->super; +} diff --git a/examples/Integration_with_fftw/fftw/api/mkprinter-str.c b/examples/Integration_with_fftw/fftw/api/mkprinter-str.c new file mode 100644 index 0000000..142fd62 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/mkprinter-str.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +typedef struct { + printer super; + size_t *cnt; +} P_cnt; + +static void putchr_cnt(printer * p_, char c) +{ + P_cnt *p = (P_cnt *) p_; + UNUSED(c); + ++*p->cnt; +} + +printer *X(mkprinter_cnt)(size_t *cnt) +{ + P_cnt *p = (P_cnt *) X(mkprinter)(sizeof(P_cnt), putchr_cnt, 0); + p->cnt = cnt; + *cnt = 0; + return &p->super; +} + +typedef struct { + printer super; + char *s; +} P_str; + +static void putchr_str(printer * p_, char c) +{ + P_str *p = (P_str *) p_; + *p->s++ = c; + *p->s = 0; +} + +printer *X(mkprinter_str)(char *s) +{ + P_str *p = (P_str *) X(mkprinter)(sizeof(P_str), putchr_str, 0); + p->s = s; + *s = 0; + return &p->super; +} diff --git a/examples/Integration_with_fftw/fftw/api/mktensor-iodims.c b/examples/Integration_with_fftw/fftw/api/mktensor-iodims.c new file mode 100644 index 0000000..ae5924e --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/mktensor-iodims.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "mktensor-iodims.h" diff --git a/examples/Integration_with_fftw/fftw/api/mktensor-iodims.h b/examples/Integration_with_fftw/fftw/api/mktensor-iodims.h new file mode 100644 index 0000000..cdedd39 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/mktensor-iodims.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +tensor *MKTENSOR_IODIMS(int rank, const IODIM *dims, int is, int os) +{ + int i; + tensor *x = X(mktensor)(rank); + + if (FINITE_RNK(rank)) { + for (i = 0; i < rank; ++i) { + x->dims[i].n = dims[i].n; + x->dims[i].is = dims[i].is * is; + x->dims[i].os = dims[i].os * os; + } + } + return x; +} + +static int iodims_kosherp(int rank, const IODIM *dims, int allow_minfty) +{ + int i; + + if (rank < 0) return 0; + + if (allow_minfty) { + if (!FINITE_RNK(rank)) return 1; + for (i = 0; i < rank; ++i) + if (dims[i].n < 0) return 0; + } else { + if (!FINITE_RNK(rank)) return 0; + for (i = 0; i < rank; ++i) + if (dims[i].n <= 0) return 0; + } + + return 1; +} + +int GURU_KOSHERP(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims) +{ + return (iodims_kosherp(rank, dims, 0) && + iodims_kosherp(howmany_rank, howmany_dims, 1)); +} diff --git a/examples/Integration_with_fftw/fftw/api/mktensor-iodims64.c b/examples/Integration_with_fftw/fftw/api/mktensor-iodims64.c new file mode 100644 index 0000000..df5b4e0 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/mktensor-iodims64.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "mktensor-iodims.h" diff --git a/examples/Integration_with_fftw/fftw/api/mktensor-rowmajor.c b/examples/Integration_with_fftw/fftw/api/mktensor-rowmajor.c new file mode 100644 index 0000000..d470356 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/mktensor-rowmajor.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +tensor *X(mktensor_rowmajor)(int rnk, const int *n, + const int *niphys, const int *nophys, + int is, int os) +{ + tensor *x = X(mktensor)(rnk); + + if (FINITE_RNK(rnk) && rnk > 0) { + int i; + + A(n && niphys && nophys); + x->dims[rnk - 1].is = is; + x->dims[rnk - 1].os = os; + x->dims[rnk - 1].n = n[rnk - 1]; + for (i = rnk - 1; i > 0; --i) { + x->dims[i - 1].is = x->dims[i].is * niphys[i]; + x->dims[i - 1].os = x->dims[i].os * nophys[i]; + x->dims[i - 1].n = n[i - 1]; + } + } + return x; +} + +static int rowmajor_kosherp(int rnk, const int *n) +{ + int i; + + if (!FINITE_RNK(rnk)) return 0; + if (rnk < 0) return 0; + + for (i = 0; i < rnk; ++i) + if (n[i] <= 0) return 0; + + return 1; +} + +int X(many_kosherp)(int rnk, const int *n, int howmany) +{ + return (howmany >= 0) && rowmajor_kosherp(rnk, n); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-1d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-1d.c new file mode 100644 index 0000000..d18e08e --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-1d.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) X(plan_dft_1d)(int n, C *in, C *out, int sign, unsigned flags) +{ + return X(plan_dft)(1, &n, in, out, sign, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-2d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-2d.c new file mode 100644 index 0000000..53c68cd --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-2d.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) X(plan_dft_2d)(int nx, int ny, C *in, C *out, int sign, unsigned flags) +{ + int n[2]; + n[0] = nx; + n[1] = ny; + return X(plan_dft)(2, n, in, out, sign, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-3d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-3d.c new file mode 100644 index 0000000..37e9faf --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-3d.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) X(plan_dft_3d)(int nx, int ny, int nz, + C *in, C *out, int sign, unsigned flags) +{ + int n[3]; + n[0] = nx; + n[1] = ny; + n[2] = nz; + return X(plan_dft)(3, n, in, out, sign, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-1d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-1d.c new file mode 100644 index 0000000..c0f6ba0 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-1d.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_c2r_1d)(int n, C *in, R *out, unsigned flags) +{ + return X(plan_dft_c2r)(1, &n, in, out, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-2d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-2d.c new file mode 100644 index 0000000..e9dda36 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-2d.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_c2r_2d)(int nx, int ny, C *in, R *out, unsigned flags) +{ + int n[2]; + n[0] = nx; + n[1] = ny; + return X(plan_dft_c2r)(2, n, in, out, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-3d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-3d.c new file mode 100644 index 0000000..be9dc9a --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-c2r-3d.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_c2r_3d)(int nx, int ny, int nz, + C *in, R *out, unsigned flags) +{ + int n[3]; + n[0] = nx; + n[1] = ny; + n[2] = nz; + return X(plan_dft_c2r)(3, n, in, out, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-c2r.c b/examples/Integration_with_fftw/fftw/api/plan-dft-c2r.c new file mode 100644 index 0000000..00043a1 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-c2r.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_c2r)(int rank, const int *n, C *in, R *out, unsigned flags) +{ + return X(plan_many_dft_c2r)(rank, n, 1, + in, 0, 1, 1, out, 0, 1, 1, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-1d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-1d.c new file mode 100644 index 0000000..63b0db3 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-1d.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_r2c_1d)(int n, R *in, C *out, unsigned flags) +{ + return X(plan_dft_r2c)(1, &n, in, out, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-2d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-2d.c new file mode 100644 index 0000000..43000b3 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-2d.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_r2c_2d)(int nx, int ny, R *in, C *out, unsigned flags) +{ + int n[2]; + n[0] = nx; + n[1] = ny; + return X(plan_dft_r2c)(2, n, in, out, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-3d.c b/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-3d.c new file mode 100644 index 0000000..1cd5b64 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-r2c-3d.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_r2c_3d)(int nx, int ny, int nz, + R *in, C *out, unsigned flags) +{ + int n[3]; + n[0] = nx; + n[1] = ny; + n[2] = nz; + return X(plan_dft_r2c)(3, n, in, out, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft-r2c.c b/examples/Integration_with_fftw/fftw/api/plan-dft-r2c.c new file mode 100644 index 0000000..0b19459 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft-r2c.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_r2c)(int rank, const int *n, R *in, C *out, unsigned flags) +{ + return X(plan_many_dft_r2c)(rank, n, 1, + in, 0, 1, 1, + out, 0, 1, 1, + flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-dft.c b/examples/Integration_with_fftw/fftw/api/plan-dft.c new file mode 100644 index 0000000..921af71 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-dft.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft)(int rank, const int *n, + C *in, C *out, int sign, unsigned flags) +{ + return X(plan_many_dft)(rank, n, 1, + in, 0, 1, 1, + out, 0, 1, 1, + sign, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-dft-c2r.c b/examples/Integration_with_fftw/fftw/api/plan-guru-dft-c2r.c new file mode 100644 index 0000000..00226e9 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-dft-c2r.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-dft-c2r.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-dft-c2r.h b/examples/Integration_with_fftw/fftw/api/plan-guru-dft-c2r.h new file mode 100644 index 0000000..30879d6 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-dft-c2r.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(dft_c2r)(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims, + C *in, R *out, unsigned flags) +{ + R *ri, *ii; + + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + EXTRACT_REIM(FFT_SIGN, in, &ri, &ii); + + if (out != ri) + flags |= FFTW_DESTROY_INPUT; + return X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + MKTENSOR_IODIMS(rank, dims, 2, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, 2, 1), + TAINT_UNALIGNED(out, flags), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), HC2R)); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-dft-r2c.c b/examples/Integration_with_fftw/fftw/api/plan-guru-dft-r2c.c new file mode 100644 index 0000000..a88945f --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-dft-r2c.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-dft-r2c.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-dft-r2c.h b/examples/Integration_with_fftw/fftw/api/plan-guru-dft-r2c.h new file mode 100644 index 0000000..4297696 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-dft-r2c.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(dft_r2c)(int rank, const IODIM *dims, + int howmany_rank, + const IODIM *howmany_dims, + R *in, C *out, unsigned flags) +{ + R *ro, *io; + + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + EXTRACT_REIM(FFT_SIGN, out, &ro, &io); + + return X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + MKTENSOR_IODIMS(rank, dims, 1, 2), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, 1, 2), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags), R2HC)); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-dft.c b/examples/Integration_with_fftw/fftw/api/plan-guru-dft.c new file mode 100644 index 0000000..85873da --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-dft.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-dft.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-dft.h b/examples/Integration_with_fftw/fftw/api/plan-guru-dft.h new file mode 100644 index 0000000..9e7c836 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-dft.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) XGURU(dft)(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims, + C *in, C *out, int sign, unsigned flags) +{ + R *ri, *ii, *ro, *io; + + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + EXTRACT_REIM(sign, in, &ri, &ii); + EXTRACT_REIM(sign, out, &ro, &io); + + return X(mkapiplan)( + sign, flags, + X(mkproblem_dft_d)(MKTENSOR_IODIMS(rank, dims, 2, 2), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, + 2, 2), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags))); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-r2r.c b/examples/Integration_with_fftw/fftw/api/plan-guru-r2r.c new file mode 100644 index 0000000..c6ebaed --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-r2r.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-r2r.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-r2r.h b/examples/Integration_with_fftw/fftw/api/plan-guru-r2r.h new file mode 100644 index 0000000..baf1048 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-r2r.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(r2r)(int rank, const IODIM *dims, + int howmany_rank, + const IODIM *howmany_dims, + R *in, R *out, + const X(r2r_kind) * kind, unsigned flags) +{ + X(plan) p; + rdft_kind *k; + + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + k = X(map_r2r_kind)(rank, kind); + p = X(mkapiplan)( + 0, flags, + X(mkproblem_rdft_d)(MKTENSOR_IODIMS(rank, dims, 1, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, + 1, 1), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(out, flags), k)); + X(ifree0)(k); + return p; +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-c2r.c b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-c2r.c new file mode 100644 index 0000000..2831f02 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-c2r.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-split-dft-c2r.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-c2r.h b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-c2r.h new file mode 100644 index 0000000..69a8803 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-c2r.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(split_dft_c2r)(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims, + R *ri, R *ii, R *out, unsigned flags) +{ + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + if (out != ri) + flags |= FFTW_DESTROY_INPUT; + return X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + MKTENSOR_IODIMS(rank, dims, 1, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, 1, 1), + TAINT_UNALIGNED(out, flags), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), HC2R)); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-r2c.c b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-r2c.c new file mode 100644 index 0000000..32cac9e --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-r2c.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-split-dft-r2c.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-r2c.h b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-r2c.h new file mode 100644 index 0000000..e095551 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft-r2c.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(split_dft_r2c)(int rank, const IODIM *dims, + int howmany_rank, + const IODIM *howmany_dims, + R *in, R *ro, R *io, unsigned flags) +{ + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + return X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + MKTENSOR_IODIMS(rank, dims, 1, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, 1, 1), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags), R2HC)); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft.c b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft.c new file mode 100644 index 0000000..328aa7d --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-split-dft.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft.h b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft.h new file mode 100644 index 0000000..0f7a963 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru-split-dft.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) XGURU(split_dft)(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims, + R *ri, R *ii, R *ro, R *io, unsigned flags) +{ + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + return X(mkapiplan)( + ii - ri == 1 && io - ro == 1 ? FFT_SIGN : -FFT_SIGN, flags, + X(mkproblem_dft_d)(MKTENSOR_IODIMS(rank, dims, 1, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, + 1, 1), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags))); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru64-dft-c2r.c b/examples/Integration_with_fftw/fftw/api/plan-guru64-dft-c2r.c new file mode 100644 index 0000000..6e2dddf --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru64-dft-c2r.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-dft-c2r.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru64-dft-r2c.c b/examples/Integration_with_fftw/fftw/api/plan-guru64-dft-r2c.c new file mode 100644 index 0000000..a9e776c --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru64-dft-r2c.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-dft-r2c.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru64-dft.c b/examples/Integration_with_fftw/fftw/api/plan-guru64-dft.c new file mode 100644 index 0000000..5ea218f --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru64-dft.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-dft.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru64-r2r.c b/examples/Integration_with_fftw/fftw/api/plan-guru64-r2r.c new file mode 100644 index 0000000..46012dd --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru64-r2r.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-r2r.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft-c2r.c b/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft-c2r.c new file mode 100644 index 0000000..f20d12c --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft-c2r.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-split-dft-c2r.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft-r2c.c b/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft-r2c.c new file mode 100644 index 0000000..3dfa81a --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft-r2c.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-split-dft-r2c.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft.c b/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft.c new file mode 100644 index 0000000..25b94ae --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-guru64-split-dft.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-split-dft.h" diff --git a/examples/Integration_with_fftw/fftw/api/plan-many-dft-c2r.c b/examples/Integration_with_fftw/fftw/api/plan-many-dft-c2r.c new file mode 100644 index 0000000..5f719a6 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-many-dft-c2r.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) X(plan_many_dft_c2r)(int rank, const int *n, + int howmany, + C *in, const int *inembed, + int istride, int idist, + R *out, const int *onembed, + int ostride, int odist, unsigned flags) +{ + R *ri, *ii; + int *nfi, *nfo; + int inplace; + X(plan) p; + + if (!X(many_kosherp)(rank, n, howmany)) return 0; + + EXTRACT_REIM(FFT_SIGN, in, &ri, &ii); + inplace = out == ri; + + if (!inplace) + flags |= FFTW_DESTROY_INPUT; + p = X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + X(mktensor_rowmajor)( + rank, n, + X(rdft2_pad)(rank, n, inembed, inplace, 1, &nfi), + X(rdft2_pad)(rank, n, onembed, inplace, 0, &nfo), + 2 * istride, ostride), + X(mktensor_1d)(howmany, 2 * idist, odist), + TAINT_UNALIGNED(out, flags), + TAINT_UNALIGNED(ri, flags), TAINT_UNALIGNED(ii, flags), + HC2R)); + + X(ifree0)(nfi); + X(ifree0)(nfo); + return p; +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-many-dft-r2c.c b/examples/Integration_with_fftw/fftw/api/plan-many-dft-r2c.c new file mode 100644 index 0000000..ad05231 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-many-dft-r2c.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) X(plan_many_dft_r2c)(int rank, const int *n, + int howmany, + R *in, const int *inembed, + int istride, int idist, + C *out, const int *onembed, + int ostride, int odist, unsigned flags) +{ + R *ro, *io; + int *nfi, *nfo; + int inplace; + X(plan) p; + + if (!X(many_kosherp)(rank, n, howmany)) return 0; + + EXTRACT_REIM(FFT_SIGN, out, &ro, &io); + inplace = in == ro; + + p = X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + X(mktensor_rowmajor)( + rank, n, + X(rdft2_pad)(rank, n, inembed, inplace, 0, &nfi), + X(rdft2_pad)(rank, n, onembed, inplace, 1, &nfo), + istride, 2 * ostride), + X(mktensor_1d)(howmany, idist, 2 * odist), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(ro, flags), TAINT_UNALIGNED(io, flags), + R2HC)); + + X(ifree0)(nfi); + X(ifree0)(nfo); + return p; +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-many-dft.c b/examples/Integration_with_fftw/fftw/api/plan-many-dft.c new file mode 100644 index 0000000..69643cd --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-many-dft.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +#define N0(nembed)((nembed) ? (nembed) : n) + +X(plan) X(plan_many_dft)(int rank, const int *n, + int howmany, + C *in, const int *inembed, + int istride, int idist, + C *out, const int *onembed, + int ostride, int odist, int sign, unsigned flags) +{ + R *ri, *ii, *ro, *io; + + if (!X(many_kosherp)(rank, n, howmany)) return 0; + + EXTRACT_REIM(sign, in, &ri, &ii); + EXTRACT_REIM(sign, out, &ro, &io); + + return + X(mkapiplan)(sign, flags, + X(mkproblem_dft_d)( + X(mktensor_rowmajor)(rank, n, + N0(inembed), N0(onembed), + 2 * istride, 2 * ostride), + X(mktensor_1d)(howmany, 2 * idist, 2 * odist), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags))); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-many-r2r.c b/examples/Integration_with_fftw/fftw/api/plan-many-r2r.c new file mode 100644 index 0000000..6cc7a96 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-many-r2r.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +#define N0(nembed)((nembed) ? (nembed) : n) + +X(plan) X(plan_many_r2r)(int rank, const int *n, + int howmany, + R *in, const int *inembed, + int istride, int idist, + R *out, const int *onembed, + int ostride, int odist, + const X(r2r_kind) * kind, unsigned flags) +{ + X(plan) p; + rdft_kind *k; + + if (!X(many_kosherp)(rank, n, howmany)) return 0; + + k = X(map_r2r_kind)(rank, kind); + p = X(mkapiplan)( + 0, flags, + X(mkproblem_rdft_d)(X(mktensor_rowmajor)(rank, n, + N0(inembed), N0(onembed), + istride, ostride), + X(mktensor_1d)(howmany, idist, odist), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(out, flags), k)); + X(ifree0)(k); + return p; +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-r2r-1d.c b/examples/Integration_with_fftw/fftw/api/plan-r2r-1d.c new file mode 100644 index 0000000..1f7e033 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-r2r-1d.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_r2r_1d)(int n, R *in, R *out, X(r2r_kind) kind, unsigned flags) +{ + return X(plan_r2r)(1, &n, in, out, &kind, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-r2r-2d.c b/examples/Integration_with_fftw/fftw/api/plan-r2r-2d.c new file mode 100644 index 0000000..3e6004e --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-r2r-2d.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_r2r_2d)(int nx, int ny, R *in, R *out, + X(r2r_kind) kindx, X(r2r_kind) kindy, unsigned flags) +{ + int n[2]; + X(r2r_kind) kind[2]; + n[0] = nx; + n[1] = ny; + kind[0] = kindx; + kind[1] = kindy; + return X(plan_r2r)(2, n, in, out, kind, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-r2r-3d.c b/examples/Integration_with_fftw/fftw/api/plan-r2r-3d.c new file mode 100644 index 0000000..77ebefc --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-r2r-3d.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_r2r_3d)(int nx, int ny, int nz, + R *in, R *out, X(r2r_kind) kindx, + X(r2r_kind) kindy, X(r2r_kind) kindz, unsigned flags) +{ + int n[3]; + X(r2r_kind) kind[3]; + n[0] = nx; + n[1] = ny; + n[2] = nz; + kind[0] = kindx; + kind[1] = kindy; + kind[2] = kindz; + return X(plan_r2r)(3, n, in, out, kind, flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/plan-r2r.c b/examples/Integration_with_fftw/fftw/api/plan-r2r.c new file mode 100644 index 0000000..4c4b9dd --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/plan-r2r.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_r2r)(int rank, const int *n, R *in, R *out, + const X(r2r_kind) * kind, unsigned flags) +{ + return X(plan_many_r2r)(rank, n, 1, in, 0, 1, 1, out, 0, 1, 1, kind, + flags); +} diff --git a/examples/Integration_with_fftw/fftw/api/print-plan.c b/examples/Integration_with_fftw/fftw/api/print-plan.c new file mode 100644 index 0000000..6b38816 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/print-plan.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +char *X(sprint_plan)(const X(plan) p) +{ + size_t cnt; + char *s; + plan *pln = p->pln; + + printer *pr = X(mkprinter_cnt)(&cnt); + pln->adt->print(pln, pr); + X(printer_destroy)(pr); + + s = (char *) malloc(sizeof(char) * (cnt + 1)); + if (s) { + pr = X(mkprinter_str)(s); + pln->adt->print(pln, pr); + X(printer_destroy)(pr); + } + return s; +} + +void X(fprint_plan)(const X(plan) p, FILE *output_file) +{ + printer *pr = X(mkprinter_file)(output_file); + plan *pln = p->pln; + pln->adt->print(pln, pr); + X(printer_destroy)(pr); +} + +void X(print_plan)(const X(plan) p) +{ + X(fprint_plan)(p, stdout); +} diff --git a/examples/Integration_with_fftw/fftw/api/rdft2-pad.c b/examples/Integration_with_fftw/fftw/api/rdft2-pad.c new file mode 100644 index 0000000..5e1026f --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/rdft2-pad.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include "api/api.h" + +const int *X(rdft2_pad)(int rnk, const int *n, const int *nembed, + int inplace, int cmplx, int **nfree) +{ + A(FINITE_RNK(rnk)); + *nfree = 0; + if (!nembed && rnk > 0) { + if (inplace || cmplx) { + int *np = (int *) MALLOC(sizeof(int) * (unsigned)rnk, PROBLEMS); + memcpy(np, n, sizeof(int) * (unsigned)rnk); + np[rnk - 1] = (n[rnk - 1] / 2 + 1) * (1 + !cmplx); + nembed = *nfree = np; + } else + nembed = n; + } + return nembed; +} diff --git a/examples/Integration_with_fftw/fftw/api/the-planner.c b/examples/Integration_with_fftw/fftw/api/the-planner.c new file mode 100644 index 0000000..0313a26 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/the-planner.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +static planner *plnr = 0; + +/* create the planner for the rest of the API */ +planner *X(the_planner)(void) +{ + if (!plnr) { + plnr = X(mkplanner)(); + X(configure_planner)(plnr); + } + + return plnr; +} + +void X(cleanup)(void) +{ + if (plnr) { + X(planner_destroy)(plnr); + plnr = 0; + } +} + +void X(set_timelimit)(double tlim) +{ + /* PLNR is not necessarily initialized when this function is + called, so use X(the_planner)() */ + X(the_planner)()->timelimit = tlim; +} diff --git a/examples/Integration_with_fftw/fftw/api/version.c b/examples/Integration_with_fftw/fftw/api/version.c new file mode 100644 index 0000000..4f14de1 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/version.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "api/api.h" + +const char X(cc)[] = FFTW_CC; + +/* fftw <= 3.2.2 had special compiler flags for codelets, which are + not used anymore. We keep this variable around because it is part + of the ABI */ +const char X(codelet_optim)[] = ""; + +const char X(version)[] = PACKAGE "-" PACKAGE_VERSION + +#if HAVE_FMA + "-fma" +#endif + +#if HAVE_SSE2 + "-sse2" +#endif + + /* Earlier versions of FFTW only provided 256-bit AVX, which meant + * it was important to also enable sse2 for best performance for + * short transforms. Since some programs check for this and warn + * the user, we explicitly add avx_128 to the suffix to emphasize + * that this version is more capable. + */ + +#if HAVE_AVX + "-avx" +#endif + +#if HAVE_AVX_128_FMA + "-avx_128_fma" +#endif + +#if HAVE_AVX2 + "-avx2-avx2_128" +#endif + +#if HAVE_AVX512 + "-avx512" +#endif + +#if HAVE_KCVI + "-kcvi" +#endif + +#if HAVE_ALTIVEC + "-altivec" +#endif + +#if HAVE_VSX + "-vsx" +#endif + +#if HAVE_NEON + "-neon" +#endif + +#if defined(HAVE_GENERIC_SIMD128) + "-generic_simd128" +#endif + +#if defined(HAVE_GENERIC_SIMD256) + "-generic_simd256" +#endif + +; diff --git a/examples/Integration_with_fftw/fftw/api/x77.h b/examples/Integration_with_fftw/fftw/api/x77.h new file mode 100644 index 0000000..9a1ab83 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/api/x77.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Fortran-like (e.g. as in BLAS) type prefixes for F77 interface */ +#if defined(FFTW_SINGLE) +# define x77(name) CONCAT(sfftw_, name) +# define X77(NAME) CONCAT(SFFTW_, NAME) +#elif defined(FFTW_LDOUBLE) +/* FIXME: what is best? BLAS uses D..._X, apparently. Ugh. */ +# define x77(name) CONCAT(lfftw_, name) +# define X77(NAME) CONCAT(LFFTW_, NAME) +#elif defined(FFTW_QUAD) +# define x77(name) CONCAT(qfftw_, name) +# define X77(NAME) CONCAT(QFFTW_, NAME) +#else +# define x77(name) CONCAT(dfftw_, name) +# define X77(NAME) CONCAT(DFFTW_, NAME) +#endif + +/* If F77_FUNC is not defined and the user didn't explicitly specify + --disable-fortran, then make our best guess at default wrappers + (since F77_FUNC_EQUIV should not be defined in this case, we + will use both double-underscored g77 wrappers and single- or + non-underscored wrappers). This saves us from dealing with + complaints in the cases where the user failed to specify + an F77 compiler or wrapper detection failed for some reason. */ +#if !defined(F77_FUNC) && !defined(DISABLE_FORTRAN) +# if (defined(_WIN32) || defined(__WIN32__)) && !defined(WINDOWS_F77_MANGLING) +# define WINDOWS_F77_MANGLING 1 +# endif +# if defined(_AIX) || defined(__hpux) || defined(hpux) +# define F77_FUNC(a, A) a +# elif defined(CRAY) || defined(_CRAY) || defined(_UNICOS) +# define F77_FUNC(a, A) A +# else +# define F77_FUNC(a, A) a ## _ +# endif +# define F77_FUNC_(a, A) a ## __ +#endif + +#if defined(WITH_G77_WRAPPERS) && !defined(DISABLE_FORTRAN) +# undef F77_FUNC_ +# define F77_FUNC_(a, A) a ## __ +# undef F77_FUNC_EQUIV +#endif + +/* annoying Windows syntax for shared-library declarations */ +#if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__)) +# define FFTW_VOIDFUNC __declspec(dllexport) void +#else +# define FFTW_VOIDFUNC void +#endif diff --git a/examples/Integration_with_fftw/fftw/fftw++.cc b/examples/Integration_with_fftw/fftw/fftw++.cc new file mode 100644 index 0000000..fa71015 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/fftw++.cc @@ -0,0 +1,75 @@ +#include +#include +#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="wisdom3.txt"; +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; +crfft1d::Table crfft1d::threadtable; +mrcfft1d::Table mrcfft1d::threadtable; +mcrfft1d::Table mcrfft1d::threadtable; +fft2d::Table fft2d::threadtable; + +void LoadWisdom() +{ + static bool Wise=false; + if(!Wise) { + ifstream ifWisdom; + ifWisdom.open(fftw::WisdomName); + ostringstream wisdom; + wisdom << ifWisdom.rdbuf(); + ifWisdom.close(); + const string& s=wisdom.str(); + fftw_import_wisdom_from_string(s.c_str()); + Wise=true; + } +} + +void SaveWisdom() +{ + ofstream ofWisdom; + ofWisdom.open(fftw::WisdomName); + char *wisdom=fftw_export_wisdom_to_string(); + ofWisdom << wisdom; + fftw_free(wisdom); + ofWisdom.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; +} + +ThreadBase::ThreadBase() {threads=fftw::maxthreads;} + +} + +namespace utils { +unsigned int defaultmpithreads=1; +} diff --git a/examples/Integration_with_fftw/fftw/fftw++.h b/examples/Integration_with_fftw/fftw/fftw++.h new file mode 100644 index 0000000..c3db15a --- /dev/null +++ b/examples/Integration_with_fftw/fftw/fftw++.h @@ -0,0 +1,1551 @@ +/* Fast Fourier transform C++ header class for the FFTW3 Library + Copyright (C) 2004-16 + John C. Bowman, University of Alberta + Malcolm Roberts, University of Strasbourg + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef __fftwpp_h__ +#define __fftwpp_h__ 1 + +#define __FFTWPP_H_VERSION__ 2.05 + +#include +#include +#include +#include +#include +#include + +#ifndef _OPENMP +#ifndef FFTWPP_SINGLE_THREAD +#define FFTWPP_SINGLE_THREAD +#endif +#endif + +#ifndef FFTWPP_SINGLE_THREAD +#include +#endif + +inline int get_thread_num() +{ +#ifdef FFTWPP_SINGLE_THREAD + return 0; +#else + return omp_get_thread_num(); +#endif +} + +inline int get_max_threads() +{ +#ifdef FFTWPP_SINGLE_THREAD + return 1; +#else + return omp_get_max_threads(); +#endif +} + +#ifndef FFTWPP_SINGLE_THREAD +#define PARALLEL(code) \ + if(threads > 1) { \ + _Pragma("omp parallel for num_threads(threads)") \ + code \ + } else { \ + code \ + } +#else +#define PARALLEL(code) \ + { \ + code \ + } +#endif + +#ifndef __Complex_h__ +#include +typedef std::complex Complex; +#endif + +#include "seconds.h" +#include "statistics.h" +#include "align.h" + +namespace fftwpp { + +// Obsolete names: +#define FFTWComplex ComplexAlign +#define FFTWdouble doubleAlign +#define FFTWdelete deleteAlign + +class fftw; + +extern "C" fftw_plan Planner(fftw *F, Complex *in, Complex *out); +void LoadWisdom(); +void SaveWisdom(); + +extern const char *inout; + +struct threaddata { + unsigned int threads; + double mean; + double stdev; + threaddata() : threads(0), mean(0.0), stdev(0.0) {} + threaddata(unsigned int threads, double mean, double stdev) : + threads(threads), mean(mean), stdev(stdev) {} +}; + +class fftw; + +class ThreadBase +{ +protected: + unsigned int threads; + unsigned int innerthreads; +public: + ThreadBase(); + ThreadBase(unsigned int threads) : threads(threads) {} + void Threads(unsigned int nthreads) {threads=nthreads;} + unsigned int Threads() {return threads;} + + void multithread(unsigned int nx) { + if(nx >= threads) { + innerthreads=1; + } else { + innerthreads=threads; + threads=1; + } + } +}; + +inline unsigned int realsize(unsigned int n, Complex *in, Complex *out=NULL) +{ + return (!out || in == out) ? 2*(n/2+1) : n; +} + +inline unsigned int realsize(unsigned int n, Complex *in, double *out) +{ + return realsize(n,in,(Complex *) out); +} + +inline unsigned int realsize(unsigned int n, double *in, Complex *out) +{ + return realsize(n,(Complex *) in,out); +} + +// Base clase for fft routines +// +class fftw : public ThreadBase { +protected: + unsigned int doubles; // number of double precision values in dataset + int sign; + unsigned int threads; + double norm; + + fftw_plan plan; + bool inplace; + + unsigned int Dist(unsigned int n, size_t stride, size_t dist) { + return dist ? dist : ((stride == 1) ? n : 1); + } + + static const double twopi; + +public: + static unsigned int effort; + static unsigned int maxthreads; + static double testseconds; + static const char *WisdomName; + static fftw_plan (*planner)(fftw *f, Complex *in, Complex *out); + + virtual unsigned int Threads() {return threads;} + + static const char *oddshift; + + // Inplace shift of Fourier origin to (nx/2,0) for even nx. + static void Shift(Complex *data, unsigned int nx, unsigned int ny, + unsigned int threads) { + unsigned int nyp=ny/2+1; + unsigned int stop=nx*nyp; + if(nx % 2 == 0) { + unsigned int inc=2*nyp; +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=nyp; i < stop; i += inc) { + Complex *p=data+i; + for(unsigned int j=0; j < nyp; j++) p[j]=-p[j]; + } + } else { + std::cerr << oddshift << std::endl; + exit(1); + } + } + + // Out-of-place shift of Fourier origin to (nx/2,0) for even nx. + static void Shift(double *data, unsigned int nx, unsigned int ny, + unsigned int threads) { + if(nx % 2 == 0) { + unsigned int stop=nx*ny; + unsigned int inc=2*ny; +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=ny; i < stop; i += inc) { + double *p=data+i; + for(unsigned int j=0; j < ny; j++) p[j]=-p[j]; + } + } else { + std::cerr << oddshift << std::endl; + exit(1); + } + } + + // Inplace shift of Fourier origin to (nx/2,ny/2,0) for even nx and ny. + static void Shift(Complex *data, unsigned int nx, unsigned int ny, + unsigned int nz, unsigned int threads) { + unsigned int nzp=nz/2+1; + unsigned int nyzp=ny*nzp; + if(nx % 2 == 0 && ny % 2 == 0) { + unsigned int pinc=2*nzp; +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < nx; i++) { + Complex *pstart=data+i*nyzp; + Complex *pstop=pstart+nyzp; + for(Complex *p=pstart+(1-(i % 2))*nzp; p < pstop; p += pinc) { + for(unsigned int k=0; k < nzp; k++) p[k]=-p[k]; + } + } + } else { + std::cerr << oddshift << " or odd ny" << std::endl; + exit(1); + } + } + + // Out-of-place shift of Fourier origin to (nx/2,ny/2,0) for even nx and ny. + static void Shift(double *data, unsigned int nx, unsigned int ny, + unsigned int nz, unsigned int threads) { + unsigned int nyz=ny*nz; + if(nx % 2 == 0 && ny % 2 == 0) { + unsigned int pinc=2*nz; +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < nx; i++) { + double *pstart=data+i*nyz; + double *pstop=pstart+nyz; + for(double *p=pstart+(1-(i % 2))*nz; p < pstop; p += pinc) { + for(unsigned int k=0; k < nz; k++) p[k]=-p[k]; + } + } + } else { + std::cerr << oddshift << " or odd ny" << std::endl; + exit(1); + } + } + + fftw() : plan(NULL) {} + fftw(unsigned int doubles, int sign, unsigned int threads, + unsigned int n=0) : + doubles(doubles), sign(sign), threads(threads), + norm(1.0/(n ? n : doubles/2)), plan(NULL) { +#ifndef FFTWPP_SINGLE_THREAD + fftw_init_threads(); +#endif + } + + virtual ~fftw() { + if(plan) fftw_destroy_plan(plan); + } + + virtual fftw_plan Plan(Complex *in, Complex *out) {return NULL;}; + + inline void CheckAlign(Complex *p, const char *s) { + if((size_t) p % sizeof(Complex) == 0) return; + std::cerr << "WARNING: " << s << " array is not " << sizeof(Complex) + << "-byte aligned: address " << p << std::endl; + } + + void noplan() { + std::cerr << "Unable to construct FFTW plan" << std::endl; + exit(1); + } + + static void planThreads(unsigned int threads) { +#ifndef FFTWPP_SINGLE_THREAD + omp_set_num_threads(threads); + fftw_plan_with_nthreads(threads); +#endif + } + + threaddata time(fftw_plan plan1, fftw_plan planT, Complex *in, Complex *out, + unsigned int Threads) { + utils::statistics S,ST; + double stop=utils::totalseconds()+testseconds; + threads=1; + plan=plan1; + fft(in,out); + threads=Threads; + plan=planT; + fft(in,out); + unsigned int N=1; + for(;;) { + double t0=utils::totalseconds(); + threads=1; + plan=plan1; + for(unsigned int i=0; i < N; ++i) + fft(in,out); + double t1=utils::totalseconds(); + threads=Threads; + plan=planT; + for(unsigned int i=0; i < N; ++i) + fft(in,out); + double t=utils::totalseconds(); + S.add(t1-t0); + ST.add(t-t1); + if(S.mean() < 100.0/CLOCKS_PER_SEC) N *= 2; + if(S.count() >= 10) { + double error=S.stdev(); + double diff=ST.mean()-S.mean(); + if(diff >= 0.0 || t > stop) { + threads=1; + plan=plan1; + fftw_destroy_plan(planT); + break; + } + if(diff < -error) { + threads=Threads; + fftw_destroy_plan(plan1); + break; + } + } + } + return threaddata(threads,S.mean(),S.stdev()); + } + + virtual threaddata lookup(bool inplace, unsigned int threads) { + return threaddata(); + } + virtual void store(bool inplace, const threaddata& data) {} + + inline Complex *CheckAlign(Complex *in, Complex *out, bool constructor=true) + { +#ifndef NO_CHECK_ALIGN + CheckAlign(in,constructor ? "constructor input" : "input"); + if(out) CheckAlign(out,constructor ? "constructor output" : "output"); + else out=in; +#else + if(!out) out=in; +#endif + return out; + } + + threaddata Setup(Complex *in, Complex *out=NULL) { + bool alloc=!in; + if(alloc) in=utils::ComplexAlign((doubles+1)/2); + out=CheckAlign(in,out); + inplace=(out==in); + + threaddata data; + unsigned int Threads=threads; + if(threads > 1) data=lookup(inplace,threads); + threads=data.threads > 0 ? data.threads : 1; + planThreads(threads); + plan=(*planner)(this,in,out); + if(!plan) noplan(); + + fftw_plan planT; + if(fftw::maxthreads > 1) { + threads=Threads; + planThreads(threads); + planT=(*planner)(this,in,out); + + if(data.threads == 0) { + if(planT) + data=time(plan,planT,in,out,threads); + else noplan(); + store(inplace,threaddata(threads,data.mean,data.stdev)); + } + } + + if(alloc) Array::deleteAlign(in,(doubles+1)/2); + return data; + } + + threaddata Setup(Complex *in, double *out) { + return Setup(in,(Complex *) out); + } + + threaddata Setup(double *in, Complex *out=NULL) { + return Setup((Complex *) in,out); + } + + virtual void Execute(Complex *in, Complex *out, bool=false) { + fftw_execute_dft(plan,(fftw_complex *) in,(fftw_complex *) out); + } + + Complex *Setout(Complex *in, Complex *out) { + out=CheckAlign(in,out,false); + if(inplace ^ (out == in)) { + std::cerr << "ERROR: fft " << inout << std::endl; + exit(1); + } + return out; + } + + void fft(Complex *in, Complex *out=NULL) { + out=Setout(in,out); + Execute(in,out); + } + + void fft(double *in, Complex *out=NULL) { + fft((Complex *) in,out); + } + + void fft(Complex *in, double *out) { + fft(in,(Complex *) out); + } + + void fft0(Complex *in, Complex *out=NULL) { + out=Setout(in,out); + Execute(in,out,true); + } + + void fft0(double *in, Complex *out=NULL) { + fft0((Complex *) in,out); + } + + void fft0(Complex *in, double *out) { + fft0(in,(Complex *) out); + } + + void Normalize(Complex *out) { + unsigned int stop=doubles/2; +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < stop; i++) out[i] *= norm; + } + + void Normalize(double *out) { +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < doubles; i++) out[i] *= norm; + } + + virtual void fftNormalized(Complex *in, Complex *out=NULL, bool shift=false) + { + out=Setout(in,out); + Execute(in,out,shift); + Normalize(out); + } + + void fftNormalized(Complex *in, double *out, bool shift=false) { + out=(double *) Setout(in,(Complex *) out); + Execute(in,(Complex *) out,shift); + Normalize(out); + } + + void fftNormalized(double *in, Complex *out, bool shift=false) { + fftNormalized((Complex *) in,out,shift); + } + + template + void fft0Normalized(I in, O out) { + fftNormalized(in,out,true); + } + + template + void Normalize(unsigned int nx, unsigned int M, size_t ostride, + size_t odist, O *out) { + unsigned int stop=nx*ostride; + O *outMdist=out+M*odist; +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < stop; i += ostride) { + O *pstop=outMdist+i; + for(O *p=out+i; p < pstop; p += odist) { + *p *= norm; + } + } + } + + template + void fftNormalized(unsigned int nx, unsigned int M, size_t ostride, + size_t odist, I *in, O *out=NULL, bool shift=false) { + out=(O *) Setout((Complex *) in,(Complex *) out); + Execute((Complex *) in,(Complex *) out,shift); + Normalize(nx,M,ostride,odist,out); + } + +}; // class fftw + +class Transpose { + fftw_plan plan; + fftw_plan plan2; + unsigned int a,b; + unsigned int nlength,mlength; + unsigned int ilast,jlast; + unsigned int rows,cols; + unsigned int threads; + bool inplace; + unsigned int size; +public: + template + Transpose(unsigned int rows, unsigned int cols, unsigned int length, + T *in, T *out=NULL, unsigned int threads=fftw::maxthreads) : + rows(rows), cols(cols), threads(threads) { + size=sizeof(T); + if(size % sizeof(double) != 0) { + std::cerr << "ERROR: Transpose is not implemented for type of size " + << size; + exit(1); + } + plan=plan2=NULL; + if(rows == 0 || cols == 0) return; + size /= sizeof(double); + length *= size; + + if(!out) out=in; + inplace=(out==in); + if(inplace) { + fftw::planThreads(threads); + threads=1; + } else fftw::planThreads(1); + + fftw_iodim dims[3]; + + a=std::min(rows,threads); + b=std::min(cols,threads/a); + + unsigned int n=utils::ceilquotient(rows,a); + unsigned int m=utils::ceilquotient(cols,b); + + // If rows <= threads then a=rows and n=1. + // If rows >= threads then b=1 and m=cols. + + nlength=n*length; + mlength=m*length; + + dims[0].n=n; + dims[0].is=cols*length; + dims[0].os=length; + + dims[1].n=m; + dims[1].is=length; + dims[1].os=rows*length; + + dims[2].n=length; + dims[2].is=1; + dims[2].os=1; + + // A plan with rank=0 is a transpose. + plan=fftw_plan_guru_r2r(0,NULL,3,dims,(double *) in,(double *) out, + NULL,fftw::effort); + ilast=a; + jlast=b; + + if(n*a > rows) { // Only happens when rows > threads. + a=utils::ceilquotient(rows,n); + ilast=a-1; + dims[0].n=rows-n*ilast; + plan2=fftw_plan_guru_r2r(0,NULL,3,dims,(double *) in,(double *) out, + NULL,fftw::effort); + } else { // Only happens when rows < threads. + if(m*b > cols) { + b=utils::ceilquotient(cols,m); + jlast=b-1; + dims[1].n=cols-m*jlast; + plan2=fftw_plan_guru_r2r(0,NULL,3,dims,(double *) in,(double *) out, + NULL,fftw::effort); + } + } + } + + ~Transpose() { + if(plan) fftw_destroy_plan(plan); + if(plan2) fftw_destroy_plan(plan2); + } + + template + void transpose(T *in, T *out=NULL) { + if(rows == 0 || cols == 0) return; + if(!out) out=in; + if(inplace ^ (out == in)) { + std::cerr << "ERROR: Transpose " << inout << std::endl; + exit(1); + } +#ifndef FFTWPP_SINGLE_THREAD + if(a > 1) { + if(b > 1) { + int A=a, B=b; +#pragma omp parallel for num_threads(A) + for(unsigned int i=0; i < a; ++i) { + unsigned int I=i*nlength; +#pragma omp parallel for num_threads(B) + for(unsigned int j=0; j < b; ++j) { + unsigned int J=j*mlength; + fftw_execute_r2r((i < ilast && j < jlast) ? plan : plan2, + (double *) in+cols*I+J, + (double *) out+rows*J+I); + } + } + } else { + int A=a; +#pragma omp parallel for num_threads(A) + for(unsigned int i=0; i < a; ++i) { + unsigned int I=i*nlength; + fftw_execute_r2r(i < ilast ? plan : plan2, + (double *) in+cols*I,(double *) out+I); + } + } + } else if(b > 1) { + int B=b; +#pragma omp parallel for num_threads(B) + for(unsigned int j=0; j < b; ++j) { + unsigned int J=j*mlength; + fftw_execute_r2r(j < jlast ? plan : plan2, + (double *) in+J,(double *) out+rows*J); + } + } else +#endif + fftw_execute_r2r(plan,(double *) in,(double*) out); + } +}; + +template +class Threadtable { +public: + typedef std::map Table; + + threaddata Lookup(Table& table, T key) { + typename Table::iterator p=table.find(key); + return p == table.end() ? threaddata() : p->second; + } + + void Store(Table& threadtable, T key, const threaddata& data) { + threadtable[key]=data; + } +}; + +struct keytype1 { + unsigned int nx; + unsigned int threads; + bool inplace; + keytype1(unsigned int nx, unsigned int threads, bool inplace) : + nx(nx), threads(threads), inplace(inplace) {} +}; + +struct keyless1 { + bool operator()(const keytype1& a, const keytype1& b) const { + return a.nx < b.nx || (a.nx == b.nx && + (a.threads < b.threads || (a.threads == b.threads && + a.inplace < b.inplace))); + } +}; + +struct keytype2 { + unsigned int nx; + unsigned int ny; + unsigned int threads; + bool inplace; + keytype2(unsigned int nx, unsigned int ny, unsigned int threads, + bool inplace) : + nx(nx), ny(ny), threads(threads), inplace(inplace) {} +}; + +struct keyless2 { + bool operator()(const keytype2& a, const keytype2& b) const { + return a.nx < b.nx || (a.nx == b.nx && + (a.ny < b.ny || (a.ny == b.ny && + (a.threads < b.threads || + (a.threads == b.threads && + a.inplace < b.inplace))))); + } +}; + +struct keytype3 { + unsigned int nx; + unsigned int ny; + unsigned int nz; + unsigned int threads; + bool inplace; + keytype3(unsigned int nx, unsigned int ny, unsigned int nz, + unsigned int threads, bool inplace) : + nx(nx), ny(ny), nz(nz), threads(threads), inplace(inplace) {} +}; + +struct keyless3 { + bool operator()(const keytype3& a, const keytype3& b) const { + return a.nx < b.nx || (a.nx == b.nx && + (a.ny < b.ny || (a.ny == b.ny && + (a.nz < b.nz || + (a.nz == b.nz && + (a.threads < b.threads || + (a.threads == b.threads && + a.inplace < b.inplace))))))); + } +}; + +// Compute the complex Fourier transform of n complex values. +// Before calling fft(), the arrays in and out (which may coincide) must be +// allocated as Complex[n]. +// +// Out-of-place usage: +// +// fft1d Forward(n,-1,in,out); +// Forward.fft(in,out); +// +// fft1d Backward(n,1,in,out); +// Backward.fft(in,out); +// +// fft1d Backward(n,1,in,out); +// Backward.fftNormalized(in,out); // True inverse of Forward.fft(out,in); +// +// In-place usage: +// +// fft1d Forward(n,-1); +// Forward.fft(in); +// +// fft1d Backward(n,1); +// Backward.fft(in); +// +class fft1d : public fftw, public Threadtable { + unsigned int nx; + static Table threadtable; +public: + fft1d(unsigned int nx, int sign, Complex *in=NULL, Complex *out=NULL, + unsigned int threads=maxthreads) + : fftw(2*nx,sign,threads), nx(nx) {Setup(in,out);} + +#ifdef __Array_h__ + fft1d(int sign, const Array::array1& in, + const Array::array1& out=Array::NULL1, + unsigned int threads=maxthreads) + : fftw(2*in.Nx(),sign,threads), nx(in.Nx()) {Setup(in,out);} +#endif + + threaddata lookup(bool inplace, unsigned int threads) { + return this->Lookup(threadtable,keytype1(nx,threads,inplace)); + } + void store(bool inplace, const threaddata& data) { + this->Store(threadtable,keytype1(nx,data.threads,inplace),data); + } + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_1d(nx,(fftw_complex *) in,(fftw_complex *) out, + sign,effort); + } +}; + +template +class fftwblock : public virtual fftw { +public: + int nx; + unsigned int M; + size_t istride,ostride; + size_t idist,odist; + fftw_plan plan1,plan2; + unsigned int T,Q,R; + fftwblock(unsigned int nx, unsigned int M, + size_t istride, size_t ostride, size_t idist, size_t odist, + Complex *in, Complex *out, unsigned int Threads) + : fftw(), nx(nx), M(M), istride(istride), ostride(ostride), + idist(Dist(nx,istride,idist)), odist(Dist(nx,ostride,odist)), + plan1(NULL), plan2(NULL) { + T=1; + Q=M; + R=0; + + threaddata S1=Setup(in,out); + fftw_plan planT1=plan; + + if(fftw::maxthreads > 1) { + if(Threads > 1) { + T=std::min(M,Threads); + Q=T > 0 ? M/T : 0; + R=M-Q*T; + + threads=Threads; + threaddata ST=Setup(in,out); + + if(R > 0 && threads == 1 && plan1 != plan2) { + fftw_destroy_plan(plan2); + plan2=plan1; + } + + if(ST.mean > S1.mean-S1.stdev) { // Use FFTW's multi-threading + fftw_destroy_plan(plan); + if(R > 0) { + fftw_destroy_plan(plan2); + plan2=NULL; + } + T=1; + Q=M; + R=0; + plan=planT1; + threads=S1.threads; + } else { // Do the multi-threading ourselves + fftw_destroy_plan(planT1); + threads=ST.threads; + } + } else + Setup(in,out); // Synchronize wisdom + } + } + + fftw_plan Plan(int Q, fftw_complex *in, fftw_complex *out) { + return fftw_plan_many_dft(1,&nx,Q,in,NULL,istride,idist, + out,NULL,ostride,odist,sign,effort); + } + + fftw_plan Plan(int Q, double *in, fftw_complex *out) { + return fftw_plan_many_dft_r2c(1,&nx,Q,in,NULL,istride,idist, + out,NULL,ostride,odist,effort); + } + + fftw_plan Plan(int Q, fftw_complex *in, double *out) { + return fftw_plan_many_dft_c2r(1,&nx,Q,in,NULL,istride,idist, + out,NULL,ostride,odist,effort); + } + + fftw_plan Plan(Complex *in, Complex *out) { + if(R > 0) { + plan2=Plan(Q+1,(I *) in,(O *) out); + if(!plan2) return NULL; + if(threads == 1) plan1=plan2; + } + return Plan(Q,(I *) in,(O *) out); + } + + void Execute(fftw_plan plan, fftw_complex *in, fftw_complex *out) { + fftw_execute_dft(plan,in,out); + } + + void Execute(fftw_plan plan, double *in, fftw_complex *out) { + fftw_execute_dft_r2c(plan,in,out); + } + + void Execute(fftw_plan plan, fftw_complex *in, double *out) { + fftw_execute_dft_c2r(plan,in,out); + } + + void Execute(Complex *in, Complex *out, bool=false) { + if(T == 1) + Execute(plan,(I *) in,(O *) out); + else { + unsigned int extra=T-R; +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(T) +#endif + for(unsigned int i=0; i < T; ++i) { + unsigned int iQ=i*Q; + if(i < extra) + Execute(plan,(I *) in+iQ*idist,(O *) out+iQ*odist); + else { + unsigned int offset=iQ+i-extra; + Execute(plan2,(I *) in+offset*idist,(O *) out+offset*odist); + } + } + } + } + + unsigned int Threads() {return std::max(T,threads);} + + ~fftwblock() { + if(plan2) fftw_destroy_plan(plan2); + } +}; + +// Compute the complex Fourier transform of M complex vectors, each of +// length n. +// Before calling fft(), the arrays in and out (which may coincide) must be +// allocated as Complex[M*n]. +// +// Out-of-place usage: +// +// mfft1d Forward(n,-1,M,stride,dist,in,out); +// Forward.fft(in,out); +// +// In-place usage: +// +// mfft1d Forward(n,-1,M,stride,dist); +// Forward.fft(in); +// +// Notes: +// stride is the spacing between the elements of each Complex vector; +// dist is the spacing between the first elements of the vectors. +// +// +class mfft1d : public fftwblock, + public Threadtable { + static Table threadtable; +public: + mfft1d(unsigned int nx, int sign, unsigned int M=1, size_t stride=1, + size_t dist=0, Complex *in=NULL, Complex *out=NULL, + unsigned int threads=maxthreads) : + fftw(2*((nx-1)*stride+(M-1)*Dist(nx,stride,dist)+1),sign,threads,nx), + fftwblock + (nx,M,stride,stride,dist,dist,in,out,threads) {} + + mfft1d(unsigned int nx, int sign, unsigned int M, + size_t istride, size_t ostride, size_t idist, size_t odist, + Complex *in=NULL, Complex *out=NULL, unsigned int threads=maxthreads): + fftw(std::max(2*((nx-1)*istride+(M-1)*Dist(nx,istride,idist)+1), + 2*((nx-1)*ostride+(M-1)*Dist(nx,ostride,odist)+1)),sign, + threads, nx), + fftwblock(nx,M,istride,ostride,idist,odist,in, + out,threads) {} + + threaddata lookup(bool inplace, unsigned int threads) { + return Lookup(threadtable,keytype3(nx,Q,R,threads,inplace)); + } + void store(bool inplace, const threaddata& data) { + Store(threadtable,keytype3(nx,Q,R,data.threads,inplace),data); + } +}; + +// Compute the complex Fourier transform of n real values, using phase sign -1. +// Before calling fft(), the array in must be allocated as double[n] and +// the array out must be allocated as Complex[n/2+1]. The arrays in and out +// may coincide, allocated as Complex[n/2+1]. +// +// Out-of-place usage: +// +// rcfft1d Forward(n,in,out); +// Forward.fft(in,out); +// +// In-place usage: +// +// rcfft1d Forward(n); +// Forward.fft(out); +// +// Notes: +// in contains the n real values stored as a Complex array; +// out contains the first n/2+1 Complex Fourier values. +// +class rcfft1d : public fftw, public Threadtable { + unsigned int nx; + static Table threadtable; +public: + rcfft1d(unsigned int nx, Complex *out=NULL, unsigned int threads=maxthreads) + : fftw(2*(nx/2+1),-1,threads,nx), nx(nx) {Setup(out,(double*) NULL);} + + rcfft1d(unsigned int nx, double *in, Complex *out=NULL, + unsigned int threads=maxthreads) + : fftw(2*(nx/2+1),-1,threads,nx), nx(nx) {Setup(in,out);} + + threaddata lookup(bool inplace, unsigned int threads) { + return Lookup(threadtable,keytype1(nx,threads,inplace)); + } + void store(bool inplace, const threaddata& data) { + Store(threadtable,keytype1(nx,data.threads,inplace),data); + } + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_r2c_1d(nx,(double *) in,(fftw_complex *) out, effort); + } + + void Execute(Complex *in, Complex *out, bool=false) { + fftw_execute_dft_r2c(plan,(double *) in,(fftw_complex *) out); + } +}; + +// Compute the real inverse Fourier transform of the n/2+1 Complex values +// corresponding to the non-negative part of the frequency spectrum, using +// phase sign +1. +// Before calling fft(), the array in must be allocated as Complex[n/2+1] +// and the array out must be allocated as double[n]. The arrays in and out +// may coincide, allocated as Complex[n/2+1]. +// +// Out-of-place usage (input destroyed): +// +// crfft1d Backward(n,in,out); +// Backward.fft(in,out); +// +// In-place usage: +// +// crfft1d Backward(n); +// Backward.fft(in); +// +// Notes: +// in contains the first n/2+1 Complex Fourier values. +// out contains the n real values stored as a Complex array; +// +class crfft1d : public fftw, public Threadtable { + unsigned int nx; + static Table threadtable; +public: + crfft1d(unsigned int nx, double *out=NULL, unsigned int threads=maxthreads) + : fftw(2*(nx/2+1),1,threads,nx), nx(nx) {Setup(out);} + + crfft1d(unsigned int nx, Complex *in, double *out=NULL, + unsigned int threads=maxthreads) + : fftw(realsize(nx,in,out),1,threads,nx), nx(nx) {Setup(in,out);} + + threaddata lookup(bool inplace, unsigned int threads) { + return Lookup(threadtable,keytype1(nx,threads,inplace)); + } + void store(bool inplace, const threaddata& data) { + Store(threadtable,keytype1(nx,data.threads,inplace),data); + } + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_c2r_1d(nx,(fftw_complex *) in,(double *) out,effort); + } + + void Execute(Complex *in, Complex *out, bool=false) { + fftw_execute_dft_c2r(plan,(fftw_complex *) in,(double *) out); + } +}; + +// Compute the real Fourier transform of M real vectors, each of length n, +// using phase sign -1. Before calling fft(), the array in must be +// allocated as double[M*n] and the array out must be allocated as +// Complex[M*(n/2+1)]. The arrays in and out may coincide, +// allocated as Complex[M*(n/2+1)]. +// +// Out-of-place usage: +// +// mrcfft1d Forward(n,M,istride,ostride,idist,odist,in,out); +// Forward.fft(in,out); +// +// In-place usage: +// +// mrcfft1d Forward(n,M,istride,ostride,idist,odist); +// Forward.fft(out); +// +// Notes: +// istride is the spacing between the elements of each real vector; +// ostride is the spacing between the elements of each Complex vector; +// idist is the spacing between the first elements of the real vectors; +// odist is the spacing between the first elements of the Complex vectors; +// in contains the n real values stored as a Complex array; +// out contains the first n/2+1 Complex Fourier values. +// +class mrcfft1d : public fftwblock, + public Threadtable { + static Table threadtable; +public: + mrcfft1d(unsigned int nx, unsigned int M, + size_t istride, size_t ostride, + size_t idist, size_t odist, + double *in=NULL, Complex *out=NULL, + unsigned int threads=maxthreads) + : fftw(std::max((realsize(nx,in,out)-2)*istride+(M-1)*idist+2, + 2*(nx/2*ostride+(M-1)*odist+1)),-1,threads,nx), + fftwblock + (nx,M,istride,ostride,idist,odist,(Complex *) in,out,threads) {} + + threaddata lookup(bool inplace, unsigned int threads) { + return Lookup(threadtable,keytype3(nx,Q,R,threads,inplace)); + } + + void store(bool inplace, const threaddata& data) { + Store(threadtable,keytype3(nx,Q,R,data.threads,inplace),data); + } + + void Normalize(Complex *out) { + fftw::Normalize(nx/2+1,M,ostride,odist,out); + } + + void fftNormalized(double *in, Complex *out=NULL) { + fftw::fftNormalized(nx/2+1,M,ostride,odist,in,out,false); + } + + void fft0Normalized(double *in, Complex *out=NULL) { + fftw::fftNormalized(nx/2+1,M,ostride,odist,in,out,true); + } +}; + +// Compute the real inverse Fourier transform of M complex vectors, each of +// length n/2+1, corresponding to the non-negative parts of the frequency +// spectra, using phase sign +1. Before calling fft(), the array in must be +// allocated as Complex[M*(n/2+1)] and the array out must be allocated as +// double[M*n]. The arrays in and out may coincide, +// allocated as Complex[M*(n/2+1)]. +// +// Out-of-place usage (input destroyed): +// +// mcrfft1d Backward(n,M,istride,ostride,idist,odist,in,out); +// Backward.fft(in,out); +// +// In-place usage: +// +// mcrfft1d Backward(n,M,istride,ostride,idist,odist); +// Backward.fft(out); +// +// Notes: +// stride is the spacing between the elements of each Complex vector; +// dist is the spacing between the first elements of the vectors; +// in contains the first n/2+1 Complex Fourier values; +// out contains the n real values stored as a Complex array. +// +class mcrfft1d : public fftwblock, + public Threadtable { + static Table threadtable; +public: + mcrfft1d(unsigned int nx, unsigned int M, size_t istride, size_t ostride, + size_t idist, size_t odist, Complex *in=NULL, double *out=NULL, + unsigned int threads=maxthreads) + : fftw(std::max(2*(nx/2*istride+(M-1)*idist+1), + (realsize(nx,in,out)-2)*ostride+(M-1)*odist+2),1,threads,nx), + fftwblock + (nx,M,istride,ostride,idist,odist,in,(Complex *) out,threads) {} + + threaddata lookup(bool inplace, unsigned int threads) { + return Lookup(threadtable,keytype3(nx,Q,R,threads,inplace)); + } + + void store(bool inplace, const threaddata& data) { + Store(threadtable,keytype3(nx,Q,R,data.threads,inplace),data); + } + + void Normalize(double *out) { + fftw::Normalize(nx,M,ostride,odist,out); + } + + void fftNormalized(Complex *in, double *out=NULL) { + fftw::fftNormalized(nx,M,ostride,odist,in,out,false); + } + + void fft0Normalized(Complex *in, double *out=NULL) { + fftw::fftNormalized(nx,M,ostride,odist,in,out,true); + } +}; + +// Compute the complex two-dimensional Fourier transform of nx times ny +// complex values. Before calling fft(), the arrays in and out (which may +// coincide) must be allocated as Complex[nx*ny]. +// +// Out-of-place usage: +// +// fft2d Forward(nx,ny,-1,in,out); +// Forward.fft(in,out); +// +// fft2d Backward(nx,ny,1,in,out); +// Backward.fft(in,out); +// +// fft2d Backward(nx,ny,1,in,out); +// Backward.fftNormalized(in,out); // True inverse of Forward.fft(out,in); +// +// In-place usage: +// +// fft2d Forward(nx,ny,-1); +// Forward.fft(in); +// +// fft2d Backward(nx,ny,1); +// Backward.fft(in); +// +// Note: +// in[ny*i+j] contains the ny Complex values for each i=0,...,nx-1. +// +class fft2d : public fftw, public Threadtable { + unsigned int nx; + unsigned int ny; + static Table threadtable; +public: + fft2d(unsigned int nx, unsigned int ny, int sign, Complex *in=NULL, + Complex *out=NULL, unsigned int threads=maxthreads) + : fftw(2*nx*ny,sign,threads), nx(nx), ny(ny) {Setup(in,out);} + +#ifdef __Array_h__ + fft2d(int sign, const Array::array2& in, + const Array::array2& out=Array::NULL2, + unsigned int threads=maxthreads) + : fftw(2*in.Size(),sign,threads), nx(in.Nx()), ny(in.Ny()) { + Setup(in,out); + } +#endif + + threaddata lookup(bool inplace, unsigned int threads) { + return this->Lookup(threadtable,keytype2(nx,ny,threads,inplace)); + } + void store(bool inplace, const threaddata& data) { + this->Store(threadtable,keytype2(nx,ny,data.threads,inplace),data); + } + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_2d(nx,ny,(fftw_complex *) in,(fftw_complex *) out, + sign,effort); + } + + void Execute(Complex *in, Complex *out, bool=false) { + fftw_execute_dft(plan,(fftw_complex *) in,(fftw_complex *) out); + } +}; + +// Compute the complex two-dimensional Fourier transform of nx times ny real +// values, using phase sign -1. +// Before calling fft(), the array in must be allocated as double[nx*ny] and +// the array out must be allocated as Complex[nx*(ny/2+1)]. The arrays in +// and out may coincide, allocated as Complex[nx*(ny/2+1)]. +// +// Out-of-place usage: +// +// rcfft2d Forward(nx,ny,in,out); +// Forward.fft(in,out); // Origin of Fourier domain at (0,0) +// Forward.fft0(in,out); // Origin of Fourier domain at (nx/2,0); +// input destroyed. +// +// In-place usage: +// +// rcfft2d Forward(nx,ny); +// Forward.fft(in); // Origin of Fourier domain at (0,0) +// Forward.fft0(in); // Origin of Fourier domain at (nx/2,0) +// +// Notes: +// in contains the nx*ny real values stored as a Complex array; +// out contains the upper-half portion (ky >= 0) of the Complex transform. +// +class rcfft2d : public fftw { + unsigned int nx; + unsigned int ny; +public: + rcfft2d(unsigned int nx, unsigned int ny, Complex *out=NULL, + unsigned int threads=maxthreads) + : fftw(2*nx*(ny/2+1),-1,threads,nx*ny), nx(nx), ny(ny) {Setup(out);} + + rcfft2d(unsigned int nx, unsigned int ny, double *in, Complex *out=NULL, + unsigned int threads=maxthreads) + : fftw(2*nx*(ny/2+1),-1,threads,nx*ny), nx(nx), ny(ny) { + Setup(in,out); + } + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_r2c_2d(nx,ny,(double *) in,(fftw_complex *) out, + effort); + } + + void Execute(Complex *in, Complex *out, bool shift=false) { + if(shift) { + if(inplace) Shift(in,nx,ny,threads); + else Shift((double *) in,nx,ny,threads); + } + fftw_execute_dft_r2c(plan,(double *) in,(fftw_complex *) out); + } + + // Set Nyquist modes of even shifted transforms to zero. + void deNyquist(Complex *f) { + unsigned int nyp=ny/2+1; + if(nx % 2 == 0) +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int j=0; j < nyp; ++j) + f[j]=0.0; + if(ny % 2 == 0) +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < nx; ++i) + f[(i+1)*nyp-1]=0.0; + } +}; + +// Compute the real two-dimensional inverse Fourier transform of the +// nx*(ny/2+1) Complex values corresponding to the spectral values in the +// half-plane ky >= 0, using phase sign +1. +// Before calling fft(), the array in must be allocated as +// Complex[nx*(ny/2+1)] and the array out must be allocated as +// double[nx*ny]. The arrays in and out may coincide, +// allocated as Complex[nx*(ny/2+1)]. +// +// Out-of-place usage (input destroyed): +// +// crfft2d Backward(nx,ny,in,out); +// Backward.fft(in,out); // Origin of Fourier domain at (0,0) +// Backward.fft0(in,out); // Origin of Fourier domain at (nx/2,0) +// +// In-place usage: +// +// crfft2d Backward(nx,ny); +// Backward.fft(in); // Origin of Fourier domain at (0,0) +// Backward.fft0(in); // Origin of Fourier domain at (nx/2,0) +// +// Notes: +// in contains the upper-half portion (ky >= 0) of the Complex transform; +// out contains the nx*ny real values stored as a Complex array. +// +class crfft2d : public fftw { + unsigned int nx; + unsigned int ny; +public: + crfft2d(unsigned int nx, unsigned int ny, double *out=NULL, + unsigned int threads=maxthreads) : + fftw(2*nx*(ny/2+1),1,threads,nx*ny), nx(nx), ny(ny) {Setup(out);} + + crfft2d(unsigned int nx, unsigned int ny, Complex *in, double *out=NULL, + unsigned int threads=maxthreads) + : fftw(nx*realsize(ny,in,out),1,threads,nx*ny), nx(nx), ny(ny) { + Setup(in,out); + } + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_c2r_2d(nx,ny,(fftw_complex *) in,(double *) out, + effort); + } + + void Execute(Complex *in, Complex *out, bool shift=false) { + fftw_execute_dft_c2r(plan,(fftw_complex *) in,(double *) out); + if(shift) { + if(inplace) Shift(out,nx,ny,threads); + else Shift((double *) out,nx,ny,threads); + } + } + + // Set Nyquist modes of even shifted transforms to zero. + void deNyquist(Complex *f) { + unsigned int nyp=ny/2+1; + if(nx % 2 == 0) +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int j=0; j < nyp; ++j) + f[j]=0.0; + if(ny % 2 == 0) +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < nx; ++i) + f[(i+1)*nyp-1]=0.0; + } +}; + +// Compute the complex three-dimensional Fourier transform of +// nx times ny times nz complex values. Before calling fft(), the arrays in +// and out (which may coincide) must be allocated as Complex[nx*ny*nz]. +// +// Out-of-place usage: +// +// fft3d Forward(nx,ny,nz,-1,in,out); +// Forward.fft(in,out); +// +// fft3d Backward(nx,ny,nz,1,in,out); +// Backward.fft(in,out); +// +// fft3d Backward(nx,ny,nz,1,in,out); +// Backward.fftNormalized(in,out); // True inverse of Forward.fft(out,in); +// +// In-place usage: +// +// fft3d Forward(nx,ny,nz,-1); +// Forward.fft(in); +// +// fft3d Backward(nx,ny,nz,1); +// Backward.fft(in); +// +// Note: +// in[nz*(ny*i+j)+k] contains the (i,j,k)th Complex value, +// indexed by i=0,...,nx-1, j=0,...,ny-1, and k=0,...,nz-1. +// +class fft3d : public fftw { + unsigned int nx; + unsigned int ny; + unsigned int nz; +public: + fft3d(unsigned int nx, unsigned int ny, unsigned int nz, + int sign, Complex *in=NULL, Complex *out=NULL, + unsigned int threads=maxthreads) + : fftw(2*nx*ny*nz,sign,threads), nx(nx), ny(ny), nz(nz) {Setup(in,out);} + +#ifdef __Array_h__ + fft3d(int sign, const Array::array3& in, + const Array::array3& out=Array::NULL3, + unsigned int threads=maxthreads) + : fftw(2*in.Size(),sign,threads), nx(in.Nx()), ny(in.Ny()), nz(in.Nz()) + {Setup(in,out);} +#endif + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_3d(nx,ny,nz,(fftw_complex *) in, + (fftw_complex *) out, sign, effort); + } +}; + +// Compute the complex two-dimensional Fourier transform of +// nx times ny times nz real values, using phase sign -1. +// Before calling fft(), the array in must be allocated as double[nx*ny*nz] +// and the array out must be allocated as Complex[nx*ny*(nz/2+1)]. The +// arrays in and out may coincide, allocated as Complex[nx*ny*(nz/2+1)]. +// +// Out-of-place usage: +// +// rcfft3d Forward(nx,ny,nz,in,out); +// Forward.fft(in,out); // Origin of Fourier domain at (0,0) +// Forward.fft0(in,out); // Origin of Fourier domain at (nx/2,ny/2,0); +// input destroyed +// In-place usage: +// +// rcfft3d Forward(nx,ny,nz); +// Forward.fft(in); // Origin of Fourier domain at (0,0) +// Forward.fft0(in); // Origin of Fourier domain at (nx/2,ny/2,0) +// +// Notes: +// in contains the nx*ny*nz real values stored as a Complex array; +// out contains the upper-half portion (kz >= 0) of the Complex transform. +// +class rcfft3d : public fftw { + unsigned int nx; + unsigned int ny; + unsigned int nz; +public: + rcfft3d(unsigned int nx, unsigned int ny, unsigned int nz, Complex *out=NULL, + unsigned int threads=maxthreads) + : fftw(2*nx*ny*(nz/2+1),-1,threads,nx*ny*nz), nx(nx), ny(ny), nz(nz) { + Setup(out); + } + + rcfft3d(unsigned int nx, unsigned int ny, unsigned int nz, double *in, + Complex *out=NULL, unsigned int threads=maxthreads) + : fftw(2*nx*ny*(nz/2+1),-1,threads,nx*ny*nz), + nx(nx), ny(ny), nz(nz) {Setup(in,out);} + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_r2c_3d(nx,ny,nz,(double *) in,(fftw_complex *) out, + effort); + } + + void Execute(Complex *in, Complex *out, bool shift=false) { + if(shift) { + if(inplace) Shift(in,nx,ny,nz,threads); + else Shift((double *) in,nx,ny,nz,threads); + } + fftw_execute_dft_r2c(plan,(double *) in,(fftw_complex *) out); + } + + // Set Nyquist modes of even shifted transforms to zero. + void deNyquist(Complex *f) { + unsigned int nzp=nz/2+1; + unsigned int yz=ny*nzp; + if(nx % 2 == 0) { +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int k=0; k < yz; ++k) + f[k]=0.0; + } + + if(ny % 2 == 0) { +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < nx; ++i) { + unsigned int iyz=i*yz; + for(unsigned int k=0; k < nzp; ++k) + f[iyz+k]=0.0; + } + } + + if(nz % 2 == 0) +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < nx; ++i) + for(unsigned int j=0; j < ny; ++j) + f[i*yz+(j+1)*nzp-1]=0.0; + } +}; + +// Compute the real two-dimensional inverse Fourier transform of the +// nx*ny*(nz/2+1) Complex values corresponding to the spectral values in the +// half-plane kz >= 0, using phase sign +1. +// Before calling fft(), the array in must be allocated as +// Complex[nx*ny*(nz+1)/2] and the array out must be allocated as +// double[nx*ny*nz]. The arrays in and out may coincide, +// allocated as Complex[nx*ny*(nz/2+1)]. +// +// Out-of-place usage (input destroyed): +// +// crfft3d Backward(nx,ny,nz,in,out); +// Backward.fft(in,out); // Origin of Fourier domain at (0,0) +// Backward.fft0(in,out); // Origin of Fourier domain at (nx/2,ny/2,0) +// +// In-place usage: +// +// crfft3d Backward(nx,ny,nz); +// Backward.fft(in); // Origin of Fourier domain at (0,0) +// Backward.fft0(in); // Origin of Fourier domain at (nx/2,ny/2,0) +// +// Notes: +// in contains the upper-half portion (kz >= 0) of the Complex transform; +// out contains the nx*ny*nz real values stored as a Complex array. +// +class crfft3d : public fftw { + unsigned int nx; + unsigned int ny; + unsigned int nz; +public: + crfft3d(unsigned int nx, unsigned int ny, unsigned int nz, double *out=NULL, + unsigned int threads=maxthreads) + : fftw(2*nx*ny*(nz/2+1),1,threads,nx*ny*nz), nx(nx), ny(ny), nz(nz) + {Setup(out);} + + crfft3d(unsigned int nx, unsigned int ny, unsigned int nz, Complex *in, + double *out=NULL, unsigned int threads=maxthreads) + : fftw(nx*ny*(realsize(nz,in,out)),1,threads,nx*ny*nz), nx(nx), ny(ny), + nz(nz) {Setup(in,out);} + + fftw_plan Plan(Complex *in, Complex *out) { + return fftw_plan_dft_c2r_3d(nx,ny,nz,(fftw_complex *) in,(double *) out, + effort); + } + + void Execute(Complex *in, Complex *out, bool shift=false) { + fftw_execute_dft_c2r(plan,(fftw_complex *) in,(double *) out); + if(shift) { + if(inplace) Shift(out,nx,ny,nz,threads); + else Shift((double *) out,nx,ny,nz,threads); + } + } + + // Set Nyquist modes of even shifted transforms to zero. + void deNyquist(Complex *f) { + unsigned int nzp=nz/2+1; + unsigned int yz=ny*nzp; + if(nx % 2 == 0) { +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int k=0; k < yz; ++k) + f[k]=0.0; + } + + if(ny % 2 == 0) { +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < nx; ++i) { + unsigned int iyz=i*yz; + for(unsigned int k=0; k < nzp; ++k) + f[iyz+k]=0.0; + } + } + + if(nz % 2 == 0) +#ifndef FFTWPP_SINGLE_THREAD +#pragma omp parallel for num_threads(threads) +#endif + for(unsigned int i=0; i < nx; ++i) + for(unsigned int j=0; j < ny; ++j) + f[i*yz+(j+1)*nzp-1]=0.0; + } +}; + +} + +#endif diff --git a/examples/Integration_with_fftw/fftw/seconds.h b/examples/Integration_with_fftw/fftw/seconds.h new file mode 100644 index 0000000..4f157b8 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/seconds.h @@ -0,0 +1,100 @@ +#ifndef __seconds_h__ +#define __seconds_h__ 1 + +#ifdef _WIN32 +#include + +#include +#include +#include + +#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) +#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 +#else +#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL +#endif + +struct timezone +{ + int tz_minuteswest; /* minutes W of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; + +// Definition of a gettimeofday function + +inline int gettimeofday(struct timeval *tv, struct timezone *tz) +{ +// Define a structure to receive the current Windows filetime + FILETIME ft; + +// Initialize the present time to 0 and the timezone to UTC + unsigned __int64 tmpres = 0; + static int tzflag = 0; + + if (NULL != tv) + { + GetSystemTimeAsFileTime(&ft); + +// The GetSystemTimeAsFileTime returns the number of 100 nanosecond +// intervals since Jan 1, 1601 in a structure. Copy the high bits to +// the 64 bit tmpres, shift it left by 32 then or in the low 32 bits. + tmpres |= ft.dwHighDateTime; + tmpres <<= 32; + tmpres |= ft.dwLowDateTime; + +// Convert to microseconds by dividing by 10 + tmpres /= 10; + +// The Unix epoch starts on Jan 1 1970. Need to subtract the difference +// in seconds from Jan 1 1601. + tmpres -= DELTA_EPOCH_IN_MICROSECS; + +// Finally change microseconds to seconds and place in the seconds value. +// The modulus picks up the microseconds. + tv->tv_sec = (long)(tmpres / 1000000UL); + tv->tv_usec = (long)(tmpres % 1000000UL); + } + + if (NULL != tz) + { + if (!tzflag) + { + _tzset(); + tzflag++; + } + +// Adjust for the timezone west of Greenwich + tz->tz_minuteswest = _timezone / 60; + tz->tz_dsttime = _daylight; + } + + return 0; +} + +#else + +#include + +#endif + +namespace utils { + +inline double totalseconds() +{ + timeval tv; + gettimeofday(&tv,NULL); + return tv.tv_sec+tv.tv_usec/1000000.0; +} + +inline double seconds() +{ + static double lastseconds=totalseconds(); + double t=totalseconds(); + double seconds=t-lastseconds; + lastseconds=t; + return seconds; +} + +} + +#endif diff --git a/examples/Integration_with_fftw/fftw/statistics.h b/examples/Integration_with_fftw/fftw/statistics.h new file mode 100644 index 0000000..56394d6 --- /dev/null +++ b/examples/Integration_with_fftw/fftw/statistics.h @@ -0,0 +1,49 @@ +#ifndef __statistics_h__ +#define __statistics_h__ 1 + +namespace utils { + +class statistics { + unsigned int N; + double A; + double varL; + double varH; +public: + statistics() : N(0), A(0.0), varL(0.0), varH(0.0) {} + double count() {return N;} + double mean() {return A;} + void add(double t) { + ++N; + double diff=t-A; + A += diff/N; + double v=diff*(t-A); + if(diff < 0.0) + varL += v; + else + varH += v; + } + double stdev(double var, double f) { + double factor=N > f ? f/(N-f) : 0.0; + return sqrt(var*factor); + } + double stdev() { + return stdev(varL+varH,1.0); + } + double stdevL() { + return stdev(varL,2.0); + } + double stdevH() { + return stdev(varH,2.0); + } + void output(const char *text, unsigned int m) { + std::cout << text << ":\n" + << m << "\t" + << A << "\t" + << stdevL() << "\t" + << stdevH() << std::endl; + } +}; + +} + +#endif diff --git a/examples/Integration_with_fftw/main.cpp b/examples/Integration_with_fftw/main.cpp new file mode 100644 index 0000000..083fd38 --- /dev/null +++ b/examples/Integration_with_fftw/main.cpp @@ -0,0 +1,813 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include"MMSP.hpp" + + +using namespace std; + +typedef float phi_type; +typedef MMSP::sparse store_type; +typedef std::complex Complex; +typedef std::valarray CArray; + +const double PI = 3.141592653589793238460; + +#include "definitions_v2.hpp" + +const int variant = 1 ; + + +//--------Initializing all the grids--------// + +void initialize() +{ + + G_Al_alpha = (Al_alpha_a_3 + Al_alpha_b_3*T+ Al_alpha_c_3*T*log(T) + Al_alpha_d_3*T*T) ; + G_Al_beta = (Al_beta_a_3 + Al_beta_b_3*T+ Al_beta_c_3*T*log(T) + Al_beta_d_3*T*T) ; + + G_Ti_alpha = (Ti_alpha_a_2 + Ti_alpha_b_2*T+ Ti_alpha_c_2*T*log(T) + Ti_alpha_d_2*T*T) ; + G_Ti_beta = (Ti_beta_a_1 + Ti_beta_b_1*T+ Ti_beta_c_1*T*log(T) + Ti_beta_d_1*T*T) ; + + G_V_alpha = (V_alpha_a_2 + V_alpha_b_2*T+ V_alpha_c_2*T*log(T) + V_alpha_d_2*T*T) ; //(21.96 - T/50) + G_V_beta = (V_beta_a_2 + V_beta_b_2*T+ V_beta_c_2*T*log(T) + V_beta_d_2*T*T) ; + + for(int n = 0; n < nodes(grid); n++) + { + MMSP::vector x = position(grid, n); + + store_type newGrain; + store_type nuc_newGrain ; + + set(nuc_newGrain, 1) = 0.0 ; + set(nuc_newGrain, 3) = 0.0 ; + nuc_grid(n) = nuc_newGrain ; + + set(intenergies(n), 1) = 0.0 ; + set(intenergies(n), 3) = 0.0 ; + set(selfenergies(n), 1) = 0.0 ; + set(selfenergies(n), 3) = 0.0 ; + + set(newGrain, 1) = 0.0; + set(newGrain, 2) = 0.0; + set(newGrain, 3) = 0.0; + set(newGrain, 4) = 0.0; + set(newGrain, 5) = 0.0; + set(newGrain, 6) = 0.0; + set(newGrain, 7) = 0.0; + set(newGrain, 8) = 0.0; + set(newGrain, 9) = 0.0; + set(newGrain, 10) = 0.0; + set(newGrain, 11) = 0.0; + set(newGrain, 12) = 0.0; + + if((pow((x[0]*MMSP::dx(grid,0)-0.2*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.8*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 1) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.4*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.8*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 2) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.6*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.8*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 3) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.8*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.8*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 4) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.2*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.5*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 5) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.4*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.5*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 6) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.6*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.5*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 7) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.8*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.5*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 8) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.2*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.2*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 9) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.4*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.2*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 10) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.6*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.2*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 11) = 1.0; + } + + else if((pow((x[0]*MMSP::dx(grid,0)-0.8*Lx),2) + pow((x[1]*MMSP::dx(grid,1)-0.2*Ly),2)) < 100*MMSP::dx(grid,0)*MMSP::dx(grid,0)) + { + set(newGrain, 12) = 1.0; + } + + + grid(n) = newGrain; + + } + +} + + + +int main() +{ + + initialize(); + initialize_epsi(); + initialize_alpha_eigen() ; + define_c_sigma() ; + + fftw::maxthreads=get_max_threads(); + + unsigned int nyp=ny/2+1; + + + +size_t align=sizeof(Complex); + +array2 f1(nx,ny,align); +array2 F1(nx,nyp,align); +rcfft2d Forward1(nx,ny,f1,F1); + +array2 f2(nx,ny,align); +array2 F2(nx,nyp,align); +rcfft2d Forward2(nx,ny,f2,F2); + +array2 f3(nx,ny,align); +array2 F3(nx,nyp,align); +rcfft2d Forward3(nx,ny,f3,F3); + +array2 f4(nx,ny,align); +array2 F4(nx,nyp,align); +rcfft2d Forward4(nx,ny,f4,F4); + +array2 f5(nx,ny,align); +array2 F5(nx,nyp,align); +rcfft2d Forward5(nx,ny,f5,F5); + +array2 f6(nx,ny,align); +array2 F6(nx,nyp,align); +rcfft2d Forward6(nx,ny,f6,F6); + +array2 f7(nx,ny,align); +array2 F7(nx,nyp,align); +rcfft2d Forward7(nx,ny,f7,F7); + +array2 f8(nx,ny,align); +array2 F8(nx,nyp,align); +rcfft2d Forward8(nx,ny,f8,F8); + +array2 f9(nx,ny,align); +array2 F9(nx,nyp,align); +rcfft2d Forward9(nx,ny,f9,F9); + +array2 f10(nx,ny,align); +array2 F10(nx,nyp,align); +rcfft2d Forward10(nx,ny,f10,F10); + +array2 f11(nx,ny,align); +array2 F11(nx,nyp,align); +rcfft2d Forward11(nx,ny,f11,F11); + +array2 f12(nx,ny,align); +array2 F12(nx,nyp,align); +rcfft2d Forward12(nx,ny,f12,F12); + +array2 dfdstr1(nx,nyp,align); +array2 dfdstr_real1(nx,ny,align); +crfft2d Backward1(nx,ny,dfdstr1,dfdstr_real1); + +array2 dfdstr2(nx,nyp,align); +array2 dfdstr_real2(nx,ny,align); +crfft2d Backward2(nx,ny,dfdstr2,dfdstr_real2); + +array2 dfdstr3(nx,nyp,align); +array2 dfdstr_real3(nx,ny,align); +crfft2d Backward3(nx,ny,dfdstr3,dfdstr_real3); + +array2 dfdstr4(nx,nyp,align); +array2 dfdstr_real4(nx,ny,align); +crfft2d Backward4(nx,ny,dfdstr4,dfdstr_real4); + +array2 dfdstr5(nx,nyp,align); +array2 dfdstr_real5(nx,ny,align); +crfft2d Backward5(nx,ny,dfdstr5,dfdstr_real5); + +array2 dfdstr6(nx,nyp,align); +array2 dfdstr_real6(nx,ny,align); +crfft2d Backward6(nx,ny,dfdstr6,dfdstr_real6); + +array2 dfdstr7(nx,nyp,align); +array2 dfdstr_real7(nx,ny,align); +crfft2d Backward7(nx,ny,dfdstr7,dfdstr_real7); + +array2 dfdstr8(nx,nyp,align); +array2 dfdstr_real8(nx,ny,align); +crfft2d Backward8(nx,ny,dfdstr8,dfdstr_real8); + +array2 dfdstr9(nx,nyp,align); +array2 dfdstr_real9(nx,ny,align); +crfft2d Backward9(nx,ny,dfdstr9,dfdstr_real9); + +array2 dfdstr10(nx,nyp,align); +array2 dfdstr_real10(nx,ny,align); +crfft2d Backward10(nx,ny,dfdstr10,dfdstr_real10); + +array2 dfdstr11(nx,nyp,align); +array2 dfdstr_real11(nx,ny,align); +crfft2d Backward11(nx,ny,dfdstr11,dfdstr_real11); + +array2 dfdstr12(nx,nyp,align); +array2 dfdstr_real12(nx,ny,align); +crfft2d Backward12(nx,ny,dfdstr12,dfdstr_real12); + +array2 elint1(nx,nyp,align); +array2 elint_real1(nx,ny,align); + +array2 elint3(nx,nyp,align); +array2 elint_real3(nx,ny,align); + +crfft2d Backward13(nx,ny,elint1,elint_real1); +crfft2d Backward14(nx,ny,elint3,elint_real3); + +array2 self1(nx,nyp,align); +array2 self_real1(nx,ny,align); +array2 self3(nx,nyp,align); +array2 self_real3(nx,ny,align); + +crfft2d Backward15(nx, ny, self1, self_real1); +crfft2d Backward16(nx, ny, self3, self_real3); + +array2 fstr(nx,nyp,align); +array2 fstr_real(nx,ny,align); + +crfft2d Backward17(nx,ny,fstr,fstr_real); + + + //-------Setting the boundary conditions for various grids-------// + MMSP::b0(grid,0) = MMSP::Dirichlet; + MMSP::b1(grid,0) = MMSP::Dirichlet; + + MMSP::b0(grid,1) = MMSP::Dirichlet; + MMSP::b1(grid,1) = MMSP::Dirichlet; + + MMSP::b0(grid,2) = MMSP::Dirichlet; + MMSP::b1(grid,2) = MMSP::Dirichlet; + + + //------Defining the lattice in the Fourier space------// + for(int i = 0 ; i < nx ; i++) + { + fk[i] = (2.0*3.14*i)/(double)nx ; + } + + + srand(time(NULL)); + + for(int t = 0 ; t 100.0) //Implementing the variation of Temperature based on the given cooling rate + { T= T- dt*tc*cr ; } + + + if(cr!=0.0) + { + G_Al_alpha = (Al_alpha_a_3 + Al_alpha_b_3*T+ Al_alpha_c_3*T*log(T) + Al_alpha_d_3*T*T) ; + G_Al_beta = (Al_beta_a_3 + Al_beta_b_3*T+ Al_beta_c_3*T*log(T) + Al_beta_d_3*T*T) ; + + G_Ti_alpha = (Ti_alpha_a_2 + Ti_alpha_b_2*T+ Ti_alpha_c_2*T*log(T) + Ti_alpha_d_2*T*T) ; + G_Ti_beta = (Ti_beta_a_1 + Ti_beta_b_1*T+ Ti_beta_c_1*T*log(T) + Ti_beta_d_1*T*T) ; + + G_V_alpha = (V_alpha_a_2 + V_alpha_b_2*T+ V_alpha_c_2*T*log(T) + V_alpha_d_2*T*T) ; //(21.96 - T/50) + G_V_beta = (V_beta_a_2 + V_beta_b_2*T+ V_beta_c_2*T*log(T) + V_beta_d_2*T*T) ; + } + + MMSP::grid update(grid); + + MMSP::b0(update,0) = MMSP::Dirichlet; + MMSP::b1(update,0) = MMSP::Dirichlet; + + MMSP::b0(update,1) = MMSP::Dirichlet; + MMSP::b1(update,1) = MMSP::Dirichlet; + + MMSP::b0(update,2) = MMSP::Dirichlet; + MMSP::b1(update,2) = MMSP::Dirichlet; + + + + + + for(int n = 0 ; n < nodes(grid) ; n++) + { + MMSP::vector x = position(grid, n) ; + f1(x[0], x[1])=grid(n)[1] ; + f2(x[0], x[1])=grid(n)[2] ; + f3(x[0], x[1])=grid(n)[3] ; + f4(x[0], x[1])=grid(n)[4] ; + f5(x[0], x[1])=grid(n)[5] ; + f6(x[0], x[1])=grid(n)[6] ; + f7(x[0], x[1])=grid(n)[7] ; + f8(x[0], x[1])=grid(n)[8] ; + f9(x[0], x[1])=grid(n)[9] ; + f10(x[0], x[1])=grid(n)[10] ; + f11(x[0], x[1])=grid(n)[11] ; + f12(x[0], x[1])=grid(n)[12] ; + } + + Forward1.fft0(f1,F1); + Forward2.fft0(f2,F2); + Forward3.fft0(f3,F3); + Forward4.fft0(f4,F4); + Forward5.fft0(f5,F5); + Forward6.fft0(f6,F6); + Forward7.fft0(f7,F7); + Forward8.fft0(f8,F8); + Forward9.fft0(f9,F9); + Forward10.fft0(f10,F10); + Forward11.fft0(f11,F11); + Forward12.fft0(f12,F12); + + for(int i = 0 ; i < nx ; i++) + { + for(int j = 0 ; j < nyp ; j++) + { + double k1 = fk[i] ; + double k2 = fk[j] ; + + double modk = (sqrt(k1*k1 + k2*k2)) ; + if(modk==0.0) + { + elint1(i,j) = 0.0 ; + elint3(i,j) = 0.0 ; + self1(i,j) = 0.0 ; + self3(i,j) = 0.0 ; + } + else + { + self1(i,j) = Bpq(k1, k2, modk, 1, 1) ; + self3(i,j) = Bpq(k1, k2, modk, 3, 3) ; + elint1(i,j) = Bpq(k1, k2, modk, 1, 1)*F1(i,j) + Bpq(k1, k2, modk, 2, 1)*F2(i,j) + Bpq(k1, k2, modk, 3, 1)*F3(i,j) + Bpq(k1, k2, modk, 4, 1)*F4(i,j) + + Bpq(k1, k2, modk, 5, 1)*F5(i,j) + Bpq(k1, k2, modk, 6, 1)*F6(i,j) + Bpq(k1, k2, modk, 7, 1)*F7(i,j) + Bpq(k1, k2, modk, 8, 1)*F8(i,j) + Bpq(k1, k2, modk, 9, 1)*F9(i,j) + + Bpq(k1, k2, modk, 10, 1)*F10(i,j) + Bpq(k1, k2, modk, 11, 1)*F11(i,j) + Bpq(k1, k2, modk, 12, 1)*F12(i,j) ; + + elint3(i,j) = Bpq(k1, k2, modk, 1, 3)*F1(i,j) + Bpq(k1, k2, modk, 2, 3)*F2(i,j) + Bpq(k1, k2, modk, 3, 3)*F3(i,j) + Bpq(k1, k2, modk, 4, 3)*F4(i,j) + + Bpq(k1, k2, modk, 5, 3)*F5(i,j) + Bpq(k1, k2, modk, 6, 3)*F6(i,j) + Bpq(k1, k2, modk, 7, 3)*F7(i,j) + Bpq(k1, k2, modk, 8, 3)*F8(i,j) + Bpq(k1, k2, modk, 9, 3)*F9(i,j) + + Bpq(k1, k2, modk, 10, 3)*F10(i,j) + Bpq(k1, k2, modk, 11, 3)*F11(i,j) + Bpq(k1, k2, modk, 12, 3)*F12(i,j) ; + } + } + } + + Backward13.fft0Normalized(elint1, elint_real1); + Backward14.fft0Normalized(elint3, elint_real3); + Backward15.fft0Normalized(self1, self_real1); + Backward16.fft0Normalized(self3, self_real3); + + + for(int n = 0 ; n < nodes(grid) ; n++) + { + MMSP::vector x = position(grid, n) ; + set(nuc_grid(n), 1) = 1.0 ; + set(nuc_grid(n), 3) = 1.0 ; + double phisum = 0.0 ; + for(int h = 0 ; h < length(grid(x)) ; h++) + { + int hindex = MMSP::index(grid(x),h) ; + if(hindex <= 12) + { + phisum += grid(n)[hindex] ; + } + } + if(phisum > 0.1) + { + set(intenergies(n), 1) = 0 ; + set(intenergies(n), 3) = 0 ; + set(selfenergies(n), 1) = 0 ; + set(selfenergies(n), 3) = 0 ; + set(nuc_grid(n), 1) = 0.0 ; + set(nuc_grid(n), 3) = 0.0 ; + } + else + { + set(intenergies(n), 1) = 4*3.14*9*dx*dx*nuc_grid(n)[1]*(elint_real1[x[0]][x[1]]); + set(intenergies(n), 3) = 4*3.14*9*dx*dx*nuc_grid(n)[3]*(elint_real3[x[0]][x[1]]); + set(selfenergies(n), 1) = 4*3.14*9*dx*dx*nuc_grid(n)[1]*nuc_grid(n)[1]*(self_real1[x[0]][x[1]]); + set(selfenergies(n), 3) = 4*3.14*9*dx*dx*nuc_grid(n)[3]*nuc_grid(n)[3]*(self_real3[x[0]][x[1]]); + } + } + + //cout<<"Finished nuc"< s = position(grid,n) ; + double sum = 0 ; + for(int h = 0 ; h < length(grid(s)) ; h++) + { + int hindex = MMSP::index(grid(s),h) ; + if(hindex <= 12) + { + sum+=grid(s)[hindex]*grid(s)[hindex] ; + } + } + + double sfts_sum = 0 ; + for(int i = 0 ; i < 6 ; i++) + { + for(int j = 0 ; j < 6 ; j++) + { + sfts_sum+= eigen_alpha[variant-1].e[i]*c[i][j]*eigen_alpha[variant-1].e[j] ; + } + } + + double felastic = 0.5*grid(n)[1]*sfts_sum - 0.5*fstr_real[s[0]][s[1]]/(nx*ny) ; + + myfile< x = position(grid, n); + MMSP::vector gradientsqtemp = gradsq(grid, x) ; + double temp1 = 0.0 ; + double temp2 = 0.0 ; + for(int i = 0 ; i < dim ; i++) + { + temp1 += gradientsqtemp[i][20] ; + temp1 += gradientsqtemp[i][21] ; + } + set(gradsqcal_grid(n),1) = temp1 ; + set(gradsqcv_grid(n), 1) = temp2 ; + + } + + + + for(int n = 0 ; n < nodes(grid) ; n++) + { + MMSP::vector x = position(grid, n); + + double strain_energy[13]; + strain_energy[0] = 0.0 ; + strain_energy[1] = (double)(1.0/(nx*ny))*(dfdstr_real1[x[0]][x[1]]) ; + strain_energy[2] = (double)(1.0/(nx*ny))*(dfdstr_real2[x[0]][x[1]]) ; + strain_energy[3] = (double)(1.0/(nx*ny))*(dfdstr_real3[x[0]][x[1]]) ; + strain_energy[4] = (double)(1.0/(nx*ny))*(dfdstr_real4[x[0]][x[1]]) ; + strain_energy[5] = (double)(1.0/(nx*ny))*(dfdstr_real5[x[0]][x[1]]) ; + strain_energy[6] = (double)(1.0/(nx*ny))*(dfdstr_real6[x[0]][x[1]]) ; + strain_energy[7] = (double)(1.0/(nx*ny))*(dfdstr_real7[x[0]][x[1]]) ; + strain_energy[8] = (double)(1.0/(nx*ny))*(dfdstr_real8[x[0]][x[1]]) ; + strain_energy[9] = (double)(1.0/(nx*ny))*(dfdstr_real9[x[0]][x[1]]) ; + strain_energy[10] = (double)(1.0/(nx*ny))*(dfdstr_real10[x[0]][x[1]]) ; + strain_energy[11] = (double)(1.0/(nx*ny))*(dfdstr_real11[x[0]][x[1]]) ; + strain_energy[12] = (double)(1.0/(nx*ny))*(dfdstr_real12[x[0]][x[1]]) ; + + + + + G_Alpha[n] = ((grid(n)[20]*G_Al_alpha + grid(n)[21]*G_V_alpha + (1-grid(n)[20]-grid(n)[21])*G_Ti_alpha + + R*T*(grid(n)[20]*log(grid(n)[20]) + grid(n)[21]*log(grid(n)[21]) + (1-grid(n)[20]-grid(n)[21])*log((1-grid(n)[20]-grid(n)[21]))) + + grid(n)[20]*grid(n)[21]*L0_HCP_Al_V + grid(n)[20]*(1-grid(n)[20]-grid(n)[21])*L0_HCP_Al_Ti + grid(n)[21]*(1-grid(n)[20]-grid(n)[21])*L0_HCP_Ti_V))/G_normalize ; + + G_Beta[n] = (grid(n)[20]*G_Al_beta + grid(n)[21]*G_V_beta + (1-grid(n)[20]-grid(n)[21])*G_Ti_beta + + R*T*(grid(n)[20]*log(grid(n)[20]) + grid(n)[21]*log(grid(n)[21]) + (1-grid(n)[20]-grid(n)[21])*log((1-grid(n)[20]-grid(n)[21]))) + + grid(n)[20]*grid(n)[21]*L0_BCC_Al_V + grid(n)[20]*(1-grid(n)[20]-grid(n)[21])*L0_BCC_Al_Ti + grid(n)[21]*(1-grid(n)[20]-grid(n)[21])*L0_BCC_Ti_V + + grid(n)[20]*grid(n)[21]*(1-grid(n)[20]-grid(n)[21])*L0_BCC_Al_Ti_V)/G_normalize ; + + W[n] = W_prefac*(grid(n)[20]*W_Al + grid(n)[21]*W_V + (1-grid(n)[20]-grid(n)[21])*W_Ti) ; + + + MMSP::vector gradient = grad(grid, x) ; + MMSP::vector gradientsq = gradsq(grid, x) ; + + + thermo_auxillary_terms(gradient, gradientsq, grid(n)[20], grid(n)[21]) ; + + MMSP::vector gradcalp4 = gradsq(gradsqcal_grid, x) ; + MMSP::vector gradcvp4 = gradsq(gradsqcv_grid, x) ; + + double gradp4_cal = 0 ; + double gradp4_cv = 0 ; + + for(int i = 0 ; i < dim ; i++) + { + gradp4_cal += gradcalp4[i][1] ; + gradp4_cv += gradcvp4[i][1] ; + } + + double phi_grad[12] ; + double phi_gradientsq[12] ; + for(int h = 0 ; h < length(grid(x)) ; h++) + { + int hindex = MMSP::index(grid(x),h) ; + if(hindex <= 12) + { + phi_grad[hindex-1] = 0 ; + phi_gradientsq[hindex-1] = 0 ; + for(int i = 0 ; i < dim ; i++) + { + phi_grad[hindex-1]+= gradient[i][hindex] ; + phi_gradientsq[hindex-1]+= gradientsq[i][hindex] ; + } + } + } + + + + for(int h = 0 ; h < length(grid(x)) ; h++) + { + int hindex = MMSP::index(grid(x),h) ; + if(hindex <= 12) + { + + /*hphidoubleprime[n][hindex-1] = 60*grid(n)[hindex]*(2*grid(n)[hindex]-1)*(grid(n)[hindex]-1) ; + hphi[n][hindex-1] = pow(grid(n)[hindex],3)*(6*pow(grid(n)[hindex],2) - 15*grid(n)[hindex] + 10) ; + hphiprime[n][hindex-1] = 30*pow(grid(n)[hindex],2)*pow((grid(n)[hindex]-1),2) ;*/ + + hphidoubleprime[n][hindex-1] = 2*pow(grid(n)[hindex],1) - 3*pow(grid(n)[hindex],2) ; + hphi[n][hindex-1] = pow(grid(n)[hindex],3)/3 - pow(grid(n)[hindex],4)/4 ; + hphiprime[n][hindex-1] = pow(grid(n)[hindex],2) - pow(grid(n)[hindex],3) ; + + gphidoubleprime[n][hindex-1] = 2*(6*pow(grid(n)[hindex],2) - 6*grid(n)[hindex] + 1) ; + gphiprime[n][hindex-1] = 2*grid(n)[hindex]*(1-grid(n)[hindex])*(1-2*grid(n)[hindex]) ; + gphi[n][hindex-1] = pow(grid(n)[hindex],2)*pow((1-grid(n)[hindex]),2) ; + + + } + } + + double hphidoubleprimesum = 0; + double hphiprimesum1 = 0; + double hphiprimesum2 = 0; + double hphisum = 0; + double gphidoubleprimesum = 0; + double gphiprimesum = 0; + double gphisum = 0; + + for(int h = 0 ; h < length(grid(x)) ; h++) + { + int hindex = MMSP::index(grid(x),h) ; + if(hindex <= 12) + { + hphidoubleprimesum += hphidoubleprime[n][hindex-1]*pow(phi_grad[hindex-1],2) ; + hphiprimesum1 += hphiprime[n][hindex-1]*phi_gradientsq[hindex-1]; + hphiprimesum2 += hphiprime[n][hindex-1]*phi_grad[hindex-1] ; + hphisum += hphi[n][hindex-1] ; + + gphiprimesum += gphiprime[n][hindex-1]*phi_gradientsq[hindex-1] ; + gphidoubleprimesum += gphidoubleprime[n][hindex-1]*phi_grad[hindex-1] ; + } + } + + + double c_al_rhs = 2*(del_dGAlpha_dAl - del_dGBeta_dAl)*hphiprimesum2 + delsq_dGAlpha_dAl*hphisum + delsq_dGBeta_dAl*(1-hphisum) + + (dGAlpha_dAl - dGBeta_dAl)*(hphidoubleprimesum + hphiprimesum1) + (W_Al - W_Ti)*(gphiprimesum + gphidoubleprimesum) ; + double c_v_rhs = 2*(del_dGAlpha_dV - del_dGBeta_dV)*hphiprimesum2 + delsq_dGAlpha_dV*hphisum + delsq_dGBeta_dV*(1-hphisum) + + (dGAlpha_dV - dGBeta_dV)*(hphidoubleprimesum + hphiprimesum1) + (W_V - W_Ti)*(gphiprimesum + gphidoubleprimesum) ; + + set(update(n), 20) = grid(n)[20] + dt*(Dalal*(c_al_rhs)- kappa_c*gradp4_cal + Dalv*(c_v_rhs)- 0.5*kappa_c*gradp4_cv) ; + set(update(n), 21) = grid(n)[21] + dt*(Dvv*(c_v_rhs) - kappa_c*gradp4_cv + Dval*(c_al_rhs)- 0.5*kappa_c*gradp4_cal) ; + + double lap_aniso[13]; + + + + MMSP::sparse dFdp; + phi_type dFall = 0.0; + phi_type dFall_no = 0 ; + phi_type phi_sum = 0.0 ; + + for (int j = 0; j < length(grid(n)); j++) + { + int jindex = MMSP::index(grid(n), j); + if(jindex<=12) + { + phi_sum += grid(n)[jindex] ; + } + } + + phi_type phi_beta = 1 - phi_sum ; + + for (int j = 0; j < length(grid(n)); j++) + { + int jindex = MMSP::index(grid(n), j); + + MMSP::vector x = position(grid, n); + + W[n] = W_prefac*(grid(n)[20]*W_Al + grid(n)[21]*W_V + (1-grid(n)[20]-grid(n)[21])*W_Ti) ; + + if(jindex <= 12) + { + phi_type lap_aniso = 0.0 ; + lap_aniso+= (gradientsq[0][jindex]*epsi[jindex-1][0][0] + gradientsq[1][jindex]*epsi[jindex-1][1][1]) ; + + + + + double interaction_energy = 0 ; + interaction_energy+= W[n]*grid(n)[jindex]*pow(phi_beta, 2); + interaction_energy-= W[n]*pow(grid(n)[jindex],2)*(phi_beta); + + int check = 0; + for(int k = 0 ; k < length(grid(n)); k++) + { + int tempindex = MMSP::index(grid(n), k); + if((tempindex!=jindex)&&(tempindex <=12)) + { + interaction_energy+= W[n]*pow(grid(n)[tempindex],2)*grid(n)[jindex]; + interaction_energy-= W[n]*pow(grid(n)[tempindex],2)*(phi_beta); + } + } + + + double Gdiff = G_Alpha[n] - G_Beta[n]; + + set(dFdp, jindex) = -1*hphiprime[n][jindex-1] + strain_energy[jindex] - lap_aniso ; + + + + dFall += dFdp[jindex]; + dFall_no+=1; + } + + } + L = 0.1; + + for (int h = 0; h < length(grid(n)); h++) + { + + int hindex = MMSP::index(grid(n), h); + if(hindex<=12) + { + store_type dpdt; + set(dpdt, hindex) = -L * (dFdp[hindex]); + //set(dpdt, hindex) = -L * ((dFall_no+1)*dFdp[hindex] - dFall); + set(update(n), hindex) = grid(n)[hindex] + dt * dpdt[hindex]; + } + } + + } + + swap(grid, update); + +} + + + + + + + + + +return 0 ; + +} + + + + + + + diff --git a/examples/Integration_with_fftw/strain_modules.hpp b/examples/Integration_with_fftw/strain_modules.hpp new file mode 100644 index 0000000..05eb531 --- /dev/null +++ b/examples/Integration_with_fftw/strain_modules.hpp @@ -0,0 +1,180 @@ +using namespace std ; + +double c[6][6], sigma00[12][6] ; +double c_norm = 1; + +double omega_inv_ij(double* cnew, double* k , double modk) +{ + double sum = 0.0 ; + for(int i = 0 ; i < 4 ; i++) + { + sum += cnew[i]*k[i] ; + } + return (sum)/(modk*modk) ; +} + +void define_c_sigma() +{ + + for(int i = 0 ; i < 6 ; i++) + { + for(int j = 0 ; j < 6 ; j++) + { + c[i][j] = 0.0 ; + } + } + double scale = 1.0 ; + c[0][0] = 175.0/scale; + c[1][1] = 175.0/scale; + c[2][2] = 220.0/scale; + c[0][1] = 88.7/scale ; + c[0][2] = 62.3/scale ; + c[1][2] = 62.3/scale ; + c[3][3] = 62.2/scale ; + c[4][4] = 62.2/scale ; + c[5][5] = (c[0][0]-c[0][1])/2.0 ; + c[5][5] /= scale ; + + + + for(int variant = 0 ; variant < 12 ; variant++) + { + for(int i = 0 ; i < 6 ; i++) + { + sigma00[variant][i] = 0.0 ; + for(int j = 0 ; j < 6 ; j++) + { + sigma00[variant][i] += c[i][j]*eigen_alpha[variant].e[j] ; + } + } + } + + + +} + + +double B(double k1, double k2, double modk, int variant) { + double c11[4] = {c[0][0], c[0][5], c[5][0], c[5][5]} ; + double c12[4] = {c[0][5], c[0][1], c[5][5], c[5][1]} ; + double c21[4] = {c[5][0], c[5][5], c[1][0], c[1][5]} ; + double c22[4] = {c[5][5], c[5][1], c[1][5], c[1][1]} ; + double k[4] = {k1*k1, k1*k2, k2*k1, k2*k2} ; + + + double omega_inv[2][2] = {{omega_inv_ij(c11, k, modk), omega_inv_ij(c12, k, modk)}, {omega_inv_ij(c21, k, modk), omega_inv_ij(c22, k, modk)}} ; + + + double det_omega_inv = omega_inv[0][0]*omega_inv[1][1] - omega_inv[1][0]*omega_inv[0][1] + 1e-05 ; + if(det_omega_inv==0) cout<<"Found zero det"< gradient, MMSP::vector gradientsq, double c_Al, double c_V) +{ + double grad_cal = gradient[0][20] ;// + gradient[1][20] ;// + gradient[2][20] ; + double grad_cv = gradient[0][21] ;// + gradient[1][21] ;//+ gradient[2][21] ; + double gradsq_cal = gradientsq[0][20] ;// + gradientsq[1][20] ;//+ gradientsq[2][20] ; + double gradsq_cv = gradientsq[0][21] ;//+ gradientsq[1][21] ;//+ gradientsq[2][21] ; + dGAlpha_dAl = (G_Al_alpha/G_normalize - G_Ti_alpha/G_normalize) + log(c_Al) - log((1-c_Al-c_V)) + c_V*L0_HCP_Al_V/G_normalize + + (1-2*c_Al-c_V)*L0_HCP_Al_Ti/G_normalize - c_V*L0_HCP_Ti_V/G_normalize ; + dGBeta_dAl = (G_Al_beta/G_normalize - G_Ti_beta/G_normalize) + log(c_Al) - log((1-c_Al-c_V)) + c_V*L0_BCC_Al_V/G_normalize + + (1-2*c_Al-c_V)*L0_BCC_Al_Ti/G_normalize - c_V*L0_BCC_Ti_V/G_normalize + (c_V*(1-c_Al-c_V) + - c_Al*c_V)*L0_BCC_Al_Ti_V/G_normalize ; + dGAlpha_dV = (G_V_alpha/G_normalize - G_Ti_alpha/G_normalize) + log(c_V) - log((1-c_Al-c_V)) + c_Al*L0_HCP_Al_V/G_normalize + + (1-c_Al-2*c_V)*L0_HCP_Ti_V/G_normalize - c_Al*L0_HCP_Al_Ti/G_normalize ; + dGBeta_dV = (G_V_beta/G_normalize - G_Ti_beta/G_normalize) + log(c_V) - log((1-c_Al-c_V)) + c_Al*L0_BCC_Al_V/G_normalize + + (1-c_Al-2*c_V)*L0_BCC_Ti_V/G_normalize - c_Al*L0_BCC_Al_Ti/G_normalize + (c_Al*(1-c_Al-c_V) - + c_Al*c_V)*L0_BCC_Al_Ti_V/G_normalize ; + del_dGAlpha_dAl = grad_cal*(1.0/c_Al + 1.0/(1.0-c_Al-c_V) - 2*L0_HCP_Al_Ti/G_normalize) + grad_cv*(1.0/(1.0-c_Al-c_V) + + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize -L0_HCP_Ti_V/G_normalize) ; + del_dGBeta_dAl = grad_cal*(1.0/c_Al + 1/(1-c_Al-c_V) - 2*L0_BCC_Al_Ti/G_normalize - 2*c_V*L0_BCC_Al_Ti_V/G_normalize) + + grad_cv*(1/(1-c_Al-c_V) + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize -L0_HCP_Ti_V/G_normalize + + (1-2*c_Al-2*c_V)*L0_BCC_Al_Ti_V/G_normalize) ; + del_dGAlpha_dV = grad_cv*(1.0/c_V + 1/(1-c_Al-c_V) - 2*L0_HCP_Ti_V/G_normalize) + grad_cal*(1/(1-c_Al-c_V) + + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize - L0_HCP_Ti_V/G_normalize) ; + del_dGBeta_dV = grad_cv*(1.0/c_V + 1/(1-c_Al-c_V) -2*L0_BCC_Ti_V/G_normalize - 2*c_Al*L0_BCC_Al_Ti_V/G_normalize) + + grad_cal*(1/(1-c_Al-c_V) + L0_BCC_Al_V/G_normalize - L0_BCC_Al_Ti/G_normalize - L0_BCC_Ti_V/G_normalize + + (1-2*c_Al-2*c_V)*L0_BCC_Al_Ti_V/G_normalize) ; + delsq_dGAlpha_dAl = gradsq_cal*(1.0/c_Al + 1/(1-c_Al-c_V) - 2*L0_HCP_Al_Ti/G_normalize) + gradsq_cv*(1/(1-c_Al-c_V) + + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize -L0_HCP_Ti_V/G_normalize) + grad_cal*(-grad_cal/pow(c_Al,2) + + (grad_cal + grad_cv)/pow((1-c_Al-c_V),2)) + grad_cv*((grad_cal + grad_cv)/pow((1-c_Al-c_V),2)) ; + + delsq_dGAlpha_dV = gradsq_cv*(1.0/c_V + 1/(1-c_Al-c_V) - 2*L0_HCP_Ti_V/G_normalize) + gradsq_cal*(1/(1-c_Al-c_V) + + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize - L0_HCP_Ti_V/G_normalize) + grad_cv*(-grad_cv/pow(c_V,2) + + (grad_cal + grad_cv)/pow((1-c_Al-c_V),2)) + grad_cal*((grad_cal + grad_cv)/pow((1-c_Al-c_V),2)) ; + + delsq_dGBeta_dAl = gradsq_cal*(1.0/c_Al + 1/(1-c_Al-c_V) - 2*L0_BCC_Al_Ti/G_normalize - 2*c_V*L0_BCC_Al_Ti_V/G_normalize) + + gradsq_cv*(1/(1-c_Al-c_V) + L0_HCP_Al_V/G_normalize - L0_HCP_Al_Ti/G_normalize -L0_HCP_Ti_V/G_normalize + + (1-2*c_Al-2*c_V)*L0_BCC_Al_Ti_V/G_normalize) + grad_cal*(-grad_cal/pow(c_Al,2) + (grad_cal + + grad_cv)/pow((1-c_Al-c_V),2) - 2*grad_cv*L0_BCC_Al_Ti_V/G_normalize) + grad_cv*((grad_cal + + grad_cv)/pow((1-c_Al-c_V),2) + (-2*grad_cal*grad_cv)*L0_BCC_Al_Ti_V/G_normalize) ; + delsq_dGBeta_dV = gradsq_cv*(1.0/c_V + 1/(1-c_Al-c_V) -2*L0_BCC_Ti_V/G_normalize - 2*c_Al*L0_BCC_Al_Ti_V/G_normalize) + + gradsq_cal*(1/(1-c_Al-c_V) + L0_BCC_Al_V/G_normalize - L0_BCC_Al_Ti/G_normalize - L0_BCC_Ti_V/G_normalize + + (1-2*c_Al-2*c_V)*L0_BCC_Al_Ti_V/G_normalize) + grad_cv*(-grad_cv/pow(c_V,2) + (grad_cal + + grad_cv)/pow((1-c_Al-c_V),2) - 2*grad_cal*L0_BCC_Al_Ti_V/G_normalize) + grad_cal*((grad_cal + + grad_cv)/pow((1-c_Al-c_V),2) + (-2*grad_cal*grad_cv)*L0_BCC_Al_Ti_V/G_normalize) ; +} + diff --git a/examples/Integration_with_fftw/wisdom3.txt b/examples/Integration_with_fftw/wisdom3.txt new file mode 100644 index 0000000..d25af0e --- /dev/null +++ b/examples/Integration_with_fftw/wisdom3.txt @@ -0,0 +1,132 @@ +(fftw-3.3.8 fftw_wisdom #xb400f3dc #xe7b0abe3 #xf6045330 #xbdf50fd0 + (fftw_rdft_rank0_register 2 #x10bdd #x10bdd #x0 #x2f277dd9 #x8872c036 #x15af74cf #x92533a7a) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #xc4c2d3ae #x47fb9fbd #x832b5514 #x988a4c64) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xbfd744fa #xcd0c0147 #x3c55b600 #xa40fcf94) + (fftw_rdft_nop_register 0 #x11bdd #x11bdd #x0 #xd0702255 #xe76a9ab3 #x5398ff07 #x60ee718e) + (fftw_codelet_hc2cb_12 0 #x10bdd #x10bdd #x0 #xbc0ac07d #xfe0bec6d #xd708004c #x36fd29f0) + (fftw_dft_r2hc_register 0 #x11bdd #x11bdd #x0 #x0d8c5a5e #xc54c873f #x709164ac #x29cb57ce) + (fftw_dft_thr_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #x9bced310 #xefba81cd #x422b6992 #xf22cc2e5) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x2dff3680 #x4df65c6f #x8a1d36a9 #x581e071e) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x4e9de8b8 #x2468c9ce #x7579b120 #x6913873f) + (fftw_rdft_rank0_register 3 #x10bdd #x10bdd #x0 #xd5f02a58 #x0f9b3f0e #x5bce0409 #x8f5fae61) + (fftw_rdft2_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xccf40585 #x20d1e6c7 #x9ace79d3 #x080fc256) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x3761c399 #x019a772b #x77598fc2 #x456f097e) + (fftw_codelet_n1_20 1 #x10fdd #x10fdd #x0 #xe175531b #x706e2fba #x1c3c548d #xafdc3c73) + (fftw_codelet_r2cb_12 0 #x10bdd #x10bdd #x0 #x7136fc37 #x70708b30 #xccf04970 #xd3124c27) + (fftw_dft_r2hc_register 0 #x11bdd #x11bdd #x0 #x380b5628 #x5dbcf8cb #x4762452d #x994fabc4) + (fftw_dft_nop_register 0 #x10bdd #x10bdd #x0 #xad3918fd #x2496a2a0 #x922ec9ab #x4b4b5ebe) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x1aac7279 #x62248f8e #x0c6d17fb #xccc5f6e3) + (fftw_dft_buffered_register 1 #x11bdd #x11bdd #x0 #x5e71e465 #x6c7feebb #xf25cee49 #x4eb31d2c) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x3bb9cc72 #xc20e5aa7 #xef190cab #x3098a596) + (fftw_rdft2_rank_geq2_register 0 #x11bdd #x11bdd #x0 #xe1f15505 #x2adbce96 #x6d412cf6 #xf9b4e43b) + (fftw_codelet_t1_15 0 #x10bdd #x10bdd #x0 #xbeaef693 #x1c489eed #xbc46ff97 #xdc117086) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x217ac1bc #x5ca85f8d #x353c6d1b #xcfe9dc7f) + (fftw_codelet_t1_15 0 #x10fdd #x10fdd #x0 #xe569912e #x52cc0fd3 #x52f038f9 #x5c947057) + (fftw_rdft_rank0_register 3 #x10bdd #x10bdd #x0 #x2da028d5 #xb58c3e82 #x6639caa7 #xb0df57a1) + (fftw_dft_r2hc_register 0 #x11bdd #x11bdd #x0 #xb5fa8cd8 #x6260ffdd #x3ab7f61a #xeaf64130) + (fftw_rdft_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #x58f130a7 #x00ffde33 #x2a929d8c #x0ce428b9) + (fftw_codelet_n1_20 1 #x10bdd #x10bdd #x0 #x02cccfd1 #x36365990 #x2ddc0d2e #x3f79cbb4) + (fftw_dft_vrank_geq1_register 0 #x10fdd #x10fdd #x0 #xe1ed72ce #x8950b1e9 #xcb197278 #xbeead0d6) + (fftw_rdft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x7dbbe4e6 #x83ce0a70 #x049cddce #x3e23fef4) + (fftw_codelet_t1_4 0 #x10bdd #x10bdd #x0 #x60ec8cbc #x4f39217d #xe6a50464 #x41fbbe18) + (fftw_rdft2_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x4f997380 #xf3892789 #xc65a829f #x4050040b) + (fftw_codelet_n1_20 0 #x10bdd #x10bdd #x0 #x4b66270c #x0d3a4d5a #x2f71ae85 #x9e57fd84) + (fftw_dft_buffered_register 1 #x10bdd #x10bdd #x0 #x98055601 #xba6c8c42 #x27af0434 #xe89cde6c) + (fftw_codelet_n1_6 0 #x10bdd #x10bdd #x0 #x42e777e2 #x19a6cc19 #x95570d81 #x08abb6c1) + (fftw_codelet_n1_20 1 #x10fdd #x10fdd #x0 #x4e88d013 #xa939335f #xea785f0c #x78ee25de) + (fftw_codelet_t1_15 0 #x10bdd #x10bdd #x0 #x528c9a4a #x2f4e6a2a #xdb6dfc61 #x7b991c49) + (fftw_codelet_t1_2 0 #x11bdd #x11bdd #x0 #x99aff498 #xacae7a61 #xbf828521 #x74dfedad) + (fftw_codelet_r2cf_10 0 #x11bdd #x11bdd #x0 #x33061f91 #xc801f5bd #x6c71b50c #x231458b8) + (fftw_rdft2_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #xdb6fb085 #xb8b5b225 #x72bb727c #xeb1fb6dd) + (fftw_dft_thr_vrank_geq1_register 0 #x10fdd #x10fdd #x0 #xca6534fb #x1ebfc6b6 #x89e9b80c #xaebe5d12) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x176da321 #xdcd80be5 #xc3763fdc #x6a902049) + (fftw_rdft_rank0_register 3 #x11bdd #x11bdd #x0 #xd5f02a58 #x0f9b3f0e #x5bce0409 #x8f5fae61) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xc168f1ca #x0952ab9d #x0fc451e8 #x7c556320) + (fftw_rdft_rank0_register 3 #x11bdd #x11bdd #x0 #xc05be51f #xb9d6d82d #x3351fcfa #x7b64f1f7) + (fftw_dft_indirect_register 0 #x10bdd #x10bdd #x0 #x0b8ce4be #x4dbf31c9 #x15dffd89 #x59cc8481) + (fftw_codelet_t1_15 0 #x10fdd #x10fdd #x0 #x2dbdb995 #xf32b6d1c #x616763e2 #xf96ed6be) + (fftw_codelet_hc2cb_2 0 #x10bdd #x10bdd #x0 #xc7ded0df #xef8125d2 #x283e0883 #x4c6ec45b) + (fftw_codelet_hf_10 0 #x11bdd #x11bdd #x0 #xec60a60a #x060fde4b #x4346b092 #x6f6ffb14) + (fftw_dft_buffered_register 1 #x11bdd #x11bdd #x0 #xb2ee0e47 #x9cfec5f0 #x62d36fcd #x4983ad94) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x79003252 #xb8ff8889 #x75736c33 #xd3b94731) + (fftw_dft_vrank_geq1_register 0 #x10fdd #x10fdd #x0 #x7d339db8 #xd192acfc #xc314a4a8 #xd81b1b2b) + (fftw_rdft2_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xe8edb5a4 #x82ee5026 #x1c8a6a05 #xa9930ede) + (fftw_rdft_rank0_register 3 #x11bdd #x11bdd #x0 #xb61a5e15 #xeeaa58e9 #x767eb0f5 #x351cc85c) + (fftw_codelet_r2cbIII_2 2 #x10bdd #x10bdd #x0 #x9b039ffd #xd7b7cf26 #xbe926655 #x31a0e74b) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xf8c35884 #xd784c83b #xc087d883 #xc01efddb) + (fftw_dft_buffered_register 1 #x10bdd #x10bdd #x0 #x61ac5947 #xb8c72df3 #xe2b489eb #xb71b6e9c) + (fftw_codelet_t1_4 0 #x10bdd #x10bdd #x0 #x39fe97c3 #xdeb36357 #x0c79f0e2 #x4d5eeb7d) + (fftw_dft_nop_register 0 #x10bdd #x10bdd #x0 #xb93c6c58 #x3ccd439d #xe679137c #xcfc78bd8) + (fftw_dft_buffered_register 1 #x11bdd #x11bdd #x0 #xb6bf0d5f #x163fa984 #x43fa1d83 #xa4766906) + (fftw_dft_r2hc_register 0 #x10bdd #x10bdd #x0 #x5745ba77 #x7f114a6f #x85dc5f8e #x2dc69d37) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xa9fae182 #x5d008b30 #xcd8b3861 #x9db5bcbf) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x13f36872 #x2a15ca26 #xaed208ef #xeffd771e) + (fftw_rdft2_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #x7719941e #xe121aaaf #x3955d46a #x120b9fad) + (fftw_rdft2_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x4fb58f4f #x780feafb #x0db1409f #xdfddfce4) + (fftw_dft_nop_register 0 #x11bdd #x11bdd #x0 #x33c09a7c #xf22ba281 #x430fb52f #x8390e6e1) + (fftw_rdft_rank0_register 3 #x10bdd #x10bdd #x0 #x9570856d #x43933383 #xbbc26567 #xa2b79dae) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xaab80b9c #xcc08b9cb #x3b290a85 #x473ea93a) + (fftw_codelet_t1_15 0 #x10bdd #x10bdd #x0 #x0a86cf7a #x677daffa #xf1520de5 #xf74a1d9b) + (fftw_rdft2_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #xa13bb74d #xf613935e #xbf4ebf2a #xb4e2cd38) + (fftw_dft_r2hc_register 0 #x11bdd #x11bdd #x0 #xd2999da4 #x81c5f070 #x7e1a45d0 #x4b0687ef) + (fftw_rdft_rank0_register 3 #x11bdd #x11bdd #x0 #xb7a70da5 #x3fb5ead6 #x34f3ae69 #x7b014b3a) + (fftw_dft_r2hc_register 0 #x11bdd #x11bdd #x0 #x101174f0 #x949abca1 #x293a1ba8 #x94b288d8) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x365e283b #xe0265b20 #x87f7846b #xb38cb662) + (fftw_codelet_t1_4 0 #x10bdd #x10bdd #x0 #xe69427d6 #xb88e824b #xdc536b5e #x5ac5a35d) + (fftw_dft_vrank_geq1_register 0 #x10fdd #x10fdd #x0 #x7222edf7 #x7641a9d1 #xfa1ff78c #x397a0ab1) + (fftw_codelet_r2cf_12 2 #x11bdd #x11bdd #x0 #x56eacc8e #x18d6d621 #xb220a60e #x6db60cfe) + (fftw_dft_buffered_register 1 #x11bdd #x11bdd #x0 #x57e454d8 #x644aa6a9 #xd2fbcdab #x8aff2db8) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xd9b2d781 #xc3a20e37 #x6b354a90 #x849de0dd) + (fftw_rdft2_rank_geq2_register 0 #x11bdd #x11bdd #x0 #x787150e9 #x884570c2 #xab6e2ad5 #xe7162fe5) + (fftw_codelet_r2cb_2 2 #x10bdd #x10bdd #x0 #x1cc9ba97 #x6b24dc97 #x5797b4b9 #x35499215) + (fftw_dft_r2hc_register 0 #x10bdd #x10bdd #x0 #x26456032 #x2b651f35 #xec10ba0a #xdfe17a4f) + (fftw_rdft2_rank_geq2_register 0 #x11bdd #x11bdd #x0 #xc464372d #xccd9f299 #x663a6229 #xa6c9e858) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xbfc8b7ee #x071d248f #x31bb51c9 #x669b9625) + (fftw_rdft2_nop_register 0 #x10bdd #x10bdd #x0 #xd42fd6ca #xa45b352a #xfe64bf12 #xc4183293) + (fftw_codelet_n1_20 0 #x10bdd #x10bdd #x0 #xf869bbe7 #x0b032b77 #x3e3ccc84 #xc680d0ec) + (fftw_rdft2_thr_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #xfc5937ff #xdbe2d255 #x92d6f20a #x49d6e142) + (fftw_rdft2_thr_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #x1b0d8308 #x07efb47f #x45941e11 #x801394ad) + (fftw_dft_indirect_register 0 #x10bdd #x10bdd #x0 #xd5040d06 #xd9c0f5fa #x82633681 #xef09d8a1) + (fftw_dft_r2hc_register 0 #x11bdd #x11bdd #x0 #x911ad070 #x18bddf79 #x1ecc2380 #xb54c5873) + (fftw_dft_vrank_geq1_register 0 #x10fdd #x10fdd #x0 #x17402c7b #x5a5f6538 #xed010f79 #x7119189c) + (fftw_dft_buffered_register 0 #x10bdd #x10bdd #x0 #xaf8d7e2c #x497c11cc #xccc920a3 #xc9dcdf52) + (fftw_codelet_hc2cf_2 0 #x11bdd #x11bdd #x0 #x7a888533 #xff9a7700 #xe7902481 #xc2a04da7) + (fftw_dft_thr_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #x8bd5bf4f #xcfb0e9ac #x7eeaa210 #xca6e6053) + (fftw_codelet_r2cfII_2 2 #x11bdd #x11bdd #x0 #xf61fc70e #x5e3d94a7 #x2045059b #x70a29d3a) + (fftw_dft_r2hc_register 0 #x10bdd #x10bdd #x0 #x1d734f02 #x7f930ca3 #x7bc890a3 #xb1c17b95) + (fftw_dft_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #x8c43a74c #x92788a44 #xda64d483 #x65b511e2) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x03cfbc78 #x40b9cf7b #x6face781 #xd00a60e0) + (fftw_codelet_r2cf_2 2 #x11bdd #x11bdd #x0 #x0bb8809a #xbe2cd196 #xb827886d #xebd4c73f) + (fftw_rdft_rank0_register 3 #x10bdd #x10bdd #x0 #xc05be51f #xb9d6d82d #x3351fcfa #x7b64f1f7) + (fftw_rdft_thr_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #x7dbbe4e6 #x83ce0a70 #x049cddce #x3e23fef4) + (fftw_codelet_hc2cfdft_12 0 #x11bdd #x11bdd #x0 #xf031f926 #x8173207b #xeaab2e1d #xc1a055c1) + (fftw_dft_buffered_register 1 #x10bdd #x10bdd #x0 #x17d50620 #x24ea06d7 #x329b46f7 #x2803c17c) + (fftw_rdft_rank0_register 3 #x11bdd #x11bdd #x0 #x2da028d5 #xb58c3e82 #x6639caa7 #xb0df57a1) + (fftw_rdft_rank0_register 2 #x10bdd #x10bdd #x0 #xc1873e43 #xe2c8f0c9 #x0b3f6064 #x6383d018) + (fftw_dft_r2hc_register 0 #x10bdd #x10bdd #x0 #x80f76640 #x8b389368 #x688927df #xd8daf609) + (fftw_codelet_r2cb_12 2 #x10bdd #x10bdd #x0 #xfbf5b5be #x58e1bb86 #x857be923 #x92fe283b) + (fftw_rdft_rank0_register 3 #x10bdd #x10bdd #x0 #xb61a5e15 #xeeaa58e9 #x767eb0f5 #x351cc85c) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x0d60708b #x48ca23d4 #xe14df776 #xfc9d4649) + (fftw_dft_r2hc_register 0 #x10bdd #x10bdd #x0 #xe3947dd9 #x98dc6e46 #x4d53bde2 #x72d7afb7) + (fftw_codelet_n1_20 1 #x11bdd #x11bdd #x0 #x56c6562d #x074670dc #x5f602442 #xef74bd91) + (fftw_codelet_r2cb_25 0 #x10bdd #x10bdd #x0 #x05c49e16 #x6bbc331d #xfaa21e3d #x789f9879) + (fftw_rdft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xa4d5568d #xd3d0d558 #xa80bae0a #xae3d3a84) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x32803077 #xa03afe76 #x783a6b0c #xdf03f4b2) + (fftw_codelet_r2cfII_12 2 #x11bdd #x11bdd #x0 #x57c8d1d8 #x0f629f33 #xaa4a46db #xd650e8f2) + (fftw_rdft_rank0_register 2 #x11bdd #x11bdd #x0 #xc1873e43 #xe2c8f0c9 #x0b3f6064 #x6383d018) + (fftw_rdft_rank0_register 2 #x11bdd #x11bdd #x0 #x2f277dd9 #x8872c036 #x15af74cf #x92533a7a) + (fftw_codelet_n1_2 0 #x11bdd #x11bdd #x0 #x56bf3ab6 #x6955936b #x158dc279 #x21520901) + (fftw_rdft2_rank_geq2_register 0 #x11bdd #x11bdd #x0 #x6dc98a76 #x488c2164 #xa6f257dd #x13faf8de) + (fftw_dft_nop_register 0 #x11bdd #x11bdd #x0 #x712d86dd #x873f405a #xff3498aa #x1b664ebd) + (fftw_codelet_r2cf_15 0 #x11bdd #x11bdd #x0 #xa809042c #xf1dfc1b7 #xc6aa7f91 #xdabf73bd) + (fftw_dft_buffered_register 0 #x11bdd #x11bdd #x0 #xd2453370 #xeb2aef14 #xbab8606e #x094dbccc) + (fftw_codelet_n1_6 0 #x10bdd #x10bdd #x0 #xb2d9faaf #x5f5d3f75 #x2db433a4 #xac4cadf8) + (fftw_codelet_n1_12 1 #x11bdd #x11bdd #x0 #xaae93e76 #x9f5e7e9c #x92c9a700 #xdbf91043) + (fftw_codelet_t1_15 0 #x11bdd #x11bdd #x0 #xb774e892 #x5bbd26ce #x461096ec #x8d62132d) + (fftw_dft_r2hc_register 0 #x10bdd #x10bdd #x0 #x0758893b #x0662d666 #xf5feb6f9 #xdbe4dd82) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x8ea61c8e #xdd714d51 #x2aeeddba #xda93853f) + (fftw_codelet_n1_6 1 #x10bdd #x10bdd #x0 #x05887c3a #xa9e7a1ed #xd5757b27 #xb3ba699c) + (fftw_dft_r2hc_register 0 #x10bdd #x10bdd #x0 #x310abcad #x604bf333 #xd257a615 #x801725a4) + (fftw_dft_thr_vrank_geq1_register 0 #x10fdd #x10fdd #x0 #xc5f02fae #x30de4b46 #xfd219713 #x2fc0657f) + (fftw_rdft2_vrank_geq1_register 0 #x11bdd #x11bdd #x0 #xe48298c7 #x5ec0f615 #x1b474cc0 #x3efee3bd) +) diff --git a/examples/beginners_diffusion/1stDiffusion b/examples/beginners_diffusion/1stDiffusion new file mode 100755 index 0000000000000000000000000000000000000000..e588708777c1cd022fdec78d34e4862ea4278b17 GIT binary patch literal 24784 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 P-?)ZLSTizYu*!b}g&a-g literal 0 HcmV?d00001 diff --git a/examples/beginners_diffusion/MMSPDiffusion b/examples/beginners_diffusion/MMSPDiffusion new file mode 100755 index 0000000000000000000000000000000000000000..dc52f131eeeb16a7101a129b9b0fd1a7715dfaa8 GIT binary patch literal 30624 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

2W{udofogs|)4RJ2oxIzZ&s4|1z^4JCWap{5!1q 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 W9Ww@nc=hwiF>$HSA&AoO`u_{?>>wBb literal 0 HcmV?d00001 diff --git a/examples/pfhub_bm8/MMSPNucleation.cpp b/examples/pfhub_bm8/MMSPNucleation.cpp new file mode 100644 index 0000000..159d145 --- /dev/null +++ b/examples/pfhub_bm8/MMSPNucleation.cpp @@ -0,0 +1,119 @@ +#include +#include +#include"MMSP.hpp" +using namespace MMSP; + +typedef float phi_type; +typedef MMSP::sparse store_type; + +double hphi(double phi) +{ + return pow(phi,3)*(10-15*phi+6*pow(phi,2)) ; +} + +double hphiprime(double phi) +{ + return 30*pow(phi,2)*pow((phi-1),2) ; +} +int main(int argc, char* argv[]) +{ + Init(argc, argv); + + double R = 8.314 ; + double T = 1200.0 ; + double dt = 0.01 ; + double Vm = 0.00001; + int variants = 20 ; + const int dim = 2; + const int nx = 100; + const int ny = 100; + long steps = 5e+8 ; + int iterations = 200; + const int node_total = nx*ny; + double epsisq = 1 ; + double W[node_total] ; + double diffusionCoefficient = 1.0; + + + grid<1,scalar > oldGrid(1,0,nx); + grid<2, store_type> newGrid(variants, 0, nx, 0, ny) ; + grid<2, store_type > update(newGrid); + + const double Lx = g1(newGrid,0) - g0(newGrid,0) ; + const double Ly = g1(newGrid,1) - g0(newGrid,1) ; + const double dx = MMSP::dx(newGrid, 0) ; + const double dy = MMSP::dx(newGrid, 1) ; + + MMSP::b0(newGrid,0) = MMSP::Dirichlet; + MMSP::b1(newGrid,0) = MMSP::Dirichlet; + + MMSP::b0(newGrid,1) = MMSP::Dirichlet; + MMSP::b1(newGrid,1) = MMSP::Dirichlet; + + MMSP::b0(update,0) = MMSP::Dirichlet; + MMSP::b1(update,0) = MMSP::Dirichlet; + + MMSP::b0(update,1) = MMSP::Dirichlet; + MMSP::b1(update,1) = MMSP::Dirichlet; + double rstar = 5.0 ; + double r0 = rstar ; + double x0 = 0.5*Lx ; + double y0 = 0.5*Ly ; + for(int n = 0; n < nodes(newGrid); n++) + { + MMSP::vector x = position(newGrid, n); + store_type newGrain; + double x1 = x[0]*dx ; + double y1 = x[1]*dy ; + double r = sqrt(pow((x1-x0),2) + pow((y1-y0),2)) ; + set(newGrain, 1) = 0.5*(1-tanh(r-r0)/sqrt(2)) ; + newGrid(n) = newGrain; + update(n) = newGrain ; + } + + + double F = 0.0 ; + std::string file_name = "F.txt" ; + std::ofstream file1; + file1.open(file_name.c_str()); + + for (int k=0; k s = position(newGrid, n); + MMSP::vector gradient = grad(update, s) ; + double maggrad = gradient[0][1] + gradient[1][1] ; + F += 0.5*epsisq*pow(maggrad,2) + pow(update(n)[1],2) * pow((1 - update(n)[1]),2) -1.0/(15.0*sqrt(2.0))*hphi(update(n)[1]) ; + std::cout< x = position(update, n); + MMSP::vector gradsq = gradientsq(update, x) ; + MMSP::sparse dFdp; + store_type dpdt; + phi_type lap_aniso = (gradsq[0][1]*epsisq + gradsq[1][1]*epsisq) ; + double interaction_energy = update(n)[1]*pow((1-update(n)[1]), 2) - pow(update(n)[1],2)*(1-update(n)[1]) ; + set(dFdp, 1) = -(1)*hphiprime(update(n)[1]) + interaction_energy - lap_aniso ; + set(dpdt, 1) = -0.1* (dFdp[1]); + set(update(n), 1) = update(n)[1] + dt * dpdt[1]; + } + swap(update, newGrid); + } + file1.close(); + Finalize(); + return 0; +} + diff --git a/examples/pfhub_bm8/MMSP_for_Beginners.tex b/examples/pfhub_bm8/MMSP_for_Beginners.tex new file mode 100644 index 0000000..36dba7d --- /dev/null +++ b/examples/pfhub_bm8/MMSP_for_Beginners.tex @@ -0,0 +1,321 @@ +\documentclass[10pt]{article} +\topmargin=-.5in % topmargin is 1/2 inch (note negative value) +\oddsidemargin=0in +\textwidth=6.5in % leaves 1 inch for the right margin +\textheight=9in % 9 inches reserved for the text +\usepackage{listings} +\usepackage[english]{babel} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage[colorinlistoftodos]{todonotes} +\usepackage{shadethm} +\definecolor{shadethmcolor}{rgb}{0.96,0.96,0.96} +\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} +\def\MMSP{{\tt MMSP\ }} + +\title{MMSP for Beginners} + +\author{Paul Detwiler, Andrew Lauer, Daniel Lewis} + +\date{\today} + +\begin{document} +\maketitle +\section{Introduction} +The following is a brief tutorial on how to use \MMSP and some of it's +basic functions. If you are unfamiliar with the basics of c++ or how +to compile and run programs, please refer to the main \MMSP +documentation or an online C/C++ tutorial. Some basic help will be +found in the Makefiles and README files. + +\section{The Diffusion Equation} + +The diffusion equation relates the time rate of change of a diffusing +species to the divergence of the gradients in the concentration of the +diffusing species. + +\begin{eqnarray} +\texttt{c[x,t] = (dt*D/dx**2)*(c[x-1,t-1]-2c[x,t-1]+c[x-1,t-1])+c[x,t-1]} +\end{eqnarray} + +This discrete equation will be used in our example calculation along with +some MMSP functionality. + +\section{Example Codes} +\label{sec:examples} + +\begin{listings} +\end{listings} + +\subsection{1D Diffusion couple, Cish} + +The first code is called 1stDiffusion.cpp. It is found in the +examples directory under {\tt beginners\_diffusion}. Use the {\tt g++} +or MPI commands outlined in the introduction to create an executable. + +The first thing to notice is that the include, using, and finalize commands are in the same place as in the “Hello World” script handled before. These are standard for all MMSP codes. The important MMSP commands are lines 22 and 23: +\\ \textit{grid\textless 1,scalar\textless float\textgreater \textgreater GRID(1,0,length);} +\\A breakdown of what this line means is: +\\ \textit{grid\textless \# of dimensions,data type\textgreater “GRID name”(Vector quantity, start position, number of terms in first dimension);} +\\ \begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item The vector quantity is 1 unless the vector data type is used. +\begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item vectors in MMSP are used to store multiple data values of interest in a single node on the grid +\end{itemize} +\item Start position is generally 0, but any number can be used +\item When using multi-dimensions, the only required change is to add more upper and lower boundaries for each subsequent dimension +\begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item E.g. for 2 dimensions: \textit{grid\textless 2,scalar\textless float\textgreater \textgreater GRID(1,0,lengthx,0,lengthy)} +\end{itemize} +\end{itemize} +Also, in line 28, the commands “x0(GRID)” and “x1(GRID)” are used. MMSP reads this as the initial and final nodes in the x direction, respectively. x, y, and z commands can be used for this, as well, if the number of dimensions agrees. +Some other items of interest are: +\begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item line 43, which defines the steady state boundary conditions +\item line 45, which refers to the “stability criterion.” This criterion is defined by $D\frac{\Delta t}{(\Delta x)^2}$ +\item line 48, which operates on each point in the GRID +\item line 49, which defines when GRID gets updated. +\item line 50, which uses the swap command. The swap command has the syntax: +\begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item swap(grid to be replaced, grid to use to replace) +\item In this specific example, the swap command is used to swap all points in GRID1 with all corresponding points in GRID2 +\end{itemize} +\end{itemize} +\begin{shadebox} + +\begin{enumerate} \itemsep1pt \parskip0pt \parsep0pt +\item include"MMSP.hpp" +\item using namespace MMSP; +\item +\item int main() +\item \{ +\item // Here is where all variables are called. In c++ all variables must be defined before they can be used +\item // The first word is the data type associated with the variable. “int”=integer type. +\item int length; +\item int offlength; +\item int iterate; +\item +\item // We make it so that the length of the diffusion couple and the number of iterations can be changed each time the code is run +\item std::cout\textless \textless "input couple length"\textless \textless std::endl; +\item std::cin\textgreater \textgreater length; +\item std::cout\textless \textless ""\textless \textless std::endl; +\item +\item std::cout\textless \textless "input number of iterations"\textless \textless std::endl; +\item std::cin\textgreater \textgreater iterate; +\item std::cout\textless \textless ""\textless \textless std::endl; +\item +\item //here we define some 1 dimensional grids with float variable types +\item grid\textless 1,scalar\textless float\textgreater \textgreater GRID(1,0,length); +\item grid\textless 1,scalar\textless float\textgreater \textgreater GRID2(1,0,length); +\item //this value is defined for looping control +\item offlength=x1(GRID)-3; +\item +\item //this creates two identical grids GRID and GRID2 that are 1 for the first half and 0 for the second. These represent diffusion couples. +\item for (int x=x0(GRID); x\textless x1(GRID); x++) +\item \hspace{10pt} if (x\textless length/2) \{ +\item \hspace{10pt} \hspace{10pt} GRID[x]=1; +\item \hspace{10pt} \hspace{10pt} GRID2[x]=1; +\item \hspace{10pt} \} +\item \hspace{10pt} else \{ +\item \hspace{10pt} \hspace{10pt} GRID[x]=0; +\item \hspace{10pt} \hspace{10pt} GRID2[x]=0; +\item \hspace{10pt} \} +\item +\end{enumerate} +\end{shadebox} + +\begin{shadebox} +\begin{enumerate} \itemsep1pt \parskip0pt \parsep0pt +\setcounter{enumi}{37} +\item //This step controls the number of time steps based on the user input from before +\item for (int i=0;i\textless iterate;i++) \{ +\item //Iterate through grid +\item \hspace{10pt} for (int x=x0(GRID); x\textless x1(GRID); x++) \{ +\item //Define fixed boundaries by preventing the first and last nodes of the grid from changing +\item \hspace{10pt} \hspace{10pt} if (x==0 \textbar \textbar x==length-1\{ +\item \hspace{10pt} \hspace{10pt} \} +\item //Take one time step of the discrete Fick's Law with maximum stability criterion (.5) +\item //to keep calculations from interfering with each other, the results of computations are stored in GRID2, then copied back to GRID after the last computation +\item \hspace{10pt} \hspace{10pt} else \{ +\item \hspace{10pt} \hspace{10pt} \hspace{10pt} GRID2[x]=0.5*(GRID[x-1]-2*GRID[x]+GRID[x+1])+GRID[x]; +\item \hspace{10pt} \hspace{10pt} \hspace{10pt} if (x\textgreater offlength) \{ +\item \hspace{10pt} \hspace{10pt} \hspace{10pt} \hspace{10pt} swap(GRID,GRID2); +\item \hspace{10pt} \hspace{10pt} \hspace{10pt} \} +\item \hspace{10pt} \hspace{10pt} \} +\item \hspace{10pt} \} +\item \} +\item //This prints the results of the grid to cout +\item for (int x=x0(GRID); x\textless x1(GRID); x++) \{ +\item \hspace{10pt} std::cout\textless \textless GRID[x]\textless \textless std::endl; +\item \} +\item Finalize(); +\item \} +\end{enumerate} + +\end{shadebox} + +\subsection{1D Diffusion Couple, MMSPish} +The second time through uses more MMSP functionality. The code for this example is called MMSPDiffusion.cpp in the {\tt beginners\_diffusion} directory. Important differences from the previous example: +\begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item line 19: instead of GRID2, the MMSP standard name “update” is used for the second grid. +\item lines 33-36: define the boundary conditions (bulkier in this case, but using other MMSP standard boundaries makes this step very useful). +\begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item The syntax in line 33, b0(GRID,0), can be generalized to: +\begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item \textit{boundary condition side(grid to be applied to, dimension to apply the boundary to)} +\item for this specific example, b0 corresponds to the left-hand boundary, GRID is the grid that the condition is applied to, and 0 corresponds to the 1st (or x) dimension. +\end {itemize} +\end {itemize} +\item line 43: by using the MMSP standard loop, the grid is updated at the correct time without any commands from the operator +\item line 44: ghostswap command is used in parallel processing - it has no effect when only one processor is used, but is vital when using more than one. +\end {itemize} + +\begin{shadebox} +\begin{enumerate} \itemsep1pt \parskip0pt \parsep0pt +\item \#include"MMSP.hpp" +\item using namespace MMSP; +\item +\item //we start the program off the same way as before, but this time we do not need the offset length variable +\item int main() +\item \{ +\item int length; +\item int iterate; +\item +\item std::cout\textless \textless "input couple length"\textless \textless std::endl; +\item std::cin\textgreater \textgreater length; +\item std::cout\textless \textless ""\textless \textless std::endl; +\item +\item std::cout\textless \textless "input number of iterations"\textless \textless std::endl; +\item std::cin\textgreater \textgreater iterate; +\item std::cout\textless \textless ""\textless \textless std::endl; +\item +\item grid\textless 1,scalar\textless float\textgreater \textgreater GRID(1,0,length); +\item grid\textless 1,scalar\textless float\textgreater \textgreater update(1,0,length); +\item +\item for (int x=x0(GRID); x\textless x1(GRID); x++) +\item \hspace{10pt} if (x\textless length/2) \{ +\item \hspace{10pt} \hspace{10pt} GRID[x]=1; +\item \hspace{10pt} \hspace{10pt} update[x]=1; +\item \hspace{10pt} \} +\item \hspace{10pt} else \{ +\item \hspace{10pt} \hspace{10pt} GRID[x]=0; +\item \hspace{10pt} \hspace{10pt} update[x]=1; +\item \} +\item +\end{enumerate} +\end{shadebox} + +\begin{shadebox} +\begin{enumerate} \itemsep1pt \parskip0pt \parsep0pt +\setcounter{enumi}{30} +\item //now we set the boundary conditions of both grids. By choosing the Dirichlet conditions, it is nearly identical to the manually set boundaries. +\item //the difference is that the first and last nodes of the grid can change, and the theoretical points outside the grid are fixed. +\item b0(GRID,0) = Dirichlet; +\item b1(GRID,0) = Dirichlet; +\item b0(update,0) = Dirichlet; +\item b1(update,0) = Dirichlet; +\item + +\item for (int k=0; k\textless iterate; k++) \{ +\item \hspace{10pt} for (int i=0; i\textless nodes(GRID); i++) \{ +\item //we can use MMSP's definition for laplacian instead of hardcoding it. +\item \hspace{10pt} \hspace{10pt} update(i)=0.5*laplacian(GRID,i)+GRID[i]; +\item \hspace{10pt} \} +\item \hspace{10pt} swap(GRID,update); +\item \hspace{10pt} ghostswap(GRID); +\item \}; +\item +\item +\item for (int x=x0(GRID); x\textless x1(GRID); x++) +\item \hspace{10pt} std::cout\textless \textless GRID[x]\textless \textless std::endl; +\item +\item Finalize(); +\item \} +\end{enumerate} +\end{shadebox} + +\subsection{2D Diffusion} +Now, we have a two dimensional diffusion situation (the upper left quadrant of a square is one species, the other three are another). The code for this example is named MMSPDiffusion2d.cpp and is also located in the {\tt beginners\_diffusion} directory MMSP makes adding dimensions easy, the only necessary changes are +\begin{itemize} \itemsep1pt \parskip0pt \parsep0pt +\item line 19 \& 20: change 1 to 2 when setting the number of dimensions in the grid. +\item lines 38-45: boundary conditions in both dimensions must be specified +\end{itemize} +Thats it. Those are the only changes that MMSP requires to operate in multiple dimensions. Other changes include redefining how the grid is set up, but generally the grid comes from a data set, so you will not have to worry about that, and the coefficient representing the diffusion was changed to reflect how the stability criterion changes in multiple dimensions. +\begin{shadebox} +\begin{enumerate} \itemsep1pt \parskip0pt \parsep0pt +\item \#include"MMSP.hpp" +\item using namespace MMSP; +\item +\item //we start the program off the same way as before, but this time we do not need the +\item offset length variable. Also, this creates a square grid. +\item int main() +\item \{ +\item int length; +\item int iterate; +\item +\item std::cout\textless \textless "input couple length"\textless \textless std::endl; +\item std::cin\textgreater \textgreater length; +\item std::cout\textless \textless ""\textless \textless std::endl; +\item +\item std::cout\textless \textless "input number of iterations"\textless \textless std::endl; +\item std::cin\textgreater \textgreater iterate; +\item std::cout\textless \textless ""\textless \textless std::endl; +\item +\item grid\textless 2,scalar\textless float\textgreater \textgreater GRID(1,0,length,0,length); +\item grid\textless 2,scalar\textless float\textgreater \textgreater update(1,0,length,0,length); +\item +\item //This creates a grid with 1’s in the upper left quadrant, and zeroes in the remaining 3 +\item +\item for (int x=x0(GRID); x\textless x1(GRID); x++) \{ +\item \hspace{10pt} for (int y=y0(GRID); y\textless y1(GRID); y++) \{ +\item \hspace{10pt} \hspace{10pt} if ((x\textless length/2)\& \&(y\textless length/2)) \{ +\item \hspace{10pt} \hspace{10pt} \hspace{10pt} GRID[x][y]=1; +\item \hspace{10pt} \hspace{10pt} \hspace{10pt} update[x][y]=1; +\item \hspace{10pt} \hspace{10pt} \} +\item \hspace{10pt} \hspace{10pt} else \{ +\item \hspace{10pt} \hspace{10pt} \hspace{10pt} GRID[x][y]=0; +\item \hspace{10pt} \hspace{10pt} \hspace{10pt} update[x][y]=1; +\item \hspace{10pt} \hspace{10pt} \} +\item \hspace{10pt} \} +\item \} +\end{enumerate} +\end{shadebox} + +\begin{shadebox} +\begin{enumerate} \itemsep1pt \parskip0pt \parsep0pt +\setcounter{enumi}{35} +\item //now we set the boundary conditions of both grids. By choosing the Dirichlet conditions, it is nearly identical to the manually set boudaries. +\item //the difference is that the first and last nodes of the grid can change, and the theoretical points outside the grid are fixed. +\item b0(GRID,0) = Dirichlet; +\item b1(GRID,0) = Dirichlet; +\item b0(GRID,1) = Dirichlet; +\item b1(GRID,1) = Dirichlet; +\item b0(update,0) = Dirichlet; +\item b1(update,0) = Dirichlet; +\item b0(update,1) = Dirichlet; +\item b1(update,1) = Dirichlet; +\item +\item +\item for (int k=0; k\textless iterate; k++) \{ +\item \hspace{10pt} for (int i=0; i\textless nodes(GRID); i++) \{ +\item //we can use MMSP's definition for laplacian instead of hardcoding it. +\item \hspace{10pt} \hspace{10pt} update(i)=0.2*laplacian(GRID,i)+GRID(i); +\item \hspace{10pt} \} +\item \hspace{10pt} swap(GRID,update); +\item \hspace{10pt} ghostswap(GRID); +\item \} ; +\item +\item +\item for (int x=x0(GRID); x\textless x1(GRID); x++) \{ +\item \hspace{10pt} for (int y=y0(GRID); y\textless y1(GRID); y++) \{ +\item \hspace{10pt} \hspace{10pt} std::cout\textless \textless GRID[x][y]; +\item \hspace{10pt} \hspace{10pt} std::cout\textless \textless " "; +\item \hspace{10pt} \} +\item \hspace{10pt} std::cout\textless \textless std::endl; +\item \} +\item Finalize(); +\item \} +\end{enumerate} +\end{shadebox} +\end{document} diff --git a/examples/pfhub_bm8/Makefile b/examples/pfhub_bm8/Makefile new file mode 100644 index 0000000..d59741b --- /dev/null +++ b/examples/pfhub_bm8/Makefile @@ -0,0 +1,53 @@ +# If you have a different compiler then you can +# specify this by override, e.g.: make CC='pgcc' +CC = g++ +CCOPTS = -g +PGOPTS = +LIBS = -lm + +incdir = include + +# If you have gnuplot pipes on your system, change this +# value to 'yes' and change the options in the source +# code to get graphical output. +GNUPLOT_I = no + +# If different compilers have different options, then +# those can be handled here. +ifeq ($(CC),gcc) + CCOPTIONS = $(CCOPTS) +endif + +ifeq ($(CC),pgcc) + CCOPTIONS = $(PGOPTS) +endif + +ifeq ($(CC),g++) + CCOPTIONS = +endif + +ifeq ($(GNUPLOT_I),yes) + OBJECT1 = MMSPNucleation.o +else + OBJECT1 = MMSPNucleation.o +endif + +#Program dependencies below here. +all : MMSPNucleation +.PHONY : all + +MMSPNucleation : $(OBJECT1) + $(CC) $(CCOPTIONS) -o $@ MMSPNucleation.o $(LIBS) + + +# Object defs below here. + +MMSPNucleation.o : MMSPNucleation.cpp + $(CC) $(CCOPTIONS) -I$(incdir) -c $< + +gnuplot_i.hpp.gch : gnuplot_i.hpp + $(CC) $(CCOPTIONS) -c gnuplot_i.hpp + +clean : + rm -rf 1stDiffusion MMSPDiffusion MMSPDiffusion2D *.o *~ *.gch + diff --git a/examples/pfhub_bm8/include/MMSP.grid.cpp b/examples/pfhub_bm8/include/MMSP.grid.cpp new file mode 100644 index 0000000..d2c95b3 --- /dev/null +++ b/examples/pfhub_bm8/include/MMSP.grid.cpp @@ -0,0 +1,2242 @@ +// MMSP.grid.cpp +// MMSP grid class implementation +// Questions/comments to gruberja@gmail.com (Jason Gruber) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef RAW +#include +#endif + +namespace MMSP +{ + +template +grid::grid(int FIELDS, int min[dim], int max[dim], int GHOSTS, bool SINGLE) +{ + // set number of fields + fields = FIELDS; + + // read function arguments + for (int i=0; i +grid::grid(int FIELDS, ...) +{ + // set number of fields + fields = FIELDS; + + // read function arguments + va_list list; + va_start(list, FIELDS); + for (int i=0; i +grid::grid(const grid& GRID) +{ + // set number of fields + fields = MMSP::fields(GRID); + + // read function arguments + for (int i=0; i template +grid::grid(const grid& GRID, int FIELDS) +{ + // set number of fields + fields = FIELDS; + + // read function arguments + for (int i=0; i +grid::grid(const char* filename, int GHOSTS) +{ + // initialize data + data=NULL; + + // read data from file + input(filename, GHOSTS); +} + +template +void grid::setup(bool SINGLE) +{ + // setup default grid parameters + for (int i=0; i 0) { + if (pos[i] < rem) { + x0[i] += pos[i]; + x1[i] = x0[i] + nom + 1; + } else if (pos[i] == rem) { + x0[i] += pos[i]; + x1[i] = x0[i] + nom; + } else { + x0[i] += rem; + x1[i] = x0[i] + nom; + } + } + } + + // determine neighbor processors + for (int i=0; i +grid::~grid() +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } +} + +// assignment operators + +template template grid& grid::operator=(const U& value) +{ + for (int i=0; i(value); + return *this; +} + +template template grid& grid::operator=(const grid& GRID) +{ + for (int i=0; i(GRID.data[i]); + return *this; +} + +template template grid& grid::operator+=(const grid& GRID) +{ + for (int i=0; i(GRID.data[i]); + return *this; +} + +template template grid& grid::operator-=(const grid& GRID) +{ + for (int i=0; i(GRID.data[i]); + return *this; +} + +// subscript operators +template target < dim - 1, 0, T > grid::operator [](int x) const +{ + check_boundary(x, x0[0], x1[0], b0[0], b1[0]); + return target < dim - 1, 0, T > (data + (x - s0[0]) * sx[0], s0, sx, x0, x1, b0, b1); +} + +template T& grid::operator()(MMSP::vector x) const +{ + T* p = data; + for (int i=0; i T& grid::operator()(int i) const +{ + #ifdef MPI_VERSION + int x[dim]; + for (int j=0; j MMSP::vector grid::position(int i) const +{ + MMSP::vector x(dim); + for (int j=0; j void grid::ghostswap() +{ + #ifdef MPI_VERSION + MPI::COMM_WORLD.Barrier(); + for (int i=0; ibuffer_size(send_min, send_max); + unsigned long recv_size = 0; + + // Small data transfer: blocking Sendrecv should scale -- but don't plan on it. + MPI::Request requests[2]; + requests[0] = MPI::COMM_WORLD.Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 100); // send number of ghosts + requests[1] = MPI::COMM_WORLD.Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 100); // receive number of ghosts + MPI::Request::Waitall(2, requests); + MPI::COMM_WORLD.Barrier(); + char* send_buffer = new char[send_size]; + char* recv_buffer = new char[recv_size]; + send_size = this->to_buffer(send_buffer, send_min, send_max); + + // Large data transfer requires non-blocking communication + requests[0] = MPI::COMM_WORLD.Isend(send_buffer, send_size, MPI_CHAR, send_proc, 200); // send ghosts + requests[1] = MPI::COMM_WORLD.Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 200); // receive ghosts + MPI::Request::Waitall(2, requests); + MPI::COMM_WORLD.Barrier(); + this->from_buffer(recv_buffer, recv_min, recv_max); // populate ghost cell data from buffer + delete [] send_buffer; + send_buffer=NULL; + delete [] recv_buffer; + recv_buffer=NULL; + } + + if (1) { + // send to processor below and receive from processor above + int send_proc = n0[i]; + int recv_proc = n1[i]; + + int send_min[dim], send_max[dim]; + int recv_min[dim], recv_max[dim]; + for (int j=0; jbuffer_size(send_min, send_max); + unsigned long recv_size = 0; + + // Small data transfer: blocking Sendrecv should scale -- but don't plan on it. + MPI::Request requests[2]; + requests[0] = MPI::COMM_WORLD.Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 300); // send number of ghosts + requests[1] = MPI::COMM_WORLD.Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 300); // receive number of incoming ghosts + MPI::Request::Waitall(2, requests); + MPI::COMM_WORLD.Barrier(); + char* send_buffer = new char[send_size]; + char* recv_buffer = new char[recv_size]; + send_size = this->to_buffer(send_buffer, send_min, send_max); + + // Large data transfer requires non-blocking communication + requests[0] = MPI::COMM_WORLD.Isend(send_buffer, send_size, MPI_CHAR, send_proc, 400); // send ghosts + requests[1] = MPI::COMM_WORLD.Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 400); // receive ghosts + MPI::Request::Waitall(2, requests); + MPI::COMM_WORLD.Barrier(); + + this->from_buffer(recv_buffer, recv_min, recv_max); // populate ghost cell data from buffer + + delete [] send_buffer; + send_buffer=NULL; + delete [] recv_buffer; + recv_buffer=NULL; + } + } + MPI::COMM_WORLD.Barrier(); + #endif +} + +template void grid::ghostswap(const int sublattice) // ghostswap for Monte Carlo communiation reduction. +{ + #ifdef MPI_VERSION + MPI::COMM_WORLD.Barrier(); + for (int i=0; ibuffer_size_save(send_min, send_max); + unsigned long recv_size = 0; + + // Small data transfer: blocking Sendrecv should scale -- but don't plan on it. + MPI::Request requests[2]; + requests[0] = MPI::COMM_WORLD.Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 100); // send number of ghosts + requests[1] = MPI::COMM_WORLD.Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 100); // receive number of ghosts + MPI::Request::Waitall(2, requests); + MPI::COMM_WORLD.Barrier(); + char* send_buffer = new char[send_size]; + char* recv_buffer = new char[recv_size]; + send_size = this->to_buffer_save(send_buffer, send_min, send_max); + + // Large data transfer requires non-blocking communication + requests[0] = MPI::COMM_WORLD.Isend(send_buffer, send_size, MPI_CHAR, send_proc, 200); // send ghosts + requests[1] = MPI::COMM_WORLD.Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 200); // receive ghosts + MPI::Request::Waitall(2, requests); + MPI::COMM_WORLD.Barrier(); + + this->from_buffer_save(recv_buffer, recv_min, recv_max); // populate ghost cell data from buffer + + delete [] send_buffer; + send_buffer=NULL; + delete [] recv_buffer; + recv_buffer=NULL; + } + + if (1) { + // send to processor below and receive from processor above + int send_proc = n0[i]; + int recv_proc = n1[i]; + + int send_min[dim], send_max[dim]; + int recv_min[dim], recv_max[dim]; + for (int j=0; jbuffer_size_save(send_min, send_max); + unsigned long recv_size = 0; + + // Small data transfer: blocking Sendrecv should scale -- but don't plan on it. + MPI::Request requests[2]; + requests[0] = MPI::COMM_WORLD.Isend(&send_size, 1, MPI_UNSIGNED_LONG, send_proc, 300); // send number of ghosts + requests[1] = MPI::COMM_WORLD.Irecv(&recv_size, 1, MPI_UNSIGNED_LONG, recv_proc, 300); // receive number of incoming ghosts + MPI::Request::Waitall(2, requests); + MPI::COMM_WORLD.Barrier(); + char* send_buffer = new char[send_size]; + char* recv_buffer = new char[recv_size]; + + send_size = this->to_buffer_save(send_buffer, send_min, send_max); + + // Large data transfer requires non-blocking communication + requests[0] = MPI::COMM_WORLD.Isend(send_buffer, send_size, MPI_CHAR, send_proc, 400); // send ghosts + requests[1] = MPI::COMM_WORLD.Irecv(recv_buffer, recv_size, MPI_CHAR, recv_proc, 400); // receive ghosts + MPI::Request::Waitall(2, requests); + MPI::COMM_WORLD.Barrier(); + + this->from_buffer_save(recv_buffer, recv_min, recv_max); // populate ghost cell data from buffer + + delete [] send_buffer; + send_buffer=NULL; + delete [] recv_buffer; + recv_buffer=NULL; + } + } + MPI::COMM_WORLD.Barrier(); + #endif +} + +template unsigned long grid::buffer_size_save(const int min[dim], const int max[dim]) const +{ + return buffer_size_save(data, 0, min, max); +} + +template unsigned long grid::buffer_size_save(T* p, int i, const int min[dim], const int max[dim]) const +{ + unsigned long size = 0; + if (i == dim - 1) { + for (int x = min[i]; x < max[i]; x+=2) + size += MMSP::buffer_size(*(p + (x - s0[i]) * sx[i])); + } else if (i >= 0 && i < dim) { + for (int x = min[i]; x < max[i]; x+=2) + size += buffer_size_save(p + (x - s0[i]) * sx[i], i + 1, min, max); + } + return size; +} + +template unsigned long grid::to_buffer_save(char* buffer, const int min[dim], const int max[dim]) const +{ + return to_buffer_save(buffer, data, 0, min, max); +} + +template unsigned long grid::to_buffer_save(char* buffer, T* p, int i, const int min[dim], const int max[dim]) const +{ + unsigned long size = 0; + if (i == dim - 1) { + for (int x = min[i]; x < max[i]; x+=2) + size += MMSP::to_buffer(*(p + (x - s0[i]) * sx[i]), buffer + size); + } else if (i >= 0 && i < dim) { + for (int x = min[i]; x < max[i]; x+=2) + size += to_buffer_save(buffer + size, p + (x - s0[i]) * sx[i], i + 1, min, max); + } + return size; +} + +template unsigned long grid::from_buffer_save(char* buffer, const int min[dim], const int max[dim]) +{ + return from_buffer_save(buffer, data, 0, min, max); +} + +template unsigned long grid::from_buffer_save(char* buffer, T* p, int i, const int min[dim], const int max[dim]) +{ + unsigned long size = 0; + if (i == dim - 1) { + for (int x = min[i]; x < max[i]; x+=2) + size += MMSP::from_buffer(*(p + (x - s0[i]) * sx[i]), buffer + size); + } else if (i >= 0 && i < dim) { + for (int x = min[i]; x < max[i]; x+=2) + size += from_buffer_save(buffer + size, p + (x - s0[i]) * sx[i], i + 1, min, max); + } + return size; +} + +// buffer I/O +template unsigned long grid::buffer_size(T* p, int i, const int min[dim], const int max[dim]) const +{ + unsigned long size = 0; + if (i == dim - 1) { + for (int x = min[i]; x < max[i]; x++) + size += MMSP::buffer_size(*(p + (x - s0[i]) * sx[i])); + } else if (i >= 0 && i < dim) { + for (int x = min[i]; x < max[i]; x++) + size += buffer_size(p + (x - s0[i]) * sx[i], i + 1, min, max); + } + return size; +} + +template unsigned long grid::buffer_size() const +{ + return buffer_size(x0, x1); +} + +template unsigned long grid::buffer_size(const int min[dim], const int max[dim]) const +{ + return buffer_size(data, 0, min, max); +} + + + +template unsigned long grid::to_buffer(char* buffer) const +{ + return to_buffer(buffer, x0, x1); +} + +template unsigned long grid::to_buffer(char* buffer, const int min[dim], const int max[dim]) const +{ + return to_buffer(buffer, data, 0, min, max); +} + +template unsigned long grid::to_buffer(char* buffer, T* p, int i, const int min[dim], const int max[dim]) const +{ + unsigned long size = 0; + if (i == dim - 1) { + for (int x = min[i]; x < max[i]; x++) + size += MMSP::to_buffer(*(p + (x - s0[i]) * sx[i]), buffer + size); + } else if (i >= 0 && i < dim) { + for (int x = min[i]; x < max[i]; x++) + size += to_buffer(buffer + size, p + (x - s0[i]) * sx[i], i + 1, min, max); + } + return size; +} + +template unsigned long grid::from_buffer(char* buffer) +{ + return from_buffer(buffer, x0, x1); +} + +template unsigned long grid::from_buffer(char* buffer, const int min[dim], const int max[dim]) +{ + return from_buffer(buffer, data, 0, min, max); +} + +template unsigned long grid::from_buffer(char* buffer, T* p, int i, const int min[dim], const int max[dim]) +{ + unsigned long size = 0; + if (i == dim - 1) { + for (int x = min[i]; x < max[i]; x++) + size += MMSP::from_buffer(*(p + (x - s0[i]) * sx[i]), buffer + size); + } else if (i >= 0 && i < dim) { + for (int x = min[i]; x < max[i]; x++) + size += from_buffer(buffer + size, p + (x - s0[i]) * sx[i], i + 1, min, max); + } + return size; +} + +// file I/O +template void grid::input(const char* filename, int GHOSTS, int SINGLE) +{ + // file open error check + std::ifstream input(filename); + if (!input) { + std::cerr << "File input error: could not open "; + std::cerr << filename << "." << std::endl; + exit(-1); + } + + // grid data type error check + std::string type, scalar_type; + getline(input, type, '\n'); + scalar_type = "grid:scalar" + type.substr(type.find_last_of(":", 8)); + if (type != name(*this) && scalar_type == name(*this)) { + type = scalar_type; + } + if (type != name(*this)) { + std::cerr << "File read error: wrong data type (" << type << "), expected (" << name(*this) << ")." << std::endl; + exit(-2); + } + + // dimension error check + int dimen; + input >> dimen; + if (dimen != dim) { + std::cerr << "File read error: wrong dimension (" << dimen << ")." << std::endl; + exit(-3); + } + + // read number of fields + input >> fields; + + // read grid size + for (int i=0; i> g0[i] >> g1[i]; + + // set number of ghosts + ghosts = GHOSTS; + #ifndef MPI_VERSION + ghosts = 0; + #endif + + // setup grid parameters + if (data!=NULL) { + delete [] data; + data=NULL; + } + setup(SINGLE); + + // read cell spacing + for (int i=0; i> dx[i]; + + // ignore trailing endlines + input.ignore(10, '\n'); + + // input grid data + read(input, GHOSTS); + + // ghostswap if necessary + if (not SINGLE) ghostswap(); + input.close(); +} + +template void grid::read(std::ifstream& file, int GHOSTS) +{ + /* + Reads each block of the input file and constructs a + temporary grid, "GRID". Then compares the spatial extents of + the block (lmin, lmax) to the local grid (this->x0, this->x1). + Data is copied from the region where both overlap, if it exists. + Then the next block is read. + */ + // read number of blocks + int blocks; + file.read(reinterpret_cast(&blocks), sizeof(blocks)); + + #ifdef GRIDDEBUG + int actual_read=0; + unsigned long data_read=0; + #endif + + // for each block... + for (int i=0; i(&lmin[j]), sizeof(lmin[j])); + file.read(reinterpret_cast(&lmax[j]), sizeof(lmax[j])); + } + int blo[dim]; + int bhi[dim]; + // read boundary conditions + for (int j=0; j(&blo[j]), sizeof(blo[j])); + file.read(reinterpret_cast(&bhi[j]), sizeof(bhi[j])); + } + + // read block data + unsigned long size_on_disk, size_in_mem; + file.read(reinterpret_cast(&size_in_mem), sizeof(size_in_mem)); // read grid data size + file.read(reinterpret_cast(&size_on_disk), sizeof(size_on_disk)); // read compressed size + + // find overlapping region + int min[dim]; + int max[dim]; + bool overlap = true; + for (int j=0; j x1[j]) ? x1[j] : lmax[j]; + if (min[j] >= max[j]) overlap = false; + } + + if (overlap) { + #ifdef GRIDDEBUG + ++actual_read; + data_read+=size_on_disk; + #endif + char* buffer = new char[size_on_disk]; + file.read(buffer, size_on_disk); + grid GRID(fields, lmin, lmax, 0, true); + if (size_in_mem!=size_on_disk) { + #ifdef RAW + std::cerr<<"Unable to uncompress data: compiled without zlib."<(raw), &size_in_mem, reinterpret_cast(buffer), size_on_disk); + switch ( status ) { + case Z_OK: + break; + case Z_MEM_ERROR: + std::cerr << "Uncompress: out of memory." << std::endl; + exit(1); // quit. + break; + case Z_BUF_ERROR: + std::cerr << "Uncompress: output buffer wasn't large enough." << std::endl; + exit(1); // quit. + break; + } + GRID.from_buffer(raw); + delete [] raw; + raw=NULL; + #endif + } else GRID.from_buffer(buffer); + delete [] buffer; + buffer=NULL; + + // copy block data that overlaps + unsigned long size = GRID.buffer_size(min, max); + buffer = new char[size]; + GRID.to_buffer(buffer, min, max); + this->from_buffer(buffer, min, max); + delete [] buffer; + buffer=NULL; + + // set boundary conditions from file + for (int j=0; j void grid::output(const char* filename) const +{ + #ifndef MPI_VERSION + unsigned int np=1; + // file open error check + std::ofstream output(filename); + if (!output) { + std::cerr << "File output error: could not open "; + std::cerr << filename << "." << std::endl; + MMSP::Abort(-1); + } + + std::stringstream outstr; + + // get grid data type + std::string type = name(*this); + outstr << type << '\n'; + + // get grid dimension + outstr << dim << '\n'; + + // get number of fields + outstr << fields << '\n'; + + // get grid size + for (int i=0; i(&np), sizeof(np)); + + // get grid data to write + char* buffer; + unsigned long size_of_buffer = this->write_buffer(buffer); + // output grid data + output.write(buffer, size_of_buffer); + delete [] buffer; + buffer=NULL; + + + #else + /* MPI-IO write to disk */ + + // MPI C-style functions require char*, not const char*, filename + char fname[FILENAME_MAX] = {}; // initializes array with null chars + // C-style strings are null-terminated ('\0') by definition + for (unsigned int i=0; i(&np), sizeof(np), MPI_CHAR, &status); + + header_offset+=sizeof(np); + delete [] header; + header=NULL; + } + MPI_File_sync(output); + MPI::COMM_WORLD.Barrier(); + MPI::COMM_WORLD.Bcast(&header_offset, 1, MPI_UNSIGNED_LONG, 0); // broadcast header size from rank 0 + + // get grid data to write + char* buffer=NULL; + unsigned long size_of_buffer = this->write_buffer(buffer); + assert(buffer!=NULL); + + // Compute file offsets based on buffer sizes + unsigned long* datasizes = new unsigned long[np]; + MPI::COMM_WORLD.Allgather(&size_of_buffer, 1, MPI_UNSIGNED_LONG, datasizes, 1, MPI_UNSIGNED_LONG); + + // Calculate disk space + unsigned long filesize=0; + for (unsigned int i=0; i(std::numeric_limits::max())); + offsets[n]=offsets[n-1]+datasizes[n-1]; + } + #ifdef GRIDDEBUG + assert(datasizes[rank]==size_of_buffer); + if (rank==0) std::cout<<" Synchronized data offsets on "<(actual_size)); + } + + delete [] offsets; + offsets=NULL; + delete [] datasizes; + datasizes=NULL; + + } else { + + // Custom MPI-IO for large-block filesystems, such as IBM GPFS: + // Two-stage aggregate+write IO, one rank per block at MOST + // create buffer pointers + unsigned long* datasizes = NULL; + unsigned long* offsets = NULL; + unsigned long* aoffsets = NULL; + unsigned long* misalignments = NULL; + char* databuffer=NULL; + char* headbuffer=NULL; + char* filebuffer=NULL; + unsigned int* writeranks=NULL; + MPI_Request* recvrequests = NULL; + MPI_Status* recvstatuses = NULL; + int mpi_err = 0; + + // get grid data to write + const unsigned long size_of_buffer = write_buffer(databuffer); + assert(databuffer!=NULL); + // Generate MMSP header from rank 0 + unsigned long header_offset=0; + if (rank==0) { + // get grid data type + std::string type = name(*this); + + std::stringstream outstr; + outstr << type << '\n'; + outstr << dim << '\n'; + outstr << MMSP::fields(*this) << '\n'; + + for (int i=0; i(&np), sizeof(np)); + header_offset+=sizeof(rank); + } + MPI::COMM_WORLD.Bcast(&header_offset, 1, MPI_UNSIGNED_LONG, 0); // broadcast header size from rank 0 + #ifdef GRIDDEBUG + if (rank==0) std::cout<<"Prepared file header."<(std::numeric_limits::max())); + offsets[n]=offsets[n-1]+datasizes[n-1]; + } + offsets[0]=0; + #ifdef GRIDDEBUG + assert(datasizes[rank]==size_of_buffer); + if (rank==0) std::cout<<" Synchronized data offsets on "<np)?np:blocks; + const unsigned long writesize=blocksize*(blocks/nwriters); + assert(writesize % blocksize==0); + const unsigned long excessblocks=blocks % nwriters; + bool isWriter=false; + #ifdef GRIDDEBUG + if (rank==0) std::cout<<" Preparing "<0)?ws+aoffsets[w-1]:0; + while ((aoffsets[w] > offsets[temprank]+datasizes[temprank]) && temprank=rank) + --prevwriter; + } + if (rank>=writeranks[nwriters-1]) { + nextwriter=nwriters; + } else { + while (writeranks[nextwriter]<=rank) + ++nextwriter; + } + + unsigned long ws = writesize; + if (nextwriter<=excessblocks) + ws+=blocksize; + if (rank>=writeranks[nwriters-1]) + ws=filesize-aoffsets[nwriters-1]; // last block may be only partially-filled + + unsigned long deficiency=0; + if (rank>0) { + unsigned long prevws = (prevwriter>=excessblocks)?writesize:writesize+blocksize; + deficiency = aoffsets[prevwriter]+prevws - offsets[rank]; + if (deficiency>datasizes[rank]) + deficiency=datasizes[rank]; + } + // Collect block misalignments + misalignments = new unsigned long[np]; + MPI::COMM_WORLD.Allgather(&deficiency, 1, MPI_UNSIGNED_LONG, misalignments, 1, MPI_UNSIGNED_LONG); + + #ifdef GRIDDEBUG + if (datasizes[rank]-deficiency>ws) + std::fprintf(stderr, "Error on Rank %u, alignment: buffered %lu B > writesize %lu B.\n", rank, datasizes[rank]-deficiency, ws); + #endif + + // Accumulate data + const unsigned int silentranks=writeranks[nextwriter]-rank; // number of MPI ranks between this rank and the next writer + MPI_Request sendrequest; + MPI::COMM_WORLD.Barrier(); + if (isWriter) { + // This rank is a writer. + assert(misalignments[rank] < datasizes[rank]); + #ifdef GRIDDEBUG + if (rank>0 && writeranks[prevwriter+1]!=rank) + std::fprintf(stderr, "Error on Rank %u, writer ID: %u != %u\n", rank, writeranks[prevwriter+1], rank); + #endif + + // Copy local data into filebuffer + filebuffer = new char[ws]; + char* p = filebuffer; + if (rank==0) { + memcpy(p, headbuffer, header_offset); + p+=header_offset; + } + #ifdef GRIDDEBUG + if (datasizes[rank]-misalignments[rank]>ws) + std::fprintf(stderr, "Error on Rank %u, memcpy: %lu B > %lu B\n", rank, datasizes[rank]-misalignments[rank], ws); + #endif + char* q=databuffer+misalignments[rank]; + memcpy(p, q, datasizes[rank]-misalignments[rank]); + p+=datasizes[rank]-misalignments[rank]; + + // Recv remote data into filebuffer + if (silentranks>0) { + recvrequests = new MPI_Request[silentranks]; + recvstatuses = new MPI_Status[silentranks]; + } + for (unsigned int i=0; inp) + std::fprintf(stderr, "Error on Rank %u, receiving: recv_proc=%i\n", rank, recv_proc); + #endif + unsigned long recv_size = misalignments[recv_proc]; + if (recv_size==0) continue; + #ifdef GRIDDEBUG + if (p+recv_size>filebuffer+ws) + std::fprintf(stderr, "Error on Rank %u, receiving from %i: %lu B > %lu B\n", rank, recv_proc, p-filebuffer, ws-recv_size); + #endif + MPI_Irecv(p, recv_size, MPI_CHAR, recv_proc, recv_proc, MPI::COMM_WORLD, &recvrequests[i]); + p+=recv_size; + } + #ifdef GRIDDEBUG + if (p-filebuffer!=int(ws)) + std::fprintf(stderr, "Error on Rank %u, total received: %i B != %lu B\n", rank, int(p-filebuffer), ws); + #endif + if (rank>0 && misalignments[rank]>0) { + q=databuffer; + assert(writeranks[prevwriter]= datasizes[rank]) { + assert(writeranks[prevwriter]0) MPI_Wait(&sendrequest, &status); + MPI::COMM_WORLD.Barrier(); + + // file open error check + #ifdef GRIDDEBUG + if (rank==0) std::cout<<" Opening "< unsigned long grid::write_buffer(char*& buf) const +{ + // Find out how big the dataset is + unsigned long size_in_mem = this->buffer_size(); + unsigned long size_on_disk = 1.125 * size_in_mem + 12; + #ifdef RAW + size_on_disk=size_in_mem; + #endif + + // Figure out the block extents + unsigned long header_size = 0; + for (int j=0; j(sizeof(x0[j])); + header_size += static_cast(sizeof(x1[j])); + header_size += static_cast(sizeof(b0[j])); + header_size += static_cast(sizeof(b1[j])); + } + // Make a buffer to hold all the data + const unsigned long size_of_buffer = header_size + static_cast(sizeof(size_in_mem)) + + size_on_disk + static_cast(sizeof(size_on_disk)); + buf = new char[size_of_buffer]; + char* dst = buf; + unsigned long increment=0; // number of bytes to copy + + // Write local limits + for (int j=0; j(&x0[j]), increment); + dst += increment; + increment = sizeof(x1[j]); + memcpy(dst, reinterpret_cast(&x1[j]), increment); + dst += increment; + } + + // Write local boundary conditions + for (int j=0; j(&b0[j]), increment); + dst += increment; + increment = sizeof(b1[j]); + memcpy(dst, reinterpret_cast(&b1[j]), increment); + dst += increment; + } + + // Write the size of the raw data block + increment = sizeof(size_in_mem); + memcpy(dst, reinterpret_cast(&size_in_mem), increment); + dst += increment; + + // Write the size of the compressed block + #ifndef RAW + char* q(dst); // save current location: need to re-write this value later + #endif + increment = sizeof(size_on_disk); + memcpy(dst, reinterpret_cast(&size_on_disk), increment); + dst += increment; + + // Read the data block from grid private data + #ifdef RAW + size_on_disk=this->to_buffer(dst); + #else + char* raw = new char[size_in_mem]; + size_in_mem = this->to_buffer(raw); + + // Compress the data block to the buffer + int level=9; // highest compression level (slowest speed) + int status = compress2(reinterpret_cast(dst), &size_on_disk, reinterpret_cast(raw), size_in_mem, level); + switch (status) { + case Z_OK: + break; + case Z_MEM_ERROR: + std::cerr << "Compress: out of memory." << std::endl; + exit(1); + break; + case Z_BUF_ERROR: + std::cerr << "Compress: output buffer wasn't large enough." << std::endl; + exit(1); + break; + } + assert(size_on_disk<=size_of_buffer); // Abort if data was lost in compression process. Duplicate of Z_BUF_ERROR check. + dst=NULL; + delete [] raw; + raw=NULL; + + // Re-write the size of the (compressed) data block + increment = sizeof(size_on_disk); + memcpy(q, reinterpret_cast(&size_on_disk), increment); + #endif + + // Return total size of the populated buffer + return header_size + static_cast(sizeof(size_in_mem)) + static_cast(sizeof(size_on_disk)) + size_on_disk; +} +// grid utility functions + +// utility functions +template void grid::swap(grid& GRID) +{ + // swap grid data + T* DATA = data; + data = GRID.data; + GRID.data = DATA; + + // swap number of nodes + int NODES = nodes; + nodes = GRID.nodes; + GRID.nodes = NODES; + + // swap number of cells + int CELLS = cells; + cells = GRID.cells; + GRID.cells = CELLS; + + // swap number of fields + int FIELDS = fields; + fields = GRID.fields; + GRID.fields = FIELDS; + + // swap number of ghosts + int GHOSTS = ghosts; + ghosts = GRID.ghosts; + GRID.ghosts = GHOSTS; + + // swap grid parameters + for (int i=0; i void grid::copy(const grid& GRID) +{ + // initialize data + if (data != NULL) { + delete [] data; + data=NULL; + } + + // copy number of nodes + nodes = GRID.nodes; + + // copy number of cells + cells = GRID.cells; + + // copy number of fields + fields = GRID.fields; + + // copy number of ghosts + ghosts = GRID.ghosts; + + // copy grid parameters + for (int i=0; i T laplacian(const MMSP::grid& GRID, const vector& x) +{ + T laplacian = 0.0; + MMSP::vector s = x; + const T& y = GRID(x); + + for (int i=0; i vector laplacian(const grid >& GRID, const vector& x) +{ + int N = fields(GRID); + vector laplacian(N, 0.0); + vector s = x; + + const vector& y = GRID(x); + + for (int i=0; i& yh = GRID(s); + s[i] -= 2; + const vector& yl = GRID(s); + s[i] += 1; + + double weight = 1.0 / (dx(GRID, i) * dx(GRID, i)); + for (int j=0; j T laplacian(const grid >& GRID, const vector& x, const int field) +{ + T laplacian = 0.0; + vector s = x; + + const T& y = GRID(x)[field]; + + for (int i=0; i sparse laplacian(const grid >& GRID, const vector& x) +{ + sparse laplacian; + vector s = x; + + const sparse& y = GRID(x); + + for (int i=0; i& yh = GRID(s); + s[i] -= 2; + const sparse& yl = GRID(s); + s[i] += 1; + + double weight = 1.0 / (dx(GRID, i) * dx(GRID, i)); + laplacian += weight * (yh - 2.0 * y + yl); + } + return laplacian; +} + +template T laplacian(const grid& GRID, int i) +{ + vector x = GRID.position(i); + return laplacian(GRID, x); +} + +template vector laplacian(const grid >& GRID, int i) +{ + vector x = GRID.position(i); + return laplacian(GRID, x); +} + +template T laplacian(const grid >& GRID, int i, int f) +{ + vector x = GRID.position(i); + return laplacian(GRID, x, f); +} + +template sparse laplacian(const grid >& GRID, int i) +{ + vector x = GRID.position(i); + return laplacian(GRID, x); +} + +template MMSP::vector gradient(const grid& GRID, const vector& x) +{ + vector gradient(dim); + vector s = x; + + for (int i=0; i MMSP::vector gradientsq(const grid& GRID, const vector& x) +{ + vector gradientsq(dim); + vector s = x; + + const T& y = GRID(x); + + for (int i=0; i MMSP::vector gradient(const grid >& GRID, const vector& x, const int field) +{ + vector gradient(dim); + vector s = x; + + for (int i=0; i vector grad(const grid& GRID, const vector& x) +{ + return gradient(GRID, x); +} + +template vector divergence(const grid >& GRID, const vector& x) +{ + vector divergence(dim, 0.0); + vector s = x; + + int N = length(GRID(x)); + + for (int i=0; i& yh = GRID(s); + s[i] -= 2; + const vector& yl = GRID(s); + s[i] += 1; + + double weight = 1.0 / (2.0 * dx(GRID, i)); + for (int j=0; j T divergence(const grid& GRID, const vector& x) +{ + T divergence = 0.0; + vector s = x; + + for (int i=0; i class grid; + +// grid utility functions +template int nodes(const grid& GRID) +{ + return nodes(GRID); +} +template int fields(const grid& GRID) +{ + return fields(GRID); +} +template int ghosts(const grid& GRID) +{ + return ghosts(GRID); +} +template int g0(const grid& GRID, int i) +{ + return g0(GRID, i); +} +template int g1(const grid& GRID, int i) +{ + return g1(GRID, i); +} +template int b0(const grid& GRID, int i) +{ + return b0(GRID, i); +} +template int b1(const grid& GRID, int i) +{ + return b1(GRID, i); +} +template int& b0(grid& GRID, int i) +{ + return b0(GRID, i); +} +template int& b1(grid& GRID, int i) +{ + return b1(GRID, i); +} + +// grid utility functions (all directions) +template int x0(const grid& GRID, int i) +{ + return x0(GRID, i); +} +template int x1(const grid& GRID, int i) +{ + return x1(GRID, i); +} +template int xmin(const grid& GRID, int i) +{ + return xmin(GRID, i); +} +template int xmax(const grid& GRID, int i) +{ + return xmax(GRID, i); +} +template int xlength(const grid& GRID, int i) +{ + return xlength(GRID, i); +} +template double dx(const grid& GRID, int i) +{ + return dx(GRID, i); +} +template double& dx(grid& GRID, int i) +{ + return dx(GRID, i); +} + +// grid utility functions (x direction) +template int x0(const grid& GRID) +{ + return x0(GRID); +} +template int x1(const grid& GRID) +{ + return x1(GRID); +} +template int xmin(const grid& GRID) +{ + return xmin(GRID); +} +template int xmax(const grid& GRID) +{ + return xmax(GRID); +} +template int xlength(const grid& GRID) +{ + return xlength(GRID); +} +template double dx(const grid& GRID) +{ + return dx(GRID); +} +template double& dx(grid& GRID) +{ + return dx(GRID); +} + +// grid utility functions (y direction) +template int y0(const grid& GRID) +{ + return y0(GRID); +} +template int y1(const grid& GRID) +{ + return y1(GRID); +} +template int ymin(const grid& GRID) +{ + return ymin(GRID); +} +template int ymax(const grid& GRID) +{ + return ymax(GRID); +} +template int ylength(const grid& GRID) +{ + return ylength(GRID); +} +template double dy(const grid& GRID) +{ + return dy(GRID); +} +template double& dy(grid& GRID) +{ + return dy(GRID); +} + +// grid utility functions (z direction) +template int z0(const grid& GRID) +{ + return z0(GRID); +} +template int z1(const grid& GRID) +{ + return z1(GRID); +} +template int zmin(const grid& GRID) +{ + return zmin(GRID); +} +template int zmax(const grid& GRID) +{ + return zmax(GRID); +} +template int zlength(const grid& GRID) +{ + return zlength(GRID); +} +template double dz(const grid& GRID) +{ + return dz(GRID); +} +template double& dz(grid& GRID) +{ + return dz(GRID); +} + + +// instantiation of grid class +template +class grid +{ +public: + // constructors + grid(int FIELDS, int min[dim], int max[dim], int GHOSTS=1, bool SINGLE=false); + + grid(int FIELDS, ...); + + grid(const grid& GRID); + + template + grid(const grid& GRID, int FIELDS); + + grid(const char* filename, int GHOSTS = 1); + + void setup(bool SINGLE = false); + // destructor + ~grid(); + + // assignment operators + + template grid& operator=(const U& value); + + template grid& operator=(const grid& GRID); + + template grid& operator+=(const grid& GRID); + + template grid& operator-=(const grid& GRID); + + // subscript operators + target < dim - 1, 0, T > operator [](int x) const; + + T& operator()(MMSP::vector x) const; + + T& operator()(int i) const; + + + // position utility function + MMSP::vector position(int i) const; + + + // parallelization + void ghostswap(); + + void ghostswap(const int sublattice); + + unsigned long buffer_size_save(const int min[dim], const int max[dim]) const; + + unsigned long buffer_size_save(T* p, int i, const int min[dim], const int max[dim]) const; + + unsigned long to_buffer_save(char* buffer, const int min[dim], const int max[dim]) const; + + unsigned long to_buffer_save(char* buffer, T* p, int i, const int min[dim], const int max[dim]) const; + + unsigned long from_buffer_save(char* buffer, const int min[dim], const int max[dim]); + + unsigned long from_buffer_save(char* buffer, T* p, int i, const int min[dim], const int max[dim]); + + unsigned long buffer_size() const; + + unsigned long buffer_size(const int min[dim], const int max[dim]) const; + + unsigned long buffer_size(T* p, int i, const int min[dim], const int max[dim]) const; + + unsigned long to_buffer(char* buffer) const; + + unsigned long to_buffer(char* buffer, const int min[dim], const int max[dim]) const; + + unsigned long to_buffer(char* buffer, T* p, int i, const int min[dim], const int max[dim]) const; + + unsigned long from_buffer(char* buffer); + + unsigned long from_buffer(char* buffer, const int min[dim], const int max[dim]); + + unsigned long from_buffer(char* buffer, T* p, int i, const int min[dim], const int max[dim]); + + // file I/O + void input(const char* filename, int GHOSTS = 1, int SINGLE = false); + + void read(std::ifstream& file, int GHOSTS = 1); + + void output(const char* filename) const; + + unsigned long write_buffer(char*& buf) const; + + // grid utility functions + friend int nodes(const grid& GRID) + { + return GRID.nodes; + } + friend int fields(const grid& GRID) + { + return GRID.fields; + } + friend int ghosts(const grid& GRID) + { + return GRID.ghosts; + } + friend int g0(const grid& GRID, int i) + { + return GRID.g0[i]; + } + friend int g1(const grid& GRID, int i) + { + return GRID.g1[i]; + } + friend int glength(const grid& GRID, int i) + { + return GRID.g1[i] - GRID.g0[i]; + } + friend int b0(const grid& GRID, int i) + { + return GRID.b0[i]; + } + friend int b1(const grid& GRID, int i) + { + return GRID.b1[i]; + } + friend int& b0(grid& GRID, int i) + { + return GRID.b0[i]; + } + friend int& b1(grid& GRID, int i) + { + return GRID.b1[i]; + } + + // grid utility functions (all directions) + friend int x0(const grid& GRID, int i) + { + return GRID.x0[i]; + } + friend int x1(const grid& GRID, int i) + { + return GRID.x1[i]; + } + friend int xmin(const grid& GRID, int i) + { + return GRID.x0[i]; + } + friend int xmax(const grid& GRID, int i) + { + return GRID.x1[i]; + } + friend int xlength(const grid& GRID, int i) + { + return GRID.x1[i] - GRID.x0[i]; + } + friend double dx(const grid& GRID, int i) + { + return GRID.dx[i]; + } + friend double& dx(grid& GRID, int i) + { + return GRID.dx[i]; + } + friend int N0(const grid& GRID, int i) + { + return GRID.n0[i]; + } + friend int N1(const grid& GRID, int i) + { + return GRID.n1[i]; + } + friend int P0(const grid& GRID, int i) + { + return GRID.p0[i]; + } + friend int P1(const grid& GRID, int i) + { + return GRID.p1[i]; + } + friend int sp(const grid& GRID, int i) + { + return GRID.sp[i]; + } + + // grid utility functions (x direction) + friend int x0(const grid& GRID) + { + return GRID.x0[0]; + } + friend int x1(const grid& GRID) + { + return GRID.x1[0]; + } + friend int xmin(const grid& GRID) + { + return GRID.x0[0]; + } + friend int xmax(const grid& GRID) + { + return GRID.x1[0]; + } + friend int xlength(const grid& GRID) + { + return GRID.x1[0] - GRID.x0[0]; + } + friend double dx(const grid& GRID) + { + return GRID.dx[0]; + } + friend double& dx(grid& GRID) + { + return GRID.dx[0]; + } + + // grid utility functions (y direction) + friend int y0(const grid& GRID) + { + return GRID.x0[1]; + } + friend int y1(const grid& GRID) + { + return GRID.x1[1]; + } + friend int ymin(const grid& GRID) + { + return GRID.x0[1]; + } + friend int ymax(const grid& GRID) + { + return GRID.x1[1]; + } + friend int ylength(const grid& GRID) + { + return GRID.x1[1] - GRID.x0[1]; + } + friend double dy(const grid& GRID) + { + return GRID.dx[1]; + } + friend double& dy(grid& GRID) + { + return GRID.dx[1]; + } + // grid utility functions (z direction) + friend int z0(const grid& GRID) + { + return GRID.x0[2]; + } + friend int z1(const grid& GRID) + { + return GRID.x1[2]; + } + friend int zmin(const grid& GRID) + { + return GRID.x0[2]; + } + friend int zmax(const grid& GRID) + { + return GRID.x1[2]; + } + friend int zlength(const grid& GRID) + { + return GRID.x1[2] - GRID.x0[2]; + } + friend double dz(const grid& GRID) + { + return GRID.dx[2]; + } + friend double& dz(grid& GRID) + { + return GRID.dx[2]; + } + + + // utility functions + void swap(grid& GRID); + + void copy(const grid& GRID); + +protected: + T* data; // local grid data + + int nodes; // number of nodes (excluding ghosts) + int cells; // number of nodes (including ghosts) + int fields; // number of fields + int ghosts; // ghost cell depth + + #define dMax 3 + + int g0[dMax]; // global lower coordinate limit (excluding ghosts) + int g1[dMax]; // global upper coordinate limit (excluding ghosts) + + int x0[dMax]; // local lower coordinate limit (excluding ghosts) + int x1[dMax]; // local upper coordinate limit (excluding ghosts) + int xx[dMax]; // local cells in slice (excluding ghosts) + + int s0[dMax]; // local lower coordinate limit (including ghosts) + int s1[dMax]; // local upper coordinate limit (including ghosts) + int sx[dMax]; // local cells in slice (including ghosts) + + int b0[dMax]; // boundary condition at x0 + int b1[dMax]; // boundary condition at x1 + + double dx[dMax]; // global cell spacing + + int p0[dMax]; + int p1[dMax]; + int sp[dMax]; // global processors in slice + + int n0[dMax]; // neighbor processor at x0 + int n1[dMax]; // neighbor processor at x1 +}; + + +// math functions +template T laplacian(const grid& GRID, const vector& x); + +template vector laplacian(const grid >& GRID, const vector& x); + +template T laplacian(const grid >& GRID, const vector& x, const int field); + +template sparse laplacian(const grid >& GRID, const vector& x); + +template T laplacian(const grid& GRID, int i); + +template vector laplacian(const grid >& GRID, int i); + + +template T laplacian(const grid >& GRID, int i, int f); + +template sparse laplacian(const grid >& GRID, int i); + +template vector gradient(const grid& GRID, const vector& x); + +template vector gradient(const grid >& GRID, const vector& x, const int field); + +template vector gradientsq(const grid& GRID, const vector& x); + +template vector grad(const grid& GRID, const vector& x); + +template T divergence(const grid& GRID, const vector& x); + +template vector divergence(const grid >& GRID, const vector& x); + +template T div(const grid& GRID, const vector& x) +{ + return divergence(GRID, x); +} + +template vector div(const grid >& GRID, const vector& x) +{ + return divergence(GRID, x); +} + +// position utility function +template MMSP::vector position(const grid& GRID, int index) +{ + return GRID.position(index); +} + +// parallelization +template void ghostswap(grid& GRID) +{ + GRID.ghostswap(); +} + +template void ghostswap(grid& GRID, const int sublattice) +{ + GRID.ghostswap(sublattice); +} +// buffer I/O functions +template unsigned long buffer_size(const grid& GRID) +{ + return GRID.buffer_size(); +} +template unsigned long to_buffer(const grid& GRID, char* buffer) +{ + return GRID.to_buffer(buffer); +} +template unsigned long from_buffer(grid& GRID, const char* buffer) +{ + return GRID.from_buffer(buffer); +} + +// file I/O functions +template void read(grid& GRID, std::ifstream& file) +{ + GRID.read(file); +} +template void write(const grid& GRID, std::ifstream& file) +{ + GRID.write(file); +} +template void input(grid& GRID, const char* filename, int GHOSTS = 1, int SINGLE = false) +{ + GRID.input(filename, GHOSTS, SINGLE); +} +template void output(const grid& GRID, const char* filename) +{ + GRID.output(filename); +} +template unsigned long write_buffer(const grid& GRID, char*& buf) +{ + return GRID.write_buffer(buf); +} + +// utility functions +template int length(const grid& GRID) +{ + return nodes(GRID); +} +template void resize(int n, grid& GRID) {} +template void swap(grid& GRID1, grid& GRID2) +{ + GRID1.swap(GRID2); +} +template void copy(grid& GRID1, grid& GRID2) +{ + GRID2.copy(GRID1); +} +template std::string name(const grid& GRID) +{ + return std::string("grid:") + name(T()); +} + + +} // namespace MMSP + + +#include "MMSP.grid.cpp" + +#endif diff --git a/examples/pfhub_bm8/include/MMSP.hpp b/examples/pfhub_bm8/include/MMSP.hpp new file mode 100644 index 0000000..dba8adb --- /dev/null +++ b/examples/pfhub_bm8/include/MMSP.hpp @@ -0,0 +1,15 @@ +// MMSP.hpp +// All encompassing MMSP header file +// Questions/comments to gruberja@gmail.com (Jason Gruber) + +#include"MMSP.utility.h" + +#include"MMSP.scalar.h" + +#include"MMSP.vector.h" + +#include"MMSP.sparse.h" + +#include"MMSP.grid.h" + +#include"MMSP.output.h" diff --git a/examples/pfhub_bm8/include/MMSP.main.hpp b/examples/pfhub_bm8/include/MMSP.main.hpp new file mode 100644 index 0000000..9ec3d88 --- /dev/null +++ b/examples/pfhub_bm8/include/MMSP.main.hpp @@ -0,0 +1,356 @@ +// MMSP.main.hpp +// Boilerplate source code for MMSP executables +// Questions/comments to gruberja@gmail.com (Jason Gruber) + +// The user must supply the following in any source +// code that includes this file: +// +// #include"..." +// +// void generate(int dim, +// char* filename); +// template +// void update(GRID& grid, int steps); +// +// #include"MMSP.main.hpp" +// +// The first include must provide the functions +// +// std::string PROGRAM = "..."; +// std::string MESSAGE = "..."; +// typedef ... GRID1D; +// typedef ... GRID2D; +// typedef ... GRID3D; +// +// which the main() function calls to generate +// example grids or to perform computations. + + +#ifndef MMSP_MAIN +#define MMSP_MAIN +#include +#include +#include +#include +#include +#include + +int main(int argc, char* argv[]) { + MMSP::Init(argc, argv); + + // check argument list + if (argc < 2) { + std::cout << PROGRAM << ": bad argument list. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + + // Many of the example programs call rand(). srand() must be called + // _exactly once_, making this the proper place for it. + int rank = 0; + #ifdef MPI_VERSION + rank = MPI::COMM_WORLD.Get_rank(); + #endif + srand(time(NULL)+rank); + + // print help message and exit + if (std::string(argv[1]) == std::string("--help")) { + std::cout << PROGRAM << ": " << MESSAGE << "\n\n"; + std::cout << "Valid command lines have the form:\n\n"; + std::cout << " " << PROGRAM << " "; + std::cout << "[--help] [--example dimension [outfile]] [infile [outfile] steps [increment]]\n\n"; + std::cout << "A few examples of using the command line follow.\n\n"; + std::cout << "The command\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "generates this help message and exits. "; + std::cout << "The \"--example\" option can be used to gen-\nerate a relevant test grid, e.g.\n\n"; + std::cout << " " << PROGRAM << " --example 3\n\n"; + std::cout << "generates an example test problem on a grid of dimension 3 and writes this to the \n"; + std::cout << "file named \"example\", while\n\n"; + std::cout << " " << PROGRAM << " --example 2 start\n\n"; + std::cout << "generates an example test problem on a grid of dimension 2 and writes this to the \n"; + std::cout << "file named \"start\".\n\n"; + std::cout << " " << PROGRAM << " start 1000\n\n"; + std::cout << "reads the grid contained within \"start\" and runs a simulation for 1000 time steps.\n"; + std::cout << "The final grid is written to a file named \"start.1000\".\n\n"; + std::cout << " " << PROGRAM << " start final 1000\n\n"; + std::cout << "reads the grid contained within \"start\" and runs a simulation for 1000 time steps.\n"; + std::cout << "The final grid is written to a file named \"final.1000\".\n\n"; + std::cout << " " << PROGRAM << " start 1000 100\n\n"; + std::cout << "reads the grid contained within \"start\" and runs a simulation for 1000 time steps.\n"; + std::cout << "The grid is then written to a file every 100 time steps. "; + std::cout << "The resulting files are \nnamed \"start.0100\", \"start.0200\", ... \"start.1000\".\n\n"; + std::cout << " " << PROGRAM << " start final 1000 100\n\n"; + std::cout << "reads the grid contained within \"start\" and runs a simulation for 1000 time steps.\n"; + std::cout << "The grid is then written to a file every 100 time steps. "; + std::cout << "The resulting files are \nnamed \"final.0100\", \"final.0200\", ... \"final.1000\".\n\n"; + exit(0); + } + + // generate example grid + else if (std::string(argv[1]) == std::string("--example")) { + // check argument list + if (argc<3 or argc>4) { + std::cout << PROGRAM << ": bad argument list. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + + // check problem dimension + if (std::string(argv[2]).find_first_not_of("0123456789") != std::string::npos) { + std::cout << PROGRAM << ": example grid must have integral dimension. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + + int dim = atoi(argv[2]); + + // set output file name + std::string outfile; + if (argc < 4) outfile = "example"; + else outfile = argv[3]; + + char* filename = new char[outfile.length()+1]; + for (unsigned int i=0; i5) { + std::cout << PROGRAM << ": bad argument list. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + + int steps; + int increment; + std::string outfile; + + if (std::string(argv[2]).find_first_not_of("0123456789") == std::string::npos) { + // set output file name + outfile = argv[1]; + + // must have integral number of time steps + if (std::string(argv[2]).find_first_not_of("0123456789") != std::string::npos) { + std::cout << PROGRAM << ": number of time steps must have integral value. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + + steps = atoi(argv[2]); + increment = steps; + + if (argc > 3) { + // must have integral output increment + if (std::string(argv[3]).find_first_not_of("0123456789") != std::string::npos) { + std::cout << PROGRAM << ": output increment must have integral value. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + + increment = atoi(argv[3]); + + // output increment must be smaller than number of steps + if (increment > steps) { + std::cout << PROGRAM << ": output increment must be smaller than number of time steps. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + } + } + + else { + // set output file name + outfile = argv[2]; + + // set number of time steps + if (std::string(argv[3]).find_first_not_of("0123456789") != std::string::npos) { + // must have integral number of time steps + std::cout << PROGRAM << ": number of time steps must have integral value. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + + steps = atoi(argv[3]); + increment = steps; + + if (argc > 4) { + // must have integral output increment + if (std::string(argv[4]).find_first_not_of("0123456789") != std::string::npos) { + std::cout << PROGRAM << ": output increment must have integral value. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + + increment = atoi(argv[4]); + + // output increment must be smaller than number of steps + if (increment > steps) { + std::cout << PROGRAM << ": output increment must be smaller than number of time steps. Use\n\n"; + std::cout << " " << PROGRAM << " --help\n\n"; + std::cout << "to generate help message.\n\n"; + MMSP::Abort(-1); + } + } + } + + // file open error check + std::ifstream input(argv[1]); + if (!input) { + std::cerr << "File input error: could not open " << argv[1] << ".\n\n"; + MMSP::Abort(-1); + } + + // read data type + std::string type; + getline(input, type, '\n'); + + // grid type error check + if (type.substr(0, 4) != "grid") { + std::cerr << "File input error: file does not contain grid data." << std::endl; + MMSP::Abort(-1); + } + + // read grid dimension + int dim; + input >> dim; + + input.close(); + + // set output file basename + int iterations_start(0); + if (outfile.find_first_of(".") != outfile.find_last_of(".")) { + std::string number = outfile.substr(outfile.find_first_of(".") + 1, outfile.find_last_of(".") - 1); + iterations_start = atoi(number.c_str()); + } + std::string base; + if (outfile.find(".", outfile.find_first_of(".") + 1) == std::string::npos) // only one dot found + base = outfile.substr(0, outfile.find_last_of(".")) + "."; + else { + int last_dot = outfile.find_last_of("."); + int prev_dot = outfile.rfind('.', last_dot - 1); + std::string number = outfile.substr(prev_dot + 1, last_dot - prev_dot - 1); + bool isNumeric(true); + for (unsigned int i = 0; i < number.size(); ++i) { + if (!isdigit(number[i])) isNumeric = false; + } + if (isNumeric) + base = outfile.substr(0, outfile.rfind(".", outfile.find_last_of(".") - 1)) + "."; + else base = outfile.substr(0, outfile.find_last_of(".")) + "."; + } + + // set output file suffix + std::string suffix = ""; + if (outfile.find_last_of(".") != std::string::npos) + suffix = outfile.substr(outfile.find_last_of("."), std::string::npos); + + // set output filename length + int length = base.length() + suffix.length(); + if (1) { + std::stringstream slength; + slength << steps; + length += slength.str().length(); + } + + + if (dim == 1) { + // construct grid object + GRID1D grid(argv[1]); + + // perform computation + for (int i = iterations_start; i < steps; i += increment) { + MMSP::update(grid, increment); + + // generate output filename + std::stringstream outstr; + int n = outstr.str().length(); + for (int j = 0; n < length; j++) { + outstr.str(""); + outstr << base; + for (int k = 0; k < j; k++) outstr << 0; + outstr << i + increment << suffix; + n = outstr.str().length(); + } + + char filename[FILENAME_MAX] = {}; // initialize null characters + for (unsigned int j=0; j +#include + +namespace MMSP { + +#ifdef PNG_LIBPNG_VER +int writePNG(const int w, const int h, const int bpp, unsigned char* imData, const char* filename) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write PNG in parallel." < +void scalar_field_to_png(const grid& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const unsigned int& bufsize, unsigned char* buffer) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write PNG in parallel." <max) + max=val; + else if (val x(1,0); + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double val = GRID(x); + if (mode==1) //mag + val = std::fabs(val); + assert(n::iterator it=levelset.begin(); it!=levelset.end(); it++) + if (std::fabs(val-*it)/std::fabs(*it) x(2,0); + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double val = GRID(x); + if (mode==1) //mag + val = std::fabs(val); + assert(n::iterator it=levelset.begin(); it!=levelset.end(); it++) + if (std::fabs(val-*it)/std::fabs(*it) x(3,0); + for (x[2] = g0(GRID,2); x[2] < g1(GRID,2); x[2]++) + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + if (x[sliceaxis]!=slicelevel) // clumsy, but effective + continue; + double val = GRID(x); + if (mode==1) //mag + val = std::fabs(val); + assert(n0) //contour + for (std::set::iterator it=levelset.begin(); it!=levelset.end(); it++) + if (std::fabs(val-*it)/std::fabs(*it) +void vector_field_to_png(const grid >& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const std::set& fieldset, + const unsigned int& bufsize, unsigned char* buffer) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write PNG in parallel." <1) + sum += pow(GRID(n)[i],2.0); + else + sum = GRID(n)[i]; + } else if (mode==1) { // --mag + for (int i=0; i1) + for (std::set::iterator it=fieldset.begin(); it!=fieldset.end(); it++) + sum += pow(GRID(n)[*it],2.0); + else + sum = GRID(n)[*fieldset.begin()]; + } else if (mode==3) { // --exclude + for (int i=0; i::iterator it=fieldset.find(i); + if (it == fieldset.end()) { + if (included>1) + sum += pow(GRID(n)[i],2.0); + else + sum = GRID(n)[i]; + } + } + } + if (mode==1 || included!=1) + sum = std::sqrt(sum); + if (sum>max) + max=sum; + else if (sum x(1,0); + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double sum=0.0; + if (mode==0) { // default selection + for (int i=0; i1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } else if (mode==1) { // --mag + for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) + sum += pow(GRID(x)[*it],2.0); + } else if (mode==3) { // --exclude + for (int i=0; i::iterator it=fieldset.find(i); + if (it == fieldset.end()) { + if (included>1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } + } + if (mode==1 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(2,0); + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double sum=0.0; + if (mode==0) { // default selection + for (int i=0; i1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } else if (mode==1) { // --mag + for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) + sum += pow(GRID(x)[*it],2.0); + } + } else if (mode==3) { // --exclude + for (int i=0; i::iterator it=fieldset.find(i); + if (it == fieldset.end()) { + if (included>1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } + } + if (mode==1 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(3,0); + for (x[2] = g0(GRID,2); x[2] < g1(GRID,2); x[2]++) + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + if (x[sliceaxis]!=slicelevel) // clumsy, but effective + continue; + double sum=0.0; + if (mode==0) { // default selection + for (int i=0; i1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } else if (mode==1) { // --mag + for (int i=0; i::iterator it=fieldset.begin(); it!=fieldset.end(); it++) + sum += pow(GRID(x)[*it],2.0); + } else if (mode==3) { // --exclude + for (int i=0; i::iterator it=fieldset.find(i); + if (it == fieldset.end()) { + if (included>1) + sum += pow(GRID(x)[i],2.0); + else + sum = GRID(x)[i]; + } + } + } + if (mode==1 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) +void sparse_field_to_png(const grid >& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const std::set& fieldset, + const unsigned int& bufsize, unsigned char* buffer) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write PNG in parallel." <::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { + if (included>1) + sum += pow(GRID(n)[*it],2.0); + else + sum = GRID(n)[*it]; + } + } else if (mode==3) { // --exclude + for (int h=0; h::iterator it=fieldset.find(i); + if (it == fieldset.end()) + sum += pow(GRID(n).value(h),2.0); + } + } + if (included!=1) + sum = std::sqrt(sum); + if (sum>max) + max=sum; + else if (sum x(1,0); + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double sum=0.0; + if (mode<2) { // --mag + for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { + if (included>1) + sum += pow(GRID(x)[*it],2.0); + else + sum = GRID(x)[*it]; + } + } else if (mode==3) { // --exclude + for (int h=0; h::iterator it=fieldset.find(i); + if (it == fieldset.end()) + sum += pow(GRID(x).value(h),2.0); + } + } + if (mode!=2 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(2,0); + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + double sum=0.0; + if (mode<2) { // --mag + for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { + if (included>1) + sum += pow(GRID(x)[*it],2.0); + else + sum = GRID(x)[*it]; + } + } else if (mode==3) { // --exclude + for (int h=0; h::iterator it=fieldset.find(i); + if (it == fieldset.end()) + sum += pow(GRID(x).value(h),2.0); + } + } + if (mode!=2 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) x(3,0); + for (x[2] = g0(GRID,2); x[2] < g1(GRID,2); x[2]++) + for (x[1] = g1(GRID,1)-1; x[1] >= g0(GRID,1); x[1]--) + for (x[0] = g0(GRID,0); x[0] < g1(GRID,0); x[0]++) { + if (x[sliceaxis]!=slicelevel) // clumsy, but effective + continue; + double sum=0.0; + if (mode<2) { // --mag + for (int h=0; h::iterator it=fieldset.begin(); it!=fieldset.end(); it++) { + if (included>1) + sum += pow(GRID(x)[*it],2.0); + else + sum = GRID(x)[*it]; + } + } else if (mode==3) { // --exclude + for (int h=0; h::iterator it=fieldset.find(i); + if (it == fieldset.end()) + sum += pow(GRID(x).value(h),2.0); + } + } + if (mode!=2 || included!=1) + sum = std::sqrt(sum); + assert(n0) // --contour + for (std::set::iterator itl=levelset.begin(); itl!=levelset.end(); itl++) + if (std::fabs(GRID(x)[lvlfield]-*itl)/std::fabs(*itl) +void scalar_field_to_vtk(std::string filename, const grid& GRID, const int mode) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write VTK in parallel." < scalarData = vtkSmartPointer::New(); + + if (dim==1) { + scalarData->SetDimensions(x1(GRID)-x0(GRID), 1, 1); + scalarData->SetExtent(x0(GRID), x1(GRID) - 1, 0, 0, 0, 0); + scalarData->SetSpacing(dx(GRID), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + scalarData->SetScalarTypeToFloat(); + scalarData->SetNumberOfScalarComponents(1); + #else + scalarData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(1,0); + for (x[0]=x0(GRID); x[0](scalarData->GetScalarPointer(x[0], 0, 0)); + if (mode==1) { // --mag + *pixel = std::sqrt(GRID(x)*GRID(x)); + } else { + *pixel = GRID(x); + } + } + } else if (dim==2) { + scalarData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + 1); + scalarData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + 0, 0); + scalarData->SetSpacing(dx(GRID, 0), dx(GRID, 1), 1); + #if VTK_MAJOR_VERSION <= 5 + scalarData->SetScalarTypeToFloat(); + scalarData->SetNumberOfScalarComponents(1); + #else + scalarData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(2,0); + for (x[1]=y0(GRID); x[1](scalarData->GetScalarPointer(x[0], x[1], 0)); + if (mode==1) { // --mag + *pixel = std::sqrt(GRID(x)*GRID(x)); + } else { + *pixel = GRID(x); + } + } + } + } else if (dim==3) { + scalarData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + z1(GRID)-z0(GRID)); + scalarData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + z0(GRID), z1(GRID) - 1); + scalarData->SetSpacing(dx(GRID, 0), dx(GRID, 1), dx(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + scalarData->SetScalarTypeToFloat(); + scalarData->SetNumberOfScalarComponents(1); + #else + scalarData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(3,0); + for (x[2]=z0(GRID); x[2](scalarData->GetScalarPointer(x[0], x[1], x[2])); + if (mode==1) { // --mag + *pixel = std::sqrt(GRID(x)*GRID(x)); + } else { + *pixel = GRID(x); + } + } + } + } + } + scalarData->GetPointData()->GetAbstractArray(0)->SetName("scalar_data"); + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(scalarData->GetProducerPort()); + #else + writer->SetInputData(scalarData); + #endif + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); + writer->Write(); + + scalarData = NULL; + writer = NULL; +} + +template +void vector_field_to_vtk(std::string filename, const grid >& GRID, + const int mode, const int field) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write VTK in parallel." < vectorData = vtkSmartPointer::New(); + + if (dim==1) { + vectorData->SetDimensions(x1(GRID)-x0(GRID), 1, 1); + vectorData->SetExtent(x0(GRID), x1(GRID) - 1, 0, 0, 0, 0); + vectorData->SetSpacing(dx(GRID), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + vectorData->SetScalarTypeToFloat(); + if (mode==1 || mode==2 || mode==3) + vectorData->SetNumberOfScalarComponents(1); + else + vectorData->SetNumberOfScalarComponents(fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + vectorData->AllocateScalars(VTK_FLOAT, 1); + else + vectorData->AllocateScalars(VTK_FLOAT, fields(GRID)); + #endif + + vector x(1,0); + for (x[0]=x0(GRID); x[0]& v = GRID(x); + float* pixel = static_cast(vectorData->GetScalarPointer(x[0], 0, 0)); + if (mode==1) { // --mag + double sum = 0.0; + for (int h = 0; h < v.length(); h++) + sum += v[h]*v[h]; + *pixel = std::sqrt(sum); + } else if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < v.length(); h++) + if (v[h] > v[max]) + max = h; + *pixel = max; + } else if (mode==3) { // --field + *pixel = v[field]; + } else { + for (int h = 0; h < v.length(); h++) + pixel[h] = v[h]; + } + } + } else if (dim==2) { + vectorData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + 1); + vectorData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + 0, 0); + vectorData->SetSpacing(dx(GRID, 0), dx(GRID, 1), 1); + #if VTK_MAJOR_VERSION <= 5 + vectorData->SetScalarTypeToFloat(); + if (mode==1 || mode==2 || mode==3) + vectorData->SetNumberOfScalarComponents(1); + else + vectorData->SetNumberOfScalarComponents(fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + vectorData->AllocateScalars(VTK_DOUBLE, 1); + else + vectorData->AllocateScalars(VTK_DOUBLE, fields(GRID)); + #endif + + vector x(2,0); + for (x[1]=y0(GRID); x[1]& v = GRID(x); + double* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], 0)); + if (mode==1) { // --mag + double sum = 0.0; + for (int h = 0; h < v.length(); h++) + sum += v[h]*v[h]; + *pixel = std::sqrt(sum); + } else if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < v.length(); h++) + if (v[h] > v[max]) + max = h; + *pixel = max; + } else if (mode==3) { // --field + *pixel = v[field]; + } else { + for (int h = 0; h < v.length(); h++) + pixel[h] = v[h]; + } + } + } + } else if (dim==3) { + vectorData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + z1(GRID)-z0(GRID)); + vectorData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + z0(GRID), z1(GRID) - 1); + vectorData->SetSpacing(dx(GRID, 0), dx(GRID, 1), dx(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + vectorData->SetScalarTypeToFloat(); + if (mode==1 || mode==2 || mode==3) + vectorData->SetNumberOfScalarComponents(1); + else + vectorData->SetNumberOfScalarComponents(fields(GRID)); + #else + if (mode==1 || mode==2 || mode==3) + vectorData->AllocateScalars(VTK_FLOAT, 1); + else + vectorData->AllocateScalars(VTK_FLOAT, fields(GRID)); + #endif + + vector x(3,0); + for (x[2]=z0(GRID); x[2]& v = GRID(x); + float* pixel = static_cast(vectorData->GetScalarPointer(x[0], x[1], x[2])); + if (mode==1) { // --mag + double sum = 0.0; + for (int h = 0; h < v.length(); h++) + sum += v[h]*v[h]; + *pixel = std::sqrt(sum); + } else if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < v.length(); h++) + if (v[h] > v[max]) + max = h; + *pixel = max; + } else if (mode==3) { // --field + *pixel = v[field]; + } else { + for (int h = 0; h < v.length(); h++) + pixel[h] = v[h]; + } + } + } + } + } + + // vectorData->GetPointData()->GetAbstractArray(0)->SetName("vector_data"); + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(vectorData->GetProducerPort()); + #else + writer->SetInputData(vectorData); + #endif + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); + writer->Write(); + + vectorData = NULL; + writer = NULL; +} + +template +void sparse_field_to_vtk(std::string filename, const grid >& GRID, + const int mode, const int field) +{ + #ifdef MPI_VERSION + std::cerr << "Error: cannot write VTK in parallel." < sparseData = vtkSmartPointer::New(); + + if (dim==1) { + sparseData->SetDimensions(x1(GRID)-x0(GRID), 1, 1); + sparseData->SetExtent(x0(GRID), x1(GRID) - 1, 0, 0, 0, 0); + sparseData->SetSpacing(dx(GRID, 0), 1, 1); + #if VTK_MAJOR_VERSION <= 5 + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToFloat(); + #else + sparseData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(1,0); + for (x[0]=x0(GRID); x[0]& s = GRID(x); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], 0, 0)); + if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < s.length(); h++) + if (s.value(h) > s.value(max)) + max = h; + *pixel = s.index(max); + } else if (mode==3) { // --field + *pixel = s[field]; + } else { // --mag is redundant for sparse + double sum = 0.0; + for (int h = 0; h < s.length(); h++) + sum += s.value(h)*s.value(h); + *pixel = std::sqrt(sum); + } + } + } else if (dim==2) { + sparseData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + 1); + sparseData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + 0, 0); + sparseData->SetSpacing(dx(GRID, 0), dx(GRID, 1), 1); + #if VTK_MAJOR_VERSION <= 5 + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToFloat(); + #else + sparseData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(2,0); + for (x[1]=y0(GRID); x[1]& s = GRID(x); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], 0)); + if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < s.length(); h++) + if (s.value(h) > s.value(max)) + max = h; + *pixel = s.index(max); + } else if (mode==3) { // --field + *pixel = s[field]; + } else { // --mag is redundant for sparse + double sum = 0.0; + for (int h = 0; h < s.length(); h++) + sum += s.value(h)*s.value(h); + *pixel = std::sqrt(sum); + } + } + } + } else if (dim==3) { + sparseData->SetDimensions(x1(GRID)-x0(GRID), + y1(GRID)-y0(GRID), + z1(GRID)-z0(GRID)); + sparseData->SetExtent(x0(GRID), x1(GRID) - 1, + y0(GRID), y1(GRID) - 1, + z0(GRID), z1(GRID) - 1); + sparseData->SetSpacing(dx(GRID, 0), dx(GRID, 1), dx(GRID, 2)); + #if VTK_MAJOR_VERSION <= 5 + sparseData->SetNumberOfScalarComponents(1); + sparseData->SetScalarTypeToFloat(); + #else + sparseData->AllocateScalars(VTK_FLOAT, 1); + #endif + + vector x(3,0); + for (x[2]=z0(GRID); x[2]& s = GRID(x); + float* pixel = static_cast(sparseData->GetScalarPointer(x[0], x[1], x[2])); + if (mode==2) { // --max + // Export index of field with greatest magnitude + int max = 0; + for (int h = 1; h < s.length(); h++) + if (s.value(h) > s.value(max)) + max = h; + *pixel = s.index(max); + } else if (mode==3) { // --field + *pixel = s[field]; + } else { // --mag is redundant for sparse + double sum = 0.0; + for (int h = 0; h < s.length(); h++) + sum += s.value(h)*s.value(h); + *pixel = std::sqrt(sum); + } + } + } + } + } + sparseData->GetPointData()->GetAbstractArray(0)->SetName("sparse_data"); + + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName(filename.c_str()); + #if VTK_MAJOR_VERSION <= 5 + writer->SetInputConnection(sparseData->GetProducerPort()); + #else + writer->SetInputData(sparseData); + #endif + writer->SetDataModeToBinary(); + writer->SetCompressorTypeToZLib(); + writer->Write(); + + sparseData = NULL; + writer = NULL; +} +#endif // VTK + +} // namespace diff --git a/examples/pfhub_bm8/include/MMSP.output.h b/examples/pfhub_bm8/include/MMSP.output.h new file mode 100644 index 0000000..4ec90be --- /dev/null +++ b/examples/pfhub_bm8/include/MMSP.output.h @@ -0,0 +1,51 @@ +// MMSP.output.hpp +// Declaration of MMSP output functions +// Questions/comments to trevor.keller@gmail.com (Trevor Keller) + +#include +#include + +namespace MMSP { + #ifdef PNG_LIBPNG_VER + int writePNG(const int w, const int h, const int bpp, unsigned char* imData, const char* filename); + + template + void scalar_field_to_png(const grid& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const unsigned int& bufsize, unsigned char* buffer); + + template + void vector_field_to_png(const grid >& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& levelset, const int& lvlfield, + const double& contol, const std::set& fieldset, + const unsigned int& bufsize, unsigned char* buffer); + + template + void sparse_field_to_png(const grid >& GRID, + const int& mode, int sliceaxis, int slicelevel, + const double& zoomin, const double& zoomax, + const bool coninv, const std::set& leveOBlset, const int& lvlfield, + const double& contol, const std::set& fieldset, + const unsigned int& bufsize, unsigned char* buffer); + #endif // PNG + + #ifdef VTK_VERSION + template + void scalar_field_to_vtk(std::string filename, const grid& GRID, const int mode); + + template + void vector_field_to_vtk(std::string filename, const grid >& GRID, + const int mode, const int field); + + template + void sparse_field_to_vtk(std::string filename, const grid >& GRID, + const int mode, const int field); + #endif // VTK + +} // namespace + +#include "MMSP.output.cpp" diff --git a/examples/pfhub_bm8/include/MMSP.scalar.h b/examples/pfhub_bm8/include/MMSP.scalar.h new file mode 100644 index 0000000..d407c4c --- /dev/null +++ b/examples/pfhub_bm8/include/MMSP.scalar.h @@ -0,0 +1,249 @@ +// MMSP.scalar.h +// Class definition for the MMSP scalar data structure +// Questions/comments to gruberja@gmail.com (Jason Gruber) + +#ifndef MMSP_SCALAR +#define MMSP_SCALAR +#include"MMSP.utility.h" + +namespace MMSP { + +template class scalar { +public: + // constructors + scalar() {} + scalar(const T& value) { + data = value; + } + scalar(const scalar& s) { + data = s.data; + } + template scalar(const U& value) { + data = static_cast(value); + } + template scalar(const scalar& s) { + data = static_cast(s); + } + + // data access operators + operator T&() { + return data; + } + operator const T&() const { + return data; + } + + // assignment operators + scalar& operator=(const T& value) { + data = value; + return *this; + } + scalar& operator=(const scalar& s) { + data = s.data; + return *this; + } + template scalar& operator=(const U& value) { + data = static_cast(value); + return *this; + } + template scalar& operator=(const scalar& s) { + data = static_cast(s); + return *this; + } + + // buffer I/O functions + int buffer_size() const { + return sizeof(T); + } + int to_buffer(char* buffer) const { + memcpy(buffer, &data, sizeof(T)); + return sizeof(T); + } + int from_buffer(const char* buffer) { + memcpy(&data, buffer, sizeof(T)); + return sizeof(T); + } + + // file I/O functions + void write(std::ofstream& file) const { + file.write(reinterpret_cast(&data), sizeof(T)); + } + void read(std::ifstream& file) { + file.read(reinterpret_cast(&data), sizeof(T)); + } + + // utility functions + int length() const { + return 1; + } + void resize(int n) {} + void copy(const scalar& s) { + memcpy(data, s.data, sizeof(T)); + } + void swap(scalar& s) { + T temp = data; + data = s.data; + s.data = temp; + } + +private: + // object data + T data; +}; + +// buffer I/O functions +template int buffer_size(const scalar& s) { + return s.buffer_size(); +} +template int to_buffer(const scalar& s, char* buffer) { + return s.to_buffer(buffer); +} +template int from_buffer(scalar& s, const char* buffer) { + return s.from_buffer(buffer); +} + +// file I/O functions +template void write(const scalar& s, std::ofstream& file) { + return s.write(file); +} +template void read(scalar& s, std::ifstream& file) { + return s.read(file); +} + +// utility functions +template int length(const scalar& s) { + return s.length(); +} +template void resize(scalar& s, int n) { + s.resize(n); +} +template void copy(scalar& s, const scalar& t) { + s.copy(t); +} +template void swap(scalar& s, scalar& t) { + s.swap(t); +} +template std::string name(const scalar& s) { + return std::string("scalar:") + name(T()); +} + + +// target class: dim = 0 specialization for scalar class +template +class target<0, ind, scalar > { +public: + // constructor + target(scalar* DATA, const int* S0, const int* SX, const int* X0, const int* X1, const int* B0, const int* B1) { + data = DATA; + s0 = S0; + sx = SX; + x0 = X0; + x1 = X1; + b0 = B0; + b1 = B1; + } + + // data access operators + operator T&() { + return *data; + } + operator const T&() const { + return *data; + } + + // assignment operators + scalar& operator=(const T& value) const { + return data->operator=(value); + } + scalar& operator=(const scalar& s) const { + return data->operator=(s); + } + template scalar& operator=(const U& value) const { + return data->operator=(value); + } + template scalar& operator=(const scalar& s) const { + return data->operator=(s); + } + + // buffer I/O functions + int buffer_size() const { + return data->buffer_size(); + } + int to_buffer(char* buffer) const { + return data->to_buffer(buffer); + } + int from_buffer(const char* buffer) const { + return data->from_buffer(buffer); + } + + // file I/O functions + void write(std::ofstream& file) const { + data->write(file); + } + void read(std::ifstream& file) const { + data->read(file); + } + + // utility functions + int length() const { + return data->length(); + } + int resize(int n) const { + return data->resize(n); + } + void copy(const target& t) const { + data->copy(t->data); + } + void swap(const target& t) const { + data->swap(t->data); + } + + // object data + scalar* data; + const int* s0; + const int* sx; + const int* x0; + const int* x1; + const int* b0; + const int* b1; +}; + +// buffer I/O functions +template int buffer_size(const target<0, ind, scalar >& s) { + return s.buffer_size(); +} +template int to_buffer(const target<0, ind, scalar >& s, char* buffer) { + return s.to_buffer(buffer); +} +template int from_buffer(const target<0, ind, scalar >& s, const char* buffer) { + return s.from_buffer(buffer); +} + +// file I/O functions +template void write(const target<0, ind, scalar >& s, std::ofstream& file) { + return s.write(file); +} +template void read(const target<0, ind, scalar >& s, std::ifstream& file) { + return s.read(file); +} + +// utility functions +template int length(const target<0, ind, scalar >& s) { + return s.length(); +} +template void resize(const target<0, ind, scalar >& s, int n) { + s.resize(n); +} +template void copy(const target<0, ind, scalar >& s, const target<0, ind, scalar >& t) { + s.copy(t); +} +template void swap(const target<0, ind, scalar >& s, const target<0, ind, scalar >& t) { + s.swap(t); +} +template std::string name(const target<0, ind, scalar >& s) { + return std::string("scalar:") + name(T()); +} + +} // namespace MMSP + +#endif diff --git a/examples/pfhub_bm8/include/MMSP.sparse.cpp b/examples/pfhub_bm8/include/MMSP.sparse.cpp new file mode 100644 index 0000000..86ebc83 --- /dev/null +++ b/examples/pfhub_bm8/include/MMSP.sparse.cpp @@ -0,0 +1,336 @@ +// MMSP.sparse.h +// Class implementation for the MMSP sparse data structure +// Questions/comments to gruberja@gmail.com (Jason Gruber) + +#include +#include +#include + +namespace MMSP +{ + +// constructors / destructor +template sparse::sparse() +{ + size = 0; + data = NULL; +} + +template sparse::sparse(const sparse& x) +{ + size = x.length(); + data = new item[size]; + memcpy(data, x.data, size * sizeof(item)); +} + +template sparse::~sparse() +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } +} + +// assignment operator +template sparse& sparse::operator=(const sparse& x) +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } + size = x.length(); + data = new item[size]; + //memcpy(data, x.data, size * sizeof(item)); + for (int i = 0; i < size; i++) { + data[i].index = x.index(i); + data[i].value = x.value(i); + } + return *this; +} + +template template sparse& sparse::operator=(const sparse& x) +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } + size = x.length(); + data = new item[size]; + for (int i = 0; i < size; i++) { + data[i].index = x.index(i); + data[i].value = static_cast(x.value(i)); + } + return *this; +} + +// data access operators +template T& sparse::set(int index) +{ + for (int i = 0; i < size; i++) + if (data[i].index == index) + return data[i].value; + + item* temp = new item[size]; + memcpy(temp, data, size * sizeof(item)); + if (data!=NULL) { + delete [] data; + data=NULL; + } + data = new item[size + 1]; + memcpy(data, temp, size * sizeof(item)); + if (temp!=NULL) { + delete [] temp; + temp=NULL; + } + size += 1; + data[size - 1].index = index; + data[size - 1].value = static_cast(0); + return data[size - 1].value; +} + +template T sparse::operator[](int index) const +{ + for (int i = 0; i < size; i++) + if (data[i].index == index) + return data[i].value; + return static_cast(0); +} + +template unsigned int sparse::grain_id() const +{ + unsigned int max_index = 0; + T max_value = -1.0; + + for (int i = 0; i < size; i++) { + if (data[i].value > max_value) { + max_index = data[i].index; + max_value = data[i].value; + } + } + assert(max_index < std::numeric_limits::max()); + return max_index; +} + +template double sparse::getMagPhi() const +{ + double sum = 0.0; + + for (int i = 0; i < size; i++) { + double phi = data[i].value; + sum += phi * phi; + } + + return sqrt(sum); +} + +template int sparse::index(const int& i) const +{ + assert(i < size); + return data[i].index; +} + +template T sparse::value(const int& i) const +{ + assert(i < size); + return data[i].value; +} + +// buffer I/O functions +template int sparse::buffer_size() const +{ + return sizeof(size) + size * sizeof(item); +} + +template int sparse::to_buffer(char* buffer) const +{ + memcpy(buffer, &size, sizeof(size)); + memcpy(buffer + sizeof(size), data, size * sizeof(item)); + return sizeof(size) + size * sizeof(item); +} + +template int sparse::from_buffer(const char* buffer) +{ + memcpy(&size, buffer, sizeof(size)); + if (data!=NULL) { + delete [] data; + data=NULL; + } + data = new item[size]; + memcpy(data, buffer + sizeof(size), size * sizeof(item)); + return sizeof(size) + size * sizeof(item); +} + +// file I/O functions +template void sparse::write(std::ofstream& file) const +{ + file.write(reinterpret_cast(&size), sizeof(size)); + file.write(reinterpret_cast(data), size * sizeof(item)); +} + +template void sparse::read(std::ifstream& file) +{ + file.read(reinterpret_cast(&size), sizeof(size)); + if (data!=NULL) { + delete [] data; + data=NULL; + } + data = new item[size]; + file.read(reinterpret_cast(data), size * sizeof(item)); +} + +// utility functions +template int sparse::length() const +{ + return size; +} + +template void sparse::resize(int n) {} + +template void sparse::copy(const sparse& s) +{ + size = s.size; + if (data!=NULL) { + delete [] data; + data=NULL; + } + data = new item[size]; + memcpy(data, s.data, size * sizeof(item)); +} + +template void sparse::swap(sparse& s) +{ + item* t = data; + data = s.data; + s.data = t; + int l = size; + size = s.size; + s.size = l; +} + +// numerical operators +template sparse max(const sparse& x, const sparse& y) +{ + sparse z; + int N1 = x.length(); + for (int i = 0; i < N1; i++) { + T val = x.value(i); + int ind = x.index(i); + z.set(ind) = MMSP::max(val, y[ind]); + } + int N2 = y.length(); + for (int i = 0; i < N2; i++) { + T val = y.value(i); + int ind = y.index(i); + z.set(ind) = MMSP::max(val, x[ind]); + } + return z; +} + +template sparse min(const sparse& x, const sparse& y) +{ + sparse z; + int N1 = x.length(); + for (int i = 0; i < N1; i++) { + T val = x.value(i); + int ind = x.index(i); + z.set(ind) = MMSP::min(val, y[ind]); + } + int N2 = y.length(); + for (int i = 0; i < N2; i++) { + T val = y.value(i); + int ind = y.index(i); + z.set(ind) = MMSP::min(val, x[ind]); + } + return z; +} + +template sparse& operator+=(sparse& x, const sparse& y) +{ + int N = y.length(); + for (int i = 0; i < N; i++) + x.set(y.index(i)) += static_cast(y.value(i)); + return x; +} + +template sparse operator+(const sparse& x, const sparse& y) +{ + sparse z; + int N1 = x.length(); + for (int i = 0; i < N1; i++) + z.set(x.index(i)) += static_cast(x.value(i)); + int N2 = y.length(); + for (int i = 0; i < N2; i++) + z.set(y.index(i)) += static_cast(y.value(i)); + return z; +} + +template sparse& operator-=(sparse& x, const sparse& y) +{ + int N = y.length(); + for (int i = 0; i < N; i++) + x.set(y.index(i)) -= static_cast(y.value(i)); + return x; +} + +template sparse operator-(const sparse& x, const sparse& y) +{ + sparse z; + int N1 = x.length(); + for (int i = 0; i < N1; i++) + z.set(x.index(i)) += static_cast(x.value(i)); + int N2 = y.length(); + for (int i = 0; i < N2; i++) + z.set(y.index(i)) -= static_cast(y.value(i)); + return z; +} + +template sparse& operator*=(sparse& x, const U& value) +{ + int N = x.length(); + for (int i = 0; i < N; i++) + x.set(x.index(i)) *= static_cast(value); + return x; +} + +template sparse operator*(const U& value, const sparse& x) +{ + sparse z; + int N = x.length(); + for (int i = 0; i < N; i++) + z.set(x.index(i)) = static_cast(value) * x.value(i); + return z; +} + +template target<0,ind,sparse >::target(sparse* DATA, const int* S0, const int* SX, const int* X0, const int* X1, const int* B0, const int* B1) +{ + data = DATA; + s0 = S0; + sx = SX; + x0 = X0; + x1 = X1; + b0 = B0; + b1 = B1; +} + +template bool operator==(const sparse& a, const sparse& b) +{ + int N=a.length(); + if (N != b.length()) return false; + for (int i = 0; i < N; i++) { + int indexA = a.index(i); + bool found=false; + bool match=false; + for (int j=0; j +struct item { + int index; + T value; +}; + +template +class sparse { +public: + // constructors / destructor + sparse(); + sparse(const sparse& x); + ~sparse(); + + // assignment operator + sparse& operator=(const sparse& x); + template sparse& operator=(const sparse& x); + + // data access operators + T& set(int index); + + T operator[](int index) const; + + unsigned int grain_id() const; + double getMagPhi() const; + + int index(const int& i) const; + T value(const int& i) const; + + // buffer I/O functions + int buffer_size() const; + int to_buffer(char* buffer) const; + int from_buffer(const char* buffer); + + // file I/O functions + void write(std::ofstream& file) const; + void read(std::ifstream& file); + + // utility functions + int length() const; + void resize(int n); + void copy(const sparse& s); + void swap(sparse& s); + +private: + // object data + item* data; + int size; +}; + +// buffer I/O functions +template int buffer_size(const sparse& s) { + return s.buffer_size(); +} +template int to_buffer(const sparse& s, char* buffer) { + return s.to_buffer(buffer); +} +template int from_buffer(sparse& s, const char* buffer) { + return s.from_buffer(buffer); +} + +// file I/O functions +template void write(const sparse& s, std::ofstream& file) { + return s.write(file); +} +template void read(sparse& s, std::ifstream& file) { + return s.read(file); +} + +// utility functions +template int length(const sparse& s) { + return s.length(); +} +template void resize(sparse& s, int n) { + s.resize(n); +} +template void copy(sparse& s, const sparse& t) { + s.copy(t); +} +template void swap(sparse& s, sparse& t) { + s.swap(t); +} + +template T& set(sparse& s, int index) { + return s.set(index); +} +template int index(const sparse& s, int i) { + return s.index(i); +} +template T value(const sparse& s, int i) { + return s.value(i); +} +template std::string name(const sparse& s) { + return std::string("sparse:") + name(T()); +} + +// numerical operators +template sparse max(const sparse& x, const sparse& y); + +template sparse min(const sparse& x, const sparse& y); + +template sparse& operator+=(sparse& x, const sparse& y); + +template sparse operator+(const sparse& x, const sparse& y); + +template sparse& operator-=(sparse& x, const sparse& y); + +template sparse operator-(const sparse& x, const sparse& y); + +template sparse& operator*=(sparse& x, const U& value); + +template sparse operator*(const U& value, const sparse& x); + + +// target class: dim = 0 specialization for sparse class +template +class target<0, ind, sparse > { +public: + target(sparse* DATA, const int* S0, const int* SX, const int* X0, const int* X1, const int* B0, const int* B1); + + operator sparse&() { + return *data; + } + operator const sparse&() const { + return *data; + } + T operator[](int i) { + return data->operator[](i); + } + const T operator[](int i) const { + return data->operator[](i); + } + + sparse& operator=(const sparse& s) const { + return data->operator=(s); + } + template sparse& operator=(const sparse& s) const { + return data->operator=(s); + } + + int buffer_size() const { + return data->buffer_size(); + } + int to_buffer(char* buffer) const { + return data->to_buffer(buffer); + } + int from_buffer(const char* buffer) const { + return data->from_buffer(buffer); + } + + void write(std::ofstream& file) const { + data->write(file); + } + void read(std::ifstream& file) const { + data->read(file); + } + + int length() const { + return data->length(); + } + int resize(int n) const { + return data->resize(n); + } + void copy(const target& t) const { + return data->copy(t->data); + } + void swap(const target& t) const { + return data->swap(t->data); + } + + T& set(int index) const { + return data->set(index); + } + int index(int i) const { + return data->index(i); + } + T value(int i) const { + return data->value(i); + } + + sparse* data; + const int* s0; + const int* sx; + const int* x0; + const int* x1; + const int* b0; + const int* b1; +}; + +template T& set(const target<0, ind, sparse >& s, int index) { + return s.set(index); +} +template int index(const target<0, ind, sparse >& s, int i) { + return s.index(i); +} +template T value(const target<0, ind, sparse >& s, int i) { + return s.value(i); +} + +// buffer I/O functions +template int buffer_size(const target<0, ind, sparse >& s) { + return s.buffer_size(); +} +template int to_buffer(const target<0, ind, sparse >& s, char* buffer) { + return s.to_buffer(buffer); +} +template int from_buffer(const target<0, ind, sparse >& s, const char* buffer) { + return s.from_buffer(buffer); +} + +// file I/O functions +template void write(const target<0, ind, sparse >& s, std::ofstream& file) { + return s.write(file); +} +template void read(const target<0, ind, sparse >& s, std::ifstream& file) { + return s.read(file); +} + +// utility functions +template int length(const target<0, ind, sparse >& s) { + return s.length(); +} +template void resize(const target<0, ind, sparse >& s, int n) { + s.resize(n); +} +template void copy(const target<0, ind, sparse >& s, const target<0, ind, sparse >& t) { + s.copy(t); +} +template void swap(const target<0, ind, sparse >& s, const target<0, ind, sparse >& t) { + s.swap(t); +} +template std::string name(const target<0, ind, sparse >& s) { + return std::string("sparse:") + name(T()); +} + +// numerical operators +template +sparse& min(target<0, ind, sparse > x, const target<0, ind, sparse >& y) { + return min(*(x.data), *(y.data)); +} +template +sparse& max(target<0, ind, sparse > x, const target<0, ind, sparse >& y) { + return max(*(x.data), *(y.data)); +} +template +sparse& operator+=(target<0, ind, sparse > x, const target<0, ind, sparse >& y) { + return operator+=(*(x.data), *(y.data)); +} +template +sparse operator+(const target<0, ind, sparse > x, const target<0, ind, sparse >& y) { + return operator+(*(x.data), *(y.data)); +} +template +sparse& operator-=(target<0, ind, sparse > x, const target<0, ind, sparse >& y) { + return operator-=(*(x.data), *(y.data)); +} +template +sparse operator-(const target<0, ind, sparse > x, const target<0, ind, sparse >& y) { + return operator-(*(x.data), *(y.data)); +} +template +sparse& operator*=(target<0, ind, sparse > x, const U& value) { + return operator*=(*(x.data), value); +} +template +sparse operator*(const U& value, const target<0, ind, sparse >& x) { + return operator*(value, *(x.data)); +} +template bool operator==(const sparse& a, const sparse& b); + + +} // namespace MMSP + +#include "MMSP.sparse.cpp" + +#endif diff --git a/examples/pfhub_bm8/include/MMSP.utility.cpp b/examples/pfhub_bm8/include/MMSP.utility.cpp new file mode 100644 index 0000000..2cb51a1 --- /dev/null +++ b/examples/pfhub_bm8/include/MMSP.utility.cpp @@ -0,0 +1,174 @@ +// MMSP.utility.cpp +// Utility function and class implementations for MMSP +// Questions/comments to gruberja@gmail.com (Jason Gruber) + +#include +#include +#include +#include + +namespace MMSP +{ + +// MMSP Init function +void Init(int argc, char* argv[]) +{ + #ifdef MPI_VERSION + MPI::Init(argc, argv); + #endif +} + +// MMSP Finalize function +void Finalize() +{ + #ifdef MPI_VERSION + MPI::Finalize(); + #endif +} + +// MMSP Abort function +void Abort(int err) +{ + #ifdef MPI_VERSION + MPI::COMM_WORLD.Abort(err); + #endif + exit(err); +} + + + +// check_boundary: a utility function that adjusts coordinates +// based on limiting coordinates and boundary conditions +void check_boundary(int& x, int x0, int x1, int b0, int b1) +{ + if (x < x0) { + if (b0 == Neumann or b0 == Dirichlet) x = x0; + #ifndef MPI_VERSION + else if (b0 == periodic) x = x1 - (x0 - x); + #endif + else if (b0 == mirror) x = 2 * x0 - x; + } else if (x >= x1) { + if (b1 == Neumann or b1 == Dirichlet) x = (x1 - 1); + #ifndef MPI_VERSION + else if (b1 == periodic) x = x0 + (x - x1); + #endif + else if (b1 == mirror) x = 2 * (x1 - 1) - x; + } +} + + +// global reducing function +template T global(T& value, const char* operation) +{ + // initialize global value + T global = value; + + #ifdef MPI_VERSION + int rank = MPI::COMM_WORLD.Get_rank(); + int np = MPI::COMM_WORLD.Get_size(); + + if (rank == 0) { + // receive local values + for (int i = 1; i < np; i++) { + T temp; + int size; + MPI::COMM_WORLD.Recv(&size, 1, MPI_INT, i, 100); + char* buffer = new char[size]; + MPI::COMM_WORLD.Recv(buffer, size, MPI_CHAR, i, 200); + from_buffer(temp, buffer); + if (buffer != NULL) { + delete [] buffer; + buffer=NULL; + } + + // perform operation + if (std::string(operation)=="add" or std::string(operation)=="sum") + global += temp; + else if (std::string(operation)=="min" or std::string(operation)=="minimum") + global = min(global, temp); + else if (std::string(operation)=="max" or std::string(operation)=="maximum") + global = max(global, temp); + } + + // send global value + for (int i = 1; i < np; i++) { + int size = buffer_size(global); + MPI::COMM_WORLD.Send(&size, 1, MPI_INT, i, 300); + char* buffer = new char[size]; + to_buffer(global, buffer); + MPI::COMM_WORLD.Send(buffer, size, MPI_CHAR, i, 400); + if (buffer != NULL) { + delete [] buffer; + buffer=NULL; + } + } + } + + else { + // send local value + int size = buffer_size(value); + MPI::COMM_WORLD.Send(&size, 1, MPI_INT, 0, 100); + char* buffer = new char[size]; + to_buffer(value, buffer); + MPI::COMM_WORLD.Send(buffer, size, MPI_CHAR, 0, 200); + if (buffer != NULL) { + delete [] buffer; + buffer=NULL; + } + + // receive global value + MPI::COMM_WORLD.Recv(&size, 1, MPI_INT, 0, 300); + buffer = new char[size]; + MPI::COMM_WORLD.Recv(buffer, size, MPI_CHAR, 0, 400); + from_buffer(global, buffer); + if (buffer != NULL) { + delete [] buffer; + buffer=NULL; + } + } + + MPI::COMM_WORLD.Barrier(); + #endif + + return global; +} + +void print_progress(const int step, const int steps) +{ + /* + Prints timestamps and a 20-point progress bar to stdout. + Call once inside the update function (or equivalent). + + for (int step=0; step +#include + +namespace MMSP { + +// MMSP Init function +void Init(int argc, char* argv[]); + +// MMSP Finalize function +void Finalize(); + +// MMSP Abort function +void Abort(int err); + +// MMSP boundary conditions +enum { + mirror = 0, + Neumann = 1, + periodic = 2, + parallel = 3, + Dirichlet = 4 +}; + +// check_boundary: a utility function that adjusts coordinates +// based on limiting coordinates and boundary conditions +void check_boundary(int& x, int x0, int x1, int b0, int b1); + + +// target class: a utility class that makes +// grids with array-style subscripting possible +template +class target { +public: + target(T* DATA, const int* S0, const int* SX, const int* X0, const int* X1, const int* B0, const int* B1) { + data = DATA; + s0 = S0; + sx = SX; + x0 = X0; + x1 = X1; + b0 = B0; + b1 = B1; + } + target < dim - 1, index + 1, T > operator[](int x) { + int i = index + 1; + check_boundary(x, x0[i], x1[i], b0[i], b1[i]); + return target < dim - 1, index + 1, T > (data + (x - s0[i]) * sx[i], s0, sx, x0, x1, b0, b1); + } + const target < dim - 1, index + 1, T > operator[](int x) const { + int i = index + 1; + check_boundary(x, x0[i], x1[i], b0[i], b1[i]); + return target < dim - 1, index + 1, T > (data + (x - s0[i]) * sx[i], s0, sx, x0, x1, b0, b1); + } + T* data; + const int* s0; + const int* sx; + const int* x0; + const int* x1; + const int* b0; + const int* b1; +}; + +// target class: dim = 1 specialization for all data types +template +class target<1, index, T> { +public: + target(T* DATA, const int* S0, const int* SX, const int* X0, const int* X1, const int* B0, const int* B1) { + data = DATA; + s0 = S0; + sx = SX; + x0 = X0; + x1 = X1; + b0 = B0; + b1 = B1; + } + T& operator[](int x) { + int i = index + 1; + check_boundary(x, x0[i], x1[i], b0[i], b1[i]); + return *(data + (x - s0[i]) * sx[i]); + } + const T& operator[](int x) const { + int i = index + 1; + check_boundary(x, x0[i], x1[i], b0[i], b1[i]); + return *(data + (x - s0[i]) * sx[i]); + } + T* data; + const int* s0; + const int* sx; + const int* x0; + const int* x1; + const int* b0; + const int* b1; +}; + +// target class: dim = 0 specialization for primitive data types +// this class template must be overloaded for new classes, but +// this is only necessary if grids with dim = 1 are used +template +class target<0, index, T> { +public: + target(T* DATA, const int* S0, const int* SX, const int* X0, const int* X1, const int* B0, const int* B1) { + data = DATA; + s0 = S0; + sx = SX; + x0 = X0; + x1 = X1; + b0 = B0; + b1 = B1; + } + template T& operator=(const U& value) { + *data = value; + return *data; + } + template const T& operator=(const U& value) const { + *data = value; + return *data; + } + operator T&() { + return *data; + } + operator const T&() const { + return *data; + } + T* data; + const int* s0; + const int* sx; + const int* x0; + const int* x1; + const int* b0; + const int* b1; +}; + + +// buffer I/O functions for primitive and POD data types +// overload as friend functions within new non-POD class definitions +template unsigned long buffer_size(const T& value) { + return sizeof(value); +} +template unsigned long to_buffer(const T& value, char* buffer) { + memcpy(buffer, &value, sizeof(value)); + return sizeof(value); +} +template unsigned long from_buffer(T& value, const char* buffer) { + memcpy(&value, buffer, sizeof(value)); + return sizeof(value); +} + +// file I/O functions for primitive and POD data types +// overload as friend functions within new non-POD class definitions +template void read(T& value, std::ifstream& file) { + file.read(reinterpret_cast(&value), sizeof(value)); +} +template void write(const T& value, std::ofstream& file) { + file.write(reinterpret_cast(&value), sizeof(value)); +} + +// utility functions for primitive and POD data types +// overload as friend functions within new non-POD class definitions +template int length(const T& value) { + return 1; +} +template void resize(T& value, int n) { + return; +} +template void copy(T& value, const T& copy) { + value = copy; +} +template void swap(T& value, T& swap) { + T temp = value; + value = swap; + swap = temp; +} + +// status function for type identification +std::string name(const bool& value) { + return "bool"; +} +std::string name(const char& value) { + return "char"; +} +std::string name(const unsigned char& value) { + return "unsigned char"; +} +std::string name(const int& value) { + return "int"; +} +std::string name(const unsigned int& value) { + return "unsigned int"; +} +std::string name(const long& value) { + return "long"; +} +std::string name(const unsigned long& value) { + return "unsigned long"; +} +std::string name(const short& value) { + return "short"; +} +std::string name(const unsigned short& value) { + return "unsigned short"; +} +std::string name(const float& value) { + return "float"; +} +std::string name(const double& value) { + return "double"; +} +std::string name(const long double& value) { + return "long double"; +} + +// mathematical operations +template T max(const T& x, const T& y) { + return x > y ? x : y; +} +template T min(const T& x, const T& y) { + return x < y ? x : y; +} + +// global reducing function +template T global(T& value, const char* operation); + +// simple progress bar for the terminal +void print_progress(const int step, const int steps); + +} // namespace MMSP + +#include "MMSP.utility.cpp" + +#endif diff --git a/examples/pfhub_bm8/include/MMSP.vector.cpp b/examples/pfhub_bm8/include/MMSP.vector.cpp new file mode 100644 index 0000000..6523c64 --- /dev/null +++ b/examples/pfhub_bm8/include/MMSP.vector.cpp @@ -0,0 +1,241 @@ +// MMSP.vector.cpp +// Class implementation for the MMSP vector data structure +// Questions/comments to gruberja@gmail.com (Jason Gruber) + +namespace MMSP +{ + +//vector constructors and destructor +template vector::vector() +{ + size = 0; + data = NULL; +} + +template vector::vector(const vector& v) +{ + size = v.length(); + data = new T[size]; + for (int i = 0; i < size; i++) + data[i] = static_cast(v[i]); +} + +template template vector::vector(const vector& v) +{ + size = v.length(); + data = new T[size]; + for (int i = 0; i < size; i++) + data[i] = static_cast(v[i]); +} + +template vector::vector(int N) +{ + size = N; + data = new T[size]; +} + +template template vector::vector(int N, const U& value) +{ + size = N; + data = new T[size]; + for (int i = 0; i < size; i++) + data[i] = static_cast(value); +} + +template vector::~vector() +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } +} + +// assignment operators +template vector& vector::operator=(const T& value) +{ + for (int i = 0; i < size; i++) + data[i] = static_cast(value); + return *this; +} + +template vector& vector::operator=(const vector& v) +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } + size = v.length(); + data = new T[size]; + for (int i = 0; i < size; i++) + data[i] = static_cast(v[i]); + return *this; +} + +template template vector& vector::operator=(const U& value) +{ + for (int i = 0; i < size; i++) + data[i] = static_cast(value); + return *this; +} + +template template vector& vector::operator=(const vector& v) +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } + size = v.length(); + data = new T[size]; + for (int i = 0; i < size; i++) + data[i] = static_cast(v[i]); + return *this; +} + +// buffer I/O functions +template int vector::buffer_size() const +{ + return sizeof(size) + size * sizeof(T); +} + +template int vector::to_buffer(char* buffer) const +{ + memcpy(buffer, &size, sizeof(size)); + memcpy(buffer + sizeof(size), data, size * sizeof(T)); + return sizeof(size) + size * sizeof(T); +} + +template int vector::from_buffer(const char* buffer) +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } + memcpy(&size, buffer, sizeof(size)); + data = new T[size]; + memcpy(data, buffer + sizeof(size), size * sizeof(T)); + return sizeof(size) + size * sizeof(T); +} + +// file I/O functions +template void vector::write(std::ofstream& file) const +{ + file.write(reinterpret_cast(data), size * sizeof(T)); +} + +template void vector::read(std::ifstream& file) +{ + file.read(reinterpret_cast(data), size * sizeof(T)); +} + +// utility functions +template int vector::length() const +{ + return size; +} + +template void vector::resize(int N) +{ + if (size == 0) { + size = N; + data = new T[size]; + } else if (N > size) { + T* temp = new T[N]; + memcpy(temp, data, size * sizeof(T)); + if (data!=NULL) { + delete [] data; + data=NULL; + } + size = N; + data = new T[size]; + memcpy(data, temp, size * sizeof(T)); + if (temp!=NULL) { + delete [] temp; + temp=NULL; + } + } else if (N < size) { + T* temp = new T[N]; + memcpy(temp, data, N * sizeof(T)); + if (data!=NULL) { + delete [] data; + data=NULL; + } + size = N; + data = new T[size]; + memcpy(data, temp, N * sizeof(T)); + if (temp!=NULL) { + delete [] temp; + temp=NULL; + } + } +} + +template void vector::copy(const vector& v) +{ + if (data!=NULL) { + delete [] data; + data=NULL; + } + size = v.size; + data = new T[size]; + memcpy(data, v.data, size * sizeof(T)); +} + +template void vector::swap(vector& v) +{ + T* temp = data; + data = v.data; + v.data = temp; + int s = size; + size = v.size; + v.size = s; +} + +template template void vector::append(const U& value) +{ + T* temp = new T[size]; + memcpy(temp, data, size * sizeof(T)); + if (data!=NULL) { + delete [] data; + data=NULL; + } + size += 1; + data = new T[size]; + memcpy(data, temp, size * sizeof(T)); + if (temp!=NULL) { + delete [] temp; + temp=NULL; + } + data[size - 1] = static_cast(value); +} + +template template void vector::append(const vector& v) +{ + int N = size; + T* temp = new T[size]; + memcpy(temp, data, size * sizeof(T)); + if (data!=NULL) { + delete [] data; + data=NULL; + } + size += v.length(); + data = new T[size]; + memcpy(data, temp, size * sizeof(T)); + if (temp!=NULL) { + delete [] temp; + temp=NULL; + } + for (int i = N; i < size; i++) + data[i] = static_cast(v[i - N]); +} + +template bool operator==(const vector& a, const vector& b) +{ + int N=a.length(); + if (N != b.length()) return false; + for (int i=0; i +#include"MMSP.utility.h" + +namespace MMSP { + +template class vector { +public: + // constructors / destructor + vector(); + + vector(const vector& v); + + template vector(const vector& v); + + vector(int N); + + template vector(int N, const U& value); + + ~vector(); + + // data access operators + T& operator[](int i) { + assert(i < size); + return data[i]; + } + const T& operator[](int i) const { + assert(i < size); + return data[i]; + } + + // assignment operator + vector& operator=(const T& value); + + vector& operator=(const vector& v); + + template vector& operator=(const U& value); + + template vector& operator=(const vector& v); + + // buffer I/O functions + int buffer_size() const; + + int to_buffer(char* buffer) const; + + int from_buffer(const char* buffer); + + // file I/O functions + void write(std::ofstream& file) const; + + void read(std::ifstream& file); + + // utility functions + int length() const; + + void resize(int N); + + void copy(const vector& v); + + void swap(vector& v); + + template void append(const U& value); + + template void append(const vector& v); +private: + // object data + T* data; + int size; +}; + +// buffer I/O functions +template int buffer_size(const vector& v) { + return v.buffer_size(); +} +template int to_buffer(const vector& v, char* buffer) { + return v.to_buffer(buffer); +} +template int from_buffer(vector& v, const char* buffer) { + return v.from_buffer(buffer); +} + +// file I/O functions +template void write(const vector& v, std::ofstream& file) { + return v.write(file); +} +template void read(vector& v, std::ifstream& file) { + return v.read(file); +} + +// utility functions +template int length(const vector& v) { + return v.length(); +} +template void resize(vector& v, int n) { + v.resize(n); +} +template void copy(vector& v, const vector& w) { + v.copy(w); +} +template void swap(vector& v, vector& w) { + v.swap(w); +} +template void append(vector& v, const U& value) { + v.append(value); +} +template void append(vector& v, const vector& w) { + v.append(w); +} +template std::string name(const vector& s) { + return std::string("vector:") + name(T()); +} + +// mathematical operators +template vector min(const vector& x, const vector& y) { + int N = x.length(); + vector z(N); + for (int i = 0; i < N; i++) z[i] = min(x[i], y[i]); + return z; +} + +template vector max(const vector& x, const vector& y) { + int N = x.length(); + vector z(N); + for (int i = 0; i < N; i++) z[i] = max(x[i], y[i]); + return z; +} + +template vector& operator+=(vector& x, const vector& y) { + int N = x.length(); + for (int i = 0; i < N; i++) x[i] += y[i]; + return x; +} +template vector operator+(const vector& x, const vector& y) { + int N = x.length(); + vector z(N); + for (int i = 0; i < N; i++) z[i] = x[i] + y[i]; + return z; +} +template vector& operator-=(vector& x, const vector& y) { + int N = x.length(); + for (int i = 0; i < N; i++) x[i] -= y[i]; + return x; +} +template vector operator-(const vector& x, const vector& y) { + int N = x.length(); + vector z(N); + for (int i = 0; i < N; i++) z[i] = x[i] - y[i]; + return z; +} +template vector& operator*=(vector& x, const U& value) { + int N = x.length(); + for (int i = 0; i < N; i++) x[i] *= static_cast(value); + return x; +} +template vector operator*(const U& value, const vector& x) { + int N = x.length(); + vector z(N); + for (int i = 0; i < N; i++) z[i] = static_cast(value) * x[i]; + return z; +} +template vector operator*(const vector& x, const U& value) { + return value*x; +} +template T operator*(const vector& x, const vector& y) { + int N = (x.length()>y.length())?y.length():x.length(); + T z(0); + for (int i = 0; i < N; i++) z += x[i] * y[i]; + return z; +} + + +// target class: dim = 0 specialization for vector class +template +class target<0, ind, vector > { +public: + // constructors + target(vector* DATA, const int* S0, const int* SX, const int* X0, const int* X1, const int* B0, const int* B1) { + data = DATA; + s0 = S0; + sx = SX; + x0 = X0; + x1 = X1; + b0 = B0; + b1 = B1; + } + + // data access operators + operator vector&() { + return *data; + } + operator const vector&() const { + return *data; + } + T& operator[](int i) { + return data->operator[](i); + } + const T& operator[](int i) const { + return data->operator[](i); + } + + // assignment operators + vector& operator=(const T& value) const { + return data->operator=(value); + } + vector& operator=(const vector& v) const { + return data->operator=(v); + } + template vector& operator=(const U& value) const { + return data->operator=(value); + } + template vector& operator=(const vector& v) const { + return data->operator=(v); + } + + // buffer I/O functions + int buffer_size() const { + return data->buffer_size(); + } + int to_buffer(char* buffer) const { + return data->to_buffer(buffer); + } + int from_buffer(const char* buffer) const { + return data->from_buffer(buffer); + } + + // file I/O functions + void write(std::ofstream& file) const { + data->write(file); + } + void read(std::ifstream& file) const { + data->read(file); + } + + // utility functions + int length() const { + return data->length(); + } + int resize(int n) const { + return data->resize(n); + } + void copy(const target& t) const { + data->copy(t->data); + } + void swap(const target& t) const { + data->swap(t->data); + } + template void append(const U& value) const { + data->append(value); + } + template void append(const vector& v) const { + data->append(v); + } + + // object data + vector* data; + const int* s0; + const int* sx; + const int* x0; + const int* x1; + const int* b0; + const int* b1; +}; + +// buffer I/O functions +template int buffer_size(const target<0, ind, vector >& v) { + return v.buffer_size(); +} +template int to_buffer(const target<0, ind, vector >& v, char* buffer) { + return v.to_buffer(buffer); +} +template int from_buffer(const target<0, ind, vector >& v, const char* buffer) { + return v.from_buffer(buffer); +} + +// file I/O functions +template void write(const target<0, ind, vector >& v, std::ofstream& file) { + return v.write(file); +} +template void read(const target<0, ind, vector >& v, std::ifstream& file) { + return v.read(file); +} + +// utility functions +template int length(const target<0, ind, vector >& v) { + return v.length(); +} +template void resize(const target<0, ind, vector >& v, int n) { + v.resize(n); +} +template void copy(const target<0, ind, vector >& v, const target<0, ind, vector >& w) { + v.copy(w); +} +template void swap(const target<0, ind, vector >& v, const target<0, ind, vector >& w) { + v.swap(w); +} +template void append(const target<0, ind, vector >& v, const U& value) { + v.append(value); +} +template void append(const target<0, ind, vector >& v, const vector& w) { + v.append(w); +} +template std::string name(const target<0, ind, vector >& s) { + return std::string("vector:") + name(T()); +} + +// mathematical operators +template +vector min(const target<0, ind, vector >& x, const target<0, ind, vector >& y) { + return min(*(x.data), *(y.data)); +} +template +vector max(const target<0, ind, vector >& x, const target<0, ind, vector >& y) { + return max(*(x.data), *(y.data)); +} +template +vector& operator+=(target<0, ind, vector >& x, const target<0, ind, vector >& y) { + return operator+=(*(x.data), *(y.data)); +} +template +vector operator+(const target<0, ind, vector >& x, const target<0, ind, vector >& y) { + return operator+(*(x.data), *(y.data)); +} +template +vector& operator-=(target<0, ind, vector >& x, const target<0, ind, vector >& y) { + return operator-=(*(x.data), *(y.data)); +} +template +vector operator-(const target<0, ind, vector >& x, const target<0, ind, vector >& y) { + return operator-(*(x.data), *(y.data)); +} +template +vector& operator*=(target<0, ind, vector >& x, const U& value) { + return operator*=(*(x.data), value); +} +template +vector operator*(const U& value, const target<0, ind, vector >& x) { + return operator*(value, *(x.data)); +} +template bool operator==(const vector& a, const vector& b); + + +} // namespace MMSP + +#include "MMSP.vector.cpp" + +#endif diff --git a/examples/pfhub_bm8/output_0.txt b/examples/pfhub_bm8/output_0.txt new file mode 100644 index 0000000..88a98c0 --- /dev/null +++ b/examples/pfhub_bm8/output_0.txt @@ -0,0 +1,2500 @@ +0,0,0.146447 +0,1,0.146447 +0,2,0.146447 +0,3,0.146447 +0,4,0.146447 +0,5,0.146447 +0,6,0.146447 +0,7,0.146447 +0,8,0.146447 +0,9,0.146447 +0,10,0.146447 +0,11,0.146447 +0,12,0.146447 +0,13,0.146447 +0,14,0.146447 +0,15,0.146447 +0,16,0.146447 +0,17,0.146447 +0,18,0.146447 +0,19,0.146447 +0,20,0.146447 +0,21,0.146447 +0,22,0.146447 +0,23,0.146447 +0,24,0.146447 +0,25,0.146447 +0,26,0.146447 +0,27,0.146447 +0,28,0.146447 +0,29,0.146447 +0,30,0.146447 +0,31,0.146447 +0,32,0.146447 +0,33,0.146447 +0,34,0.146447 +0,35,0.146447 +0,36,0.146447 +0,37,0.146447 +0,38,0.146447 +0,39,0.146447 +0,40,0.146447 +0,41,0.146447 +0,42,0.146447 +0,43,0.146447 +0,44,0.146447 +0,45,0.146447 +0,46,0.146447 +0,47,0.146447 +0,48,0.146447 +0,49,0.146447 +1,0,0.146447 +1,1,0.146447 +1,2,0.146447 +1,3,0.146447 +1,4,0.146447 +1,5,0.146447 +1,6,0.146447 +1,7,0.146447 +1,8,0.146447 +1,9,0.146447 +1,10,0.146447 +1,11,0.146447 +1,12,0.146447 +1,13,0.146447 +1,14,0.146447 +1,15,0.146447 +1,16,0.146447 +1,17,0.146447 +1,18,0.146447 +1,19,0.146447 +1,20,0.146447 +1,21,0.146447 +1,22,0.146447 +1,23,0.146447 +1,24,0.146447 +1,25,0.146447 +1,26,0.146447 +1,27,0.146447 +1,28,0.146447 +1,29,0.146447 +1,30,0.146447 +1,31,0.146447 +1,32,0.146447 +1,33,0.146447 +1,34,0.146447 +1,35,0.146447 +1,36,0.146447 +1,37,0.146447 +1,38,0.146447 +1,39,0.146447 +1,40,0.146447 +1,41,0.146447 +1,42,0.146447 +1,43,0.146447 +1,44,0.146447 +1,45,0.146447 +1,46,0.146447 +1,47,0.146447 +1,48,0.146447 +1,49,0.146447 +2,0,0.146447 +2,1,0.146447 +2,2,0.146447 +2,3,0.146447 +2,4,0.146447 +2,5,0.146447 +2,6,0.146447 +2,7,0.146447 +2,8,0.146447 +2,9,0.146447 +2,10,0.146447 +2,11,0.146447 +2,12,0.146447 +2,13,0.146447 +2,14,0.146447 +2,15,0.146447 +2,16,0.146447 +2,17,0.146447 +2,18,0.146447 +2,19,0.146447 +2,20,0.146447 +2,21,0.146447 +2,22,0.146447 +2,23,0.146447 +2,24,0.146447 +2,25,0.146447 +2,26,0.146447 +2,27,0.146447 +2,28,0.146447 +2,29,0.146447 +2,30,0.146447 +2,31,0.146447 +2,32,0.146447 +2,33,0.146447 +2,34,0.146447 +2,35,0.146447 +2,36,0.146447 +2,37,0.146447 +2,38,0.146447 +2,39,0.146447 +2,40,0.146447 +2,41,0.146447 +2,42,0.146447 +2,43,0.146447 +2,44,0.146447 +2,45,0.146447 +2,46,0.146447 +2,47,0.146447 +2,48,0.146447 +2,49,0.146447 +3,0,0.146447 +3,1,0.146447 +3,2,0.146447 +3,3,0.146447 +3,4,0.146447 +3,5,0.146447 +3,6,0.146447 +3,7,0.146447 +3,8,0.146447 +3,9,0.146447 +3,10,0.146447 +3,11,0.146447 +3,12,0.146447 +3,13,0.146447 +3,14,0.146447 +3,15,0.146447 +3,16,0.146447 +3,17,0.146447 +3,18,0.146447 +3,19,0.146447 +3,20,0.146447 +3,21,0.146447 +3,22,0.146447 +3,23,0.146447 +3,24,0.146447 +3,25,0.146447 +3,26,0.146447 +3,27,0.146447 +3,28,0.146447 +3,29,0.146447 +3,30,0.146447 +3,31,0.146447 +3,32,0.146447 +3,33,0.146447 +3,34,0.146447 +3,35,0.146447 +3,36,0.146447 +3,37,0.146447 +3,38,0.146447 +3,39,0.146447 +3,40,0.146447 +3,41,0.146447 +3,42,0.146447 +3,43,0.146447 +3,44,0.146447 +3,45,0.146447 +3,46,0.146447 +3,47,0.146447 +3,48,0.146447 +3,49,0.146447 +4,0,0.146447 +4,1,0.146447 +4,2,0.146447 +4,3,0.146447 +4,4,0.146447 +4,5,0.146447 +4,6,0.146447 +4,7,0.146447 +4,8,0.146447 +4,9,0.146447 +4,10,0.146447 +4,11,0.146447 +4,12,0.146447 +4,13,0.146447 +4,14,0.146447 +4,15,0.146447 +4,16,0.146447 +4,17,0.146447 +4,18,0.146447 +4,19,0.146447 +4,20,0.146447 +4,21,0.146447 +4,22,0.146447 +4,23,0.146447 +4,24,0.146447 +4,25,0.146447 +4,26,0.146447 +4,27,0.146447 +4,28,0.146447 +4,29,0.146447 +4,30,0.146447 +4,31,0.146447 +4,32,0.146447 +4,33,0.146447 +4,34,0.146447 +4,35,0.146447 +4,36,0.146447 +4,37,0.146447 +4,38,0.146447 +4,39,0.146447 +4,40,0.146447 +4,41,0.146447 +4,42,0.146447 +4,43,0.146447 +4,44,0.146447 +4,45,0.146447 +4,46,0.146447 +4,47,0.146447 +4,48,0.146447 +4,49,0.146447 +5,0,0.146447 +5,1,0.146447 +5,2,0.146447 +5,3,0.146447 +5,4,0.146447 +5,5,0.146447 +5,6,0.146447 +5,7,0.146447 +5,8,0.146447 +5,9,0.146447 +5,10,0.146447 +5,11,0.146447 +5,12,0.146447 +5,13,0.146447 +5,14,0.146447 +5,15,0.146447 +5,16,0.146447 +5,17,0.146447 +5,18,0.146447 +5,19,0.146447 +5,20,0.146447 +5,21,0.146447 +5,22,0.146447 +5,23,0.146447 +5,24,0.146447 +5,25,0.146447 +5,26,0.146447 +5,27,0.146447 +5,28,0.146447 +5,29,0.146447 +5,30,0.146447 +5,31,0.146447 +5,32,0.146447 +5,33,0.146447 +5,34,0.146447 +5,35,0.146447 +5,36,0.146447 +5,37,0.146447 +5,38,0.146447 +5,39,0.146447 +5,40,0.146447 +5,41,0.146447 +5,42,0.146447 +5,43,0.146447 +5,44,0.146447 +5,45,0.146447 +5,46,0.146447 +5,47,0.146447 +5,48,0.146447 +5,49,0.146447 +6,0,0.146447 +6,1,0.146447 +6,2,0.146447 +6,3,0.146447 +6,4,0.146447 +6,5,0.146447 +6,6,0.146447 +6,7,0.146447 +6,8,0.146447 +6,9,0.146447 +6,10,0.146447 +6,11,0.146447 +6,12,0.146447 +6,13,0.146447 +6,14,0.146447 +6,15,0.146447 +6,16,0.146447 +6,17,0.146447 +6,18,0.146447 +6,19,0.146447 +6,20,0.146447 +6,21,0.146447 +6,22,0.146447 +6,23,0.146447 +6,24,0.146447 +6,25,0.146447 +6,26,0.146447 +6,27,0.146447 +6,28,0.146447 +6,29,0.146447 +6,30,0.146447 +6,31,0.146447 +6,32,0.146447 +6,33,0.146447 +6,34,0.146447 +6,35,0.146447 +6,36,0.146447 +6,37,0.146447 +6,38,0.146447 +6,39,0.146447 +6,40,0.146447 +6,41,0.146447 +6,42,0.146447 +6,43,0.146447 +6,44,0.146447 +6,45,0.146447 +6,46,0.146447 +6,47,0.146447 +6,48,0.146447 +6,49,0.146447 +7,0,0.146447 +7,1,0.146447 +7,2,0.146447 +7,3,0.146447 +7,4,0.146447 +7,5,0.146447 +7,6,0.146447 +7,7,0.146447 +7,8,0.146447 +7,9,0.146447 +7,10,0.146447 +7,11,0.146447 +7,12,0.146447 +7,13,0.146447 +7,14,0.146447 +7,15,0.146447 +7,16,0.146447 +7,17,0.146447 +7,18,0.146447 +7,19,0.146447 +7,20,0.146447 +7,21,0.146447 +7,22,0.146447 +7,23,0.146447 +7,24,0.146447 +7,25,0.146447 +7,26,0.146447 +7,27,0.146447 +7,28,0.146447 +7,29,0.146447 +7,30,0.146447 +7,31,0.146447 +7,32,0.146447 +7,33,0.146447 +7,34,0.146447 +7,35,0.146447 +7,36,0.146447 +7,37,0.146447 +7,38,0.146447 +7,39,0.146447 +7,40,0.146447 +7,41,0.146447 +7,42,0.146447 +7,43,0.146447 +7,44,0.146447 +7,45,0.146447 +7,46,0.146447 +7,47,0.146447 +7,48,0.146447 +7,49,0.146447 +8,0,0.146447 +8,1,0.146447 +8,2,0.146447 +8,3,0.146447 +8,4,0.146447 +8,5,0.146447 +8,6,0.146447 +8,7,0.146447 +8,8,0.146447 +8,9,0.146447 +8,10,0.146447 +8,11,0.146447 +8,12,0.146447 +8,13,0.146447 +8,14,0.146447 +8,15,0.146447 +8,16,0.146447 +8,17,0.146447 +8,18,0.146447 +8,19,0.146447 +8,20,0.146447 +8,21,0.146447 +8,22,0.146447 +8,23,0.146447 +8,24,0.146447 +8,25,0.146447 +8,26,0.146447 +8,27,0.146447 +8,28,0.146447 +8,29,0.146447 +8,30,0.146447 +8,31,0.146447 +8,32,0.146447 +8,33,0.146447 +8,34,0.146447 +8,35,0.146447 +8,36,0.146447 +8,37,0.146447 +8,38,0.146447 +8,39,0.146447 +8,40,0.146447 +8,41,0.146447 +8,42,0.146447 +8,43,0.146447 +8,44,0.146447 +8,45,0.146447 +8,46,0.146447 +8,47,0.146447 +8,48,0.146447 +8,49,0.146447 +9,0,0.146447 +9,1,0.146447 +9,2,0.146447 +9,3,0.146447 +9,4,0.146447 +9,5,0.146447 +9,6,0.146447 +9,7,0.146447 +9,8,0.146447 +9,9,0.146447 +9,10,0.146447 +9,11,0.146447 +9,12,0.146447 +9,13,0.146447 +9,14,0.146447 +9,15,0.146447 +9,16,0.146447 +9,17,0.146447 +9,18,0.146447 +9,19,0.146447 +9,20,0.146447 +9,21,0.146447 +9,22,0.146447 +9,23,0.146447 +9,24,0.146447 +9,25,0.146447 +9,26,0.146447 +9,27,0.146447 +9,28,0.146447 +9,29,0.146447 +9,30,0.146447 +9,31,0.146447 +9,32,0.146447 +9,33,0.146447 +9,34,0.146447 +9,35,0.146447 +9,36,0.146447 +9,37,0.146447 +9,38,0.146447 +9,39,0.146447 +9,40,0.146447 +9,41,0.146447 +9,42,0.146447 +9,43,0.146447 +9,44,0.146447 +9,45,0.146447 +9,46,0.146447 +9,47,0.146447 +9,48,0.146447 +9,49,0.146447 +10,0,0.146447 +10,1,0.146447 +10,2,0.146447 +10,3,0.146447 +10,4,0.146447 +10,5,0.146447 +10,6,0.146447 +10,7,0.146447 +10,8,0.146447 +10,9,0.146447 +10,10,0.146447 +10,11,0.146447 +10,12,0.146447 +10,13,0.146447 +10,14,0.146447 +10,15,0.146447 +10,16,0.146447 +10,17,0.146447 +10,18,0.146447 +10,19,0.146447 +10,20,0.146447 +10,21,0.146447 +10,22,0.146447 +10,23,0.146447 +10,24,0.146447 +10,25,0.146447 +10,26,0.146447 +10,27,0.146447 +10,28,0.146447 +10,29,0.146447 +10,30,0.146447 +10,31,0.146447 +10,32,0.146447 +10,33,0.146447 +10,34,0.146447 +10,35,0.146447 +10,36,0.146447 +10,37,0.146447 +10,38,0.146447 +10,39,0.146447 +10,40,0.146447 +10,41,0.146447 +10,42,0.146447 +10,43,0.146447 +10,44,0.146447 +10,45,0.146447 +10,46,0.146447 +10,47,0.146447 +10,48,0.146447 +10,49,0.146447 +11,0,0.146447 +11,1,0.146447 +11,2,0.146447 +11,3,0.146447 +11,4,0.146447 +11,5,0.146447 +11,6,0.146447 +11,7,0.146447 +11,8,0.146447 +11,9,0.146447 +11,10,0.146447 +11,11,0.146447 +11,12,0.146447 +11,13,0.146447 +11,14,0.146447 +11,15,0.146447 +11,16,0.146447 +11,17,0.146447 +11,18,0.146447 +11,19,0.146447 +11,20,0.146447 +11,21,0.146447 +11,22,0.146447 +11,23,0.146447 +11,24,0.146447 +11,25,0.146447 +11,26,0.146447 +11,27,0.146447 +11,28,0.146447 +11,29,0.146447 +11,30,0.146447 +11,31,0.146447 +11,32,0.146447 +11,33,0.146447 +11,34,0.146447 +11,35,0.146447 +11,36,0.146447 +11,37,0.146447 +11,38,0.146447 +11,39,0.146447 +11,40,0.146447 +11,41,0.146447 +11,42,0.146447 +11,43,0.146447 +11,44,0.146447 +11,45,0.146447 +11,46,0.146447 +11,47,0.146447 +11,48,0.146447 +11,49,0.146447 +12,0,0.146447 +12,1,0.146447 +12,2,0.146447 +12,3,0.146447 +12,4,0.146447 +12,5,0.146447 +12,6,0.146447 +12,7,0.146447 +12,8,0.146447 +12,9,0.146447 +12,10,0.146447 +12,11,0.146447 +12,12,0.146447 +12,13,0.146447 +12,14,0.146447 +12,15,0.146447 +12,16,0.146447 +12,17,0.146447 +12,18,0.146447 +12,19,0.146447 +12,20,0.146447 +12,21,0.146447 +12,22,0.146447 +12,23,0.146447 +12,24,0.146447 +12,25,0.146447 +12,26,0.146447 +12,27,0.146447 +12,28,0.146447 +12,29,0.146447 +12,30,0.146447 +12,31,0.146447 +12,32,0.146447 +12,33,0.146447 +12,34,0.146447 +12,35,0.146447 +12,36,0.146447 +12,37,0.146447 +12,38,0.146447 +12,39,0.146447 +12,40,0.146447 +12,41,0.146447 +12,42,0.146447 +12,43,0.146447 +12,44,0.146447 +12,45,0.146447 +12,46,0.146447 +12,47,0.146447 +12,48,0.146447 +12,49,0.146447 +13,0,0.146447 +13,1,0.146447 +13,2,0.146447 +13,3,0.146447 +13,4,0.146447 +13,5,0.146447 +13,6,0.146447 +13,7,0.146447 +13,8,0.146447 +13,9,0.146447 +13,10,0.146447 +13,11,0.146447 +13,12,0.146447 +13,13,0.146447 +13,14,0.146447 +13,15,0.146447 +13,16,0.146447 +13,17,0.146447 +13,18,0.146447 +13,19,0.146447 +13,20,0.146447 +13,21,0.146447 +13,22,0.146447 +13,23,0.146447 +13,24,0.146447 +13,25,0.146447 +13,26,0.146447 +13,27,0.146447 +13,28,0.146447 +13,29,0.146447 +13,30,0.146447 +13,31,0.146447 +13,32,0.146447 +13,33,0.146447 +13,34,0.146447 +13,35,0.146447 +13,36,0.146447 +13,37,0.146447 +13,38,0.146447 +13,39,0.146447 +13,40,0.146447 +13,41,0.146447 +13,42,0.146447 +13,43,0.146447 +13,44,0.146447 +13,45,0.146447 +13,46,0.146447 +13,47,0.146447 +13,48,0.146447 +13,49,0.146447 +14,0,0.146447 +14,1,0.146447 +14,2,0.146447 +14,3,0.146447 +14,4,0.146447 +14,5,0.146447 +14,6,0.146447 +14,7,0.146447 +14,8,0.146447 +14,9,0.146447 +14,10,0.146447 +14,11,0.146447 +14,12,0.146447 +14,13,0.146447 +14,14,0.146447 +14,15,0.146447 +14,16,0.146447 +14,17,0.146447 +14,18,0.146447 +14,19,0.146447 +14,20,0.146447 +14,21,0.146448 +14,22,0.146449 +14,23,0.14645 +14,24,0.146451 +14,25,0.146451 +14,26,0.146451 +14,27,0.14645 +14,28,0.146449 +14,29,0.146448 +14,30,0.146447 +14,31,0.146447 +14,32,0.146447 +14,33,0.146447 +14,34,0.146447 +14,35,0.146447 +14,36,0.146447 +14,37,0.146447 +14,38,0.146447 +14,39,0.146447 +14,40,0.146447 +14,41,0.146447 +14,42,0.146447 +14,43,0.146447 +14,44,0.146447 +14,45,0.146447 +14,46,0.146447 +14,47,0.146447 +14,48,0.146447 +14,49,0.146447 +15,0,0.146447 +15,1,0.146447 +15,2,0.146447 +15,3,0.146447 +15,4,0.146447 +15,5,0.146447 +15,6,0.146447 +15,7,0.146447 +15,8,0.146447 +15,9,0.146447 +15,10,0.146447 +15,11,0.146447 +15,12,0.146447 +15,13,0.146447 +15,14,0.146447 +15,15,0.146447 +15,16,0.146447 +15,17,0.146447 +15,18,0.146447 +15,19,0.146448 +15,20,0.14645 +15,21,0.146453 +15,22,0.14646 +15,23,0.146468 +15,24,0.146476 +15,25,0.146479 +15,26,0.146476 +15,27,0.146468 +15,28,0.14646 +15,29,0.146453 +15,30,0.14645 +15,31,0.146448 +15,32,0.146447 +15,33,0.146447 +15,34,0.146447 +15,35,0.146447 +15,36,0.146447 +15,37,0.146447 +15,38,0.146447 +15,39,0.146447 +15,40,0.146447 +15,41,0.146447 +15,42,0.146447 +15,43,0.146447 +15,44,0.146447 +15,45,0.146447 +15,46,0.146447 +15,47,0.146447 +15,48,0.146447 +15,49,0.146447 +16,0,0.146447 +16,1,0.146447 +16,2,0.146447 +16,3,0.146447 +16,4,0.146447 +16,5,0.146447 +16,6,0.146447 +16,7,0.146447 +16,8,0.146447 +16,9,0.146447 +16,10,0.146447 +16,11,0.146447 +16,12,0.146447 +16,13,0.146447 +16,14,0.146447 +16,15,0.146447 +16,16,0.146447 +16,17,0.146447 +16,18,0.146449 +16,19,0.146453 +16,20,0.146464 +16,21,0.14649 +16,22,0.146536 +16,23,0.146599 +16,24,0.146659 +16,25,0.146684 +16,26,0.146659 +16,27,0.146599 +16,28,0.146536 +16,29,0.14649 +16,30,0.146464 +16,31,0.146453 +16,32,0.146449 +16,33,0.146447 +16,34,0.146447 +16,35,0.146447 +16,36,0.146447 +16,37,0.146447 +16,38,0.146447 +16,39,0.146447 +16,40,0.146447 +16,41,0.146447 +16,42,0.146447 +16,43,0.146447 +16,44,0.146447 +16,45,0.146447 +16,46,0.146447 +16,47,0.146447 +16,48,0.146447 +16,49,0.146447 +17,0,0.146447 +17,1,0.146447 +17,2,0.146447 +17,3,0.146447 +17,4,0.146447 +17,5,0.146447 +17,6,0.146447 +17,7,0.146447 +17,8,0.146447 +17,9,0.146447 +17,10,0.146447 +17,11,0.146447 +17,12,0.146447 +17,13,0.146447 +17,14,0.146447 +17,15,0.146447 +17,16,0.146447 +17,17,0.146449 +17,18,0.146456 +17,19,0.146479 +17,20,0.146546 +17,21,0.146712 +17,22,0.147037 +17,23,0.147516 +17,24,0.147991 +17,25,0.148195 +17,26,0.147991 +17,27,0.147516 +17,28,0.147037 +17,29,0.146712 +17,30,0.146546 +17,31,0.146479 +17,32,0.146456 +17,33,0.146449 +17,34,0.146447 +17,35,0.146447 +17,36,0.146447 +17,37,0.146447 +17,38,0.146447 +17,39,0.146447 +17,40,0.146447 +17,41,0.146447 +17,42,0.146447 +17,43,0.146447 +17,44,0.146447 +17,45,0.146447 +17,46,0.146447 +17,47,0.146447 +17,48,0.146447 +17,49,0.146447 +18,0,0.146447 +18,1,0.146447 +18,2,0.146447 +18,3,0.146447 +18,4,0.146447 +18,5,0.146447 +18,6,0.146447 +18,7,0.146447 +18,8,0.146447 +18,9,0.146447 +18,10,0.146447 +18,11,0.146447 +18,12,0.146447 +18,13,0.146447 +18,14,0.146447 +18,15,0.146447 +18,16,0.146449 +18,17,0.146456 +18,18,0.146486 +18,19,0.146599 +18,20,0.146972 +18,21,0.147991 +18,22,0.150206 +18,23,0.153766 +18,24,0.157506 +18,25,0.159165 +18,26,0.157506 +18,27,0.153766 +18,28,0.150206 +18,29,0.147991 +18,30,0.146972 +18,31,0.146599 +18,32,0.146486 +18,33,0.146456 +18,34,0.146449 +18,35,0.146447 +18,36,0.146447 +18,37,0.146447 +18,38,0.146447 +18,39,0.146447 +18,40,0.146447 +18,41,0.146447 +18,42,0.146447 +18,43,0.146447 +18,44,0.146447 +18,45,0.146447 +18,46,0.146447 +18,47,0.146447 +18,48,0.146447 +18,49,0.146447 +19,0,0.146447 +19,1,0.146447 +19,2,0.146447 +19,3,0.146447 +19,4,0.146447 +19,5,0.146447 +19,6,0.146447 +19,7,0.146447 +19,8,0.146447 +19,9,0.146447 +19,10,0.146447 +19,11,0.146447 +19,12,0.146447 +19,13,0.146447 +19,14,0.146447 +19,15,0.146448 +19,16,0.146453 +19,17,0.146479 +19,18,0.146599 +19,19,0.14711 +19,20,0.148999 +19,21,0.154837 +19,22,0.168923 +19,23,0.193147 +19,24,0.2192 +19,25,0.230736 +19,26,0.2192 +19,27,0.193147 +19,28,0.168923 +19,29,0.154837 +19,30,0.148999 +19,31,0.14711 +19,32,0.146599 +19,33,0.146479 +19,34,0.146453 +19,35,0.146448 +19,36,0.146447 +19,37,0.146447 +19,38,0.146447 +19,39,0.146447 +19,40,0.146447 +19,41,0.146447 +19,42,0.146447 +19,43,0.146447 +19,44,0.146447 +19,45,0.146447 +19,46,0.146447 +19,47,0.146447 +19,48,0.146447 +19,49,0.146447 +20,0,0.146447 +20,1,0.146447 +20,2,0.146447 +20,3,0.146447 +20,4,0.146447 +20,5,0.146447 +20,6,0.146447 +20,7,0.146447 +20,8,0.146447 +20,9,0.146447 +20,10,0.146447 +20,11,0.146447 +20,12,0.146447 +20,13,0.146447 +20,14,0.146447 +20,15,0.14645 +20,16,0.146464 +20,17,0.146546 +20,18,0.146972 +20,19,0.148999 +20,20,0.157506 +20,21,0.186743 +20,22,0.259235 +20,23,0.370181 +20,24,0.465105 +20,25,0.5 +20,26,0.465105 +20,27,0.370181 +20,28,0.259235 +20,29,0.186743 +20,30,0.157506 +20,31,0.148999 +20,32,0.146972 +20,33,0.146546 +20,34,0.146464 +20,35,0.14645 +20,36,0.146447 +20,37,0.146447 +20,38,0.146447 +20,39,0.146447 +20,40,0.146447 +20,41,0.146447 +20,42,0.146447 +20,43,0.146447 +20,44,0.146447 +20,45,0.146447 +20,46,0.146447 +20,47,0.146447 +20,48,0.146447 +20,49,0.146447 +21,0,0.146447 +21,1,0.146447 +21,2,0.146447 +21,3,0.146447 +21,4,0.146447 +21,5,0.146447 +21,6,0.146447 +21,7,0.146447 +21,8,0.146447 +21,9,0.146447 +21,10,0.146447 +21,11,0.146447 +21,12,0.146447 +21,13,0.146447 +21,14,0.146448 +21,15,0.146453 +21,16,0.14649 +21,17,0.146712 +21,18,0.147991 +21,19,0.154837 +21,20,0.186743 +21,21,0.296259 +21,22,0.5 +21,23,0.67103 +21,24,0.749206 +21,25,0.769264 +21,26,0.749206 +21,27,0.67103 +21,28,0.5 +21,29,0.296259 +21,30,0.186743 +21,31,0.154837 +21,32,0.147991 +21,33,0.146712 +21,34,0.14649 +21,35,0.146453 +21,36,0.146448 +21,37,0.146447 +21,38,0.146447 +21,39,0.146447 +21,40,0.146447 +21,41,0.146447 +21,42,0.146447 +21,43,0.146447 +21,44,0.146447 +21,45,0.146447 +21,46,0.146447 +21,47,0.146447 +21,48,0.146447 +21,49,0.146447 +22,0,0.146447 +22,1,0.146447 +22,2,0.146447 +22,3,0.146447 +22,4,0.146447 +22,5,0.146447 +22,6,0.146447 +22,7,0.146447 +22,8,0.146447 +22,9,0.146447 +22,10,0.146447 +22,11,0.146447 +22,12,0.146447 +22,13,0.146447 +22,14,0.146449 +22,15,0.14646 +22,16,0.146536 +22,17,0.147037 +22,18,0.150206 +22,19,0.168923 +22,20,0.259235 +22,21,0.5 +22,22,0.726104 +22,23,0.812593 +22,24,0.836079 +22,25,0.840835 +22,26,0.836079 +22,27,0.812593 +22,28,0.726104 +22,29,0.5 +22,30,0.259235 +22,31,0.168923 +22,32,0.150206 +22,33,0.147037 +22,34,0.146536 +22,35,0.14646 +22,36,0.146449 +22,37,0.146447 +22,38,0.146447 +22,39,0.146447 +22,40,0.146447 +22,41,0.146447 +22,42,0.146447 +22,43,0.146447 +22,44,0.146447 +22,45,0.146447 +22,46,0.146447 +22,47,0.146447 +22,48,0.146447 +22,49,0.146447 +23,0,0.146447 +23,1,0.146447 +23,2,0.146447 +23,3,0.146447 +23,4,0.146447 +23,5,0.146447 +23,6,0.146447 +23,7,0.146447 +23,8,0.146447 +23,9,0.146447 +23,10,0.146447 +23,11,0.146447 +23,12,0.146447 +23,13,0.146447 +23,14,0.14645 +23,15,0.146468 +23,16,0.146599 +23,17,0.147516 +23,18,0.153766 +23,19,0.193147 +23,20,0.370181 +23,21,0.67103 +23,22,0.812593 +23,23,0.844482 +23,24,0.850754 +23,25,0.851805 +23,26,0.850754 +23,27,0.844482 +23,28,0.812593 +23,29,0.67103 +23,30,0.370181 +23,31,0.193147 +23,32,0.153766 +23,33,0.147516 +23,34,0.146599 +23,35,0.146468 +23,36,0.14645 +23,37,0.146447 +23,38,0.146447 +23,39,0.146447 +23,40,0.146447 +23,41,0.146447 +23,42,0.146447 +23,43,0.146447 +23,44,0.146447 +23,45,0.146447 +23,46,0.146447 +23,47,0.146447 +23,48,0.146447 +23,49,0.146447 +24,0,0.146447 +24,1,0.146447 +24,2,0.146447 +24,3,0.146447 +24,4,0.146447 +24,5,0.146447 +24,6,0.146447 +24,7,0.146447 +24,8,0.146447 +24,9,0.146447 +24,10,0.146447 +24,11,0.146447 +24,12,0.146447 +24,13,0.146447 +24,14,0.146451 +24,15,0.146476 +24,16,0.146659 +24,17,0.147991 +24,18,0.157506 +24,19,0.2192 +24,20,0.465105 +24,21,0.749206 +24,22,0.836079 +24,23,0.850754 +24,24,0.853011 +24,25,0.853316 +24,26,0.853011 +24,27,0.850754 +24,28,0.836079 +24,29,0.749206 +24,30,0.465105 +24,31,0.2192 +24,32,0.157506 +24,33,0.147991 +24,34,0.146659 +24,35,0.146476 +24,36,0.146451 +24,37,0.146447 +24,38,0.146447 +24,39,0.146447 +24,40,0.146447 +24,41,0.146447 +24,42,0.146447 +24,43,0.146447 +24,44,0.146447 +24,45,0.146447 +24,46,0.146447 +24,47,0.146447 +24,48,0.146447 +24,49,0.146447 +25,0,0.146447 +25,1,0.146447 +25,2,0.146447 +25,3,0.146447 +25,4,0.146447 +25,5,0.146447 +25,6,0.146447 +25,7,0.146447 +25,8,0.146447 +25,9,0.146447 +25,10,0.146447 +25,11,0.146447 +25,12,0.146447 +25,13,0.146447 +25,14,0.146451 +25,15,0.146479 +25,16,0.146684 +25,17,0.148195 +25,18,0.159165 +25,19,0.230736 +25,20,0.5 +25,21,0.769264 +25,22,0.840835 +25,23,0.851805 +25,24,0.853316 +25,25,0.853521 +25,26,0.853316 +25,27,0.851805 +25,28,0.840835 +25,29,0.769264 +25,30,0.5 +25,31,0.230736 +25,32,0.159165 +25,33,0.148195 +25,34,0.146684 +25,35,0.146479 +25,36,0.146451 +25,37,0.146447 +25,38,0.146447 +25,39,0.146447 +25,40,0.146447 +25,41,0.146447 +25,42,0.146447 +25,43,0.146447 +25,44,0.146447 +25,45,0.146447 +25,46,0.146447 +25,47,0.146447 +25,48,0.146447 +25,49,0.146447 +26,0,0.146447 +26,1,0.146447 +26,2,0.146447 +26,3,0.146447 +26,4,0.146447 +26,5,0.146447 +26,6,0.146447 +26,7,0.146447 +26,8,0.146447 +26,9,0.146447 +26,10,0.146447 +26,11,0.146447 +26,12,0.146447 +26,13,0.146447 +26,14,0.146451 +26,15,0.146476 +26,16,0.146659 +26,17,0.147991 +26,18,0.157506 +26,19,0.2192 +26,20,0.465105 +26,21,0.749206 +26,22,0.836079 +26,23,0.850754 +26,24,0.853011 +26,25,0.853316 +26,26,0.853011 +26,27,0.850754 +26,28,0.836079 +26,29,0.749206 +26,30,0.465105 +26,31,0.2192 +26,32,0.157506 +26,33,0.147991 +26,34,0.146659 +26,35,0.146476 +26,36,0.146451 +26,37,0.146447 +26,38,0.146447 +26,39,0.146447 +26,40,0.146447 +26,41,0.146447 +26,42,0.146447 +26,43,0.146447 +26,44,0.146447 +26,45,0.146447 +26,46,0.146447 +26,47,0.146447 +26,48,0.146447 +26,49,0.146447 +27,0,0.146447 +27,1,0.146447 +27,2,0.146447 +27,3,0.146447 +27,4,0.146447 +27,5,0.146447 +27,6,0.146447 +27,7,0.146447 +27,8,0.146447 +27,9,0.146447 +27,10,0.146447 +27,11,0.146447 +27,12,0.146447 +27,13,0.146447 +27,14,0.14645 +27,15,0.146468 +27,16,0.146599 +27,17,0.147516 +27,18,0.153766 +27,19,0.193147 +27,20,0.370181 +27,21,0.67103 +27,22,0.812593 +27,23,0.844482 +27,24,0.850754 +27,25,0.851805 +27,26,0.850754 +27,27,0.844482 +27,28,0.812593 +27,29,0.67103 +27,30,0.370181 +27,31,0.193147 +27,32,0.153766 +27,33,0.147516 +27,34,0.146599 +27,35,0.146468 +27,36,0.14645 +27,37,0.146447 +27,38,0.146447 +27,39,0.146447 +27,40,0.146447 +27,41,0.146447 +27,42,0.146447 +27,43,0.146447 +27,44,0.146447 +27,45,0.146447 +27,46,0.146447 +27,47,0.146447 +27,48,0.146447 +27,49,0.146447 +28,0,0.146447 +28,1,0.146447 +28,2,0.146447 +28,3,0.146447 +28,4,0.146447 +28,5,0.146447 +28,6,0.146447 +28,7,0.146447 +28,8,0.146447 +28,9,0.146447 +28,10,0.146447 +28,11,0.146447 +28,12,0.146447 +28,13,0.146447 +28,14,0.146449 +28,15,0.14646 +28,16,0.146536 +28,17,0.147037 +28,18,0.150206 +28,19,0.168923 +28,20,0.259235 +28,21,0.5 +28,22,0.726104 +28,23,0.812593 +28,24,0.836079 +28,25,0.840835 +28,26,0.836079 +28,27,0.812593 +28,28,0.726104 +28,29,0.5 +28,30,0.259235 +28,31,0.168923 +28,32,0.150206 +28,33,0.147037 +28,34,0.146536 +28,35,0.14646 +28,36,0.146449 +28,37,0.146447 +28,38,0.146447 +28,39,0.146447 +28,40,0.146447 +28,41,0.146447 +28,42,0.146447 +28,43,0.146447 +28,44,0.146447 +28,45,0.146447 +28,46,0.146447 +28,47,0.146447 +28,48,0.146447 +28,49,0.146447 +29,0,0.146447 +29,1,0.146447 +29,2,0.146447 +29,3,0.146447 +29,4,0.146447 +29,5,0.146447 +29,6,0.146447 +29,7,0.146447 +29,8,0.146447 +29,9,0.146447 +29,10,0.146447 +29,11,0.146447 +29,12,0.146447 +29,13,0.146447 +29,14,0.146448 +29,15,0.146453 +29,16,0.14649 +29,17,0.146712 +29,18,0.147991 +29,19,0.154837 +29,20,0.186743 +29,21,0.296259 +29,22,0.5 +29,23,0.67103 +29,24,0.749206 +29,25,0.769264 +29,26,0.749206 +29,27,0.67103 +29,28,0.5 +29,29,0.296259 +29,30,0.186743 +29,31,0.154837 +29,32,0.147991 +29,33,0.146712 +29,34,0.14649 +29,35,0.146453 +29,36,0.146448 +29,37,0.146447 +29,38,0.146447 +29,39,0.146447 +29,40,0.146447 +29,41,0.146447 +29,42,0.146447 +29,43,0.146447 +29,44,0.146447 +29,45,0.146447 +29,46,0.146447 +29,47,0.146447 +29,48,0.146447 +29,49,0.146447 +30,0,0.146447 +30,1,0.146447 +30,2,0.146447 +30,3,0.146447 +30,4,0.146447 +30,5,0.146447 +30,6,0.146447 +30,7,0.146447 +30,8,0.146447 +30,9,0.146447 +30,10,0.146447 +30,11,0.146447 +30,12,0.146447 +30,13,0.146447 +30,14,0.146447 +30,15,0.14645 +30,16,0.146464 +30,17,0.146546 +30,18,0.146972 +30,19,0.148999 +30,20,0.157506 +30,21,0.186743 +30,22,0.259235 +30,23,0.370181 +30,24,0.465105 +30,25,0.5 +30,26,0.465105 +30,27,0.370181 +30,28,0.259235 +30,29,0.186743 +30,30,0.157506 +30,31,0.148999 +30,32,0.146972 +30,33,0.146546 +30,34,0.146464 +30,35,0.14645 +30,36,0.146447 +30,37,0.146447 +30,38,0.146447 +30,39,0.146447 +30,40,0.146447 +30,41,0.146447 +30,42,0.146447 +30,43,0.146447 +30,44,0.146447 +30,45,0.146447 +30,46,0.146447 +30,47,0.146447 +30,48,0.146447 +30,49,0.146447 +31,0,0.146447 +31,1,0.146447 +31,2,0.146447 +31,3,0.146447 +31,4,0.146447 +31,5,0.146447 +31,6,0.146447 +31,7,0.146447 +31,8,0.146447 +31,9,0.146447 +31,10,0.146447 +31,11,0.146447 +31,12,0.146447 +31,13,0.146447 +31,14,0.146447 +31,15,0.146448 +31,16,0.146453 +31,17,0.146479 +31,18,0.146599 +31,19,0.14711 +31,20,0.148999 +31,21,0.154837 +31,22,0.168923 +31,23,0.193147 +31,24,0.2192 +31,25,0.230736 +31,26,0.2192 +31,27,0.193147 +31,28,0.168923 +31,29,0.154837 +31,30,0.148999 +31,31,0.14711 +31,32,0.146599 +31,33,0.146479 +31,34,0.146453 +31,35,0.146448 +31,36,0.146447 +31,37,0.146447 +31,38,0.146447 +31,39,0.146447 +31,40,0.146447 +31,41,0.146447 +31,42,0.146447 +31,43,0.146447 +31,44,0.146447 +31,45,0.146447 +31,46,0.146447 +31,47,0.146447 +31,48,0.146447 +31,49,0.146447 +32,0,0.146447 +32,1,0.146447 +32,2,0.146447 +32,3,0.146447 +32,4,0.146447 +32,5,0.146447 +32,6,0.146447 +32,7,0.146447 +32,8,0.146447 +32,9,0.146447 +32,10,0.146447 +32,11,0.146447 +32,12,0.146447 +32,13,0.146447 +32,14,0.146447 +32,15,0.146447 +32,16,0.146449 +32,17,0.146456 +32,18,0.146486 +32,19,0.146599 +32,20,0.146972 +32,21,0.147991 +32,22,0.150206 +32,23,0.153766 +32,24,0.157506 +32,25,0.159165 +32,26,0.157506 +32,27,0.153766 +32,28,0.150206 +32,29,0.147991 +32,30,0.146972 +32,31,0.146599 +32,32,0.146486 +32,33,0.146456 +32,34,0.146449 +32,35,0.146447 +32,36,0.146447 +32,37,0.146447 +32,38,0.146447 +32,39,0.146447 +32,40,0.146447 +32,41,0.146447 +32,42,0.146447 +32,43,0.146447 +32,44,0.146447 +32,45,0.146447 +32,46,0.146447 +32,47,0.146447 +32,48,0.146447 +32,49,0.146447 +33,0,0.146447 +33,1,0.146447 +33,2,0.146447 +33,3,0.146447 +33,4,0.146447 +33,5,0.146447 +33,6,0.146447 +33,7,0.146447 +33,8,0.146447 +33,9,0.146447 +33,10,0.146447 +33,11,0.146447 +33,12,0.146447 +33,13,0.146447 +33,14,0.146447 +33,15,0.146447 +33,16,0.146447 +33,17,0.146449 +33,18,0.146456 +33,19,0.146479 +33,20,0.146546 +33,21,0.146712 +33,22,0.147037 +33,23,0.147516 +33,24,0.147991 +33,25,0.148195 +33,26,0.147991 +33,27,0.147516 +33,28,0.147037 +33,29,0.146712 +33,30,0.146546 +33,31,0.146479 +33,32,0.146456 +33,33,0.146449 +33,34,0.146447 +33,35,0.146447 +33,36,0.146447 +33,37,0.146447 +33,38,0.146447 +33,39,0.146447 +33,40,0.146447 +33,41,0.146447 +33,42,0.146447 +33,43,0.146447 +33,44,0.146447 +33,45,0.146447 +33,46,0.146447 +33,47,0.146447 +33,48,0.146447 +33,49,0.146447 +34,0,0.146447 +34,1,0.146447 +34,2,0.146447 +34,3,0.146447 +34,4,0.146447 +34,5,0.146447 +34,6,0.146447 +34,7,0.146447 +34,8,0.146447 +34,9,0.146447 +34,10,0.146447 +34,11,0.146447 +34,12,0.146447 +34,13,0.146447 +34,14,0.146447 +34,15,0.146447 +34,16,0.146447 +34,17,0.146447 +34,18,0.146449 +34,19,0.146453 +34,20,0.146464 +34,21,0.14649 +34,22,0.146536 +34,23,0.146599 +34,24,0.146659 +34,25,0.146684 +34,26,0.146659 +34,27,0.146599 +34,28,0.146536 +34,29,0.14649 +34,30,0.146464 +34,31,0.146453 +34,32,0.146449 +34,33,0.146447 +34,34,0.146447 +34,35,0.146447 +34,36,0.146447 +34,37,0.146447 +34,38,0.146447 +34,39,0.146447 +34,40,0.146447 +34,41,0.146447 +34,42,0.146447 +34,43,0.146447 +34,44,0.146447 +34,45,0.146447 +34,46,0.146447 +34,47,0.146447 +34,48,0.146447 +34,49,0.146447 +35,0,0.146447 +35,1,0.146447 +35,2,0.146447 +35,3,0.146447 +35,4,0.146447 +35,5,0.146447 +35,6,0.146447 +35,7,0.146447 +35,8,0.146447 +35,9,0.146447 +35,10,0.146447 +35,11,0.146447 +35,12,0.146447 +35,13,0.146447 +35,14,0.146447 +35,15,0.146447 +35,16,0.146447 +35,17,0.146447 +35,18,0.146447 +35,19,0.146448 +35,20,0.14645 +35,21,0.146453 +35,22,0.14646 +35,23,0.146468 +35,24,0.146476 +35,25,0.146479 +35,26,0.146476 +35,27,0.146468 +35,28,0.14646 +35,29,0.146453 +35,30,0.14645 +35,31,0.146448 +35,32,0.146447 +35,33,0.146447 +35,34,0.146447 +35,35,0.146447 +35,36,0.146447 +35,37,0.146447 +35,38,0.146447 +35,39,0.146447 +35,40,0.146447 +35,41,0.146447 +35,42,0.146447 +35,43,0.146447 +35,44,0.146447 +35,45,0.146447 +35,46,0.146447 +35,47,0.146447 +35,48,0.146447 +35,49,0.146447 +36,0,0.146447 +36,1,0.146447 +36,2,0.146447 +36,3,0.146447 +36,4,0.146447 +36,5,0.146447 +36,6,0.146447 +36,7,0.146447 +36,8,0.146447 +36,9,0.146447 +36,10,0.146447 +36,11,0.146447 +36,12,0.146447 +36,13,0.146447 +36,14,0.146447 +36,15,0.146447 +36,16,0.146447 +36,17,0.146447 +36,18,0.146447 +36,19,0.146447 +36,20,0.146447 +36,21,0.146448 +36,22,0.146449 +36,23,0.14645 +36,24,0.146451 +36,25,0.146451 +36,26,0.146451 +36,27,0.14645 +36,28,0.146449 +36,29,0.146448 +36,30,0.146447 +36,31,0.146447 +36,32,0.146447 +36,33,0.146447 +36,34,0.146447 +36,35,0.146447 +36,36,0.146447 +36,37,0.146447 +36,38,0.146447 +36,39,0.146447 +36,40,0.146447 +36,41,0.146447 +36,42,0.146447 +36,43,0.146447 +36,44,0.146447 +36,45,0.146447 +36,46,0.146447 +36,47,0.146447 +36,48,0.146447 +36,49,0.146447 +37,0,0.146447 +37,1,0.146447 +37,2,0.146447 +37,3,0.146447 +37,4,0.146447 +37,5,0.146447 +37,6,0.146447 +37,7,0.146447 +37,8,0.146447 +37,9,0.146447 +37,10,0.146447 +37,11,0.146447 +37,12,0.146447 +37,13,0.146447 +37,14,0.146447 +37,15,0.146447 +37,16,0.146447 +37,17,0.146447 +37,18,0.146447 +37,19,0.146447 +37,20,0.146447 +37,21,0.146447 +37,22,0.146447 +37,23,0.146447 +37,24,0.146447 +37,25,0.146447 +37,26,0.146447 +37,27,0.146447 +37,28,0.146447 +37,29,0.146447 +37,30,0.146447 +37,31,0.146447 +37,32,0.146447 +37,33,0.146447 +37,34,0.146447 +37,35,0.146447 +37,36,0.146447 +37,37,0.146447 +37,38,0.146447 +37,39,0.146447 +37,40,0.146447 +37,41,0.146447 +37,42,0.146447 +37,43,0.146447 +37,44,0.146447 +37,45,0.146447 +37,46,0.146447 +37,47,0.146447 +37,48,0.146447 +37,49,0.146447 +38,0,0.146447 +38,1,0.146447 +38,2,0.146447 +38,3,0.146447 +38,4,0.146447 +38,5,0.146447 +38,6,0.146447 +38,7,0.146447 +38,8,0.146447 +38,9,0.146447 +38,10,0.146447 +38,11,0.146447 +38,12,0.146447 +38,13,0.146447 +38,14,0.146447 +38,15,0.146447 +38,16,0.146447 +38,17,0.146447 +38,18,0.146447 +38,19,0.146447 +38,20,0.146447 +38,21,0.146447 +38,22,0.146447 +38,23,0.146447 +38,24,0.146447 +38,25,0.146447 +38,26,0.146447 +38,27,0.146447 +38,28,0.146447 +38,29,0.146447 +38,30,0.146447 +38,31,0.146447 +38,32,0.146447 +38,33,0.146447 +38,34,0.146447 +38,35,0.146447 +38,36,0.146447 +38,37,0.146447 +38,38,0.146447 +38,39,0.146447 +38,40,0.146447 +38,41,0.146447 +38,42,0.146447 +38,43,0.146447 +38,44,0.146447 +38,45,0.146447 +38,46,0.146447 +38,47,0.146447 +38,48,0.146447 +38,49,0.146447 +39,0,0.146447 +39,1,0.146447 +39,2,0.146447 +39,3,0.146447 +39,4,0.146447 +39,5,0.146447 +39,6,0.146447 +39,7,0.146447 +39,8,0.146447 +39,9,0.146447 +39,10,0.146447 +39,11,0.146447 +39,12,0.146447 +39,13,0.146447 +39,14,0.146447 +39,15,0.146447 +39,16,0.146447 +39,17,0.146447 +39,18,0.146447 +39,19,0.146447 +39,20,0.146447 +39,21,0.146447 +39,22,0.146447 +39,23,0.146447 +39,24,0.146447 +39,25,0.146447 +39,26,0.146447 +39,27,0.146447 +39,28,0.146447 +39,29,0.146447 +39,30,0.146447 +39,31,0.146447 +39,32,0.146447 +39,33,0.146447 +39,34,0.146447 +39,35,0.146447 +39,36,0.146447 +39,37,0.146447 +39,38,0.146447 +39,39,0.146447 +39,40,0.146447 +39,41,0.146447 +39,42,0.146447 +39,43,0.146447 +39,44,0.146447 +39,45,0.146447 +39,46,0.146447 +39,47,0.146447 +39,48,0.146447 +39,49,0.146447 +40,0,0.146447 +40,1,0.146447 +40,2,0.146447 +40,3,0.146447 +40,4,0.146447 +40,5,0.146447 +40,6,0.146447 +40,7,0.146447 +40,8,0.146447 +40,9,0.146447 +40,10,0.146447 +40,11,0.146447 +40,12,0.146447 +40,13,0.146447 +40,14,0.146447 +40,15,0.146447 +40,16,0.146447 +40,17,0.146447 +40,18,0.146447 +40,19,0.146447 +40,20,0.146447 +40,21,0.146447 +40,22,0.146447 +40,23,0.146447 +40,24,0.146447 +40,25,0.146447 +40,26,0.146447 +40,27,0.146447 +40,28,0.146447 +40,29,0.146447 +40,30,0.146447 +40,31,0.146447 +40,32,0.146447 +40,33,0.146447 +40,34,0.146447 +40,35,0.146447 +40,36,0.146447 +40,37,0.146447 +40,38,0.146447 +40,39,0.146447 +40,40,0.146447 +40,41,0.146447 +40,42,0.146447 +40,43,0.146447 +40,44,0.146447 +40,45,0.146447 +40,46,0.146447 +40,47,0.146447 +40,48,0.146447 +40,49,0.146447 +41,0,0.146447 +41,1,0.146447 +41,2,0.146447 +41,3,0.146447 +41,4,0.146447 +41,5,0.146447 +41,6,0.146447 +41,7,0.146447 +41,8,0.146447 +41,9,0.146447 +41,10,0.146447 +41,11,0.146447 +41,12,0.146447 +41,13,0.146447 +41,14,0.146447 +41,15,0.146447 +41,16,0.146447 +41,17,0.146447 +41,18,0.146447 +41,19,0.146447 +41,20,0.146447 +41,21,0.146447 +41,22,0.146447 +41,23,0.146447 +41,24,0.146447 +41,25,0.146447 +41,26,0.146447 +41,27,0.146447 +41,28,0.146447 +41,29,0.146447 +41,30,0.146447 +41,31,0.146447 +41,32,0.146447 +41,33,0.146447 +41,34,0.146447 +41,35,0.146447 +41,36,0.146447 +41,37,0.146447 +41,38,0.146447 +41,39,0.146447 +41,40,0.146447 +41,41,0.146447 +41,42,0.146447 +41,43,0.146447 +41,44,0.146447 +41,45,0.146447 +41,46,0.146447 +41,47,0.146447 +41,48,0.146447 +41,49,0.146447 +42,0,0.146447 +42,1,0.146447 +42,2,0.146447 +42,3,0.146447 +42,4,0.146447 +42,5,0.146447 +42,6,0.146447 +42,7,0.146447 +42,8,0.146447 +42,9,0.146447 +42,10,0.146447 +42,11,0.146447 +42,12,0.146447 +42,13,0.146447 +42,14,0.146447 +42,15,0.146447 +42,16,0.146447 +42,17,0.146447 +42,18,0.146447 +42,19,0.146447 +42,20,0.146447 +42,21,0.146447 +42,22,0.146447 +42,23,0.146447 +42,24,0.146447 +42,25,0.146447 +42,26,0.146447 +42,27,0.146447 +42,28,0.146447 +42,29,0.146447 +42,30,0.146447 +42,31,0.146447 +42,32,0.146447 +42,33,0.146447 +42,34,0.146447 +42,35,0.146447 +42,36,0.146447 +42,37,0.146447 +42,38,0.146447 +42,39,0.146447 +42,40,0.146447 +42,41,0.146447 +42,42,0.146447 +42,43,0.146447 +42,44,0.146447 +42,45,0.146447 +42,46,0.146447 +42,47,0.146447 +42,48,0.146447 +42,49,0.146447 +43,0,0.146447 +43,1,0.146447 +43,2,0.146447 +43,3,0.146447 +43,4,0.146447 +43,5,0.146447 +43,6,0.146447 +43,7,0.146447 +43,8,0.146447 +43,9,0.146447 +43,10,0.146447 +43,11,0.146447 +43,12,0.146447 +43,13,0.146447 +43,14,0.146447 +43,15,0.146447 +43,16,0.146447 +43,17,0.146447 +43,18,0.146447 +43,19,0.146447 +43,20,0.146447 +43,21,0.146447 +43,22,0.146447 +43,23,0.146447 +43,24,0.146447 +43,25,0.146447 +43,26,0.146447 +43,27,0.146447 +43,28,0.146447 +43,29,0.146447 +43,30,0.146447 +43,31,0.146447 +43,32,0.146447 +43,33,0.146447 +43,34,0.146447 +43,35,0.146447 +43,36,0.146447 +43,37,0.146447 +43,38,0.146447 +43,39,0.146447 +43,40,0.146447 +43,41,0.146447 +43,42,0.146447 +43,43,0.146447 +43,44,0.146447 +43,45,0.146447 +43,46,0.146447 +43,47,0.146447 +43,48,0.146447 +43,49,0.146447 +44,0,0.146447 +44,1,0.146447 +44,2,0.146447 +44,3,0.146447 +44,4,0.146447 +44,5,0.146447 +44,6,0.146447 +44,7,0.146447 +44,8,0.146447 +44,9,0.146447 +44,10,0.146447 +44,11,0.146447 +44,12,0.146447 +44,13,0.146447 +44,14,0.146447 +44,15,0.146447 +44,16,0.146447 +44,17,0.146447 +44,18,0.146447 +44,19,0.146447 +44,20,0.146447 +44,21,0.146447 +44,22,0.146447 +44,23,0.146447 +44,24,0.146447 +44,25,0.146447 +44,26,0.146447 +44,27,0.146447 +44,28,0.146447 +44,29,0.146447 +44,30,0.146447 +44,31,0.146447 +44,32,0.146447 +44,33,0.146447 +44,34,0.146447 +44,35,0.146447 +44,36,0.146447 +44,37,0.146447 +44,38,0.146447 +44,39,0.146447 +44,40,0.146447 +44,41,0.146447 +44,42,0.146447 +44,43,0.146447 +44,44,0.146447 +44,45,0.146447 +44,46,0.146447 +44,47,0.146447 +44,48,0.146447 +44,49,0.146447 +45,0,0.146447 +45,1,0.146447 +45,2,0.146447 +45,3,0.146447 +45,4,0.146447 +45,5,0.146447 +45,6,0.146447 +45,7,0.146447 +45,8,0.146447 +45,9,0.146447 +45,10,0.146447 +45,11,0.146447 +45,12,0.146447 +45,13,0.146447 +45,14,0.146447 +45,15,0.146447 +45,16,0.146447 +45,17,0.146447 +45,18,0.146447 +45,19,0.146447 +45,20,0.146447 +45,21,0.146447 +45,22,0.146447 +45,23,0.146447 +45,24,0.146447 +45,25,0.146447 +45,26,0.146447 +45,27,0.146447 +45,28,0.146447 +45,29,0.146447 +45,30,0.146447 +45,31,0.146447 +45,32,0.146447 +45,33,0.146447 +45,34,0.146447 +45,35,0.146447 +45,36,0.146447 +45,37,0.146447 +45,38,0.146447 +45,39,0.146447 +45,40,0.146447 +45,41,0.146447 +45,42,0.146447 +45,43,0.146447 +45,44,0.146447 +45,45,0.146447 +45,46,0.146447 +45,47,0.146447 +45,48,0.146447 +45,49,0.146447 +46,0,0.146447 +46,1,0.146447 +46,2,0.146447 +46,3,0.146447 +46,4,0.146447 +46,5,0.146447 +46,6,0.146447 +46,7,0.146447 +46,8,0.146447 +46,9,0.146447 +46,10,0.146447 +46,11,0.146447 +46,12,0.146447 +46,13,0.146447 +46,14,0.146447 +46,15,0.146447 +46,16,0.146447 +46,17,0.146447 +46,18,0.146447 +46,19,0.146447 +46,20,0.146447 +46,21,0.146447 +46,22,0.146447 +46,23,0.146447 +46,24,0.146447 +46,25,0.146447 +46,26,0.146447 +46,27,0.146447 +46,28,0.146447 +46,29,0.146447 +46,30,0.146447 +46,31,0.146447 +46,32,0.146447 +46,33,0.146447 +46,34,0.146447 +46,35,0.146447 +46,36,0.146447 +46,37,0.146447 +46,38,0.146447 +46,39,0.146447 +46,40,0.146447 +46,41,0.146447 +46,42,0.146447 +46,43,0.146447 +46,44,0.146447 +46,45,0.146447 +46,46,0.146447 +46,47,0.146447 +46,48,0.146447 +46,49,0.146447 +47,0,0.146447 +47,1,0.146447 +47,2,0.146447 +47,3,0.146447 +47,4,0.146447 +47,5,0.146447 +47,6,0.146447 +47,7,0.146447 +47,8,0.146447 +47,9,0.146447 +47,10,0.146447 +47,11,0.146447 +47,12,0.146447 +47,13,0.146447 +47,14,0.146447 +47,15,0.146447 +47,16,0.146447 +47,17,0.146447 +47,18,0.146447 +47,19,0.146447 +47,20,0.146447 +47,21,0.146447 +47,22,0.146447 +47,23,0.146447 +47,24,0.146447 +47,25,0.146447 +47,26,0.146447 +47,27,0.146447 +47,28,0.146447 +47,29,0.146447 +47,30,0.146447 +47,31,0.146447 +47,32,0.146447 +47,33,0.146447 +47,34,0.146447 +47,35,0.146447 +47,36,0.146447 +47,37,0.146447 +47,38,0.146447 +47,39,0.146447 +47,40,0.146447 +47,41,0.146447 +47,42,0.146447 +47,43,0.146447 +47,44,0.146447 +47,45,0.146447 +47,46,0.146447 +47,47,0.146447 +47,48,0.146447 +47,49,0.146447 +48,0,0.146447 +48,1,0.146447 +48,2,0.146447 +48,3,0.146447 +48,4,0.146447 +48,5,0.146447 +48,6,0.146447 +48,7,0.146447 +48,8,0.146447 +48,9,0.146447 +48,10,0.146447 +48,11,0.146447 +48,12,0.146447 +48,13,0.146447 +48,14,0.146447 +48,15,0.146447 +48,16,0.146447 +48,17,0.146447 +48,18,0.146447 +48,19,0.146447 +48,20,0.146447 +48,21,0.146447 +48,22,0.146447 +48,23,0.146447 +48,24,0.146447 +48,25,0.146447 +48,26,0.146447 +48,27,0.146447 +48,28,0.146447 +48,29,0.146447 +48,30,0.146447 +48,31,0.146447 +48,32,0.146447 +48,33,0.146447 +48,34,0.146447 +48,35,0.146447 +48,36,0.146447 +48,37,0.146447 +48,38,0.146447 +48,39,0.146447 +48,40,0.146447 +48,41,0.146447 +48,42,0.146447 +48,43,0.146447 +48,44,0.146447 +48,45,0.146447 +48,46,0.146447 +48,47,0.146447 +48,48,0.146447 +48,49,0.146447 +49,0,0.146447 +49,1,0.146447 +49,2,0.146447 +49,3,0.146447 +49,4,0.146447 +49,5,0.146447 +49,6,0.146447 +49,7,0.146447 +49,8,0.146447 +49,9,0.146447 +49,10,0.146447 +49,11,0.146447 +49,12,0.146447 +49,13,0.146447 +49,14,0.146447 +49,15,0.146447 +49,16,0.146447 +49,17,0.146447 +49,18,0.146447 +49,19,0.146447 +49,20,0.146447 +49,21,0.146447 +49,22,0.146447 +49,23,0.146447 +49,24,0.146447 +49,25,0.146447 +49,26,0.146447 +49,27,0.146447 +49,28,0.146447 +49,29,0.146447 +49,30,0.146447 +49,31,0.146447 +49,32,0.146447 +49,33,0.146447 +49,34,0.146447 +49,35,0.146447 +49,36,0.146447 +49,37,0.146447 +49,38,0.146447 +49,39,0.146447 +49,40,0.146447 +49,41,0.146447 +49,42,0.146447 +49,43,0.146447 +49,44,0.146447 +49,45,0.146447 +49,46,0.146447 +49,47,0.146447 +49,48,0.146447 +49,49,0.146447 diff --git a/examples/pfhub_bm8/output_100.txt b/examples/pfhub_bm8/output_100.txt new file mode 100644 index 0000000..ab59b2a --- /dev/null +++ b/examples/pfhub_bm8/output_100.txt @@ -0,0 +1,2500 @@ +0,0,0.16809 +0,1,0.168113 +0,2,0.168114 +0,3,0.168114 +0,4,0.168114 +0,5,0.168114 +0,6,0.168114 +0,7,0.168114 +0,8,0.168114 +0,9,0.168114 +0,10,0.168114 +0,11,0.168114 +0,12,0.168114 +0,13,0.168114 +0,14,0.168114 +0,15,0.168114 +0,16,0.168114 +0,17,0.168114 +0,18,0.168114 +0,19,0.168114 +0,20,0.168114 +0,21,0.168114 +0,22,0.168114 +0,23,0.168114 +0,24,0.168114 +0,25,0.168114 +0,26,0.168114 +0,27,0.168114 +0,28,0.168114 +0,29,0.168114 +0,30,0.168114 +0,31,0.168114 +0,32,0.168114 +0,33,0.168114 +0,34,0.168114 +0,35,0.168114 +0,36,0.168114 +0,37,0.168114 +0,38,0.168114 +0,39,0.168114 +0,40,0.168114 +0,41,0.168114 +0,42,0.168114 +0,43,0.168114 +0,44,0.168114 +0,45,0.168114 +0,46,0.168114 +0,47,0.168114 +0,48,0.168114 +0,49,0.168114 +1,0,0.168113 +1,1,0.168137 +1,2,0.168137 +1,3,0.168137 +1,4,0.168137 +1,5,0.168137 +1,6,0.168137 +1,7,0.168137 +1,8,0.168137 +1,9,0.168137 +1,10,0.168137 +1,11,0.168137 +1,12,0.168137 +1,13,0.168137 +1,14,0.168137 +1,15,0.168137 +1,16,0.168137 +1,17,0.168137 +1,18,0.168137 +1,19,0.168137 +1,20,0.168137 +1,21,0.168137 +1,22,0.168137 +1,23,0.168137 +1,24,0.168137 +1,25,0.168137 +1,26,0.168137 +1,27,0.168137 +1,28,0.168137 +1,29,0.168137 +1,30,0.168137 +1,31,0.168137 +1,32,0.168137 +1,33,0.168137 +1,34,0.168137 +1,35,0.168137 +1,36,0.168137 +1,37,0.168137 +1,38,0.168137 +1,39,0.168137 +1,40,0.168137 +1,41,0.168137 +1,42,0.168137 +1,43,0.168137 +1,44,0.168137 +1,45,0.168137 +1,46,0.168137 +1,47,0.168137 +1,48,0.168137 +1,49,0.168137 +2,0,0.168114 +2,1,0.168137 +2,2,0.168138 +2,3,0.168138 +2,4,0.168138 +2,5,0.168138 +2,6,0.168138 +2,7,0.168138 +2,8,0.168138 +2,9,0.168138 +2,10,0.168138 +2,11,0.168138 +2,12,0.168138 +2,13,0.168138 +2,14,0.168138 +2,15,0.168138 +2,16,0.168138 +2,17,0.168138 +2,18,0.168138 +2,19,0.168138 +2,20,0.168138 +2,21,0.168138 +2,22,0.168138 +2,23,0.168138 +2,24,0.168138 +2,25,0.168138 +2,26,0.168138 +2,27,0.168138 +2,28,0.168138 +2,29,0.168138 +2,30,0.168138 +2,31,0.168138 +2,32,0.168138 +2,33,0.168138 +2,34,0.168138 +2,35,0.168138 +2,36,0.168138 +2,37,0.168138 +2,38,0.168138 +2,39,0.168138 +2,40,0.168138 +2,41,0.168138 +2,42,0.168138 +2,43,0.168138 +2,44,0.168138 +2,45,0.168138 +2,46,0.168138 +2,47,0.168138 +2,48,0.168138 +2,49,0.168138 +3,0,0.168114 +3,1,0.168137 +3,2,0.168138 +3,3,0.168138 +3,4,0.168138 +3,5,0.168138 +3,6,0.168138 +3,7,0.168138 +3,8,0.168138 +3,9,0.168138 +3,10,0.168138 +3,11,0.168138 +3,12,0.168138 +3,13,0.168138 +3,14,0.168138 +3,15,0.168138 +3,16,0.168138 +3,17,0.168138 +3,18,0.168138 +3,19,0.168138 +3,20,0.168138 +3,21,0.168138 +3,22,0.168138 +3,23,0.168138 +3,24,0.168138 +3,25,0.168138 +3,26,0.168138 +3,27,0.168138 +3,28,0.168138 +3,29,0.168138 +3,30,0.168138 +3,31,0.168138 +3,32,0.168138 +3,33,0.168138 +3,34,0.168138 +3,35,0.168138 +3,36,0.168138 +3,37,0.168138 +3,38,0.168138 +3,39,0.168138 +3,40,0.168138 +3,41,0.168138 +3,42,0.168138 +3,43,0.168138 +3,44,0.168138 +3,45,0.168138 +3,46,0.168138 +3,47,0.168138 +3,48,0.168138 +3,49,0.168138 +4,0,0.168114 +4,1,0.168137 +4,2,0.168138 +4,3,0.168138 +4,4,0.168138 +4,5,0.168138 +4,6,0.168138 +4,7,0.168138 +4,8,0.168138 +4,9,0.168138 +4,10,0.168138 +4,11,0.168138 +4,12,0.168138 +4,13,0.168138 +4,14,0.168138 +4,15,0.168138 +4,16,0.168138 +4,17,0.168138 +4,18,0.168138 +4,19,0.168138 +4,20,0.168138 +4,21,0.168138 +4,22,0.168138 +4,23,0.168138 +4,24,0.168138 +4,25,0.168138 +4,26,0.168138 +4,27,0.168138 +4,28,0.168138 +4,29,0.168138 +4,30,0.168138 +4,31,0.168138 +4,32,0.168138 +4,33,0.168138 +4,34,0.168138 +4,35,0.168138 +4,36,0.168138 +4,37,0.168138 +4,38,0.168138 +4,39,0.168138 +4,40,0.168138 +4,41,0.168138 +4,42,0.168138 +4,43,0.168138 +4,44,0.168138 +4,45,0.168138 +4,46,0.168138 +4,47,0.168138 +4,48,0.168138 +4,49,0.168138 +5,0,0.168114 +5,1,0.168137 +5,2,0.168138 +5,3,0.168138 +5,4,0.168138 +5,5,0.168138 +5,6,0.168138 +5,7,0.168138 +5,8,0.168138 +5,9,0.168138 +5,10,0.168138 +5,11,0.168138 +5,12,0.168138 +5,13,0.168138 +5,14,0.168138 +5,15,0.168138 +5,16,0.168138 +5,17,0.168138 +5,18,0.168138 +5,19,0.168138 +5,20,0.168138 +5,21,0.168138 +5,22,0.168138 +5,23,0.168138 +5,24,0.168138 +5,25,0.168138 +5,26,0.168138 +5,27,0.168138 +5,28,0.168138 +5,29,0.168138 +5,30,0.168138 +5,31,0.168138 +5,32,0.168138 +5,33,0.168138 +5,34,0.168138 +5,35,0.168138 +5,36,0.168138 +5,37,0.168138 +5,38,0.168138 +5,39,0.168138 +5,40,0.168138 +5,41,0.168138 +5,42,0.168138 +5,43,0.168138 +5,44,0.168138 +5,45,0.168138 +5,46,0.168138 +5,47,0.168138 +5,48,0.168138 +5,49,0.168138 +6,0,0.168114 +6,1,0.168137 +6,2,0.168138 +6,3,0.168138 +6,4,0.168138 +6,5,0.168138 +6,6,0.168138 +6,7,0.168138 +6,8,0.168138 +6,9,0.168138 +6,10,0.168138 +6,11,0.168138 +6,12,0.168138 +6,13,0.168138 +6,14,0.168138 +6,15,0.168138 +6,16,0.168138 +6,17,0.168138 +6,18,0.168138 +6,19,0.168138 +6,20,0.168138 +6,21,0.168138 +6,22,0.168138 +6,23,0.168138 +6,24,0.168138 +6,25,0.168138 +6,26,0.168138 +6,27,0.168138 +6,28,0.168138 +6,29,0.168138 +6,30,0.168138 +6,31,0.168138 +6,32,0.168138 +6,33,0.168138 +6,34,0.168138 +6,35,0.168138 +6,36,0.168138 +6,37,0.168138 +6,38,0.168138 +6,39,0.168138 +6,40,0.168138 +6,41,0.168138 +6,42,0.168138 +6,43,0.168138 +6,44,0.168138 +6,45,0.168138 +6,46,0.168138 +6,47,0.168138 +6,48,0.168138 +6,49,0.168138 +7,0,0.168114 +7,1,0.168137 +7,2,0.168138 +7,3,0.168138 +7,4,0.168138 +7,5,0.168138 +7,6,0.168138 +7,7,0.168138 +7,8,0.168138 +7,9,0.168138 +7,10,0.168138 +7,11,0.168138 +7,12,0.168138 +7,13,0.168138 +7,14,0.168138 +7,15,0.168138 +7,16,0.168138 +7,17,0.168138 +7,18,0.168138 +7,19,0.168138 +7,20,0.168138 +7,21,0.168138 +7,22,0.168138 +7,23,0.168138 +7,24,0.168138 +7,25,0.168138 +7,26,0.168138 +7,27,0.168138 +7,28,0.168138 +7,29,0.168138 +7,30,0.168138 +7,31,0.168138 +7,32,0.168138 +7,33,0.168138 +7,34,0.168138 +7,35,0.168138 +7,36,0.168138 +7,37,0.168138 +7,38,0.168138 +7,39,0.168138 +7,40,0.168138 +7,41,0.168138 +7,42,0.168138 +7,43,0.168138 +7,44,0.168138 +7,45,0.168138 +7,46,0.168138 +7,47,0.168138 +7,48,0.168138 +7,49,0.168138 +8,0,0.168114 +8,1,0.168137 +8,2,0.168138 +8,3,0.168138 +8,4,0.168138 +8,5,0.168138 +8,6,0.168138 +8,7,0.168138 +8,8,0.168138 +8,9,0.168138 +8,10,0.168138 +8,11,0.168138 +8,12,0.168138 +8,13,0.168138 +8,14,0.168138 +8,15,0.168138 +8,16,0.168138 +8,17,0.168138 +8,18,0.168138 +8,19,0.168138 +8,20,0.168138 +8,21,0.168138 +8,22,0.168138 +8,23,0.168138 +8,24,0.168138 +8,25,0.168138 +8,26,0.168138 +8,27,0.168138 +8,28,0.168138 +8,29,0.168138 +8,30,0.168138 +8,31,0.168138 +8,32,0.168138 +8,33,0.168138 +8,34,0.168138 +8,35,0.168138 +8,36,0.168138 +8,37,0.168138 +8,38,0.168138 +8,39,0.168138 +8,40,0.168138 +8,41,0.168138 +8,42,0.168138 +8,43,0.168138 +8,44,0.168138 +8,45,0.168138 +8,46,0.168138 +8,47,0.168138 +8,48,0.168138 +8,49,0.168138 +9,0,0.168114 +9,1,0.168137 +9,2,0.168138 +9,3,0.168138 +9,4,0.168138 +9,5,0.168138 +9,6,0.168138 +9,7,0.168138 +9,8,0.168138 +9,9,0.168138 +9,10,0.168138 +9,11,0.168138 +9,12,0.168138 +9,13,0.168138 +9,14,0.168138 +9,15,0.168138 +9,16,0.168138 +9,17,0.168138 +9,18,0.168138 +9,19,0.168138 +9,20,0.168138 +9,21,0.168138 +9,22,0.168138 +9,23,0.168138 +9,24,0.168138 +9,25,0.168138 +9,26,0.168138 +9,27,0.168138 +9,28,0.168138 +9,29,0.168138 +9,30,0.168138 +9,31,0.168138 +9,32,0.168138 +9,33,0.168138 +9,34,0.168138 +9,35,0.168138 +9,36,0.168138 +9,37,0.168138 +9,38,0.168138 +9,39,0.168138 +9,40,0.168138 +9,41,0.168138 +9,42,0.168138 +9,43,0.168138 +9,44,0.168138 +9,45,0.168138 +9,46,0.168138 +9,47,0.168138 +9,48,0.168138 +9,49,0.168138 +10,0,0.168114 +10,1,0.168137 +10,2,0.168138 +10,3,0.168138 +10,4,0.168138 +10,5,0.168138 +10,6,0.168138 +10,7,0.168138 +10,8,0.168138 +10,9,0.168138 +10,10,0.168138 +10,11,0.168138 +10,12,0.168138 +10,13,0.168138 +10,14,0.168138 +10,15,0.168138 +10,16,0.168138 +10,17,0.168138 +10,18,0.168138 +10,19,0.168138 +10,20,0.168138 +10,21,0.168138 +10,22,0.168138 +10,23,0.168138 +10,24,0.168138 +10,25,0.168138 +10,26,0.168138 +10,27,0.168138 +10,28,0.168138 +10,29,0.168138 +10,30,0.168138 +10,31,0.168138 +10,32,0.168138 +10,33,0.168138 +10,34,0.168138 +10,35,0.168138 +10,36,0.168138 +10,37,0.168138 +10,38,0.168138 +10,39,0.168138 +10,40,0.168138 +10,41,0.168138 +10,42,0.168138 +10,43,0.168138 +10,44,0.168138 +10,45,0.168138 +10,46,0.168138 +10,47,0.168138 +10,48,0.168138 +10,49,0.168138 +11,0,0.168114 +11,1,0.168137 +11,2,0.168138 +11,3,0.168138 +11,4,0.168138 +11,5,0.168138 +11,6,0.168138 +11,7,0.168138 +11,8,0.168138 +11,9,0.168138 +11,10,0.168138 +11,11,0.168138 +11,12,0.168138 +11,13,0.168138 +11,14,0.168138 +11,15,0.168138 +11,16,0.168138 +11,17,0.168138 +11,18,0.168138 +11,19,0.168138 +11,20,0.168138 +11,21,0.168138 +11,22,0.168138 +11,23,0.168138 +11,24,0.168138 +11,25,0.168138 +11,26,0.168138 +11,27,0.168138 +11,28,0.168138 +11,29,0.168138 +11,30,0.168138 +11,31,0.168138 +11,32,0.168138 +11,33,0.168138 +11,34,0.168138 +11,35,0.168138 +11,36,0.168138 +11,37,0.168138 +11,38,0.168138 +11,39,0.168138 +11,40,0.168138 +11,41,0.168138 +11,42,0.168138 +11,43,0.168138 +11,44,0.168138 +11,45,0.168138 +11,46,0.168138 +11,47,0.168138 +11,48,0.168138 +11,49,0.168138 +12,0,0.168114 +12,1,0.168137 +12,2,0.168138 +12,3,0.168138 +12,4,0.168138 +12,5,0.168138 +12,6,0.168138 +12,7,0.168138 +12,8,0.168138 +12,9,0.168138 +12,10,0.168138 +12,11,0.168138 +12,12,0.168138 +12,13,0.168138 +12,14,0.168138 +12,15,0.168138 +12,16,0.168138 +12,17,0.168138 +12,18,0.168138 +12,19,0.168138 +12,20,0.168138 +12,21,0.168138 +12,22,0.168138 +12,23,0.168138 +12,24,0.168138 +12,25,0.168138 +12,26,0.168138 +12,27,0.168138 +12,28,0.168138 +12,29,0.168138 +12,30,0.168138 +12,31,0.168138 +12,32,0.168138 +12,33,0.168138 +12,34,0.168138 +12,35,0.168138 +12,36,0.168138 +12,37,0.168138 +12,38,0.168138 +12,39,0.168138 +12,40,0.168138 +12,41,0.168138 +12,42,0.168138 +12,43,0.168138 +12,44,0.168138 +12,45,0.168138 +12,46,0.168138 +12,47,0.168138 +12,48,0.168138 +12,49,0.168138 +13,0,0.168114 +13,1,0.168137 +13,2,0.168138 +13,3,0.168138 +13,4,0.168138 +13,5,0.168138 +13,6,0.168138 +13,7,0.168138 +13,8,0.168138 +13,9,0.168138 +13,10,0.168138 +13,11,0.168138 +13,12,0.168138 +13,13,0.168138 +13,14,0.168138 +13,15,0.168138 +13,16,0.168138 +13,17,0.168138 +13,18,0.168138 +13,19,0.168138 +13,20,0.168138 +13,21,0.168138 +13,22,0.168138 +13,23,0.168138 +13,24,0.168139 +13,25,0.168139 +13,26,0.168139 +13,27,0.168138 +13,28,0.168138 +13,29,0.168138 +13,30,0.168138 +13,31,0.168138 +13,32,0.168138 +13,33,0.168138 +13,34,0.168138 +13,35,0.168138 +13,36,0.168138 +13,37,0.168138 +13,38,0.168138 +13,39,0.168138 +13,40,0.168138 +13,41,0.168138 +13,42,0.168138 +13,43,0.168138 +13,44,0.168138 +13,45,0.168138 +13,46,0.168138 +13,47,0.168138 +13,48,0.168138 +13,49,0.168138 +14,0,0.168114 +14,1,0.168137 +14,2,0.168138 +14,3,0.168138 +14,4,0.168138 +14,5,0.168138 +14,6,0.168138 +14,7,0.168138 +14,8,0.168138 +14,9,0.168138 +14,10,0.168138 +14,11,0.168138 +14,12,0.168138 +14,13,0.168138 +14,14,0.168138 +14,15,0.168138 +14,16,0.168138 +14,17,0.168138 +14,18,0.168138 +14,19,0.168138 +14,20,0.168139 +14,21,0.168139 +14,22,0.168141 +14,23,0.168143 +14,24,0.168144 +14,25,0.168145 +14,26,0.168144 +14,27,0.168143 +14,28,0.168141 +14,29,0.168139 +14,30,0.168139 +14,31,0.168138 +14,32,0.168138 +14,33,0.168138 +14,34,0.168138 +14,35,0.168138 +14,36,0.168138 +14,37,0.168138 +14,38,0.168138 +14,39,0.168138 +14,40,0.168138 +14,41,0.168138 +14,42,0.168138 +14,43,0.168138 +14,44,0.168138 +14,45,0.168138 +14,46,0.168138 +14,47,0.168138 +14,48,0.168138 +14,49,0.168138 +15,0,0.168114 +15,1,0.168137 +15,2,0.168138 +15,3,0.168138 +15,4,0.168138 +15,5,0.168138 +15,6,0.168138 +15,7,0.168138 +15,8,0.168138 +15,9,0.168138 +15,10,0.168138 +15,11,0.168138 +15,12,0.168138 +15,13,0.168138 +15,14,0.168138 +15,15,0.168138 +15,16,0.168138 +15,17,0.168138 +15,18,0.168138 +15,19,0.16814 +15,20,0.168143 +15,21,0.168149 +15,22,0.16816 +15,23,0.168174 +15,24,0.168187 +15,25,0.168192 +15,26,0.168187 +15,27,0.168174 +15,28,0.16816 +15,29,0.168149 +15,30,0.168143 +15,31,0.16814 +15,32,0.168138 +15,33,0.168138 +15,34,0.168138 +15,35,0.168138 +15,36,0.168138 +15,37,0.168138 +15,38,0.168138 +15,39,0.168138 +15,40,0.168138 +15,41,0.168138 +15,42,0.168138 +15,43,0.168138 +15,44,0.168138 +15,45,0.168138 +15,46,0.168138 +15,47,0.168138 +15,48,0.168138 +15,49,0.168138 +16,0,0.168114 +16,1,0.168137 +16,2,0.168138 +16,3,0.168138 +16,4,0.168138 +16,5,0.168138 +16,6,0.168138 +16,7,0.168138 +16,8,0.168138 +16,9,0.168138 +16,10,0.168138 +16,11,0.168138 +16,12,0.168138 +16,13,0.168138 +16,14,0.168138 +16,15,0.168138 +16,16,0.168138 +16,17,0.168139 +16,18,0.168141 +16,19,0.168148 +16,20,0.168167 +16,21,0.168209 +16,22,0.168286 +16,23,0.168393 +16,24,0.168495 +16,25,0.168538 +16,26,0.168495 +16,27,0.168393 +16,28,0.168286 +16,29,0.168209 +16,30,0.168167 +16,31,0.168148 +16,32,0.168141 +16,33,0.168139 +16,34,0.168138 +16,35,0.168138 +16,36,0.168138 +16,37,0.168138 +16,38,0.168138 +16,39,0.168138 +16,40,0.168138 +16,41,0.168138 +16,42,0.168138 +16,43,0.168138 +16,44,0.168138 +16,45,0.168138 +16,46,0.168138 +16,47,0.168138 +16,48,0.168138 +16,49,0.168138 +17,0,0.168114 +17,1,0.168137 +17,2,0.168138 +17,3,0.168138 +17,4,0.168138 +17,5,0.168138 +17,6,0.168138 +17,7,0.168138 +17,8,0.168138 +17,9,0.168138 +17,10,0.168138 +17,11,0.168138 +17,12,0.168138 +17,13,0.168138 +17,14,0.168138 +17,15,0.168138 +17,16,0.168139 +17,17,0.168141 +17,18,0.168152 +17,19,0.168189 +17,20,0.168299 +17,21,0.16857 +17,22,0.169107 +17,23,0.16991 +17,24,0.170712 +17,25,0.171058 +17,26,0.170712 +17,27,0.169911 +17,28,0.169108 +17,29,0.16857 +17,30,0.168299 +17,31,0.168189 +17,32,0.168152 +17,33,0.168141 +17,34,0.168139 +17,35,0.168138 +17,36,0.168138 +17,37,0.168138 +17,38,0.168138 +17,39,0.168138 +17,40,0.168138 +17,41,0.168138 +17,42,0.168138 +17,43,0.168138 +17,44,0.168138 +17,45,0.168138 +17,46,0.168138 +17,47,0.168138 +17,48,0.168138 +17,49,0.168138 +18,0,0.168114 +18,1,0.168137 +18,2,0.168138 +18,3,0.168138 +18,4,0.168138 +18,5,0.168138 +18,6,0.168138 +18,7,0.168138 +18,8,0.168138 +18,9,0.168138 +18,10,0.168138 +18,11,0.168138 +18,12,0.168138 +18,13,0.168138 +18,14,0.168138 +18,15,0.168138 +18,16,0.168141 +18,17,0.168152 +18,18,0.168201 +18,19,0.168383 +18,20,0.168981 +18,21,0.170626 +18,22,0.174217 +18,23,0.179971 +18,24,0.185953 +18,25,0.188584 +18,26,0.185957 +18,27,0.179976 +18,28,0.174221 +18,29,0.170628 +18,30,0.168982 +18,31,0.168383 +18,32,0.168201 +18,33,0.168152 +18,34,0.168141 +18,35,0.168138 +18,36,0.168138 +18,37,0.168138 +18,38,0.168138 +18,39,0.168138 +18,40,0.168138 +18,41,0.168138 +18,42,0.168138 +18,43,0.168138 +18,44,0.168138 +18,45,0.168138 +18,46,0.168138 +18,47,0.168138 +18,48,0.168138 +18,49,0.168138 +19,0,0.168114 +19,1,0.168137 +19,2,0.168138 +19,3,0.168138 +19,4,0.168138 +19,5,0.168138 +19,6,0.168138 +19,7,0.168138 +19,8,0.168138 +19,9,0.168138 +19,10,0.168138 +19,11,0.168138 +19,12,0.168138 +19,13,0.168138 +19,14,0.168138 +19,15,0.16814 +19,16,0.168148 +19,17,0.168189 +19,18,0.168383 +19,19,0.169196 +19,20,0.172194 +19,21,0.181385 +19,22,0.203037 +19,23,0.238498 +19,24,0.274497 +19,25,0.289859 +19,26,0.274512 +19,27,0.238521 +19,28,0.203058 +19,29,0.181398 +19,30,0.1722 +19,31,0.169198 +19,32,0.168383 +19,33,0.168189 +19,34,0.168148 +19,35,0.16814 +19,36,0.168138 +19,37,0.168138 +19,38,0.168138 +19,39,0.168138 +19,40,0.168138 +19,41,0.168138 +19,42,0.168138 +19,43,0.168138 +19,44,0.168138 +19,45,0.168138 +19,46,0.168138 +19,47,0.168138 +19,48,0.168138 +19,49,0.168138 +20,0,0.168114 +20,1,0.168137 +20,2,0.168138 +20,3,0.168138 +20,4,0.168138 +20,5,0.168138 +20,6,0.168138 +20,7,0.168138 +20,8,0.168138 +20,9,0.168138 +20,10,0.168138 +20,11,0.168138 +20,12,0.168138 +20,13,0.168138 +20,14,0.168139 +20,15,0.168143 +20,16,0.168167 +20,17,0.168299 +20,18,0.168981 +20,19,0.172194 +20,20,0.185433 +20,21,0.229093 +20,22,0.327965 +20,23,0.459097 +20,24,0.555306 +20,25,0.587635 +20,26,0.555305 +20,27,0.459118 +20,28,0.328015 +20,29,0.229139 +20,30,0.185456 +20,31,0.172201 +20,32,0.168982 +20,33,0.168299 +20,34,0.168167 +20,35,0.168143 +20,36,0.168139 +20,37,0.168138 +20,38,0.168138 +20,39,0.168138 +20,40,0.168138 +20,41,0.168138 +20,42,0.168138 +20,43,0.168138 +20,44,0.168138 +20,45,0.168138 +20,46,0.168138 +20,47,0.168138 +20,48,0.168138 +20,49,0.168138 +21,0,0.168114 +21,1,0.168137 +21,2,0.168138 +21,3,0.168138 +21,4,0.168138 +21,5,0.168138 +21,6,0.168138 +21,7,0.168138 +21,8,0.168138 +21,9,0.168138 +21,10,0.168138 +21,11,0.168138 +21,12,0.168138 +21,13,0.168138 +21,14,0.168139 +21,15,0.168149 +21,16,0.168209 +21,17,0.16857 +21,18,0.170626 +21,19,0.181385 +21,20,0.229093 +21,21,0.37484 +21,22,0.588015 +21,23,0.728894 +21,24,0.789607 +21,25,0.805447 +21,26,0.789589 +21,27,0.728855 +21,28,0.587996 +21,29,0.374888 +21,30,0.229151 +21,31,0.181408 +21,32,0.170631 +21,33,0.168571 +21,34,0.168209 +21,35,0.168149 +21,36,0.168139 +21,37,0.168138 +21,38,0.168138 +21,39,0.168138 +21,40,0.168138 +21,41,0.168138 +21,42,0.168138 +21,43,0.168138 +21,44,0.168138 +21,45,0.168138 +21,46,0.168138 +21,47,0.168138 +21,48,0.168138 +21,49,0.168138 +22,0,0.168114 +22,1,0.168137 +22,2,0.168138 +22,3,0.168138 +22,4,0.168138 +22,5,0.168138 +22,6,0.168138 +22,7,0.168138 +22,8,0.168138 +22,9,0.168138 +22,10,0.168138 +22,11,0.168138 +22,12,0.168138 +22,13,0.168138 +22,14,0.168141 +22,15,0.16816 +22,16,0.168286 +22,17,0.169107 +22,18,0.174217 +22,19,0.203037 +22,20,0.327965 +22,21,0.588015 +22,22,0.77119 +22,23,0.840556 +22,24,0.861198 +22,25,0.865579 +22,26,0.861194 +22,27,0.840539 +22,28,0.771141 +22,29,0.587994 +22,30,0.328023 +22,31,0.203087 +22,32,0.174231 +22,33,0.16911 +22,34,0.168287 +22,35,0.16816 +22,36,0.168141 +22,37,0.168138 +22,38,0.168138 +22,39,0.168138 +22,40,0.168138 +22,41,0.168138 +22,42,0.168138 +22,43,0.168138 +22,44,0.168138 +22,45,0.168138 +22,46,0.168138 +22,47,0.168138 +22,48,0.168138 +22,49,0.168138 +23,0,0.168114 +23,1,0.168137 +23,2,0.168138 +23,3,0.168138 +23,4,0.168138 +23,5,0.168138 +23,6,0.168138 +23,7,0.168138 +23,8,0.168138 +23,9,0.168138 +23,10,0.168138 +23,11,0.168138 +23,12,0.168138 +23,13,0.168138 +23,14,0.168143 +23,15,0.168174 +23,16,0.168393 +23,17,0.16991 +23,18,0.179971 +23,19,0.238498 +23,20,0.459097 +23,21,0.728894 +23,22,0.840556 +23,23,0.869036 +23,24,0.875149 +23,25,0.876204 +23,26,0.875148 +23,27,0.869033 +23,28,0.840527 +23,29,0.728842 +23,30,0.45911 +23,31,0.238567 +23,32,0.179997 +23,33,0.169916 +23,34,0.168394 +23,35,0.168174 +23,36,0.168143 +23,37,0.168138 +23,38,0.168138 +23,39,0.168138 +23,40,0.168138 +23,41,0.168138 +23,42,0.168138 +23,43,0.168138 +23,44,0.168138 +23,45,0.168138 +23,46,0.168138 +23,47,0.168138 +23,48,0.168138 +23,49,0.168138 +24,0,0.168114 +24,1,0.168137 +24,2,0.168138 +24,3,0.168138 +24,4,0.168138 +24,5,0.168138 +24,6,0.168138 +24,7,0.168138 +24,8,0.168138 +24,9,0.168138 +24,10,0.168138 +24,11,0.168138 +24,12,0.168138 +24,13,0.168139 +24,14,0.168144 +24,15,0.168187 +24,16,0.168495 +24,17,0.170712 +24,18,0.185953 +24,19,0.274497 +24,20,0.555306 +24,21,0.789607 +24,22,0.861198 +24,23,0.875149 +24,24,0.877451 +24,25,0.877771 +24,26,0.877451 +24,27,0.875148 +24,28,0.861183 +24,29,0.789552 +24,30,0.555293 +24,31,0.274565 +24,32,0.185991 +24,33,0.17072 +24,34,0.168496 +24,35,0.168187 +24,36,0.168144 +24,37,0.168139 +24,38,0.168138 +24,39,0.168138 +24,40,0.168138 +24,41,0.168138 +24,42,0.168138 +24,43,0.168138 +24,44,0.168138 +24,45,0.168138 +24,46,0.168138 +24,47,0.168138 +24,48,0.168138 +24,49,0.168138 +25,0,0.168114 +25,1,0.168137 +25,2,0.168138 +25,3,0.168138 +25,4,0.168138 +25,5,0.168138 +25,6,0.168138 +25,7,0.168138 +25,8,0.168138 +25,9,0.168138 +25,10,0.168138 +25,11,0.168138 +25,12,0.168138 +25,13,0.168139 +25,14,0.168145 +25,15,0.168192 +25,16,0.168538 +25,17,0.171058 +25,18,0.188584 +25,19,0.289859 +25,20,0.587635 +25,21,0.805447 +25,22,0.865579 +25,23,0.876204 +25,24,0.877771 +25,25,0.877977 +25,26,0.877771 +25,27,0.876204 +25,28,0.865567 +25,29,0.805394 +25,30,0.587614 +25,31,0.289924 +25,32,0.188625 +25,33,0.171067 +25,34,0.168539 +25,35,0.168192 +25,36,0.168145 +25,37,0.168139 +25,38,0.168138 +25,39,0.168138 +25,40,0.168138 +25,41,0.168138 +25,42,0.168138 +25,43,0.168138 +25,44,0.168138 +25,45,0.168138 +25,46,0.168138 +25,47,0.168138 +25,48,0.168138 +25,49,0.168138 +26,0,0.168114 +26,1,0.168137 +26,2,0.168138 +26,3,0.168138 +26,4,0.168138 +26,5,0.168138 +26,6,0.168138 +26,7,0.168138 +26,8,0.168138 +26,9,0.168138 +26,10,0.168138 +26,11,0.168138 +26,12,0.168138 +26,13,0.168139 +26,14,0.168144 +26,15,0.168187 +26,16,0.168495 +26,17,0.170712 +26,18,0.185957 +26,19,0.274512 +26,20,0.555305 +26,21,0.789589 +26,22,0.861194 +26,23,0.875148 +26,24,0.877451 +26,25,0.877771 +26,26,0.877451 +26,27,0.875147 +26,28,0.861179 +26,29,0.789534 +26,30,0.555291 +26,31,0.27458 +26,32,0.185995 +26,33,0.17072 +26,34,0.168496 +26,35,0.168187 +26,36,0.168144 +26,37,0.168139 +26,38,0.168138 +26,39,0.168138 +26,40,0.168138 +26,41,0.168138 +26,42,0.168138 +26,43,0.168138 +26,44,0.168138 +26,45,0.168138 +26,46,0.168138 +26,47,0.168138 +26,48,0.168138 +26,49,0.168138 +27,0,0.168114 +27,1,0.168137 +27,2,0.168138 +27,3,0.168138 +27,4,0.168138 +27,5,0.168138 +27,6,0.168138 +27,7,0.168138 +27,8,0.168138 +27,9,0.168138 +27,10,0.168138 +27,11,0.168138 +27,12,0.168138 +27,13,0.168138 +27,14,0.168143 +27,15,0.168174 +27,16,0.168393 +27,17,0.169911 +27,18,0.179976 +27,19,0.238521 +27,20,0.459118 +27,21,0.728855 +27,22,0.840539 +27,23,0.869033 +27,24,0.875148 +27,25,0.876204 +27,26,0.875147 +27,27,0.869029 +27,28,0.840509 +27,29,0.728803 +27,30,0.459131 +27,31,0.238591 +27,32,0.180003 +27,33,0.169917 +27,34,0.168394 +27,35,0.168174 +27,36,0.168143 +27,37,0.168138 +27,38,0.168138 +27,39,0.168138 +27,40,0.168138 +27,41,0.168138 +27,42,0.168138 +27,43,0.168138 +27,44,0.168138 +27,45,0.168138 +27,46,0.168138 +27,47,0.168138 +27,48,0.168138 +27,49,0.168138 +28,0,0.168114 +28,1,0.168137 +28,2,0.168138 +28,3,0.168138 +28,4,0.168138 +28,5,0.168138 +28,6,0.168138 +28,7,0.168138 +28,8,0.168138 +28,9,0.168138 +28,10,0.168138 +28,11,0.168138 +28,12,0.168138 +28,13,0.168138 +28,14,0.168141 +28,15,0.16816 +28,16,0.168286 +28,17,0.169108 +28,18,0.174221 +28,19,0.203058 +28,20,0.328015 +28,21,0.587996 +28,22,0.771141 +28,23,0.840527 +28,24,0.861183 +28,25,0.865567 +28,26,0.861179 +28,27,0.840509 +28,28,0.771091 +28,29,0.587975 +28,30,0.328073 +28,31,0.203109 +28,32,0.174236 +28,33,0.169111 +28,34,0.168287 +28,35,0.16816 +28,36,0.168141 +28,37,0.168138 +28,38,0.168138 +28,39,0.168138 +28,40,0.168138 +28,41,0.168138 +28,42,0.168138 +28,43,0.168138 +28,44,0.168138 +28,45,0.168138 +28,46,0.168138 +28,47,0.168138 +28,48,0.168138 +28,49,0.168138 +29,0,0.168114 +29,1,0.168137 +29,2,0.168138 +29,3,0.168138 +29,4,0.168138 +29,5,0.168138 +29,6,0.168138 +29,7,0.168138 +29,8,0.168138 +29,9,0.168138 +29,10,0.168138 +29,11,0.168138 +29,12,0.168138 +29,13,0.168138 +29,14,0.168139 +29,15,0.168149 +29,16,0.168209 +29,17,0.16857 +29,18,0.170628 +29,19,0.181398 +29,20,0.229139 +29,21,0.374888 +29,22,0.587994 +29,23,0.728842 +29,24,0.789552 +29,25,0.805394 +29,26,0.789534 +29,27,0.728803 +29,28,0.587975 +29,29,0.374935 +29,30,0.229197 +29,31,0.181421 +29,32,0.170634 +29,33,0.168571 +29,34,0.168209 +29,35,0.168149 +29,36,0.168139 +29,37,0.168138 +29,38,0.168138 +29,39,0.168138 +29,40,0.168138 +29,41,0.168138 +29,42,0.168138 +29,43,0.168138 +29,44,0.168138 +29,45,0.168138 +29,46,0.168138 +29,47,0.168138 +29,48,0.168138 +29,49,0.168138 +30,0,0.168114 +30,1,0.168137 +30,2,0.168138 +30,3,0.168138 +30,4,0.168138 +30,5,0.168138 +30,6,0.168138 +30,7,0.168138 +30,8,0.168138 +30,9,0.168138 +30,10,0.168138 +30,11,0.168138 +30,12,0.168138 +30,13,0.168138 +30,14,0.168139 +30,15,0.168143 +30,16,0.168167 +30,17,0.168299 +30,18,0.168982 +30,19,0.1722 +30,20,0.185456 +30,21,0.229151 +30,22,0.328023 +30,23,0.45911 +30,24,0.555293 +30,25,0.587614 +30,26,0.555291 +30,27,0.459131 +30,28,0.328073 +30,29,0.229197 +30,30,0.185479 +30,31,0.172207 +30,32,0.168983 +30,33,0.168299 +30,34,0.168167 +30,35,0.168143 +30,36,0.168139 +30,37,0.168138 +30,38,0.168138 +30,39,0.168138 +30,40,0.168138 +30,41,0.168138 +30,42,0.168138 +30,43,0.168138 +30,44,0.168138 +30,45,0.168138 +30,46,0.168138 +30,47,0.168138 +30,48,0.168138 +30,49,0.168138 +31,0,0.168114 +31,1,0.168137 +31,2,0.168138 +31,3,0.168138 +31,4,0.168138 +31,5,0.168138 +31,6,0.168138 +31,7,0.168138 +31,8,0.168138 +31,9,0.168138 +31,10,0.168138 +31,11,0.168138 +31,12,0.168138 +31,13,0.168138 +31,14,0.168138 +31,15,0.16814 +31,16,0.168148 +31,17,0.168189 +31,18,0.168383 +31,19,0.169198 +31,20,0.172201 +31,21,0.181408 +31,22,0.203087 +31,23,0.238567 +31,24,0.274565 +31,25,0.289924 +31,26,0.27458 +31,27,0.238591 +31,28,0.203109 +31,29,0.181421 +31,30,0.172207 +31,31,0.1692 +31,32,0.168383 +31,33,0.16819 +31,34,0.168148 +31,35,0.16814 +31,36,0.168138 +31,37,0.168138 +31,38,0.168138 +31,39,0.168138 +31,40,0.168138 +31,41,0.168138 +31,42,0.168138 +31,43,0.168138 +31,44,0.168138 +31,45,0.168138 +31,46,0.168138 +31,47,0.168138 +31,48,0.168138 +31,49,0.168138 +32,0,0.168114 +32,1,0.168137 +32,2,0.168138 +32,3,0.168138 +32,4,0.168138 +32,5,0.168138 +32,6,0.168138 +32,7,0.168138 +32,8,0.168138 +32,9,0.168138 +32,10,0.168138 +32,11,0.168138 +32,12,0.168138 +32,13,0.168138 +32,14,0.168138 +32,15,0.168138 +32,16,0.168141 +32,17,0.168152 +32,18,0.168201 +32,19,0.168383 +32,20,0.168982 +32,21,0.170631 +32,22,0.174231 +32,23,0.179997 +32,24,0.185991 +32,25,0.188625 +32,26,0.185995 +32,27,0.180003 +32,28,0.174236 +32,29,0.170634 +32,30,0.168983 +32,31,0.168383 +32,32,0.168201 +32,33,0.168152 +32,34,0.168141 +32,35,0.168138 +32,36,0.168138 +32,37,0.168138 +32,38,0.168138 +32,39,0.168138 +32,40,0.168138 +32,41,0.168138 +32,42,0.168138 +32,43,0.168138 +32,44,0.168138 +32,45,0.168138 +32,46,0.168138 +32,47,0.168138 +32,48,0.168138 +32,49,0.168138 +33,0,0.168114 +33,1,0.168137 +33,2,0.168138 +33,3,0.168138 +33,4,0.168138 +33,5,0.168138 +33,6,0.168138 +33,7,0.168138 +33,8,0.168138 +33,9,0.168138 +33,10,0.168138 +33,11,0.168138 +33,12,0.168138 +33,13,0.168138 +33,14,0.168138 +33,15,0.168138 +33,16,0.168139 +33,17,0.168141 +33,18,0.168152 +33,19,0.168189 +33,20,0.168299 +33,21,0.168571 +33,22,0.16911 +33,23,0.169916 +33,24,0.17072 +33,25,0.171067 +33,26,0.17072 +33,27,0.169917 +33,28,0.169111 +33,29,0.168571 +33,30,0.168299 +33,31,0.16819 +33,32,0.168152 +33,33,0.168141 +33,34,0.168139 +33,35,0.168138 +33,36,0.168138 +33,37,0.168138 +33,38,0.168138 +33,39,0.168138 +33,40,0.168138 +33,41,0.168138 +33,42,0.168138 +33,43,0.168138 +33,44,0.168138 +33,45,0.168138 +33,46,0.168138 +33,47,0.168138 +33,48,0.168138 +33,49,0.168138 +34,0,0.168114 +34,1,0.168137 +34,2,0.168138 +34,3,0.168138 +34,4,0.168138 +34,5,0.168138 +34,6,0.168138 +34,7,0.168138 +34,8,0.168138 +34,9,0.168138 +34,10,0.168138 +34,11,0.168138 +34,12,0.168138 +34,13,0.168138 +34,14,0.168138 +34,15,0.168138 +34,16,0.168138 +34,17,0.168139 +34,18,0.168141 +34,19,0.168148 +34,20,0.168167 +34,21,0.168209 +34,22,0.168287 +34,23,0.168394 +34,24,0.168496 +34,25,0.168539 +34,26,0.168496 +34,27,0.168394 +34,28,0.168287 +34,29,0.168209 +34,30,0.168167 +34,31,0.168148 +34,32,0.168141 +34,33,0.168139 +34,34,0.168138 +34,35,0.168138 +34,36,0.168138 +34,37,0.168138 +34,38,0.168138 +34,39,0.168138 +34,40,0.168138 +34,41,0.168138 +34,42,0.168138 +34,43,0.168138 +34,44,0.168138 +34,45,0.168138 +34,46,0.168138 +34,47,0.168138 +34,48,0.168138 +34,49,0.168138 +35,0,0.168114 +35,1,0.168137 +35,2,0.168138 +35,3,0.168138 +35,4,0.168138 +35,5,0.168138 +35,6,0.168138 +35,7,0.168138 +35,8,0.168138 +35,9,0.168138 +35,10,0.168138 +35,11,0.168138 +35,12,0.168138 +35,13,0.168138 +35,14,0.168138 +35,15,0.168138 +35,16,0.168138 +35,17,0.168138 +35,18,0.168138 +35,19,0.16814 +35,20,0.168143 +35,21,0.168149 +35,22,0.16816 +35,23,0.168174 +35,24,0.168187 +35,25,0.168192 +35,26,0.168187 +35,27,0.168174 +35,28,0.16816 +35,29,0.168149 +35,30,0.168143 +35,31,0.16814 +35,32,0.168138 +35,33,0.168138 +35,34,0.168138 +35,35,0.168138 +35,36,0.168138 +35,37,0.168138 +35,38,0.168138 +35,39,0.168138 +35,40,0.168138 +35,41,0.168138 +35,42,0.168138 +35,43,0.168138 +35,44,0.168138 +35,45,0.168138 +35,46,0.168138 +35,47,0.168138 +35,48,0.168138 +35,49,0.168138 +36,0,0.168114 +36,1,0.168137 +36,2,0.168138 +36,3,0.168138 +36,4,0.168138 +36,5,0.168138 +36,6,0.168138 +36,7,0.168138 +36,8,0.168138 +36,9,0.168138 +36,10,0.168138 +36,11,0.168138 +36,12,0.168138 +36,13,0.168138 +36,14,0.168138 +36,15,0.168138 +36,16,0.168138 +36,17,0.168138 +36,18,0.168138 +36,19,0.168138 +36,20,0.168139 +36,21,0.168139 +36,22,0.168141 +36,23,0.168143 +36,24,0.168144 +36,25,0.168145 +36,26,0.168144 +36,27,0.168143 +36,28,0.168141 +36,29,0.168139 +36,30,0.168139 +36,31,0.168138 +36,32,0.168138 +36,33,0.168138 +36,34,0.168138 +36,35,0.168138 +36,36,0.168138 +36,37,0.168138 +36,38,0.168138 +36,39,0.168138 +36,40,0.168138 +36,41,0.168138 +36,42,0.168138 +36,43,0.168138 +36,44,0.168138 +36,45,0.168138 +36,46,0.168138 +36,47,0.168138 +36,48,0.168138 +36,49,0.168138 +37,0,0.168114 +37,1,0.168137 +37,2,0.168138 +37,3,0.168138 +37,4,0.168138 +37,5,0.168138 +37,6,0.168138 +37,7,0.168138 +37,8,0.168138 +37,9,0.168138 +37,10,0.168138 +37,11,0.168138 +37,12,0.168138 +37,13,0.168138 +37,14,0.168138 +37,15,0.168138 +37,16,0.168138 +37,17,0.168138 +37,18,0.168138 +37,19,0.168138 +37,20,0.168138 +37,21,0.168138 +37,22,0.168138 +37,23,0.168138 +37,24,0.168139 +37,25,0.168139 +37,26,0.168139 +37,27,0.168138 +37,28,0.168138 +37,29,0.168138 +37,30,0.168138 +37,31,0.168138 +37,32,0.168138 +37,33,0.168138 +37,34,0.168138 +37,35,0.168138 +37,36,0.168138 +37,37,0.168138 +37,38,0.168138 +37,39,0.168138 +37,40,0.168138 +37,41,0.168138 +37,42,0.168138 +37,43,0.168138 +37,44,0.168138 +37,45,0.168138 +37,46,0.168138 +37,47,0.168138 +37,48,0.168138 +37,49,0.168138 +38,0,0.168114 +38,1,0.168137 +38,2,0.168138 +38,3,0.168138 +38,4,0.168138 +38,5,0.168138 +38,6,0.168138 +38,7,0.168138 +38,8,0.168138 +38,9,0.168138 +38,10,0.168138 +38,11,0.168138 +38,12,0.168138 +38,13,0.168138 +38,14,0.168138 +38,15,0.168138 +38,16,0.168138 +38,17,0.168138 +38,18,0.168138 +38,19,0.168138 +38,20,0.168138 +38,21,0.168138 +38,22,0.168138 +38,23,0.168138 +38,24,0.168138 +38,25,0.168138 +38,26,0.168138 +38,27,0.168138 +38,28,0.168138 +38,29,0.168138 +38,30,0.168138 +38,31,0.168138 +38,32,0.168138 +38,33,0.168138 +38,34,0.168138 +38,35,0.168138 +38,36,0.168138 +38,37,0.168138 +38,38,0.168138 +38,39,0.168138 +38,40,0.168138 +38,41,0.168138 +38,42,0.168138 +38,43,0.168138 +38,44,0.168138 +38,45,0.168138 +38,46,0.168138 +38,47,0.168138 +38,48,0.168138 +38,49,0.168138 +39,0,0.168114 +39,1,0.168137 +39,2,0.168138 +39,3,0.168138 +39,4,0.168138 +39,5,0.168138 +39,6,0.168138 +39,7,0.168138 +39,8,0.168138 +39,9,0.168138 +39,10,0.168138 +39,11,0.168138 +39,12,0.168138 +39,13,0.168138 +39,14,0.168138 +39,15,0.168138 +39,16,0.168138 +39,17,0.168138 +39,18,0.168138 +39,19,0.168138 +39,20,0.168138 +39,21,0.168138 +39,22,0.168138 +39,23,0.168138 +39,24,0.168138 +39,25,0.168138 +39,26,0.168138 +39,27,0.168138 +39,28,0.168138 +39,29,0.168138 +39,30,0.168138 +39,31,0.168138 +39,32,0.168138 +39,33,0.168138 +39,34,0.168138 +39,35,0.168138 +39,36,0.168138 +39,37,0.168138 +39,38,0.168138 +39,39,0.168138 +39,40,0.168138 +39,41,0.168138 +39,42,0.168138 +39,43,0.168138 +39,44,0.168138 +39,45,0.168138 +39,46,0.168138 +39,47,0.168138 +39,48,0.168138 +39,49,0.168138 +40,0,0.168114 +40,1,0.168137 +40,2,0.168138 +40,3,0.168138 +40,4,0.168138 +40,5,0.168138 +40,6,0.168138 +40,7,0.168138 +40,8,0.168138 +40,9,0.168138 +40,10,0.168138 +40,11,0.168138 +40,12,0.168138 +40,13,0.168138 +40,14,0.168138 +40,15,0.168138 +40,16,0.168138 +40,17,0.168138 +40,18,0.168138 +40,19,0.168138 +40,20,0.168138 +40,21,0.168138 +40,22,0.168138 +40,23,0.168138 +40,24,0.168138 +40,25,0.168138 +40,26,0.168138 +40,27,0.168138 +40,28,0.168138 +40,29,0.168138 +40,30,0.168138 +40,31,0.168138 +40,32,0.168138 +40,33,0.168138 +40,34,0.168138 +40,35,0.168138 +40,36,0.168138 +40,37,0.168138 +40,38,0.168138 +40,39,0.168138 +40,40,0.168138 +40,41,0.168138 +40,42,0.168138 +40,43,0.168138 +40,44,0.168138 +40,45,0.168138 +40,46,0.168138 +40,47,0.168138 +40,48,0.168138 +40,49,0.168138 +41,0,0.168114 +41,1,0.168137 +41,2,0.168138 +41,3,0.168138 +41,4,0.168138 +41,5,0.168138 +41,6,0.168138 +41,7,0.168138 +41,8,0.168138 +41,9,0.168138 +41,10,0.168138 +41,11,0.168138 +41,12,0.168138 +41,13,0.168138 +41,14,0.168138 +41,15,0.168138 +41,16,0.168138 +41,17,0.168138 +41,18,0.168138 +41,19,0.168138 +41,20,0.168138 +41,21,0.168138 +41,22,0.168138 +41,23,0.168138 +41,24,0.168138 +41,25,0.168138 +41,26,0.168138 +41,27,0.168138 +41,28,0.168138 +41,29,0.168138 +41,30,0.168138 +41,31,0.168138 +41,32,0.168138 +41,33,0.168138 +41,34,0.168138 +41,35,0.168138 +41,36,0.168138 +41,37,0.168138 +41,38,0.168138 +41,39,0.168138 +41,40,0.168138 +41,41,0.168138 +41,42,0.168138 +41,43,0.168138 +41,44,0.168138 +41,45,0.168138 +41,46,0.168138 +41,47,0.168138 +41,48,0.168138 +41,49,0.168138 +42,0,0.168114 +42,1,0.168137 +42,2,0.168138 +42,3,0.168138 +42,4,0.168138 +42,5,0.168138 +42,6,0.168138 +42,7,0.168138 +42,8,0.168138 +42,9,0.168138 +42,10,0.168138 +42,11,0.168138 +42,12,0.168138 +42,13,0.168138 +42,14,0.168138 +42,15,0.168138 +42,16,0.168138 +42,17,0.168138 +42,18,0.168138 +42,19,0.168138 +42,20,0.168138 +42,21,0.168138 +42,22,0.168138 +42,23,0.168138 +42,24,0.168138 +42,25,0.168138 +42,26,0.168138 +42,27,0.168138 +42,28,0.168138 +42,29,0.168138 +42,30,0.168138 +42,31,0.168138 +42,32,0.168138 +42,33,0.168138 +42,34,0.168138 +42,35,0.168138 +42,36,0.168138 +42,37,0.168138 +42,38,0.168138 +42,39,0.168138 +42,40,0.168138 +42,41,0.168138 +42,42,0.168138 +42,43,0.168138 +42,44,0.168138 +42,45,0.168138 +42,46,0.168138 +42,47,0.168138 +42,48,0.168138 +42,49,0.168138 +43,0,0.168114 +43,1,0.168137 +43,2,0.168138 +43,3,0.168138 +43,4,0.168138 +43,5,0.168138 +43,6,0.168138 +43,7,0.168138 +43,8,0.168138 +43,9,0.168138 +43,10,0.168138 +43,11,0.168138 +43,12,0.168138 +43,13,0.168138 +43,14,0.168138 +43,15,0.168138 +43,16,0.168138 +43,17,0.168138 +43,18,0.168138 +43,19,0.168138 +43,20,0.168138 +43,21,0.168138 +43,22,0.168138 +43,23,0.168138 +43,24,0.168138 +43,25,0.168138 +43,26,0.168138 +43,27,0.168138 +43,28,0.168138 +43,29,0.168138 +43,30,0.168138 +43,31,0.168138 +43,32,0.168138 +43,33,0.168138 +43,34,0.168138 +43,35,0.168138 +43,36,0.168138 +43,37,0.168138 +43,38,0.168138 +43,39,0.168138 +43,40,0.168138 +43,41,0.168138 +43,42,0.168138 +43,43,0.168138 +43,44,0.168138 +43,45,0.168138 +43,46,0.168138 +43,47,0.168138 +43,48,0.168138 +43,49,0.168138 +44,0,0.168114 +44,1,0.168137 +44,2,0.168138 +44,3,0.168138 +44,4,0.168138 +44,5,0.168138 +44,6,0.168138 +44,7,0.168138 +44,8,0.168138 +44,9,0.168138 +44,10,0.168138 +44,11,0.168138 +44,12,0.168138 +44,13,0.168138 +44,14,0.168138 +44,15,0.168138 +44,16,0.168138 +44,17,0.168138 +44,18,0.168138 +44,19,0.168138 +44,20,0.168138 +44,21,0.168138 +44,22,0.168138 +44,23,0.168138 +44,24,0.168138 +44,25,0.168138 +44,26,0.168138 +44,27,0.168138 +44,28,0.168138 +44,29,0.168138 +44,30,0.168138 +44,31,0.168138 +44,32,0.168138 +44,33,0.168138 +44,34,0.168138 +44,35,0.168138 +44,36,0.168138 +44,37,0.168138 +44,38,0.168138 +44,39,0.168138 +44,40,0.168138 +44,41,0.168138 +44,42,0.168138 +44,43,0.168138 +44,44,0.168138 +44,45,0.168138 +44,46,0.168138 +44,47,0.168138 +44,48,0.168138 +44,49,0.168138 +45,0,0.168114 +45,1,0.168137 +45,2,0.168138 +45,3,0.168138 +45,4,0.168138 +45,5,0.168138 +45,6,0.168138 +45,7,0.168138 +45,8,0.168138 +45,9,0.168138 +45,10,0.168138 +45,11,0.168138 +45,12,0.168138 +45,13,0.168138 +45,14,0.168138 +45,15,0.168138 +45,16,0.168138 +45,17,0.168138 +45,18,0.168138 +45,19,0.168138 +45,20,0.168138 +45,21,0.168138 +45,22,0.168138 +45,23,0.168138 +45,24,0.168138 +45,25,0.168138 +45,26,0.168138 +45,27,0.168138 +45,28,0.168138 +45,29,0.168138 +45,30,0.168138 +45,31,0.168138 +45,32,0.168138 +45,33,0.168138 +45,34,0.168138 +45,35,0.168138 +45,36,0.168138 +45,37,0.168138 +45,38,0.168138 +45,39,0.168138 +45,40,0.168138 +45,41,0.168138 +45,42,0.168138 +45,43,0.168138 +45,44,0.168138 +45,45,0.168138 +45,46,0.168138 +45,47,0.168138 +45,48,0.168138 +45,49,0.168138 +46,0,0.168114 +46,1,0.168137 +46,2,0.168138 +46,3,0.168138 +46,4,0.168138 +46,5,0.168138 +46,6,0.168138 +46,7,0.168138 +46,8,0.168138 +46,9,0.168138 +46,10,0.168138 +46,11,0.168138 +46,12,0.168138 +46,13,0.168138 +46,14,0.168138 +46,15,0.168138 +46,16,0.168138 +46,17,0.168138 +46,18,0.168138 +46,19,0.168138 +46,20,0.168138 +46,21,0.168138 +46,22,0.168138 +46,23,0.168138 +46,24,0.168138 +46,25,0.168138 +46,26,0.168138 +46,27,0.168138 +46,28,0.168138 +46,29,0.168138 +46,30,0.168138 +46,31,0.168138 +46,32,0.168138 +46,33,0.168138 +46,34,0.168138 +46,35,0.168138 +46,36,0.168138 +46,37,0.168138 +46,38,0.168138 +46,39,0.168138 +46,40,0.168138 +46,41,0.168138 +46,42,0.168138 +46,43,0.168138 +46,44,0.168138 +46,45,0.168138 +46,46,0.168138 +46,47,0.168138 +46,48,0.168138 +46,49,0.168138 +47,0,0.168114 +47,1,0.168137 +47,2,0.168138 +47,3,0.168138 +47,4,0.168138 +47,5,0.168138 +47,6,0.168138 +47,7,0.168138 +47,8,0.168138 +47,9,0.168138 +47,10,0.168138 +47,11,0.168138 +47,12,0.168138 +47,13,0.168138 +47,14,0.168138 +47,15,0.168138 +47,16,0.168138 +47,17,0.168138 +47,18,0.168138 +47,19,0.168138 +47,20,0.168138 +47,21,0.168138 +47,22,0.168138 +47,23,0.168138 +47,24,0.168138 +47,25,0.168138 +47,26,0.168138 +47,27,0.168138 +47,28,0.168138 +47,29,0.168138 +47,30,0.168138 +47,31,0.168138 +47,32,0.168138 +47,33,0.168138 +47,34,0.168138 +47,35,0.168138 +47,36,0.168138 +47,37,0.168138 +47,38,0.168138 +47,39,0.168138 +47,40,0.168138 +47,41,0.168138 +47,42,0.168138 +47,43,0.168138 +47,44,0.168138 +47,45,0.168138 +47,46,0.168138 +47,47,0.168138 +47,48,0.168138 +47,49,0.168138 +48,0,0.168114 +48,1,0.168137 +48,2,0.168138 +48,3,0.168138 +48,4,0.168138 +48,5,0.168138 +48,6,0.168138 +48,7,0.168138 +48,8,0.168138 +48,9,0.168138 +48,10,0.168138 +48,11,0.168138 +48,12,0.168138 +48,13,0.168138 +48,14,0.168138 +48,15,0.168138 +48,16,0.168138 +48,17,0.168138 +48,18,0.168138 +48,19,0.168138 +48,20,0.168138 +48,21,0.168138 +48,22,0.168138 +48,23,0.168138 +48,24,0.168138 +48,25,0.168138 +48,26,0.168138 +48,27,0.168138 +48,28,0.168138 +48,29,0.168138 +48,30,0.168138 +48,31,0.168138 +48,32,0.168138 +48,33,0.168138 +48,34,0.168138 +48,35,0.168138 +48,36,0.168138 +48,37,0.168138 +48,38,0.168138 +48,39,0.168138 +48,40,0.168138 +48,41,0.168138 +48,42,0.168138 +48,43,0.168138 +48,44,0.168138 +48,45,0.168138 +48,46,0.168138 +48,47,0.168138 +48,48,0.168138 +48,49,0.168138 +49,0,0.168114 +49,1,0.168137 +49,2,0.168138 +49,3,0.168138 +49,4,0.168138 +49,5,0.168138 +49,6,0.168138 +49,7,0.168138 +49,8,0.168138 +49,9,0.168138 +49,10,0.168138 +49,11,0.168138 +49,12,0.168138 +49,13,0.168138 +49,14,0.168138 +49,15,0.168138 +49,16,0.168138 +49,17,0.168138 +49,18,0.168138 +49,19,0.168138 +49,20,0.168138 +49,21,0.168138 +49,22,0.168138 +49,23,0.168138 +49,24,0.168138 +49,25,0.168138 +49,26,0.168138 +49,27,0.168138 +49,28,0.168138 +49,29,0.168138 +49,30,0.168138 +49,31,0.168138 +49,32,0.168138 +49,33,0.168138 +49,34,0.168138 +49,35,0.168138 +49,36,0.168138 +49,37,0.168138 +49,38,0.168138 +49,39,0.168138 +49,40,0.168138 +49,41,0.168138 +49,42,0.168138 +49,43,0.168138 +49,44,0.168138 +49,45,0.168138 +49,46,0.168138 +49,47,0.168138 +49,48,0.168138 +49,49,0.168138 diff --git a/examples/pfhubbenchmark-8 b/examples/pfhubbenchmark-8 new file mode 160000 index 0000000..9bd6b7b --- /dev/null +++ b/examples/pfhubbenchmark-8 @@ -0,0 +1 @@ +Subproject commit 9bd6b7b7f549fd9a643e457ca8cd1b09a4c4ea34 diff --git a/include/MMSP.grid.cpp b/include/MMSP.grid.cpp index 94debbb..d2c95b3 100644 --- a/include/MMSP.grid.cpp +++ b/include/MMSP.grid.cpp @@ -2156,6 +2156,26 @@ template MMSP::vector gradient(const grid& GRID return gradient; } +template MMSP::vector gradientsq(const grid& GRID, const vector& x) +{ + vector gradientsq(dim); + vector s = x; + + const T& y = GRID(x); + + for (int i=0; i MMSP::vector gradient(const grid >& GRID, const vector& x, const int field) { vector gradient(dim); diff --git a/include/MMSP.grid.h b/include/MMSP.grid.h index bb6c337..6c9e779 100644 --- a/include/MMSP.grid.h +++ b/include/MMSP.grid.h @@ -508,6 +508,8 @@ template vector gradient(const grid& GRID, cons template vector gradient(const grid >& GRID, const vector& x, const int field); +template vector gradientsq(const grid& GRID, const vector& x); + template vector grad(const grid& GRID, const vector& x); template T divergence(const grid& GRID, const vector& x); diff --git a/utility/mmsp2csv.cpp b/utility/mmsp2csv.cpp index 4046660..9eaf8ac 100644 --- a/utility/mmsp2csv.cpp +++ b/utility/mmsp2csv.cpp @@ -1,6 +1,6 @@ // mmsp2csv.cpp // Convert MMSP grid data to comma-delimited ASCII format (CSV) -// Questions/comments to trevor.keller@gmail.com (Trevor Keller) +// Questions/comments to trevor.keller@gmail.com (Trevor Keller) and arupad@gmail.com (Arun Baskaran) #include #include @@ -127,546 +127,554 @@ int main(int argc, char* argv[]) input.ignore(10, '\n'); // write grid data - if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,bool> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,bool> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,bool> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,unsigned char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,char> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,unsigned int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,int> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,unsigned long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,long> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,unsigned short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,unsigned short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,unsigned short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,short> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,float> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,float> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,float> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,long double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,long double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,long double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,double> GRID(argv[1]); - convert_scalars(GRID, csvfil); - } + if (scalar_type or (not vector_type and not sparse_type)) { // must be scalar or built-in + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,bool> GRID(argv[1]); + convert_scalars(GRID, csvfil); } } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,unsigned char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,char> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,unsigned int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,int> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,unsigned long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,long> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,unsigned short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,short> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,float> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,long double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,double> GRID(argv[1]); + convert_scalars(GRID, csvfil); + } + } + } - else if (vector_type) { - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::vector > GRID(argv[1]); - convert_vectors(GRID, csvfil); - } + else if (vector_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); } } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::vector > GRID(argv[1]); + convert_vectors(GRID, csvfil); + } + } + } - else if (sparse_type) { - if (bool_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (unsigned_char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (char_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (unsigned_int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (int_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (unsigned_long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (long_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (unsigned_short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (short_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (float_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (long_double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } - } - else if (double_type) { - if (dim == 1) { - MMSP::grid<1,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 2) { - MMSP::grid<2,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } else if (dim == 3) { - MMSP::grid<3,MMSP::sparse > GRID(argv[1]); - convert_sparses(GRID, csvfil); - } + else if (sparse_type) { + if (bool_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (char_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (int_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (long_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (unsigned_short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (short_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); } } + else if (float_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (long_double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + else if (double_type) { + if (dim == 1) { + MMSP::grid<1,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 2) { + MMSP::grid<2,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + else if (dim == 3) { + MMSP::grid<3,MMSP::sparse > GRID(argv[1]); + convert_sparses(GRID, csvfil); + } + } + } return 0; } template void convert_scalars(const MMSP::grid& GRID, std::ofstream& csvfil) { - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d void convert_vectors(const MMSP::grid >& GRID, std::ofstream& csvfil) { - - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d void convert_sparses(const MMSP::grid >& GRID, std::ofstream& csvfil) { - if (dim==1) { - for (int n=0; n x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); - csvfil << dx(GRID,0)*x[0]; - for (int d=1; d x=MMSP::position(GRID,n); + csvfil << dx(GRID,0)*x[0]; + for (int d=1; d