2 % Copyright (C) 2018 Peter Rakyta, Ph.D
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.
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.
14 % You should have received a copy of the GNU General Public License
15 % along with
this program. If not, see http:
17 %> @addtogroup unit_tests Unit Tests
22 %> EQuUs v5.0 or later
28 filename = mfilename(
'fullpath');
29 [directory, fncname] = fileparts( filename );
31 %%
test of the
class TMDC_Bilayer_Lead_Hamiltonians
34 % Parsing the input file and creating data structures 35 [Opt, param] = parseInput( 'TMDC_Bilayer_Input_SOC.xml
'); 37 % create an instance of class CreateLeadHamiltonians to create Hamiltonians 38 HLead=CreateLeadHamiltonians(Opt, param, 'Hanyadik_Lead
', 1); 39 HLead.CreateHamiltonians(); 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; 46 % nearest neighbour hopping vectors according to Table III in PRB 92 205108 53 % reciprocal lattice vectors 54 b1 = 2*pi/cCoordinates.LatticeConstant * [1; 1/sqrt(3)]; 55 b2 = 2*pi/cCoordinates.LatticeConstant * [0; 2/sqrt(3)]; 57 % special points in the BZ 59 Kpoint_p = (2*b1-b2)/3; 60 Kpoint_m = -(2*b1-b2)/3; 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 ); 68 % calculating the Hamiltonian at a special k point with EQuUs 69 H_EQuUs = HLead.MomentumDependentHamiltonian( kvector'*a1, kvector
'*a2); 72 checkpoint = norm( full(H_EQuUs) - full(H_Fourier) ); 74 warning(['EQuUs:Tests:
', fncname, ':checkpoint failed with error
', num2str( checkpoint)]); 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 ) 87 ret = zeros( orbitals_num ); 89 % obtaining derived hopping parameters t_2__i_i 90 t_2__hoppings = param.scatter.Calc_t_2__i_i(); 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 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));
104 % ******* EQ (5) in <a href="https:
105 % obtaining derived hopping parameters t_2__i_j
106 t_2__hoppings =
param.scatter.Calc_t_2__i_j();
108 % obtaining derived hopping parameters t_3__i_j
109 t_3__hoppings =
param.scatter.Calc_t_3__i_j();
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);
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) );
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) );
133 % ******* EQ (6) in <a href="https:
134 % obtaining derived hopping parameters t_2__i_j
135 t_2__hoppings =
param.scatter.Calc_t_2__i_j();
137 % obtaining derived hopping parameters t_3__i_j
138 t_3__hoppings =
param.scatter.Calc_t_3__i_j();
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);
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) );
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) );
161 % ******* EQ (7) in <a href="https:
162 % obtaining derived hopping parameters t_4__i_j
163 t_4__hoppings =
param.scatter.Calc_t_4__i_j();
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);
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) );
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) );
183 % ******* EQ (8) in <a href="https:
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);
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);
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);
208 % ****** SOC: EQ (12) in <a href="https:
210 % adding spin degree of freedom
211 ret = kron( eye(2), ret);
214 % defining orbital types according to Table II in <a href="https:
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 );
218 site_number = orbital_number*M;
219 SOC_H = zeros( site_number*2, site_number*2 );
221 sigma_x = [0, 1; 1, 0]/2;
222 sigma_y = [0, -1i; 1i, 0]/2;
223 sigma_z = [1, 0; 0, -1]/2;
225 for idx = 1:orbital_number
226 orbital_type_row = orbitals{idx};
227 row_indexes = (idx-1)*M+1:idx*M;
229 for jdx = 1:orbital_number
230 orbital_type_col = orbitals{jdx};
231 col_indexes = (jdx-1)*M+1:jdx*M;
233 % p and d orbitals are not coulped by SOC
234 if ~strcmpi( orbital_type_row(1), orbital_type_col(1) )
239 if strcmpi( orbital_type_row(1), 'p' )
240 % spin-orbit coupling of the p-type orbitals
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
293 elseif strcmpi( orbital_type_row(1), 'd' )
294 % spin-orbit coupling of the d-type orbitals
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) );
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) );
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) );
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) );
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) );
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) );
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) );
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) );
330 SOC_H = SOC_H + SOC_H';
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.
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
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';
353 %upper_layer = lower_layer;
355 % ****** Bilyer EQ (12) in <a href="https:
357 ret = [ upper_layer, zeros(size(lower_layer)); zeros(size(lower_layer)), lower_layer];
360 % defining orbital types according to Table II in <a href="https:
361 orbitals = {
'd0_xz',
'd0_yz',
'p0_z',
'p0_x',
'p0_y',
'de_z2',
'de_xy',
'de_x2y2',
'pe_z',
'pe_x',
'pe_y'};
363 orbital_number = length( orbitals );
364 upper_site_num = length( orbitals );
365 InterLayer_H = zeros( upper_site_num*2 );
367 % relative shift between the upper and lower sheet
372 for idx = 1:orbital_number
373 % orbital type in the upper sheet
374 orbital_type_upper = orbitals{idx};
376 if strcmpi( orbital_type_upper(1),
'd' )
377 % skipping the interlayer between the d orbitals
381 % site indexes of the upper layer
384 for jdx = 1:orbital_number
385 % orbital type in the lower sheet
386 orbital_type_lower = orbitals{jdx};
388 if strcmpi( orbital_type_lower(1),
'd' )
389 % skipping the interlayer between the d orbitals
393 % site indexes of the lower layer
394 lower_indexes = jdx + upper_site_num;
398 % ******************* interlayer hopping amplitudes within the unit cell *********************
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 );
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 );
420 % ******************* interlayer hopping amplitudes between unit cells connected by a1 *********************
422 % From upper sheet to lower sheet
423 HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
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 ); 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 );
438 % From upper sheet to lower sheet
439 HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
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 ); 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 );
458 % ******************* interlayer hopping amplitudes between unit cells connected a2 *********************
460 % From upper sheet to lower sheet
461 HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
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 ); 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 );
476 % From upper sheet to lower sheet
477 HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
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 ); 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 );
495 % ******************* interlayer hopping amplitudes between unit cells connected by a1+a2 *********************
497 % From upper sheet to lower sheet
498 HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
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 ); 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 );
513 % From upper sheet to lower sheet
514 HoppingExtension = [ orbital_type_upper(end), orbital_type_lower(end) ];
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 ); 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 );
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 );
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 );
546 % adding interlayer coupling to the Hmailtonian
547 ret = ret + InterLayer_H_SOC;
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...
Structure param contains data structures describing the physical parameters of the scattering center ...
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...
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...