-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmatrix_term.hh
More file actions
232 lines (208 loc) · 6.71 KB
/
matrix_term.hh
File metadata and controls
232 lines (208 loc) · 6.71 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
// The classes defined here are split between multiple source files,
// due to the large quantity of autogenerated code. The base classes
// are defined in matrix_term.cc, and implementations are defined in
// files using the convention matrix_term_<prefix>.cc.
#ifndef _MATRIX_TERM_HH
#define _MATRIX_TERM_HH
#include <gsl/gsl_matrix.h>
#include "enums.hh"
// Base class for matrix terms. It needs to be able to generate a
// matrix based on the scale granularity parameters.
class matrix_term
{
public:
matrix_term();
virtual ~matrix_term();
// Build a matrix out of implementation-defined blocks.
// Deallocating this matrix is the caller's responsibility. Min and
// max set minimum and maximum scales in multiples of the inverse
// effective Bohr radius. Num basis states will be used scaling
// between these values in a geometric progression.
virtual gsl_matrix_complex *matrix(double min, double max, size_t num);
// Getters and setters for dielectric constant and inverse effective
// Bohr radius
double get_inv_radius();
double set_inv_radius(double r);
double get_dielectric_constant();
double set_dielectric_constant(double k);
protected:
// Callbacks to perform additional actions when parameters are set.
// These are called before setting the new value, but the new value
// is passed as an argument.
virtual void on_set_inv_radius(double r);
virtual void on_set_dielectric_constant(double k);
// Return a matrix block based on scaling arguments and internal state.
virtual gsl_matrix_complex *matrix_block(double a1, double a2) = 0;
// Inverse effective Bohr radius, in units of 1 / Bohr radius. The
// crystal term should calculate this in the constructor, and the
// caller is responsible for copying it to the other terms.
double inv_radius;
// Dielectric constant. This should be passed into the crystal term
// through the constructor, then passed to the impurity term by the
// caller.
double dielectric;
};
// the basic types of matrix terms
class crystal_term : public matrix_term
{
public:
double get_parameter(crystal_parameters_t param);
double set_parameter(crystal_parameters_t param, double val);
private:
// These should update internal state to be consistent with the
// parameter's new value, or signal an invalid parameter by
// returning 1.0/0.0 (i.e., +infinity)
virtual double _get_parameter(crystal_parameters_t param);
virtual double _set_parameter(crystal_parameters_t param, double val);
};
class impurity_term : public matrix_term
{
public:
double get_parameter(impurity_parameters_t param);
double set_parameter(impurity_parameters_t param, double val);
private:
// These should update internal state to be consistent with the
// parameter's new value, or signal an invalid parameter by
// returning 1.0/0.0 (i.e., +infinity)
virtual double _get_parameter(impurity_parameters_t param);
virtual double _set_parameter(impurity_parameters_t param, double val);
};
class overlap_term : public matrix_term {};
// terms using basis functions with radial exponential decay
// zinc-blend crystal term
class exp_zb : public crystal_term
{
public:
exp_zb(double g1, double g2, double g3, double d0, double dielectric);
exp_zb(crystals_t c);
protected:
gsl_matrix_complex *matrix_block(double a1, double a2);
double _get_parameter(crystal_parameters_t param);
double _set_parameter(crystal_parameters_t param, double val);
double g1;
double g2;
double g3;
double d0;
};
// wurtzite crystal term
class exp_wz : public crystal_term
{
public:
exp_wz(double A1, double A2, double A3, double A4, double A5, double A6,
double d1, double d2, double d3, double dielectric);
exp_wz(crystals_t c);
protected:
gsl_matrix_complex *matrix_block(double a1, double a2);
double _get_parameter(crystal_parameters_t param);
double _set_parameter(crystal_parameters_t param, double val);
double A1;
double A2;
double A3;
double A4;
double A5;
double A6;
double d1;
double d2;
double d3;
};
// generalized wurtzite crystal term
class exp_gwz : public crystal_term
{
public:
exp_gwz(double A1, double A2, double A3, double B1, double B2, double B3,
double C1, double C2, double C3, double D1, double D2, double D3,
double d1c, double d2c, double d1so, double d2so, double d3so,
double dielectric);
exp_gwz(crystals_t c);
protected:
gsl_matrix_complex *matrix_block(double a1, double a2);
double _get_parameter(crystal_parameters_t param);
double _set_parameter(crystal_parameters_t param, double val);
double A1;
double A2;
double A3;
double B1;
double B2;
double B3;
double C1;
double C2;
double C3;
double D1;
double D2;
double D3;
double d1c;
double d2c;
double d1so;
double d2so;
double d3so;
};
// coulomb impurity term
class exp_coulomb : public impurity_term
{
public:
exp_coulomb();
protected:
gsl_matrix_complex *matrix_block(double a1, double a2);
};
// wang_chen impurity term
class exp_wang : public impurity_term
{
public:
// V should be entered in meV, other params in Angstroms
exp_wang(double V, double ra, double rb, double r1);
exp_wang(crystals_t crystal, elements_t impurity);
protected:
gsl_matrix_complex *matrix_block(double a1, double a2);
double _get_parameter(impurity_parameters_t param);
double _set_parameter(impurity_parameters_t param, double val);
double V;
double ra;
double rb;
double r1;
};
class exp_LCZ_atom;
// Lam-Cohen-Zunger pseudopotential impurity term
class exp_LCZ : public impurity_term
{
public:
// default dielectric ratio to 1.0 unless passed as argument in
// constructor
exp_LCZ(elements_t host, elements_t impurity);
exp_LCZ(elements_t host, elements_t impurity, double ratio);
gsl_matrix_complex *matrix(double min, double max, size_t num);
protected:
gsl_matrix_complex *matrix_block(double a1, double a2);
void on_set_inv_radius(double r);
void on_set_dielectric_constant(double k);
double _get_parameter(impurity_parameters_t param);
double _set_parameter(impurity_parameters_t param, double val);
~exp_LCZ();
// ratio of dielectric constant between central cell potential and
// coulomb potential
double dielectric_ratio;
exp_LCZ_atom *host;
exp_LCZ_atom *impurity;
exp_coulomb *coulomb;
};
// Lam-Cohen-Zunger pseudopotential atomic impurity term
class exp_LCZ_atom : public impurity_term
{
public:
exp_LCZ_atom(elements_t atom);
protected:
// set atom with d electrons treated as core when in full energy
// level
void set_d_core(elements_t atom);
gsl_matrix_complex *matrix_block(double a1, double a2);
int Zc;
double C1;
double C2;
double C3;
};
// overlap term
class exp_overlap : public overlap_term
{
protected:
gsl_matrix_complex *matrix_block(double a1, double a2);
};
#endif // _MATRIX_TERM_HH