vector3_order.h Source File

LibRPA: vector3_order.h Source File
LibRPA
vector3_order.h
1 //==========================================================
2 // AUTHOR : Peize Lin
3 // DATE : 2017-01-10
4 //==========================================================
5 
6 #ifndef ABFS_VECTOR3_ORDER_H
7 #define ABFS_VECTOR3_ORDER_H
8 #include "vector3.h"
9 //#include "src_lcao/abfs.h"
10 
11 //#include <boost/archive/binary_oarchive.hpp>
12 //#include <boost/archive/binary_iarchive.hpp>
13 
14 template<typename T> class Vector3_Order: public Vector3<T>
15 {
16 public:
17  Vector3_Order(const Vector3<T> &v):Vector3<T>(v){}
18  Vector3_Order(const T &x,const T &y,const T &z):Vector3<T>(x,y,z){}
19  Vector3_Order()=default;
20 };
21 
22 template<typename T>
23 bool operator< ( const Vector3_Order<T> &v1, const Vector3_Order<T> &v2 );
24 
25 template<typename T>
26 Vector3_Order<T> operator-(const Vector3_Order<T> &v1)
27 {
28  return {-v1.x, -v1.y, -v1.z};
29 }
30 
31 template<typename T>
32 bool operator== ( const Vector3_Order<T> &v1, const Vector3_Order<T> &v2 );
33 /*
34 template<typename T>
35 bool operator> ( const Abfs::Vector3_Order<T> &v1, const Abfs::Vector3_Order<T> &v2 )
36 {
37  if( v1.x>v2.x ) return true;
38  else if ( v1.x<v2.x ) return false;
39  if( v1.y>v2.y ) return true;
40  else if ( v1.y<v2.y ) return false;
41  if( v1.z>v2.z ) return true;
42  else if ( v1.z<v2.z ) return false;
43  return false;
44 }
45 
46 template<typename T>
47 bool operator<= ( const Abfs::Vector3_Order<T> &v1, const Abfs::Vector3_Order<T> &v2 )
48 {
49  if( v1.x<v2.x ) return true;
50  else if ( v1.x>v2.x ) return false;
51  if( v1.y<v2.y ) return true;
52  else if ( v1.y>v2.y ) return false;
53  if( v1.z<v2.z ) return true;
54  else if ( v1.z>v2.z ) return false;
55  return true;
56 }
57 
58 template<typename T>
59 bool operator>= ( const Abfs::Vector3_Order<T> &v1, const Abfs::Vector3_Order<T> &v2 )
60 {
61  if( v1.x>v2.x ) return true;
62  else if ( v1.x<v2.x ) return false;
63  if( v1.y>v2.y ) return true;
64  else if ( v1.y<v2.y ) return false;
65  if( v1.z>v2.z ) return true;
66  else if ( v1.z<v2.z ) return false;
67  return true;
68 }
69 */
70 
71 // (a%b+b)%b: return same sign % as b
72 template<typename T>
73 Vector3_Order<T> operator% ( const Vector3_Order<T> &v1, const Vector3_Order<T> &v2 )
74 {
75  auto mod = [](const int i, const int n){ return (i%n+3*n/2)%n-n/2; }; // [-n/2,n/2]
76 // auto mod = [](const int i, const int n){ return (i%n+n)%n; }; // [0,n]
77  return Vector3_Order<T>{ mod(v1.x,v2.x), mod(v1.y,v2.y), mod(v1.z,v2.z) };
78 }
79 
80 #endif // ABFS_VECTOR3_ORDER_H
Definition: vector3_order.h:15
Definition: vector3.h:18