mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-10-31 12:04:33 +00:00 
			
		
		
		
	HDF5: better complex number support
This commit is contained in:
		| @@ -60,12 +60,12 @@ Author: paboyle <paboyle@ph.ed.ac.uk> | |||||||
| // Grid headers | // Grid headers | ||||||
| /////////////////// | /////////////////// | ||||||
| #include "Config.h" | #include "Config.h" | ||||||
| #include <Grid/serialisation/Serialisation.h> |  | ||||||
| #include <Grid/Timer.h> | #include <Grid/Timer.h> | ||||||
| #include <Grid/PerfCount.h> | #include <Grid/PerfCount.h> | ||||||
| #include <Grid/Log.h> | #include <Grid/Log.h> | ||||||
| #include <Grid/AlignedAllocator.h> | #include <Grid/AlignedAllocator.h> | ||||||
| #include <Grid/Simd.h> | #include <Grid/Simd.h> | ||||||
|  | #include <Grid/serialisation/Serialisation.h> | ||||||
| #include <Grid/Threads.h> | #include <Grid/Threads.h> | ||||||
| #include <Grid/Lexicographic.h> | #include <Grid/Lexicographic.h> | ||||||
| #include <Grid/Init.h> | #include <Grid/Init.h> | ||||||
|   | |||||||
| @@ -68,20 +68,21 @@ namespace Grid { | |||||||
|     return os; |     return os; | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   // Vector element trait ////////////////////////////////////////////////////// |   // Vector element trait //////////////////////////////////////////////////////   | ||||||
|   template <typename T> |   template <typename T> | ||||||
|   struct element |   struct element | ||||||
|   { |   { | ||||||
|     typedef T type; |     typedef T type; | ||||||
|     static constexpr bool is_arithmetic = false; |     static constexpr bool is_number = false; | ||||||
|   }; |   }; | ||||||
|    |    | ||||||
|   template <typename T> |   template <typename T> | ||||||
|   struct element<std::vector<T>> |   struct element<std::vector<T>> | ||||||
|   { |   { | ||||||
|     typedef typename element<T>::type type; |     typedef typename element<T>::type type; | ||||||
|     static constexpr bool is_arithmetic = std::is_arithmetic<T>::value |     static constexpr bool is_number = std::is_arithmetic<T>::value | ||||||
|                                           or element<T>::is_arithmetic; |                                       or is_complex<T>::value | ||||||
|  |                                       or element<T>::is_number; | ||||||
|   }; |   }; | ||||||
|    |    | ||||||
|   // Vector flatening utility class //////////////////////////////////////////// |   // Vector flatening utility class //////////////////////////////////////////// | ||||||
|   | |||||||
| @@ -32,10 +32,10 @@ namespace Grid | |||||||
|     template <typename U> |     template <typename U> | ||||||
|     void writeDefault(const std::string &s, const U &x); |     void writeDefault(const std::string &s, const U &x); | ||||||
|     template <typename U> |     template <typename U> | ||||||
|     typename std::enable_if<element<std::vector<U>>::is_arithmetic, void>::type |     typename std::enable_if<element<std::vector<U>>::is_number, void>::type | ||||||
|     writeDefault(const std::string &s, const std::vector<U> &x); |     writeDefault(const std::string &s, const std::vector<U> &x); | ||||||
|     template <typename U> |     template <typename U> | ||||||
|     typename std::enable_if<!element<std::vector<U>>::is_arithmetic, void>::type |     typename std::enable_if<!element<std::vector<U>>::is_number, void>::type | ||||||
|     writeDefault(const std::string &s, const std::vector<U> &x); |     writeDefault(const std::string &s, const std::vector<U> &x); | ||||||
|   private: |   private: | ||||||
|     template <typename U> |     template <typename U> | ||||||
| @@ -59,10 +59,10 @@ namespace Grid | |||||||
|     template <typename U> |     template <typename U> | ||||||
|     void readDefault(const std::string &s, U &output); |     void readDefault(const std::string &s, U &output); | ||||||
|     template <typename U> |     template <typename U> | ||||||
|     typename std::enable_if<element<std::vector<U>>::is_arithmetic, void>::type |     typename std::enable_if<element<std::vector<U>>::is_number, void>::type | ||||||
|     readDefault(const std::string &s, std::vector<U> &x); |     readDefault(const std::string &s, std::vector<U> &x); | ||||||
|     template <typename U> |     template <typename U> | ||||||
|     typename std::enable_if<!element<std::vector<U>>::is_arithmetic, void>::type |     typename std::enable_if<!element<std::vector<U>>::is_number, void>::type | ||||||
|     readDefault(const std::string &s, std::vector<U> &x); |     readDefault(const std::string &s, std::vector<U> &x); | ||||||
|   private: |   private: | ||||||
|     template <typename U> |     template <typename U> | ||||||
| @@ -99,7 +99,7 @@ namespace Grid | |||||||
|   void Hdf5Writer::writeDefault(const std::string &s, const std::string &x); |   void Hdf5Writer::writeDefault(const std::string &s, const std::string &x); | ||||||
|    |    | ||||||
|   template <typename U> |   template <typename U> | ||||||
|   typename std::enable_if<element<std::vector<U>>::is_arithmetic, void>::type |   typename std::enable_if<element<std::vector<U>>::is_number, void>::type | ||||||
|   Hdf5Writer::writeDefault(const std::string &s, const std::vector<U> &x) |   Hdf5Writer::writeDefault(const std::string &s, const std::vector<U> &x) | ||||||
|   { |   { | ||||||
|     // alias to element type |     // alias to element type | ||||||
| @@ -135,7 +135,7 @@ namespace Grid | |||||||
|   } |   } | ||||||
|    |    | ||||||
|   template <typename U> |   template <typename U> | ||||||
|   typename std::enable_if<!element<std::vector<U>>::is_arithmetic, void>::type |   typename std::enable_if<!element<std::vector<U>>::is_number, void>::type | ||||||
|   Hdf5Writer::writeDefault(const std::string &s, const std::vector<U> &x) |   Hdf5Writer::writeDefault(const std::string &s, const std::vector<U> &x) | ||||||
|   { |   { | ||||||
|     push(s); |     push(s); | ||||||
| @@ -169,7 +169,7 @@ namespace Grid | |||||||
|   void Hdf5Reader::readDefault(const std::string &s, std::string &x); |   void Hdf5Reader::readDefault(const std::string &s, std::string &x); | ||||||
|    |    | ||||||
|   template <typename U> |   template <typename U> | ||||||
|   typename std::enable_if<element<std::vector<U>>::is_arithmetic, void>::type |   typename std::enable_if<element<std::vector<U>>::is_number, void>::type | ||||||
|   Hdf5Reader::readDefault(const std::string &s, std::vector<U> &x) |   Hdf5Reader::readDefault(const std::string &s, std::vector<U> &x) | ||||||
|   { |   { | ||||||
|     // alias to element type |     // alias to element type | ||||||
| @@ -222,7 +222,7 @@ namespace Grid | |||||||
|   } |   } | ||||||
|    |    | ||||||
|   template <typename U> |   template <typename U> | ||||||
|   typename std::enable_if<!element<std::vector<U>>::is_arithmetic, void>::type |   typename std::enable_if<!element<std::vector<U>>::is_number, void>::type | ||||||
|   Hdf5Reader::readDefault(const std::string &s, std::vector<U> &x) |   Hdf5Reader::readDefault(const std::string &s, std::vector<U> &x) | ||||||
|   { |   { | ||||||
|     uint64_t size; |     uint64_t size; | ||||||
|   | |||||||
| @@ -10,13 +10,14 @@ | |||||||
|  |  | ||||||
| #define HDF5_NATIVE_TYPE(predType, cType)\ | #define HDF5_NATIVE_TYPE(predType, cType)\ | ||||||
| template <>\ | template <>\ | ||||||
| struct Hdf5Type<cType>\ | class Hdf5Type<cType>\ | ||||||
| {\ | {\ | ||||||
| static inline const H5NS::PredType & type(void)\ | public:\ | ||||||
| {\ |   static inline const H5NS::DataType & type(void)\ | ||||||
|   return H5NS::PredType::predType;\ |   {\ | ||||||
| }\ |     return H5NS::PredType::predType;\ | ||||||
| static constexpr bool       isNative = true;\ |   }\ | ||||||
|  |   static constexpr bool isNative = true;\ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #define DEFINE_HDF5_NATIVE_TYPES \ | #define DEFINE_HDF5_NATIVE_TYPES \ | ||||||
| @@ -38,12 +39,36 @@ HDF5_NATIVE_TYPE(NATIVE_LDOUBLE, long double); | |||||||
|  |  | ||||||
| namespace Grid | namespace Grid | ||||||
| { | { | ||||||
|   template <typename T> struct Hdf5Type |   template <typename T> class Hdf5Type | ||||||
|   { |   { | ||||||
|  |   public: | ||||||
|     static constexpr bool isNative = false; |     static constexpr bool isNative = false; | ||||||
|   }; |   }; | ||||||
|    |    | ||||||
|   DEFINE_HDF5_NATIVE_TYPES; |   DEFINE_HDF5_NATIVE_TYPES; | ||||||
|  |    | ||||||
|  |   template <typename R> | ||||||
|  |   class Hdf5Type<std::complex<R>> | ||||||
|  |   { | ||||||
|  |   public: | ||||||
|  |     static inline const H5NS::DataType & type(void) | ||||||
|  |     { | ||||||
|  |       if (typePtr_ == nullptr) | ||||||
|  |       { | ||||||
|  |         typePtr_.reset(new H5NS::CompType(sizeof(std::complex<R>))); | ||||||
|  |         typePtr_->insertMember("re", 0,         Hdf5Type<R>::type()); | ||||||
|  |         typePtr_->insertMember("im", sizeof(R), Hdf5Type<R>::type()); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       return *typePtr_; | ||||||
|  |     } | ||||||
|  |     static constexpr bool isNative = false; | ||||||
|  |   private: | ||||||
|  |     static std::unique_ptr<H5NS::CompType> typePtr_; | ||||||
|  |   }; | ||||||
|  |    | ||||||
|  |   template <typename R> | ||||||
|  |   std::unique_ptr<H5NS::CompType> Hdf5Type<std::complex<R>>::typePtr_ = nullptr; | ||||||
| } | } | ||||||
|  |  | ||||||
| #undef HDF5_NATIVE_TYPE | #undef HDF5_NATIVE_TYPE | ||||||
|   | |||||||
| @@ -43,10 +43,14 @@ public: | |||||||
|                           bool , b, |                           bool , b, | ||||||
|                           std::vector<double>, array, |                           std::vector<double>, array, | ||||||
|                           std::vector<std::vector<double>>, twodimarray, |                           std::vector<std::vector<double>>, twodimarray, | ||||||
|  |                           std::vector<std::vector<std::vector<Complex>>>, cmplx3darray | ||||||
|                           ); |                           ); | ||||||
|   myclass() {} |   myclass() {} | ||||||
|   myclass(int i) |   myclass(int i) | ||||||
|   : array(4,5.1), twodimarray(3,std::vector<double>(2,1.23456)), ve(2, myenum::blue) |   : array(4,5.1) | ||||||
|  |   , twodimarray(3,std::vector<double>(5, 1.23456)) | ||||||
|  |   , cmplx3darray(3,std::vector<std::vector<Complex>>(5, std::vector<Complex>(7, Complex(1.2, 3.4)))) | ||||||
|  |   , ve(2, myenum::blue) | ||||||
|   { |   { | ||||||
|     e=myenum::red; |     e=myenum::red; | ||||||
|     x=i; |     x=i; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user