forked from deepmodeling/abacus-develop
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMix_DMk_2D.cpp
More file actions
88 lines (77 loc) · 2.58 KB
/
Copy pathMix_DMk_2D.cpp
File metadata and controls
88 lines (77 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//=======================
// AUTHOR : Peize Lin
// DATE : 2023-05-09
//=======================
#include "Mix_DMk_2D.h"
#include "module_base/module_mixing/plain_mixing.h"
#include "module_base/tool_title.h"
#include <cassert>
template <typename Tdata>
Mix_DMk_2D<Tdata>::~Mix_DMk_2D<Tdata>()
{
if(this->flag_del_mixing)
delete this->mixing;
}
template <typename Tdata>
void Mix_DMk_2D<Tdata>::set_nks(const int nks)
{
this->mix_DMk.clear();
this->mix_DMk.resize(nks);
}
template <typename Tdata>
void Mix_DMk_2D<Tdata>::set_mixing(Base_Mixing::Mixing* mixing_in)
{
if(this->flag_del_mixing)
delete this->mixing;
this->mixing = mixing_in;
this->flag_del_mixing = false;
}
template <typename Tdata>
void Mix_DMk_2D<Tdata>::set_mixing_plain(const double& mixing_beta)
{
if(this->flag_del_mixing)
delete this->mixing;
this->mixing = new Base_Mixing::Plain_Mixing(mixing_beta);
this->flag_del_mixing = true;
}
template <typename Tdata>
void Mix_DMk_2D<Tdata>::mix(const std::vector<std::vector<Tdata>>& dm, const bool flag_restart)
{
ModuleBase::TITLE("Mix_DMk_2D", "mix");
if (flag_restart)
{ this->restart_all(dm); }
else
{ this->mix_all(dm); }
}
template <typename Tdata>
std::vector<const std::vector<Tdata>*> Mix_DMk_2D<Tdata>::get_DMk_out() const
{
std::vector<const std::vector<Tdata>*> DMk_out(this->mix_DMk.size());
for (int ik = 0; ik < this->mix_DMk.size(); ++ik)
{ DMk_out[ik] = &this->mix_DMk[ik].data_out; }
return DMk_out;
}
template <typename Tdata>
void Mix_DMk_2D<Tdata>::restart_all(const std::vector<std::vector<Tdata>>& data_in)
{
assert(this->mix_DMk.size() == data_in.size());
assert(this->mixing != nullptr);
for (int ik = 0; ik < data_in.size(); ++ik)
{
this->mix_DMk[ik].data_out = data_in[ik];
this->mixing->init_mixing_data(this->mix_DMk[ik].mixing_data, data_in[ik].size(), sizeof(Tdata));
}
}
template <typename Tdata>
void Mix_DMk_2D<Tdata>::mix_all(const std::vector<std::vector<Tdata>>& data_in)
{
assert(this->mix_DMk.size() == data_in.size());
assert(this->mixing != nullptr);
for (int ik = 0; ik < data_in.size(); ++ik)
{
this->mixing->push_data(this->mix_DMk[ik].mixing_data, this->mix_DMk[ik].data_out.data(), data_in[ik].data(), nullptr, false);
this->mixing->mix_data(this->mix_DMk[ik].mixing_data, this->mix_DMk[ik].data_out.data());
}
}
template class Mix_DMk_2D<double>;
template class Mix_DMk_2D<std::complex<double>>;