ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
RI_Util.hpp
Go to the documentation of this file.
1//=======================
2// AUTHOR : Peize Lin
3// DATE : 2022-08-17
4//=======================
5
6#ifndef RI_UTIL_HPP
7#define RI_UTIL_HPP
8
9#include "RI_Util.h"
12
13namespace RI_Util
14{
15 inline std::array<int,3>
17 {
18 return std::array<int,3>{kv.nmp[0], kv.nmp[1], kv.nmp[2]};
19 }
20
21 template<typename Tcell>
22 std::vector<std::array<Tcell,1>>
23 get_Born_von_Karmen_cells( const std::array<Tcell,1> &Born_von_Karman_period )
24 {
25 using namespace RI::Array_Operator;
26 std::vector<std::array<Tcell,1>> Born_von_Karman_cells;
27 for( int c=0; c<Born_von_Karman_period[0]; ++c )
28 Born_von_Karman_cells.emplace_back( std::array<Tcell,1>{c} % Born_von_Karman_period );
29 return Born_von_Karman_cells;
30 }
31
32 template<typename Tcell, size_t Ndim>
33 std::vector<std::array<Tcell,Ndim>>
34 get_Born_von_Karmen_cells( const std::array<Tcell,Ndim> &Born_von_Karman_period )
35 {
36 using namespace RI::Array_Operator;
37
38 std::array<Tcell,Ndim-1> sub_Born_von_Karman_period;
39 for(int i=0; i<Ndim-1; ++i)
40 sub_Born_von_Karman_period[i] = Born_von_Karman_period[i];
41
42 std::vector<std::array<Tcell,Ndim>> Born_von_Karman_cells;
43 for( const std::array<Tcell,Ndim-1> &sub_cell : get_Born_von_Karmen_cells(sub_Born_von_Karman_period) )
44 for( Tcell c=0; c<Born_von_Karman_period.back(); ++c )
45 {
46 std::array<Tcell,Ndim> cell;
47 for(int i=0; i<Ndim-1; ++i)
48 cell[i] = sub_cell[i];
49 cell.back() = (std::array<Tcell,1>{c} % std::array<Tcell,1>{Born_von_Karman_period.back()})[0];
50 Born_von_Karman_cells.emplace_back(std::move(cell));
51 }
52 return Born_von_Karman_cells;
53 }
54
55 /* example for Ndim=3:
56 template<typename Tcell, size_t Ndim>
57 std::vector<std::array<Tcell,Ndim>>
58 get_Born_von_Karmen_cells( const std::array<Tcell,Ndim> &Born_von_Karman_period )
59 {
60 using namespace Array_Operator;
61 std::vector<std::array<Tcell,Ndim>> Born_von_Karman_cells;
62 for( int ix=0; ix<Born_von_Karman_period[0]; ++ix )
63 for( int iy=0; iy<Born_von_Karman_period[1]; ++iy )
64 for( int iz=0; iz<Born_von_Karman_period[2]; ++iz )
65 Born_von_Karman_cells.push_back( std::array<Tcell,Ndim>{ix,iy,iz} % Born_von_Karman_period );
66 return Born_von_Karman_cells;
67 }
68 */
69
70 inline std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>>
72 const std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> &coulomb_param,
73 const UnitCell &ucell,
74 const K_Vectors *p_kv)
75 {
76 std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> coulomb_param_updated = coulomb_param;
77 for(auto &param_list : coulomb_param_updated)
78 {
79 for(auto &param : param_list.second)
80 {
81 if(param.at("singularity_correction") == "spencer")
82 {
83 // 4/3 * pi * Rcut^3 = V_{supercell} = V_{unitcell} * Nk
84 const int nspin0 = (PARAM.inp.nspin==2) ? 2 : 1;
85 const double Rcut = std::pow(0.75 * p_kv->get_nkstot_full()/nspin0 * ucell.omega / (ModuleBase::PI), 1.0/3.0);
87 }
88 else if(param.at("singularity_correction") == "revised_spencer")
89 {
90 const double bvk_a1 = ucell.a1.norm() * p_kv->nmp[0];
91 const double bvk_a2 = ucell.a2.norm() * p_kv->nmp[1];
92 const double bvk_a3 = ucell.a3.norm() * p_kv->nmp[2];
93 const double Rcut = 0.5 * std::min({bvk_a1, bvk_a2, bvk_a3});
95 }
96 }
97 }
98 return coulomb_param_updated;
99 }
100
101 inline std::map<Conv_Coulomb_Pot_K::Coulomb_Method,
102 std::pair<bool,
104 std::vector<std::map<std::string,std::string>>>>>
106 const std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> &coulomb_param,
107 const UnitCell &ucell,
108 const K_Vectors *p_kv)
109 {
110 const std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>>
111 coulomb_param_updated = update_coulomb_param(coulomb_param, ucell, p_kv);
112
113 // Separate the parameters into Center2 and Ewald methods
114 std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> coulomb_param_center2;
115 std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> coulomb_param_ewald;
116 for(auto &param_list : coulomb_param_updated)
117 {
118 for(auto &param : param_list.second)
119 {
120 if(param.at("singularity_correction") == "spencer" || param.at("singularity_correction") == "limits"
121 || param.at("singularity_correction") == "revised_spencer")
122 {
123 coulomb_param_center2[param_list.first].push_back(param);
124 }
125 else if (param.at("singularity_correction") == "massidda" || param.at("singularity_correction") == "carrier" )
126 {
127 coulomb_param_ewald[param_list.first].push_back(param);
128 }
129 }
130 }
131
133 std::pair<bool,
135 std::vector<std::map<std::string,std::string>>>>> coulomb_settings;
136
137 if(!coulomb_param_center2.empty())
138 {
139 coulomb_settings[Conv_Coulomb_Pot_K::Coulomb_Method::Center2] = std::make_pair(true, coulomb_param_center2);
140 }
141 if (!coulomb_param_ewald.empty())
142 {
143 coulomb_settings[Conv_Coulomb_Pot_K::Coulomb_Method::Ewald] = std::make_pair(false, coulomb_param_ewald);
144 }
145
146 return coulomb_settings;
147 }
148}
149
150#endif
Definition klist.h:13
int get_nkstot_full() const
Definition klist.h:78
int nmp[3]
distinguish spin up and down k points
Definition klist.h:23
T norm(void) const
Get the norm of a Vector3.
Definition vector3.h:187
const Input_para & inp
Definition parameter.h:26
Definition unitcell.h:16
double & omega
Definition unitcell.h:32
ModuleBase::Vector3< double > & a2
Definition unitcell.h:36
ModuleBase::Vector3< double > & a3
Definition unitcell.h:36
ModuleBase::Vector3< double > & a1
Definition unitcell.h:36
Parameter param
Definition io_system_variable_test.cpp:38
Coulomb_Type
Definition conv_coulomb_pot_k.h:10
Coulomb_Method
Definition conv_coulomb_pot_k.h:16
std::string TO_STRING(const T &t, const int n=20)
Definition global_function.h:239
const double PI
Definition constants.h:19
Definition RI_Util.h:22
std::array< int, 3 > get_Born_vonKarmen_period(const K_Vectors &kv)
Definition RI_Util.hpp:16
std::map< Conv_Coulomb_Pot_K::Coulomb_Type, std::vector< std::map< std::string, std::string > > > update_coulomb_param(const std::map< Conv_Coulomb_Pot_K::Coulomb_Type, std::vector< std::map< std::string, std::string > > > &coulomb_param, const UnitCell &ucell, const K_Vectors *p_kv)
Definition RI_Util.hpp:71
std::map< Conv_Coulomb_Pot_K::Coulomb_Method, std::pair< bool, std::map< Conv_Coulomb_Pot_K::Coulomb_Type, std::vector< std::map< std::string, std::string > > > > > update_coulomb_settings(const std::map< Conv_Coulomb_Pot_K::Coulomb_Type, std::vector< std::map< std::string, std::string > > > &coulomb_param, const UnitCell &ucell, const K_Vectors *p_kv)
Definition RI_Util.hpp:105
std::vector< std::array< Tcell, Ndim > > get_Born_von_Karmen_cells(const std::array< Tcell, Ndim > &Born_von_Karman_period)
Definition RI_Util.hpp:34
Parameter PARAM
Definition parameter.cpp:3
int nspin
LDA ; LSDA ; non-linear spin.
Definition input_parameter.h:84