Eötvös Quantum Utilities  v4.9.146
Providing the Horsepowers in the Quantum Realm
test_TMDC_Bilayer_SOC.m
Go to the documentation of this file.
1 %% Eotvos Quantum Transport Utilities
2 % Copyright (C) 2018 Peter Rakyta, Ph.D
3 %
4 % This program is free software: you can redistribute it and/or modify
5 % it under the terms of the GNU General Public License as published by
6 % the Free Software Foundation, either version 3 of the License, or
7 % (at your option) any later version.
8 %
9 % This program is distributed in the hope that it will be useful,
10 % but WITHOUT ANY WARRANTY; without even the implied warranty of
11 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 % GNU General Public License for more details.
13 %
14 % You should have received a copy of the GNU General Public License
15 % along with this program. If not, see http://www.gnu.org/licenses/.
16 %
17 %> @addtogroup unit_tests Unit Tests
18 %> @{
19 %> @file test_TMDC_Bilayer_SOC.m
20 %> @brief Testfile to check the lattice construction of bilayer TMDC by class TMDC_Bilayer_SOC_Lead_Hamiltonians.
21 %> @Available
22 %> EQuUs v5.0 or later
23 %> @}
24 %> @brief Testfile to check the lattice construction of bilayer TMDC by class TMDC_Bilayer_SOC_Lead_Hamiltonians.
26 
27 
28 filename = mfilename('fullpath');
29 [directory, fncname] = fileparts( filename );
30 
31 %% test of the class TMDC_Bilayer_Lead_Hamiltonians
32  disp( '***** test of the class TMDC_Monolayer_Lead_Hamiltonians *****' );
33 
34  % Parsing the input file and creating data structures
35  [Opt, param] = parseInput( 'TMDC_Bilayer_Input_SOC.xml');
36 
37  % create an instance of class CreateLeadHamiltonians to create Hamiltonians
38  HLead=CreateLeadHamiltonians(Opt, param, 'Hanyadik_Lead', 1);
39  HLead.CreateHamiltonians();
40 
41  % getting lattice vectors of the triangle lattice
42  cCoordinates = HLead.Read('coordinates');
43  a1 = cCoordinates.a*cCoordinates.LatticeConstant;
44  a2 = cCoordinates.b*cCoordinates.LatticeConstant;
45 
46  % nearest neighbour hopping vectors according to Table III in PRB 92 205108
47  delta1 = a1;
48  delta2 = a1 + a2;
49  delta3 = a2;
50 
51  delta5 = (a1+2*a2)/3;
52 
53  % reciprocal lattice vectors
54  b1 = 2*pi/cCoordinates.LatticeConstant * [1; 1/sqrt(3)];
55  b2 = 2*pi/cCoordinates.LatticeConstant * [0; 2/sqrt(3)];
56 
57 % special points in the BZ
58  GammaPoint = [0;0];
59  Kpoint_p = (2*b1-b2)/3;
60  Kpoint_m = -(2*b1-b2)/3;
61  Mpoint = b1/2;
62 
63 
64  % calculating the Hamiltonian at a special k point
65  kvector = 0.3*Mpoint + 0.7*Kpoint_p;
66  H_Fourier = CalcHamiltonian_k_Bilayer( kvector );
67 
68  % calculating the Hamiltonian at a special k point with EQuUs
69  H_EQuUs = HLead.MomentumDependentHamiltonian( kvector'*a1, kvector'*a2);
70 
71 
72  checkpoint = norm( full(H_EQuUs) - full(H_Fourier) );
73  if checkpoint > 1e-10
74  warning(['EQuUs:Tests:', fncname, ':checkpoint failed with error ', num2str( checkpoint)]);
75  end
76 
77 
78 
79 
80 %% CalcHamiltonian_k_Monolayer
81 %> @brief Calculates the spectrum on a TMDC monolayer lattice from Fourier-transformed Hamiltonian (PRB 92 205108)
82 %> @param kvector a two-component column vector of the momentum vector in the BZ.
83 %> @return Returns with the calculated energy eigenvalue at a specific point determined by kvector.
84  function ret = CalcHamiltonian_k_Monolayer( kvector )
85  orbitals_num = 11;
86 
87  ret = zeros( orbitals_num );
88 
89  % obtaining derived hopping parameters t_2__i_i
90  t_2__hoppings = param.scatter.Calc_t_2__i_i();
91 
92  % ******* EQ (4) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a> *********
93  for idx = 1:orbitals_num
94 
95  parameter_extension = ['__', num2str(idx), '_', num2str(idx)];
96  epsilon = param.scatter.(['epsilon', num2str(idx)]);
97  t_1 = param.scatter.(['t_1', parameter_extension]);
98  t_2 = t_2__hoppings.(['t_2', parameter_extension]);
99  ret( idx, idx) = ret( idx, idx) + epsilon + 2*t_1*cos(kvector'*delta1) + 2*t_2*(cos(kvector'*delta2) + cos(kvector'*delta3));
100 
101  end
102 
103 
104  % ******* EQ (5) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a> *********
105  % obtaining derived hopping parameters t_2__i_j
106  t_2__hoppings = param.scatter.Calc_t_2__i_j();
107 
108  % obtaining derived hopping parameters t_3__i_j
109  t_3__hoppings = param.scatter.Calc_t_3__i_j();
110 
111  % M_2 symmetry (+)
112  orbital_indexes1 = [3, 6, 9];
113  orbital_indexes2 = [5, 8, 11];
114  for idx = 1:length( orbital_indexes1 )
115  orbital_index1 = orbital_indexes1(idx);
116  orbital_index2 = orbital_indexes2(idx);
117 
118  t_1 = param.scatter.(['t_1__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
119  t_2 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
120  t_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
121  ret(orbital_index1, orbital_index2) = ret(orbital_index1, orbital_index2) + 2*t_1*cos(kvector'*delta1) + ...
122  t_2*( exp(-1i*kvector'*delta2) + exp(-1i*kvector'*delta3) ) +...
123  t_3*( exp(1i*kvector'*delta2) + exp(1i*kvector'*delta3) );
124 
125  ret(orbital_index2, orbital_index1) = ret(orbital_index2, orbital_index1) + 2*t_1*cos(kvector'*delta1) + ...
126  t_2*( exp(1i*kvector'*delta2) + exp(1i*kvector'*delta3) ) +...
127  t_3*( exp(-1i*kvector'*delta2) + exp(-1i*kvector'*delta3) );
128 
129  end
130 
131 
132 
133  % ******* EQ (6) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a> *********
134  % obtaining derived hopping parameters t_2__i_j
135  t_2__hoppings = param.scatter.Calc_t_2__i_j();
136 
137  % obtaining derived hopping parameters t_3__i_j
138  t_3__hoppings = param.scatter.Calc_t_3__i_j();
139 
140  % M_2 symmetry (-)
141  orbital_indexes1 = [1, 3, 4, 6, 7, 9, 10];
142  orbital_indexes2 = [2, 4, 5, 7, 8, 10, 11];
143  for idx = 1:length( orbital_indexes1 )
144  orbital_index1 = orbital_indexes1(idx);
145  orbital_index2 = orbital_indexes2(idx);
146 
147  t_1 = param.scatter.(['t_1__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
148  t_2 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
149  t_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
150  ret(orbital_index1, orbital_index2) = ret(orbital_index1, orbital_index2) - 2*1i*t_1*sin(kvector'*delta1) + ...
151  t_2*( exp(-1i*kvector'*delta2) - exp(-1i*kvector'*delta3) ) +...
152  t_3*( -exp(1i*kvector'*delta2) + exp(1i*kvector'*delta3) );
153 
154  ret(orbital_index2, orbital_index1) = ret(orbital_index2, orbital_index1) + 2*1i*t_1*sin(kvector'*delta1) + ...
155  t_2*( exp(1i*kvector'*delta2) - exp(1i*kvector'*delta3) ) +...
156  t_3*( -exp(-1i*kvector'*delta2) + exp(-1i*kvector'*delta3) );
157 
158  end
159 
160 
161  % ******* EQ (7) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a> *********
162  % obtaining derived hopping parameters t_4__i_j
163  t_4__hoppings = param.scatter.Calc_t_4__i_j();
164 
165 
166  % M_2 symmetry (+)
167  orbital_indexes1 = [3, 5, 4, 10, 9, 11, 10];
168  orbital_indexes2 = [1, 1, 2, 6, 7, 7, 8];
169  for idx = 1:length( orbital_indexes1 )
170  orbital_index1 = orbital_indexes1(idx);
171  orbital_index2 = orbital_indexes2(idx);
172 
173  t_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
174 % ret(orbital_index1, orbital_index2) = ret(orbital_index1, orbital_index2) + t_4*( exp(1i*kvector'*delta4) - exp(1i*kvector'*delta6) );
175 % ret(orbital_index2, orbital_index1) = ret(orbital_index2, orbital_index1) + t_4*( exp(-1i*kvector'*delta4) - exp(-1i*kvector'*delta6) );
176 
177  ret(orbital_index1, orbital_index2) = ret(orbital_index1, orbital_index2) + t_4*( 1 - exp(1i*kvector'*delta1) );
178  ret(orbital_index2, orbital_index1) = ret(orbital_index2, orbital_index1) + t_4*( 1 - exp(-1i*kvector'*delta1) );
179 
180  end
181 
182 
183  % ******* EQ (8) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a> *********
184 
185  % M_2 symmetry (-)
186  orbital_indexes1 = [4, 3, 5, 9, 11, 10, 9, 11];
187  orbital_indexes2 = [1, 2, 2, 6, 6, 7, 8, 8];
188  for idx = 1:length( orbital_indexes1 )
189  orbital_index1 = orbital_indexes1(idx);
190  orbital_index2 = orbital_indexes2(idx);
191 
192  t_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
193  t_5 = param.scatter.(['t_5__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
194 % ret(orbital_index1, orbital_index2) = ret(orbital_index1, orbital_index2) + t_4*( exp(1i*kvector'*delta4) + exp(1i*kvector'*delta6) ) + ...
195 % t_5*exp(1i*kvector'*delta5);
196 % ret(orbital_index2, orbital_index1) = ret(orbital_index2, orbital_index1) + t_4*( exp(-1i*kvector'*delta4) + exp(-1i*kvector'*delta6) ) + ...
197 % t_5*exp(-1i*kvector'*delta5);
198 
199  ret(orbital_index1, orbital_index2) = ret(orbital_index1, orbital_index2) + t_4*( 1 + exp(1i*kvector'*delta1) ) + ...
200  t_5*exp(1i*kvector'*delta2);
201  ret(orbital_index2, orbital_index1) = ret(orbital_index2, orbital_index1) + t_4*( 1 + exp(-1i*kvector'*delta1) ) + ...
202  t_5*exp(-1i*kvector'*delta2);
203 
204  end
205 
206 
207 
208  % ****** SOC: EQ (12) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a> *********
209 
210  % adding spin degree of freedom
211  ret = kron( eye(2), ret);
212 
213 
214  % defining orbital types according to Table II in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
215  orbitals = {'d0_xz', 'd0_yz', 'p0_z', 'p0_x', 'p0_y', 'de_z2', 'de_xy', 'de_x2y2', 'pe_z', 'pe_x', 'pe_y'};
216  orbital_number = length( orbitals );
217  M = 1;
218  site_number = orbital_number*M;
219  SOC_H = zeros( site_number*2, site_number*2 );
220 
221  sigma_x = [0, 1; 1, 0]/2;
222  sigma_y = [0, -1i; 1i, 0]/2;
223  sigma_z = [1, 0; 0, -1]/2;
224 
225  for idx = 1:orbital_number
226  orbital_type_row = orbitals{idx};
227  row_indexes = (idx-1)*M+1:idx*M;
228 
229  for jdx = 1:orbital_number
230  orbital_type_col = orbitals{jdx};
231  col_indexes = (jdx-1)*M+1:jdx*M;
232 
233  % p and d orbitals are not coulped by SOC
234  if ~strcmpi( orbital_type_row(1), orbital_type_col(1) )
235  continue
236  end
237 
238 
239  if strcmpi( orbital_type_row(1), 'p' )
240  % spin-orbit coupling of the p-type orbitals
241 
242  if strcmpi( orbital_type_row, 'p0_z' ) && strcmpi( orbital_type_col, 'p0_x' )
243  SOC_H = SOC_H + kron( sigma_y, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 - ...
244  kron( sigma_y, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
245 
246  elseif strcmpi( orbital_type_row, 'p0_z' ) && strcmpi( orbital_type_col, 'p0_y' )
247  SOC_H = SOC_H + kron( sigma_x, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 - ...
248  kron( sigma_x, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
249 
250  elseif strcmpi( orbital_type_row, 'p0_z' ) && strcmpi( orbital_type_col, 'pe_x' )
251  SOC_H = SOC_H + kron( sigma_y, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 + ...
252  kron( sigma_y, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
253 
254  elseif strcmpi( orbital_type_row, 'p0_z' ) && strcmpi( orbital_type_col, 'pe_y' )
255  SOC_H = SOC_H + kron( sigma_x, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 + ...
256  kron( sigma_x, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
257 
258  elseif strcmpi( orbital_type_row, 'p0_x' ) && strcmpi( orbital_type_col, 'p0_y' )
259  SOC_H = SOC_H + kron( sigma_z, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 + ...
260  kron( sigma_z, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
261 
262  elseif strcmpi( orbital_type_row, 'p0_x' ) && strcmpi( orbital_type_col, 'pe_z' )
263  SOC_H = SOC_H + kron( sigma_y, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 + ...
264  kron( sigma_y, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
265 
266  elseif strcmpi( orbital_type_row, 'p0_x' ) && strcmpi( orbital_type_col, 'pe_y' )
267  SOC_H = SOC_H + kron( sigma_z, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 - ...
268  kron( sigma_z, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
269 
270  elseif strcmpi( orbital_type_row, 'p0_y' ) && strcmpi( orbital_type_col, 'pe_z' )
271  SOC_H = SOC_H + kron( sigma_x, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 + ...
272  kron( sigma_x, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
273 
274  elseif strcmpi( orbital_type_row, 'p0_y' ) && strcmpi( orbital_type_col, 'pe_x' )
275  SOC_H = SOC_H + kron( sigma_z, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 - ...
276  kron( sigma_z, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
277 
278  elseif strcmpi( orbital_type_row, 'pe_z' ) && strcmpi( orbital_type_col, 'pe_x' )
279  SOC_H = SOC_H + kron( sigma_y, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 - ...
280  kron( sigma_y, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
281 
282  elseif strcmpi( orbital_type_row, 'pe_z' ) && strcmpi( orbital_type_col, 'pe_y' )
283  SOC_H = SOC_H + kron( sigma_x, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 - ...
284  kron( sigma_x, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
285 
286  elseif strcmpi( orbital_type_row, 'pe_x' ) && strcmpi( orbital_type_col, 'pe_y' )
287  SOC_H = SOC_H + kron( sigma_z, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2 + ...
288  kron( sigma_z, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_X, site_number, site_number) )/2;
289 
290  end
291 
292 
293  elseif strcmpi( orbital_type_row(1), 'd' )
294  % spin-orbit coupling of the d-type orbitals
295 
296  if strcmpi( orbital_type_row, 'de_xy' ) && strcmpi( orbital_type_col, 'de_x2y2' )
297  SOC_H = SOC_H + kron( sigma_z, sparse( row_indexes, col_indexes, 2*1i*param.scatter.lambda_SO_M, site_number, site_number) );
298 
299  elseif strcmpi( orbital_type_row, 'de_xy' ) && strcmpi( orbital_type_col, 'd0_xz' )
300  SOC_H = SOC_H + kron( sigma_x, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_M, site_number, site_number) );
301 
302  elseif strcmpi( orbital_type_row, 'de_xy' ) && strcmpi( orbital_type_col, 'd0_yz' )
303  SOC_H = SOC_H + kron( sigma_y, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_M, site_number, site_number) );
304 
305  elseif strcmpi( orbital_type_row, 'de_x2y2' ) && strcmpi( orbital_type_col, 'd0_xz' )
306  SOC_H = SOC_H + kron( sigma_y, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_M, site_number, site_number) );
307 
308  elseif strcmpi( orbital_type_row, 'de_x2y2' ) && strcmpi( orbital_type_col, 'd0_yz' )
309  SOC_H = SOC_H + kron( sigma_x, sparse( row_indexes, col_indexes, 1i*param.scatter.lambda_SO_M, site_number, site_number) );
310 
311  elseif strcmpi( orbital_type_row, 'd0_xz' ) && strcmpi( orbital_type_col, 'd0_yz' )
312  SOC_H = SOC_H + kron( sigma_z, sparse( row_indexes, col_indexes, -1i*param.scatter.lambda_SO_M, site_number, site_number) );
313 
314  elseif strcmpi( orbital_type_row, 'd0_xz' ) && strcmpi( orbital_type_col, 'de_z2' )
315  SOC_H = SOC_H + kron( sigma_y, sparse( row_indexes, col_indexes, 1i*sqrt(3)*param.scatter.lambda_SO_M, site_number, site_number) );
316 
317  elseif strcmpi( orbital_type_row, 'd0_yz' ) && strcmpi( orbital_type_col, 'de_z2' )
318  SOC_H = SOC_H + kron( sigma_x, sparse( row_indexes, col_indexes, -1i*sqrt(3)*param.scatter.lambda_SO_M, site_number, site_number) );
319 
320  end
321 
322  end
323 
324  end
325 
326 
327 
328  end
329 
330  SOC_H = SOC_H + SOC_H';
331 
332  ret = ret + SOC_H;
333 
334 
335  end
336 
337 
339 %> @brief Calculates the spectrum on a TMDC bilayer lattice from Fourier-transformed Hamiltonian (PRB 92 205108)
340 %> @param kvector a two-component column vector of the momentum vector in the BZ.
341 %> @return Returns with the calculated energy eigenvalue at a specific point determined by kvector.
342  function ret = CalcHamiltonian_k_Bilayer( kvector )
343 
344  % upper layer
345  % The Hamiltonian of the upper layer is tranformed by a mirror symmetry M3 in the xz plane (in this case mirroring the wave vector is equivalent to mirroring the lattice by y -> -y)
346  % see the last paragraph of the left column on page 3 of PRB 92 205108
347  upper_layer = CalcHamiltonian_k_Monolayer( [1,0;0,-1]*kvector );
348  Umtx = diag( [1 -1 1 -1 1 1 -1 1 -1 1 -1] );
349  Umtx_SOC = kron( [0, -1i; 1i, 0], Umtx ); % spin operator should also be mirrored. The mirror operator to the xz plane is sigma_y
350  upper_layer = Umtx_SOC*upper_layer*Umtx_SOC';
351  % lower layer
352  lower_layer = CalcHamiltonian_k_Monolayer( kvector );
353  %upper_layer = lower_layer;
354 
355  % ****** Bilyer EQ (12) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a> *********
356 
357  ret = [ upper_layer, zeros(size(lower_layer)); zeros(size(lower_layer)), lower_layer];
358 
359 
360  % defining orbital types according to Table II in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
361  orbitals = {'d0_xz', 'd0_yz', 'p0_z', 'p0_x', 'p0_y', 'de_z2', 'de_xy', 'de_x2y2', 'pe_z', 'pe_x', 'pe_y'};
362 
363  orbital_number = length( orbitals );
364  upper_site_num = length( orbitals );
365  InterLayer_H = zeros( upper_site_num*2 );
366 
367  % relative shift between the upper and lower sheet
368  stacking_vector = [delta5; (param.scatter.c-param.scatter.d_XX)]/param.scatter.a;
369 
370 
371 
372  for idx = 1:orbital_number
373  % orbital type in the upper sheet
374  orbital_type_upper = orbitals{idx};
375 
376  if strcmpi( orbital_type_upper(1), 'd' )
377  % skipping the interlayer between the d orbitals
378  continue
379  end
380 
381  % site indexes of the upper layer
382  upper_indexes = idx;
383 
384  for jdx = 1:orbital_number
385  % orbital type in the lower sheet
386  orbital_type_lower = orbitals{jdx};
387 
388  if strcmpi( orbital_type_lower(1), 'd' )
389  % skipping the interlayer between the d orbitals
390  continue
391  end
392 
393  % site indexes of the lower layer
394  lower_indexes = jdx + upper_site_num;
395 
396 
397 
398  % ******************* interlayer hopping amplitudes within the unit cell *********************
399 
400  % From lower sheet to upper sheet
401  HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
402  r_vec = stacking_vector;
403  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
404  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
405  InterLayer_H = InterLayer_H + sparse( upper_indexes, lower_indexes, InterlayerHoppings.(HoppingExtension)/2, upper_site_num*2, upper_site_num*2 );
406  end
407 
408 
409  % From upper sheet to lower sheet
410  HoppingExtension = [ orbital_type_lower(end), orbital_type_upper(end) ];
411  r_vec = -stacking_vector;
412  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
413  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
414  InterLayer_H = InterLayer_H + sparse( lower_indexes, upper_indexes, InterlayerHoppings.(HoppingExtension)/2, upper_site_num*2, upper_site_num*2 );
415  end
416 
417 
418 
419 
420  % ******************* interlayer hopping amplitudes between unit cells connected by a1 *********************
421 
422  % From upper sheet to lower sheet
423  HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
424  r_vec = stacking_vector + [a1; 0]/param.scatter.a;
425  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
426  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
427  InterLayer_H = InterLayer_H + sparse( lower_indexes, upper_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(1i*kvector'*a1), upper_site_num*2, upper_site_num*2 );
428  end
429 
430  % From lower sheet to upper sheet
431  HoppingExtension = [ orbital_type_lower(end), orbital_type_upper(end) ];
432  r_vec = -stacking_vector + [a1; 0]/param.scatter.a;
433  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
434  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
435  InterLayer_H = InterLayer_H + sparse( upper_indexes, lower_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(1i*kvector'*a1), upper_site_num*2, upper_site_num*2 );
436  end
437 
438  % From upper sheet to lower sheet
439  HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
440  r_vec = stacking_vector - [a1; 0]/param.scatter.a;
441  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
442  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
443  InterLayer_H = InterLayer_H + sparse( lower_indexes, upper_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(-1i*kvector'*a1), upper_site_num*2, upper_site_num*2 );
444  end
445 
446  % From lower sheet to upper sheet
447  HoppingExtension = [ orbital_type_lower(end), orbital_type_upper(end) ];
448  r_vec = -stacking_vector - [a1; 0]/param.scatter.a;
449  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
450  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
451  InterLayer_H = InterLayer_H + sparse( upper_indexes, lower_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(-1i*kvector'*a1), upper_site_num*2, upper_site_num*2 );
452  end
453 
454 
455 
456 
457 
458  % ******************* interlayer hopping amplitudes between unit cells connected a2 *********************
459 
460  % From upper sheet to lower sheet
461  HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
462  r_vec = stacking_vector + [a2; 0]/param.scatter.a;
463  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
464  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
465  InterLayer_H = InterLayer_H + sparse( lower_indexes, upper_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(1i*kvector'*a2), upper_site_num*2, upper_site_num*2 );
466  end
467 
468  % From lower sheet to upper sheet
469  HoppingExtension = [ orbital_type_lower(end), orbital_type_upper(end) ];
470  r_vec = -stacking_vector + [a2; 0]/param.scatter.a;
471  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
472  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
473  InterLayer_H = InterLayer_H + sparse( upper_indexes, lower_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(1i*kvector'*a2), upper_site_num*2, upper_site_num*2 );
474  end
475 
476  % From upper sheet to lower sheet
477  HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
478  r_vec = stacking_vector - [a2; 0]/param.scatter.a;
479  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
480  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
481  InterLayer_H = InterLayer_H + sparse( lower_indexes, upper_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(-1i*kvector'*a2), upper_site_num*2, upper_site_num*2 );
482  end
483 
484  % From lower sheet to upper sheet
485  HoppingExtension = [ orbital_type_lower(end), orbital_type_upper(end) ];
486  r_vec = -stacking_vector - [a2; 0]/param.scatter.a;
487  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
488  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
489  InterLayer_H = InterLayer_H + sparse( upper_indexes, lower_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(-1i*kvector'*a2), upper_site_num*2, upper_site_num*2 );
490  end
491 
492 
493 
494 
495  % ******************* interlayer hopping amplitudes between unit cells connected by a1+a2 *********************
496 
497  % From upper sheet to lower sheet
498  HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
499  r_vec = stacking_vector + [a1+a2; 0]/param.scatter.a;
500  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
501  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
502  InterLayer_H = InterLayer_H + sparse( lower_indexes, upper_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(1i*kvector'*(a1+a2)), upper_site_num*2, upper_site_num*2 );
503  end
504 
505  % From lower sheet to upper sheet
506  HoppingExtension = [ orbital_type_lower(end), orbital_type_upper(end) ];
507  r_vec = -stacking_vector + [a1+a2; 0]/param.scatter.a;
508  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
509  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
510  InterLayer_H = InterLayer_H + sparse( upper_indexes, lower_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(1i*kvector'*(a1+a2)), upper_site_num*2, upper_site_num*2 );
511  end
512 
513  % From upper sheet to lower sheet
514  HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
515  r_vec = stacking_vector - [a1+a2; 0]/param.scatter.a;
516  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
517  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
518  InterLayer_H = InterLayer_H + sparse( lower_indexes, upper_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(-1i*kvector'*(a1+a2)), upper_site_num*2, upper_site_num*2 );
519  end
520 
521  % From lower sheet to upper sheet
522  HoppingExtension = [ orbital_type_lower(end), orbital_type_upper(end) ];
523  r_vec = -stacking_vector - [a1+a2; 0]/param.scatter.a;
524  if norm( r_vec*cCoordinates.LatticeConstant ) < 5
525  InterlayerHoppings = param.scatter.Calc_Hopping( r_vec*cCoordinates.LatticeConstant );
526  InterLayer_H = InterLayer_H + sparse( upper_indexes, lower_indexes, InterlayerHoppings.(HoppingExtension)/2*exp(-1i*kvector'*(a1+a2)), upper_site_num*2, upper_site_num*2 );
527  end
528 
529 
530 
531  end
532 
533 
534 
535  end
536 
537  % includng spin degree of freedoms
538  InterLayer_H_SOC = sparse( [], [], [], upper_site_num*4, upper_site_num*4 );
539  InterLayer_H_SOC( 1:upper_site_num, upper_site_num*2+1:upper_site_num*3 ) = InterLayer_H( 1:upper_site_num, upper_site_num+1:upper_site_num*2 );
540  InterLayer_H_SOC( upper_site_num+1:upper_site_num*2, upper_site_num*3+1:upper_site_num*4 ) = InterLayer_H( 1:upper_site_num, upper_site_num+1:upper_site_num*2 );
541 
542  InterLayer_H_SOC( upper_site_num*2+1:upper_site_num*3, 1:upper_site_num ) = InterLayer_H( upper_site_num+1:upper_site_num*2, 1:upper_site_num );
543  InterLayer_H_SOC( upper_site_num*3+1:upper_site_num*4, upper_site_num+1:upper_site_num*2 ) = InterLayer_H( upper_site_num+1:upper_site_num*2, 1:upper_site_num );
544 
545 
546  % adding interlayer coupling to the Hmailtonian
547  ret = ret + InterLayer_H_SOC;
548 
549  end
550 
551 
552 end
function test(arg1, arg2)
Brief description of the function.
Property version
The current version of the package.
function Transport(Energy, B)
Calculates the conductance at a given energy value.
function CalcHamiltonian_k_Monolayer(kvector)
Calculates the spectrum on a TMDC monolayer lattice from Fourier-transformed Hamiltonian (PRB 92 2051...
function CalcHamiltonian_k_Bilayer(kvector)
Calculates the spectrum on a TMDC bilayer lattice from Fourier-transformed Hamiltonian (PRB 92 205108...
function()
Structure param contains data structures describing the physical parameters of the scattering center ...
Definition: structures.m:45
Class to create the Hamiltonian of one unit cell in a translational invariant lead made of TMDC_Monol...
scatter_param scatter
An instance of the structure scatter_param containing the physical parameters for the scattering regi...
Definition: structures.m:47
function test_TMDC_Bilayer_SOC()
Testfile to check the lattice construction of bilayer TMDC by class TMDC_Bilayer_SOC_Lead_Hamiltonian...
Class to create the Hamiltonian of one unit cell in a translational invariant lead made of TMDC bilay...