ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
unitcell_info.h
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <cmath>
5#include "biggrid_info.h"
6#include "gint_helper.h"
7#include "gint_type.h"
8
9namespace ModuleGint
10{
11
13{
14 public:
15 // constructor
17 const Vec3d& unitcell_vec1,
18 const Vec3d& unitcell_vec2,
19 const Vec3d& unitcell_vec3,
20 int nbx, int nby, int nbz,
21 int nmx, int nmy, int nmz);
22
23 // getter functions
24 int get_nbx() const { return nbx_; }
25 int get_nby() const { return nby_; }
26 int get_nbz() const { return nbz_; }
27 int get_bgrids_num() const { return nbxyz_; }
28 int get_nmx() const { return nmx_; }
29 int get_nmy() const { return nmy_; }
30 int get_nmz() const { return nmz_; }
31 int get_mgrids_num() const { return nmxyz_; }
32 std::shared_ptr<const BigGridInfo> get_bgrid_info() const { return biggrid_info_; }
33 std::shared_ptr<const MeshGridInfo> get_mgrid_info() const { return meshgrid_info_; }
34
35 //====================================================================
36 // functions related to the big grid
37 //====================================================================
38
39 // transform the 1D index of a big grid in the unit cell to the 3D index
40 Vec3i bgrid_idx_1Dto3D(const int index_1d) const
41 {
42 return index1Dto3D(index_1d, nbx_, nby_, nbz_);
43 }
44
45 // transform the 3D index of a biggrid in the unit cell to the 1D index
46 int bgrid_idx_3Dto1D(const Vec3i index_3d) const
47 {
48 return index3Dto1D(index_3d.x, index_3d.y, index_3d.z, nbx_, nby_, nbz_);
49 }
50
51 // get the cartesian coordinate of a big grid in the unit cell from the 3D index
52 Vec3d get_bgrid_coord(Vec3i index_3d) const
53 {
54 return biggrid_info_->get_cartesian_coord(index_3d);
55 }
56
57 // get the cartesian coordinate of a big grid in the unit cell from the 1D index
58 Vec3d get_bgrid_coord(int index_1d) const
59 {
60 return get_bgrid_coord(bgrid_idx_1Dto3D(index_1d));
61 }
62
63 // get the 3D index of a big grid in the unit cell from the cartesian coordinate
64 Vec3i get_bgrid_idx_3d(const Vec3d coord) const
65 {
66 Vec3d direct_coord = biggrid_info_->get_direct_coord(coord);
67 return Vec3i(
68 static_cast<int>(floor(direct_coord.x)),
69 static_cast<int>(floor(direct_coord.y)),
70 static_cast<int>(floor(direct_coord.z)));
71 }
72
73 // Get the relative Cartesian coordinates of big grid A relative to big grid B
74 // returned vector = coordinates of point A - coordinates of point B
75 // this function is more efficient than obtaining two 3D coordinates separately
76 // through two 3D indices and then subtracting them
77 Vec3d get_relative_coord(Vec3i index_3d_a, Vec3i index_3d_b) const
78 {
79 return get_bgrid_coord(index_3d_a - index_3d_b);
80 }
81
82 // get the extended unitcell index of a big grid
83 Vec3i get_unitcell_idx(const Vec3i index_3d) const
84 {
85 return Vec3i(floor_div(index_3d.x, nbx_),
86 floor_div(index_3d.y, nby_),
87 floor_div(index_3d.z, nbz_));
88 }
89
90 // map the extended big grid index to the big grid index in unitcell
91 Vec3i map_ext_idx_to_ucell(const Vec3i index_3d) const
92 {
93 return Vec3i(index_3d.x - floor_div(index_3d.x, nbx_) * nbx_,
94 index_3d.y - floor_div(index_3d.y, nby_) * nby_,
95 index_3d.z - floor_div(index_3d.z, nbz_) * nbz_);
96 }
97
98
99 //====================================================================
100 // functions related to the meshgrid
101 //====================================================================
102
103 // transform the 1D index of a meshgrid in the unit cell to the 3D index
104 Vec3i mgrid_idx_1Dto3D(const int index_1d) const
105 {
106 return index1Dto3D(index_1d, nmx_, nmy_, nmz_);
107 }
108
109 // transform the 3D index of a meshgrid in the unit cell to the 1D index
110 int mgrid_idx_3Dto1D(const Vec3i index_3d) const
111 {
112 return index3Dto1D(index_3d.x, index_3d.y, index_3d.z, nmx_, nmy_, nmz_);
113 }
114
115 // get the cartesian coordinate of a meshgrid in the unit cell from the 3D index
117 {
118 return meshgrid_info_->get_cartesian_coord(index_3d);
119 }
120
121 // get the cartesian coordinate of a meshgrid in the unit cell from the 1D index
122 Vec3d get_mgrid_coord(int index_1d) const
123 {
124 return get_mgrid_coord(mgrid_idx_1Dto3D(index_1d));
125 }
126
127 private:
128 // basis vectors of the unit cell
132
133 //====================================================================
134 // member variables related to the Big Grid
135 //====================================================================
136
137 // the number of big cells along the first lattice vector
138 int nbx_;
139
140 // the number of big cells along the second lattice vector
141 int nby_;
142
143 // the number of big cells along the third lattice vector
144 int nbz_;
145
146 // the total number of big cells
148
149 // basic attributes of the big grid
150 std::shared_ptr<const BigGridInfo> biggrid_info_;
151
152 std::shared_ptr<const MeshGridInfo> meshgrid_info_;
153
154 //====================================================================
155 // member variables related to meshgrid
156 //====================================================================
157
158 // the number of meshgrids along the first lattice vector
159 int nmx_;
160
161 // the number of meshgrids along the second lattice vector
162 int nmy_;
163
164 // the number of meshgrids along the third lattice vector
165 int nmz_;
166
167 // the total number of meshgrids in the unitcell
169
170};
171
172} // namespace ModuleGint
T x
Definition vector3.h:24
T y
Definition vector3.h:25
T z
Definition vector3.h:26
Definition unitcell_info.h:13
int nby_
Definition unitcell_info.h:141
int nbx_
Definition unitcell_info.h:138
int nbxyz_
Definition unitcell_info.h:147
int get_nmx() const
Definition unitcell_info.h:28
std::shared_ptr< const MeshGridInfo > meshgrid_info_
Definition unitcell_info.h:152
Vec3d unitcell_vec1_
Definition unitcell_info.h:129
int get_nmz() const
Definition unitcell_info.h:30
int get_nbz() const
Definition unitcell_info.h:26
Vec3d get_relative_coord(Vec3i index_3d_a, Vec3i index_3d_b) const
Definition unitcell_info.h:77
int get_nmy() const
Definition unitcell_info.h:29
int mgrid_idx_3Dto1D(const Vec3i index_3d) const
Definition unitcell_info.h:110
int get_mgrids_num() const
Definition unitcell_info.h:31
Vec3i get_bgrid_idx_3d(const Vec3d coord) const
Definition unitcell_info.h:64
int nmy_
Definition unitcell_info.h:162
int nmz_
Definition unitcell_info.h:165
int nmxyz_
Definition unitcell_info.h:168
int bgrid_idx_3Dto1D(const Vec3i index_3d) const
Definition unitcell_info.h:46
Vec3d get_bgrid_coord(Vec3i index_3d) const
Definition unitcell_info.h:52
Vec3i get_unitcell_idx(const Vec3i index_3d) const
Definition unitcell_info.h:83
int nbz_
Definition unitcell_info.h:144
std::shared_ptr< const BigGridInfo > get_bgrid_info() const
Definition unitcell_info.h:32
Vec3d get_bgrid_coord(int index_1d) const
Definition unitcell_info.h:58
int get_bgrids_num() const
Definition unitcell_info.h:27
int get_nby() const
Definition unitcell_info.h:25
std::shared_ptr< const BigGridInfo > biggrid_info_
Definition unitcell_info.h:150
Vec3i map_ext_idx_to_ucell(const Vec3i index_3d) const
Definition unitcell_info.h:91
std::shared_ptr< const MeshGridInfo > get_mgrid_info() const
Definition unitcell_info.h:33
Vec3i mgrid_idx_1Dto3D(const int index_1d) const
Definition unitcell_info.h:104
Vec3i bgrid_idx_1Dto3D(const int index_1d) const
Definition unitcell_info.h:40
int nmx_
Definition unitcell_info.h:159
Vec3d get_mgrid_coord(int index_1d) const
Definition unitcell_info.h:122
Vec3d get_mgrid_coord(Vec3i index_3d) const
Definition unitcell_info.h:116
Vec3d unitcell_vec2_
Definition unitcell_info.h:130
Vec3d unitcell_vec3_
Definition unitcell_info.h:131
int get_nbx() const
Definition unitcell_info.h:24
Definition batch_biggrid.cpp:4
ModuleBase::Vector3< int > Vec3i
Definition gint_type.h:11
int floor_div(const int a, const int b)
Definition gint_helper.h:50
int index3Dto1D(const int id_x, const int id_y, const int id_z, const int dim_x, const int dim_y, const int dim_z)
Definition gint_helper.h:10
Vec3i index1Dto3D(const int index_1d, const int dim_x, const int dim_y, const int dim_z)
Definition gint_helper.h:16