ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
abfs-vector3_order.h
Go to the documentation of this file.
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
10
11// mohan comment out 2021-02-06
12//#include <boost/archive/binary_oarchive.hpp>
13//#include <boost/archive/binary_iarchive.hpp>
14
15template<typename T> class Abfs::Vector3_Order: public ModuleBase::Vector3<T>
16{
17public:
19 Vector3_Order(const T &x,const T &y,const T &z):ModuleBase::Vector3<T>(x,y,z){}
20 Vector3_Order()=default;
21};
22
23template<typename T>
25
26template<>
28{
29 // threshold is used when v1 and v2 are approximately equal with double numerical error,
30 // but a strange bug occurs at LRI_CV::dVws.
31 // Peize Lin change at 2023.04.29
32 if ( v1.x < v2.x ) return true;
33 else if ( v1.x > v2.x ) return false;
34 if ( v1.y < v2.y ) return true;
35 else if ( v1.y > v2.y ) return false;
36 if ( v1.z < v2.z ) return true;
37 else if ( v1.z > v2.z ) return false;
38 return false;
39}
40
41template<>
43{
44 if ( v1.x < v2.x ) return true;
45 else if ( v1.x > v2.x ) return false;
46 if ( v1.y < v2.y ) return true;
47 else if ( v1.y > v2.y ) return false;
48 if ( v1.z < v2.z ) return true;
49 else if ( v1.z > v2.z ) return false;
50 return false;
51}
52
53/*
54template<typename T>
55bool operator> ( const Abfs::Vector3_Order<T> &v1, const Abfs::Vector3_Order<T> &v2 )
56{
57 if( v1.x>v2.x ) return true;
58 else if ( v1.x<v2.x ) return false;
59 if( v1.y>v2.y ) return true;
60 else if ( v1.y<v2.y ) return false;
61 if( v1.z>v2.z ) return true;
62 else if ( v1.z<v2.z ) return false;
63 return false;
64}
65
66template<typename T>
67bool operator<= ( const Abfs::Vector3_Order<T> &v1, const Abfs::Vector3_Order<T> &v2 )
68{
69 if( v1.x<v2.x ) return true;
70 else if ( v1.x>v2.x ) return false;
71 if( v1.y<v2.y ) return true;
72 else if ( v1.y>v2.y ) return false;
73 if( v1.z<v2.z ) return true;
74 else if ( v1.z>v2.z ) return false;
75 return true;
76}
77
78template<typename T>
79bool operator>= ( const Abfs::Vector3_Order<T> &v1, const Abfs::Vector3_Order<T> &v2 )
80{
81 if( v1.x>v2.x ) return true;
82 else if ( v1.x<v2.x ) return false;
83 if( v1.y>v2.y ) return true;
84 else if ( v1.y<v2.y ) return false;
85 if( v1.z>v2.z ) return true;
86 else if ( v1.z<v2.z ) return false;
87 return true;
88}
89*/
90
91// (a%b+b)%b: return same sign % as b
92template<typename T>
94{
95 auto mod = [](const int i, const int n){ return (i%n+3*n/2)%n-n/2; }; // [-n/2,n/2]
96// auto mod = [](const int i, const int n){ return (i%n+n)%n; }; // [0,n]
97 return Abfs::Vector3_Order<T>{ mod(v1.x,v2.x), mod(v1.y,v2.y), mod(v1.z,v2.z) };
98}
99
100#endif // ABFS_VECTOR3_ORDER_H
Abfs::Vector3_Order< T > operator%(const Abfs::Vector3_Order< T > &v1, const Abfs::Vector3_Order< T > &v2)
Definition abfs-vector3_order.h:93
bool operator<(const Abfs::Vector3_Order< T > &v1, const Abfs::Vector3_Order< T > &v2)
const std::complex< double > i
Definition cal_pLpR.cpp:46
Definition abfs-vector3_order.h:16
Vector3_Order(const ModuleBase::Vector3< T > &v)
Definition abfs-vector3_order.h:18
Vector3_Order()=default
Vector3_Order(const T &x, const T &y, const T &z)
Definition abfs-vector3_order.h:19
3 elements vector
Definition vector3.h:24
T x
Definition vector3.h:26
Vector3(const T &x1=0, const T &y1=0, const T &z1=0)
Default constructor.
Definition vector3.h:37
T y
Definition vector3.h:27
T z
Definition vector3.h:28
#define T
Definition exp.cpp:237
Definition clebsch_gordan_coeff.cpp:8