diff --git a/cpp/fftw_interface.hpp b/cpp/fftw_interface.hpp index d80cbbc2101afc7fbe8091dc06ecba4981a748de..10496355de3db27d4703245e0abb287bc067d2fb 100644 --- a/cpp/fftw_interface.hpp +++ b/cpp/fftw_interface.hpp @@ -790,6 +790,8 @@ public: } }; +template<class T> +using complex_t = typename fftw_interface<T>::complex; #endif // FFTW_INTERFACE_HPP diff --git a/cpp/field.cpp b/cpp/field.cpp index f4242295ffbfeb24485cbb2eaee4f02c498137aa..982fad2d76d2bd82781bd99479e3ade5f4678a15 100644 --- a/cpp/field.cpp +++ b/cpp/field.cpp @@ -102,7 +102,7 @@ field<rnumber, be, fc>::field( this->c2r_plan = fftw_interface<rnumber>::mpi_plan_many_dft_c2r( 3, nfftw, ncomp(fc), FFTW_MPI_DEFAULT_BLOCK, FFTW_MPI_DEFAULT_BLOCK, - (typename fftw_interface<rnumber>::complex*)this->data, + (complex_t<rnumber>*)this->data, this->data, this->comm, this->fftw_plan_rigor | FFTW_MPI_TRANSPOSED_IN); @@ -113,7 +113,7 @@ field<rnumber, be, fc>::field( 3, nfftw, ncomp(fc), FFTW_MPI_DEFAULT_BLOCK, FFTW_MPI_DEFAULT_BLOCK, this->data, - (typename fftw_interface<rnumber>::complex*)this->data, + (complex_t<rnumber>*)this->data, this->comm, this->fftw_plan_rigor | FFTW_MPI_TRANSPOSED_OUT); //plan_information = fftw_interface<rnumber>::sprint(this->r2c_plan); @@ -672,13 +672,13 @@ void field<rnumber, be, fc>::Hermitian_reflect() TIMEZONE("field::Hermitian_reflect"); start_mpi_profiling_zone(turtle_mpi_pcontrol::FIELD); assert(!this->real_space_representation); - typename fftw_interface<rnumber>::complex *cdata = this->get_cdata(); + complex_t<rnumber> *cdata = this->get_cdata(); // reflect kx = 0 plane, line by line, for ky != 0 MPI_Status *mpistatus = new MPI_Status; // bufferp will hold data from "plus", i.e. iy // bufferm will hold data from "minus", i.e. ny - iy - typename fftw_interface<rnumber>::complex *bufferp = new typename fftw_interface<rnumber>::complex[ncomp(fc)*this->clayout->sizes[1]]; - typename fftw_interface<rnumber>::complex *bufferm = new typename fftw_interface<rnumber>::complex[ncomp(fc)*this->clayout->sizes[1]]; + complex_t<rnumber> *bufferp = new complex_t<rnumber>[ncomp(fc)*this->clayout->sizes[1]]; + complex_t<rnumber> *bufferm = new complex_t<rnumber>[ncomp(fc)*this->clayout->sizes[1]]; int rankp, rankm; // for each ky slice except ky=0 for (ptrdiff_t iy = 1; iy < ptrdiff_t(this->clayout->sizes[0]/2); iy++) @@ -880,7 +880,7 @@ void field<rnumber, be, fc>::symmetrize_FFT() { TIMEZONE("field::symmetrize_FFT"); assert(!this->real_space_representation); - typename fftw_interface<rnumber>::complex *cdata = this->get_cdata(); + complex_t<rnumber> *cdata = this->get_cdata(); // make 0 mode real if (this->myrank == this->clayout->rank[0][0]) @@ -960,7 +960,7 @@ void field<rnumber, be, fc>::symmetrize_alternate() MPI_Barrier(this->clayout->comm); // TODO: figure out if this can be taken out by careful MPI tag generation start_mpi_profiling_zone(turtle_mpi_pcontrol::FIELD); assert(!this->real_space_representation); - typename fftw_interface<rnumber>::complex *cdata = this->get_cdata(); + complex_t<rnumber> *cdata = this->get_cdata(); // make 0 mode real if (this->myrank == this->clayout->rank[0][0]) @@ -1006,8 +1006,8 @@ void field<rnumber, be, fc>::symmetrize_alternate() MPI_Status *mpistatus = new MPI_Status; // bufferp will hold data from "plus", i.e. iy // bufferm will hold data from "minus", i.e. ny - iy - typename fftw_interface<rnumber>::complex *bufferp = new typename fftw_interface<rnumber>::complex[ncomp(fc)*this->clayout->sizes[1]]; - typename fftw_interface<rnumber>::complex *bufferm = new typename fftw_interface<rnumber>::complex[ncomp(fc)*this->clayout->sizes[1]]; + complex_t<rnumber> *bufferp = new complex_t<rnumber>[ncomp(fc)*this->clayout->sizes[1]]; + complex_t<rnumber> *bufferm = new complex_t<rnumber>[ncomp(fc)*this->clayout->sizes[1]]; int rankp, rankm; // for each ky slice except ky=0 for (ptrdiff_t iy = 1; iy < ptrdiff_t(this->clayout->sizes[0]/2); iy++) @@ -1226,7 +1226,7 @@ void field<rnumber, be, fc>::symmetrize() TIMEZONE("field::symmetrize"); start_mpi_profiling_zone(turtle_mpi_pcontrol::FIELD); assert(!this->real_space_representation); - typename fftw_interface<rnumber>::complex *cdata = this->get_cdata(); + complex_t<rnumber> *cdata = this->get_cdata(); // make 0 mode real if (this->myrank == this->clayout->rank[0][0]) @@ -1272,8 +1272,8 @@ void field<rnumber, be, fc>::symmetrize() MPI_Status *mpistatus = new MPI_Status; // bufferp will hold data from "plus", i.e. iy // bufferm will hold data from "minus", i.e. ny - iy - typename fftw_interface<rnumber>::complex *bufferp = new typename fftw_interface<rnumber>::complex[ncomp(fc)*this->clayout->sizes[1]]; - typename fftw_interface<rnumber>::complex *bufferm = new typename fftw_interface<rnumber>::complex[ncomp(fc)*this->clayout->sizes[1]]; + complex_t<rnumber> *bufferp = new complex_t<rnumber>[ncomp(fc)*this->clayout->sizes[1]]; + complex_t<rnumber> *bufferm = new complex_t<rnumber>[ncomp(fc)*this->clayout->sizes[1]]; int rankp, rankm; // for each ky slice except ky=0 for (ptrdiff_t iy = 1; iy < ptrdiff_t(this->clayout->sizes[0]/2); iy++) @@ -1468,7 +1468,7 @@ void field<rnumber, be, fc>::compute_stats( // what follows gave me a headache until I found this link: // http://stackoverflow.com/questions/8256636/expected-primary-expression-error-on-template-method-using kk->template cospectrum<rnumber, fc>( - (typename fftw_interface<rnumber>::complex*)(this->data), + (complex_t<rnumber>*)(this->data), group, dset_name + "_" + dset_name, toffset); @@ -2212,7 +2212,7 @@ int joint_rspace_3PDF( template <typename rnumber, field_backend be, field_components fc> -field<rnumber, be, fc>& field<rnumber, be, fc>::operator=(const typename fftw_interface<rnumber>::complex *__restrict__ source) +field<rnumber, be, fc>& field<rnumber, be, fc>::operator=(const complex_t<rnumber> *__restrict__ source) { // use CLOOP pattern, because we want the array to be arranged in memory // for optimal access by FFTW @@ -2337,7 +2337,7 @@ field<rnumber, be, fc> &field<rnumber, be, fc>::operator=( int64_t slice_size = src.clayout->local_size / src.clayout->subsizes[0]; // clean up *this = 0.0; - typename fftw_interface<rnumber>::complex *buffer; + complex_t<rnumber> *buffer; buffer = fftw_interface<rnumber>::alloc_complex(slice_size*ncomp(fc)); int min_fast_dim = diff --git a/cpp/field.hpp b/cpp/field.hpp index c136761e780eac73c1eada16e5ecece5c78f4e53..1fff8a6c382b27fd66df2ce0c8eab163b77e469c 100644 --- a/cpp/field.hpp +++ b/cpp/field.hpp @@ -192,14 +192,14 @@ class field return this->data; } - inline typename fftw_interface<rnumber>::complex *__restrict__ get_cdata() + inline complex_t<rnumber> *__restrict__ get_cdata() { - return (typename fftw_interface<rnumber>::complex*__restrict__)this->data; + return (complex_t<rnumber>*__restrict__)this->data; } - inline typename fftw_interface<rnumber>::complex *__restrict__ get_cdata() const + inline complex_t<rnumber> *__restrict__ get_cdata() const { - return (typename fftw_interface<rnumber>::complex*__restrict__)this->data; + return (complex_t<rnumber>*__restrict__)this->data; } inline rnumber &rval(ptrdiff_t rindex, unsigned int component = 0) @@ -261,7 +261,7 @@ class field return *(this->data + ((cindex*3 + comp1)*3+comp0)*2 + imag); } - field<rnumber, be, fc>& operator=(const typename fftw_interface<rnumber>::complex *__restrict__ source); + field<rnumber, be, fc>& operator=(const complex_t<rnumber> *__restrict__ source); field<rnumber, be, fc>& operator=(const rnumber *__restrict__ source); field<rnumber, be, fc>& operator=(const rnumber value); field<rnumber, be, fc>& operator=(const field<rnumber, be, fc> &src); diff --git a/cpp/kspace.cpp b/cpp/kspace.cpp index fca880f7437ee7010a6d4e25f5a1317da0312555..ca61908d3b8fc64b07bc1c6074f067719258e32e 100644 --- a/cpp/kspace.cpp +++ b/cpp/kspace.cpp @@ -30,9 +30,6 @@ #include <cmath> -template<class T> -using complex_t = typename fftw_interface<T>::complex; - template <field_backend be, kspace_dealias_type dt> template <field_components fc> diff --git a/cpp/kspace.hpp b/cpp/kspace.hpp index 0344b19a094f141d997bc63ab0ac0a8652fccfe2..48ac71ceab4cfe17a2768284860363aec1ae556e 100644 --- a/cpp/kspace.hpp +++ b/cpp/kspace.hpp @@ -83,27 +83,27 @@ class kspace template <typename rnumber, field_components fc> void low_pass( - typename fftw_interface<rnumber>::complex *__restrict__ a, + complex_t<rnumber> *__restrict__ a, const double kmax); template <typename rnumber, field_components fc> void Gauss_filter( - typename fftw_interface<rnumber>::complex *__restrict__ a, + complex_t<rnumber> *__restrict__ a, const double sigma); template <typename rnumber, field_components fc, int n> void Gauss_n_filter( - typename fftw_interface<rnumber>::complex *__restrict__ a, + complex_t<rnumber> *__restrict__ a, const double sigma); template <typename rnumber, field_components fc> void ball_filter( - typename fftw_interface<rnumber>::complex *__restrict__ a, + complex_t<rnumber> *__restrict__ a, const double sigma); /** @@ -114,20 +114,20 @@ class kspace template <typename rnumber, field_components fc> int filter( - typename fftw_interface<rnumber>::complex *__restrict__ a, + complex_t<rnumber> *__restrict__ a, const double wavenumber, std::string filter_type = std::string("Gauss")); template <typename rnumber, field_components fc> int filter_calibrated_ell( - typename fftw_interface<rnumber>::complex *__restrict__ a, + complex_t<rnumber> *__restrict__ a, const double wavenumber, std::string filter_type = std::string("Gauss")); template <typename rnumber, field_components fc> - void dealias(typename fftw_interface<rnumber>::complex *__restrict__ a); + void dealias(complex_t<rnumber> *__restrict__ a); template <typename rnumber, field_components fc> @@ -287,21 +287,21 @@ class kspace } template <typename rnumber> void project_divfree( - typename fftw_interface<rnumber>::complex *__restrict__ a, + complex_t<rnumber> *__restrict__ a, const bool maintain_energy = false); template <typename rnumber> void project_divfree( - typename fftw_interface<rnumber>::complex *__restrict__ xa, - typename fftw_interface<rnumber>::complex *__restrict__ ya, - typename fftw_interface<rnumber>::complex *__restrict__ za, + complex_t<rnumber> *__restrict__ xa, + complex_t<rnumber> *__restrict__ ya, + complex_t<rnumber> *__restrict__ za, const bool maintain_energy = false); // TODO: can the following be done in a cleaner way? template <typename rnumber> - void force_divfree(typename fftw_interface<rnumber>::complex *__restrict__ a){ + void force_divfree(complex_t<rnumber> *__restrict__ a){ this->template project_divfree<rnumber>(a, false); } template <typename rnumber> - void rotate_divfree(typename fftw_interface<rnumber>::complex *__restrict__ a); + void rotate_divfree(complex_t<rnumber> *__restrict__ a); }; #endif//KSPACE_HPP