2 % Copyright (C) 2009-2015 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 lattices Lattices
20 %> @brief A
class to create the Hamiltonian of one unit cell in a translational invariant lead made of hexagonal lattice structure, including graphene and silicene.
22 %> @brief A
class to create the Hamiltonian of one unit cell in a translational invariant lead made of hexagonal lattice structure, including graphene and silicene.
27 methods ( Access =
public )
31 %% Graphene_Bilayer_Lead_Hamiltonians
32 %> @brief Creates
Hamiltonians H_0 and H_1 of bilayer graphene ribbon with zigzag/armchair edge as well as the structure conatining the coordinates of the atomic
sites.
33 %> @image html bilayer_type1.jpg
34 %> @image latex bilayer_type1.jpg
36 %> @
param M Number of
sites in the cross section of the lead.
37 %> @
param End_Type The orientation of the lattice. Set
'A' for lattice with armchair orientation (meaning zigzag edges) or
'Z' for zizgaz orientation (meaning arm-chair edges)
38 %> @
return [1] The Hamiltonian of one slab in the ribbon.
39 %> @
return [2] The coupling between the slabs.
40 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
41 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
42 function [H0, H1, H1_transverse, coordinates] = Graphene_Bilayer_Lead_Hamiltonians(obj, lead_param, M, End_Type )
44 % check the structure containing the physical parameters
45 supClasses = superclasses(lead_param);
46 if sum( strcmp( supClasses,
'Lattice_Graphene_Bilayer' ) ) == 0
47 error([
'EQuUs:Lattices:',
class(obj),
':Graphene_Bilayer_Lead_Hamiltonians'],
'Invalid type of the input parameter');
51 error([
'EQuUs:',
class(obj),
':Graphene_Bilayer_Lead_Hamiltonians'],
'The input parameter M is empty')
54 [H0_lower,H1_lower,H1_transverse_lower,coordinates_lower] = obj.Graphene_Lead_Hamiltonians(lead_param, M, End_Type);
56 coordinates_lower.z = zeros(size(coordinates_lower.x));
60 H1_transverse_upper = H1_transverse_lower;
62 if isempty( lead_param.vargamma1 )
63 lead_param.vargamma1 = 0.381;
66 if isempty( lead_param.vargamma3 )
67 lead_param.vargamma3 = 0;
70 % zigzag edged bilayer ribbon: warping checked
71 if strcmp(End_Type, 'A')
72 Bernal_stack = [0, 1;-1,0]*coordinates_lower.a/norm(coordinates_lower.a);
74 H0_gamma1 = sparse(2:2:M, 1:2:M-1, -lead_param.vargamma1, size(H0_lower,1), size(H0_upper,2)) + sparse( M+3:2:size(H0_lower,1), M+2:2:size(H0_upper,2)-1, -lead_param.vargamma1, size(H0_lower,1), size(H0_upper,2));
75 H0_gamma3 = sparse(1:2:M-1, M+1:2:size(H0_upper,2)-1, -lead_param.vargamma3, size(H0_lower,1), size(H0_upper,2)) + ...
76 sparse(M+2:2:size(H0_lower,1), M+1:2:size(H0_upper,2)-1, -lead_param.vargamma3, size(H0_lower,1), size(H0_upper,2)) + ...
77 sparse(M+2:2:size(H0_lower,1), 2:2:M, -lead_param.vargamma3, size(H0_lower,1), size(H0_upper,2)) + ...
78 sparse(3:2:M-1, 2:2:M-1, -lead_param.vargamma3, size(H0_lower,1), size(H0_upper,2));
79 H0 = [H0_lower, H0_gamma1 + H0_gamma3;...
80 (H0_gamma1+H0_gamma3)' , H0_upper];
82 H1_gamma3_lower_upper = sparse(M+2:2:size(H1_lower,1), 2:2:M, -lead_param.vargamma3, size(H1_lower,1), size(H1_upper,2));
83 H1_gamma3_upper_lower = sparse(M+1:2:size(H1_upper,1)-1, 1:2:M-1, -lead_param.vargamma3, size(H1_upper,1), size(H1_lower,2));
84 H1 = [H1_lower, H1_gamma3_lower_upper; ...
85 H1_gamma3_upper_lower, H1_upper];
88 if ~isempty(H1_transverse_lower)
89 %> tranverse coupling: warping checked
90 H1_transverse_lower_upper = sparse(M+1, 2*M, -lead_param.vargamma1, size(H1_transverse_lower,1), size(H1_transverse_upper,2));
91 H1_transverse_upper_lower = sparse(2*M, M+1, -lead_param.vargamma1, size(H1_transverse_upper,1), size(H1_transverse_lower,2));
92 H1_transverse_gamma3_lower_upper = sparse(1, M, -lead_param.vargamma3, size(H1_transverse_lower,1), size(H1_transverse_upper,2));
93 H1_transverse_gamma3_upper_lower = sparse([], [], [], size(H1_transverse_upper,1), size(H1_transverse_lower,2));
94 H1_transverse = [ H1_transverse_lower, H1_transverse_lower_upper + H1_transverse_gamma3_lower_upper;
95 H1_transverse_upper_lower + H1_transverse_gamma3_upper_lower, H1_transverse_upper];
101 % armchair edged bilayer ribbon: warping checked, but not for H1_transverse
102 elseif strcmp(End_Type, 'Z')
104 Bernal_stack = [-0.5; sqrt(3)/2];
106 H0_gamma1 = sparse(1:M, M+1:2*M, -lead_param.vargamma1, size(H0_lower,1), size(H0_upper,2)) + sparse( 2*M+2:3*M, 3*M+1:4*M-1, -lead_param.vargamma1, size(H0_lower,1), size(H0_upper,2));
107 H0_gamma3 = sparse(M+2:2*M, 1:M-1, -lead_param.vargamma3, size(H0_lower,1), size(H0_upper,2)) + ...
108 sparse(M+1:2*M, 2*M+1:3*M, -lead_param.vargamma3, size(H0_lower,1), size(H0_upper,2)) + sparse(M+2:2*M, 2*M+1:3*M-1, -lead_param.vargamma3, size(H0_lower,1), size(H0_upper,2)) + ...
109 sparse(3*M+1:4*M, 2*M+1:3*M, -lead_param.vargamma3, size(H0_lower,1), size(H0_upper,2));
110 H0 = [H0_lower, H0_gamma1 + H0_gamma3;...
111 (H0_gamma1+H0_gamma3)' , H0_upper];
113 H1_gamma3_lower_upper = sparse(3*M+1:4*M, 1:M, -lead_param.vargamma3, size(H1_lower,1), size(H1_upper,2)) + sparse(3*M+2:4*M, 1:M-1, -lead_param.vargamma3, size(H1_lower,1), size(H1_upper,2));
114 H1_gamma3_upper_lower = sparse([], [], -lead_param.vargamma3, size(H1_upper,1), size(H1_lower,2));
115 H1 = [H1_lower, H1_gamma3_lower_upper; ...
116 H1_gamma3_upper_lower, H1_upper];
120 if ~isempty(H1_transverse_lower)
121 % warping needs to be included
122 H1_transverse_lower_upper = sparse(2*M+1, 4*M, -lead_param.vargamma1, size(H1_transverse_lower,1), size(H1_transverse_upper,2));
123 H1_transverse_upper_lower = sparse(4*M, 2*M+1, -lead_param.vargamma1, size(H1_transverse_upper,1), size(H1_transverse_lower,2));
124 H1_transverse = [ H1_transverse_lower, H1_transverse_lower_upper;
125 H1_transverse_upper_lower, H1_transverse_upper];
132 save('Hex_Lead_Hamiltonians_Graphene_Bilayer_Lead_Hamiltonians.mat');
133 error('Undefined lead end type')
137 coordinates_upper =
structures( 'coordinates' );
138 fields = fieldnames( coordinates_lower );
139 for idx = 1:length( fields )
140 fieldname = fields{idx};
141 if strcmp( fieldname,
'x' )
142 coordinates_upper.x = coordinates_lower.x + Bernal_stack(1);
143 elseif strcmp( fieldname, 'y' )
144 coordinates_upper.y = coordinates_lower.y + Bernal_stack(2);
145 elseif strcmp( fieldname, 'z' )
146 coordinates_upper.z = coordinates_lower.z + 3.3/1.42; %The distance between the layers in units of rCC is 3.3 \AA ?
148 coordinates_upper.(fieldname) = coordinates_lower.(fieldname);
154 for idx = 1:length( fields )
155 fieldname = fields{idx};
156 if strcmp( fieldname,
'a' )
157 coordinates.a = coordinates_lower.(fieldname);
158 elseif strcmp( fieldname, 'b' )
159 coordinates.b = coordinates_lower.(fieldname);
160 elseif strcmp( fieldname, 'LatticeConstant' )
161 coordinates.LatticeConstant = coordinates_lower.LatticeConstant;
163 coordinates.(fieldname) = [coordinates_lower.(fieldname); coordinates_upper.(fieldname)];
171 %% Graphene_Bilayer_Lead_Hamiltonians2
172 %> @brief Creates
Hamiltonians H_0 and H_1 of bilayer graphene ribbon type 2 with zigzag/armchair edge as well as the structure conatining the coordinates of the atomic
sites.
173 %> @image html bilayer_type2.jpg
174 %> @image latex bilayer_type2.jpg
175 %> @
param lead_param An instance of structure
#Lattice_Bilayer_Graphene (or its subclass) containing the physical parameters. 176 %> @
param M Number of
sites in the cross section of the lead.
177 %> @
param End_Type The orientation of the lattice. Set
'A' for lattice with armchair orientation (meaning zigzag edges) or
'Z' for zizgaz orientation (meaning arm-chair edges)
178 %> @
return [1] The Hamiltonian of one slab in the ribbon.
179 %> @
return [2] The coupling between the slabs.
180 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
181 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
182 function [H0, H1, H1_transverse, coordinates] = Graphene_Bilayer_Lead_Hamiltonians2(obj, lead_param, M, End_Type, varargin )
184 % check the structure containing the physical parameters
185 supClasses = superclasses(lead_param);
186 if sum( strcmp( supClasses,
'Lattice_Graphene_Bilayer' ) ) == 0
187 error([
'EQuUs:Lattices:',
class(obj),
':Graphene_Bilayer_Lead_Hamiltonians2'],
'Invalid type of the input parameter');
191 error([
'EQuUs:',
class(obj),
':Graphene_Bilayer_Lead_Hamiltonians2'],
'The input parameter M is empty')
195 % zigzag edged bilayer ribbon
196 if strcmp(End_Type, 'A')
200 [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Lead_Hamiltonians(lead_param, Mtmp, End_Type, varargin{:});
202 sites_to_be_removed = [1, 2, Mtmp+1, Mtmp+2, Mtmp-1, Mtmp, 2*Mtmp, ... lower sheet
203 [1, 2, Mtmp+1, Mtmp-1, Mtmp, 2*Mtmp-1, 2*Mtmp] + 2*Mtmp]; %upper sheet
205 logical_indexes =
true(size(H0, 1),1);
206 logical_indexes(sites_to_be_removed) =
false;
208 H0 = H0(logical_indexes, logical_indexes);
209 H1 = H1(logical_indexes, logical_indexes);
211 if ~isempty(H1_transverse)
212 H1_transverse = H1_transverse(logical_indexes, logical_indexes);
216 fields = fieldnames( coordinates );
217 for idx = 1:length( fields )
218 fieldname = fields{idx};
219 if strcmpi( fieldname,
'a') || strcmpi( fieldname,
'b') || isempty(coordinates.(fieldname)) || strcmpi( fieldname,
'LatticeConstant')
223 coordinates.(fieldname) = coordinates.(fieldname)(logical_indexes);
228 % armchair edged bilayer ribbon
229 elseif strcmp(End_Type, 'Z')
230 [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Lead_Hamiltonians(lead_param, M, End_Type, varargin{:});
238 %% Graphene_Bilayer_Lead_Hamiltonians3
239 %> @brief Creates
Hamiltonians H_0 and H_1 of bilayer graphene ribbon with zigzag/armchair edge as well as the structure conatining the coordinates of the atomic
sites.
241 %> @
param M Number of
sites in the cross section of the lead.
242 %> @
param End_Type The orientation of the lattice. Set
'A' for lattice with armchair orientation (meaning zigzag edges) or
'Z' for zizgaz orientation (meaning arm-chair edges)
243 %> @
param varargin Optional parameters (https:
244 %> @
param 'q' The transverse momentum. Set to empty (
default)
for computations without transverse momentums.
245 %> @
return [1] The Hamiltonian of one slab in the ribbon.
246 %> @
return [2] The coupling between the slabs.
247 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
248 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
249 function [H0, H1, H1_transverse, coordinates] = Graphene_Bilayer_Lead_Hamiltonians3(obj, lead_param, M, End_Type )
251 % check the structure containing the physical parameters
252 supClasses = superclasses(lead_param);
253 if sum( strcmp( supClasses,
'Lattice_Graphene_Bilayer' ) ) == 0
254 error([
'EQuUs:Lattices:',
class(obj),
':Graphene_Bilayer_Lead_Hamiltonians3'],
'Invalid type of the input parameter');
258 error([
'EQuUs:',
class(obj),
':Graphene_Bilayer_Lead_Hamiltonians3'],
'The input parameter M is empty')
263 [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Lead_Hamiltonians(lead_param, Mtmp, End_Type );
265 sites_to_be_removed = [1, Mtmp+1, ... lower sheet
266 [Mtmp, 2*Mtmp] + 2*Mtmp]; %upper sheet
268 logical_indexes = true(size(H0, 1),1);
269 logical_indexes(sites_to_be_removed) = false;
271 H0 = H0(logical_indexes, logical_indexes);
272 H1 = H1(logical_indexes, logical_indexes);
274 if ~isempty(H1_transverse)
275 H1_transverse = H1_transverse(logical_indexes, logical_indexes);
279 fields = fieldnames( coordinates );
280 for idx = 1:length( fields )
281 fieldname = fields{idx};
282 if strcmpi( fieldname,
'a') || strcmpi( fieldname,
'b') || isempty(coordinates.(fieldname))
286 coordinates.(fieldname) = coordinates.(fieldname)(logical_indexes);
294 %% Silicene_Lead_Hamiltonians
295 %> @brief Creates
Hamiltonians H_0 and H_1 of silicene ribbon with zigzag edge as well as the structure conatining the coordinates of the atomic
sites.
296 %> @
param lead_param An instance of structure #
Lattice_Silicene (or its subclass) containing the physical parameters.
297 %> @
param M Number of
sites in the cross section of the lead.
298 %> @
param End_Type The orientation of the lattice. Set
'A' for lattice with armchair orientation (meaning zigzag edges) or
'Z' for zizgaz orientation (meaning arm-chair edges)
299 %> @
return [1] The Hamiltonian of one slab in the ribbon.
300 %> @
return [2] The coupling between the slabs.
301 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
302 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
303 function [H0, H1, H1_transverse, coordinates] = Silicene_Lead_Hamiltonians(obj, lead_param, M, End_Type )
304 % Hamiltonian created according to arXiv:1305.3684v1
306 % check the structure containing the physical parameters
307 supClasses = superclasses(lead_param);
308 if sum( strcmp( supClasses,
'Lattice_Silicene' ) ) == 0
309 error([
'EQuUs:Lattices:',
class(obj),
':Silicene_Lead_Hamiltonians'],
'Invalid type of the input parameter');
313 error([
'EQuUs:',
class(obj),
':Silicene_Lead_Hamiltonians'],
'The input parameter M is empty')
316 if strcmp( End_Type, 'Z' )
317 error(['EQuUs:', class(obj), ':Silicene_Lead_Hamiltonians'], 'Silicene Hamiltonian developed only for Armchair ended leads')
321 if isprop( lead_param, 'SOintrinsic' )
322 SOintrinsic = -lead_param.SOintrinsic/(3*sqrt(3));
324 SOintrinsic = -0.3*vargamma/(3*sqrt(3));
326 if isprop( lead_param, 'SO_rashba_intrinsic' )
327 SO_rashba_intrinsic = lead_param.SO_rashba_intrinsic*2/3;
329 SO_rashba_intrinsic = 0.07*vargamma;
335 [H0,H1,H1_transverse,coordinates] = Graphene_Lead_Hamiltonians(obj, lead_param, M, End_Type);
336 coordinates.spinup = [ true( size(coordinates.x) ); false( size(coordinates.x) ) ];
337 coordinates.x = [ coordinates.x; coordinates.x];
338 coordinates.y = [ coordinates.y; coordinates.y];
341 % intrinsic SO coupling
342 HSOintrinsic_H0 = sparse( 1:2:M-1, M+2:2:2*M, -1i*SOintrinsic, size(H0,1), size(H0,2)) + sparse( 2:2:M, M+1:2:2*M-1, 1i*SOintrinsic, size(H0,1), size(H0,2)) + ...
343 sparse( 3:2:M, M+2:2:2*M-1, -1i*SOintrinsic, size(H0,1), size(H0,2)) + sparse( 2:2:M-1, M+3:2:2*M, 1i*SOintrinsic, size(H0,1), size(H0,2));
344 HSOintrinsic_H0 = HSOintrinsic_H0 + HSOintrinsic_H0';
346 HSOintrinsic_H1 = sparse( 1:2:M, 1:2:M, 1i*SOintrinsic, size(H1,1), size(H1,2)) + sparse( 2:2:M, 2:2:M, -1i*SOintrinsic, size(H1,1), size(H1,2)) + ...
347 sparse( M+1:2:2*M, M+1:2:2*M, -1i*SOintrinsic, size(H1,1), size(H1,2)) + sparse( M+2:2:2*M, M+2:2:2*M, 1i*SOintrinsic, size(H1,1), size(H1,2)) + ...
348 sparse( M+1:2:2*M, 2:2:M, 1i*SOintrinsic, size(H1,1), size(H1,2)) + sparse( M+2:2:2*M-1, 3:2:M, -1i*SOintrinsic, size(H1,1), size(H1,2)) + ...
349 sparse( M+3:2:2*M, 2:2:M-1, 1i*SOintrinsic, size(H1,1), size(H1,2)) + sparse( M+2:2:2*M, 1:2:M, -1i*SOintrinsic, size(H1,1), size(H1,2));
352 % intrinsic Rashba SO coupling
353 % next-nearest vectors
354 d1 = [coordinates.x(M+2) - coordinates.x(1); coordinates.y(M+2) - coordinates.y(1)]; d1 = d1/norm(d1);
355 d2 = [coordinates.x(M+1) - coordinates.x(2); coordinates.y(M+1) - coordinates.y(2)]; d2 = d2/norm(d2);
356 d3 = coordinates.a; d3 = d3/norm(d3);
359 muvec_firstrow = (-1).^(muvec) * sgn;
360 muvec_secondrow = -muvec_firstrow;
361 % matrix of spin updown
362 HSO_rashba_intrinsic_H0 = ...
363 sparse( M+2:2*M, 1:M-1, -1i*SO_rashba_intrinsic*(d1(2)+1i*d1(1))*muvec_secondrow(2:M), size(H0,1), size(H0,2)) + ...
364 sparse( 1:M-1, M+2:2*M, -1i*SO_rashba_intrinsic*(-d1(2)+1i*(-d1(1)))*(muvec_firstrow(1:M-1)), size(H0,1), size(H0,2)) + ...
365 sparse( M+1:2*M-1, 2:M, -1i*SO_rashba_intrinsic*(d2(2)+1i*d2(1))*muvec_secondrow(1:M-1), size(H0,1), size(H0,2)) + ...
366 sparse( 2:M, M+1:2*M-1, -1i*SO_rashba_intrinsic*(-d2(2)+1i*(-d2(1)))*(muvec_firstrow(2:M)), size(H0,1), size(H0,2));
367 HSO_rashba_intrinsic_H1 = ...
368 sparse( 1:M, 1:M, -1i*SO_rashba_intrinsic*(d3(2)+1i*d3(1))*muvec_firstrow, size(H1,1), size(H1,2)) + ...
369 sparse( M+1:2*M, M+1:2*M, -1i*SO_rashba_intrinsic*(d3(2)+1i*d3(1))*muvec_secondrow, size(H1,1), size(H1,2)) + ...
370 sparse( 2:M, M+1:2*M-1, -1i*SO_rashba_intrinsic*(d1(2)+1i*d1(1))*muvec_firstrow(2:M), size(H1,1), size(H1,2)) + ...
371 sparse( 1:M-1, M+2:2*M, -1i*SO_rashba_intrinsic*(d2(2)+1i*d2(1))*muvec_firstrow(1:M-1), size(H1,1), size(H1,2));
373 % matrix of spin downup
374 HSO_rashba_intrinsic_H0b = ...
375 sparse( M+2:2*M, 1:M-1, -1i*SO_rashba_intrinsic*(d1(2)-1i*d1(1))*muvec_secondrow(2:M), size(H0,1), size(H0,2)) + ...
376 sparse( 1:M-1, M+2:2*M, -1i*SO_rashba_intrinsic*(-d1(2)-1i*(-d1(1)))*muvec_firstrow(1:M-1), size(H0,1), size(H0,2)) + ...
377 sparse( M+1:2*M-1, 2:M, -1i*SO_rashba_intrinsic*(d2(2)-1i*d2(1))*muvec_secondrow(1:M-1), size(H1,1), size(H0,2)) + ...
378 sparse( 2:M, M+1:2*M-1, -1i*SO_rashba_intrinsic*(-d2(2)-1i*(-d2(1)))*muvec_firstrow(2:M), size(H1,1), size(H0,2));
379 HSO_rashba_intrinsic_H1b = ...
380 sparse( 1:M, 1:M, -1i*SO_rashba_intrinsic*(d3(2)-1i*d3(1))*muvec_firstrow, size(H0,1), size(H1,2)) + ...
381 sparse( M+1:2*M, M+1:2*M, -1i*SO_rashba_intrinsic*(d3(2)-1i*d3(1))*muvec_secondrow, size(H0,1), size(H1,2));
382 sparse( 2:M, M+1:2*M-1, -1i*SO_rashba_intrinsic*(d1(2)-1i*d1(1))*muvec_firstrow(2:M), size(H1,1), size(H1,2)) + ...
383 sparse( 1:M-1, M+2:2*M, -1i*SO_rashba_intrinsic*(d2(2)-1i*d2(1))*muvec_firstrow(1:M-1), size(H1,1), size(H1,2));
386 % expand by spin up/down
387 H0 = [H0 + HSOintrinsic_H0, HSO_rashba_intrinsic_H0; ...
388 HSO_rashba_intrinsic_H0b, H0 - HSOintrinsic_H0];
389 H1 = [H1 + HSOintrinsic_H1, HSO_rashba_intrinsic_H1; ...
390 HSO_rashba_intrinsic_H1b, H1 - HSOintrinsic_H1];
394 %% Graphene_Lead_Hamiltonians
395 %> @brief Creates
Hamiltonians H_0 and H_1 of silicene ribbon with zigzag/armchair edge as well as the structure conatining the coordinates of the atomic
sites.
396 %> @image html graphene.jpg
397 %> @image latex graphene.jpg
398 %> @
param lead_param An instance of structure
#Lattice_Graphene (or its subclass) containing the physical parameters. 399 %> @
param M Number of
sites in the cross section of the lead.
400 %> @
param End_Type The orientation of the lattice. Set
'A' for lattice with armchair orientation (meaning zigzag edges) or
'Z' for zizgaz orientation (meaning arm-chair edges)
401 %> @
return [1] The Hamiltonian of one slab in the ribbon.
402 %> @
return [2] The coupling between the slabs.
403 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
404 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
405 function [H0, H1, H1_transverse, coordinates] = Graphene_Lead_Hamiltonians(obj, lead_param, M, End_Type )
407 % check the structure containing the physical parameters
408 supClasses = superclasses(lead_param);
409 if sum( strcmp( supClasses,
'Lattice_Graphene' ) ) == 0
410 error([
'EQuUs:Lattices:',
class(obj),
':Graphene_Lead_Hamiltonians'],
'Invalid type of the input parameter');
414 error([
'EQuUs:',
class(obj),
':Graphene_Lead_Hamiltonians'],
'The input parameter M is empty')
417 epsilon = lead_param.epsilon;
418 vargamma = lead_param.vargamma;
419 deltaAB = lead_param.deltaAB;
423 if strcmp(End_Type, 'A')
424 [H0,H1, H1_transverse, coordinates] = obj.Armchair_End(epsilon,vargamma,M);
425 elseif strcmp(End_Type, 'Z')
426 [H0, H1, H1_transverse, coordinates] = obj.Zigzag_End(epsilon,vargamma,M);
428 warning('Unrecognized
Lead type, creating lead with zigzag edge');
429 [H0,H1, H1_transverse, coordinates] = Armchair_End(epsilon,vargamma,M);
432 % staggered A-B potential tuned by perpendicular electric field
433 H_DeltaAB = sparse( 1:2:M, 1:2:M, deltaAB, size(H0,1), size(H0,2)) + sparse( M+2:2:2*M, M+2:2:2*M, deltaAB, size(H0,1), size(H0,2)) + ...
434 sparse( 2:2:M, 2:2:M, -deltaAB, size(H0,1), size(H0,2)) + sparse( M+1:2:2*M, M+1:2:2*M, -deltaAB, size(H0,1), size(H0,2));
439 % H0 = H0 + H1_transverse*exp(1i*q) + H1_transverse'*exp(-1i*q);
450 methods ( Access = protected )
452 %> @brief Creates
Hamiltonians H_0 and H_1 of silicene ribbon with zigzag edge as well as the structure conatining the coordinates of the atomic
sites.
453 %> @
param epsilon The onsite potential.
454 %> @
param vargamma The hopping amplitude.
455 %> @
param M Number of
sites in the cross section of the lead.
456 %> @
param q The transverse momentum quantum number.
457 %> @return [1] The Hamiltonian of one slab in the ribbon.
458 %> @return [2] The coupling between the slabs.
459 %> @return [3] The transverse coupling between the slabs for transverse calculations.
460 %> @return [4] A structure
Coordinates containing the coordinates of the
sites.
461 function [H0,H1,H1_transverse,coordinates] = Armchair_End(obj, epsilon,vargamma,M)
464 error(['EQuUs:', class(obj), ':Armchair_End'], 'The input parameter M is empty')
468 H0 = sparse( 1:2:M-1, 2:2:M, -vargamma, 2*M, 2*M) + ...
469 sparse( M+2:2:2*M-1, M+3:2:2*M, -vargamma, 2*M, 2*M) + ...
470 sparse( 1:M, M+1:2*M, -vargamma, 2*M, 2*M);
471 H0 = H0 + H0' + sparse( 1:2*M, 1:2*M, epsilon, 2*M, 2*M);
473 H1 = sparse( M+1:2*M, 1:M, -vargamma, 2*M, 2*M);
477 coordinates.a = zeros(2,1);
478 coordinates.x = zeros(2*M,1);
479 coordinates.y = zeros(2*M,1);
484 coordinates.x(1:2:M) = ((1:2:M)-1)*(deltax1+deltax2)/2; %in units rCC
485 coordinates.x(2:2:M) = ((2:2:M)-2)*(deltax1+deltax2)/2 + deltax2; %in units rCC
486 coordinates.x(M+(1:2:M)) = ((1:2:M)-1)*(deltax1+deltax2)/2 - deltax2/2; %in units rCC
487 coordinates.x(M+(2:2:M)) = ((2:2:M)-2)*(deltax1+deltax2)/2 + deltax1 - deltax2/2; %in units rCC
488 coordinates.y = [zeros(M,1); ones(M,1)*deltay]; %in units rCC
489 coordinates.a = [0; 2*deltay];% 1D lattice constant in uits of rCC
492 H1_transverse = sparse( 2*M, M+1, -vargamma, 2*M, 2*M);
493 %H1_transverse = sparse( M+1, 2*M, -vargamma, 2*M, 2*M);
494 coordinates.b = [M/2*3; 0];
503 %> @brief Creates
Hamiltonians H_0 and H_1 of silicene ribbon with armchair edge as well as the structure conatining the coordinates of the atomic
sites.
504 %> @
param epsilon The onsite potential.
505 %> @
param vargamma The hopping amplitude.
506 %> @
param M Number of
sites in the cross section of the lead.
507 %> @
param q The transverse momentum quantum number.
508 %> @
param varargin Optional parameters (https:
509 %> @return [1] The Hamiltonian of one slab in the ribbon.
510 %> @return [2] The coupling between the slabs.
511 %> @return [3] The transverse coupling between the slabs for transverse calculations.
512 %> @return [4] A structure
Coordinates containing the coordinates of the
sites.
513 function [H0, H1, H1_transverse, coordinates] = Zigzag_End(obj, epsilon,vargamma,M)
516 error(['EQuUs:', class(obj), ':Zigzag_End'], 'The input parameter M is empty')
520 coordinates.a = [0;3]; %in units rCC
522 vargamma_nnn = 0*vargamma;
523 H0nnn = sparse(1:M, 2*M+1:3*M, -vargamma_nnn, 4*M, 4*M) + sparse(1:M-1, 2*M+2:3*M, -vargamma_nnn, 4*M, 4*M) + sparse(1:M-1, 2:M, -vargamma_nnn, 4*M, 4*M) +...
524 sparse(M+1:2*M, 3*M+1:4*M, -vargamma_nnn, 4*M, 4*M) + sparse(M+2:2*M, 3*M+1:4*M-1, -vargamma_nnn, 4*M, 4*M) + sparse(M+1:2*M-1, M+2:2*M, -vargamma_nnn, 4*M, 4*M) +...
525 sparse(2*M+1:3*M-1, 2*M+2:3*M, -vargamma_nnn, 4*M, 4*M) + ...
526 sparse(3*M+1:4*M-1, 3*M+2:4*M, -vargamma_nnn, 4*M, 4*M);
528 H1nnn = sparse(3*M+1:4*M, M+1:2*M, -vargamma_nnn, 4*M, 4*M) + sparse(3*M+1:4*M-1, M+2:2*M, -vargamma_nnn, 4*M, 4*M) + ...
529 sparse(2*M+1:3*M, 1:M, -vargamma_nnn, 4*M, 4*M) + sparse(2*M+2:3*M, 1:M-1, -vargamma_nnn, 4*M, 4*M);
531 H0 = sparse(1:M, M+1:2*M, -vargamma, 4*M, 4*M) + sparse(1:M-1, M+2:2*M, -vargamma, 4*M, 4*M) + ...
532 sparse(M+1:2*M, 2*M+1:3*M, -vargamma, 4*M, 4*M) + ...
533 sparse(2*M+1:3*M, 3*M+1:4*M, -vargamma, 4*M, 4*M) + sparse(2*M+2:3*M, 3*M+1:4*M-1, -vargamma, 4*M, 4*M);
534 H0 = H0 + H0' + sparse( 1:4*M, 1:4*M, epsilon, 4*M, 4*M) + H0nnn + H0nnn';
536 H1 = sparse(3*M+1:4*M, 1:M, -vargamma, 4*M, 4*M) + H1nnn;
539 coordinates.x = zeros(4*M,1); %in units rCC
540 coordinates.y = zeros(4*M,1); %in units rCC
542 coordinates.x(1:M) = sqrt(3)*(1:M) - sqrt(3)/2; %in units rCC
543 coordinates.y(1:M) = 0; %in units rCC
545 coordinates.x(M+1:2*M) = sqrt(3)*(0:M-1); %in units rCC
546 coordinates.y(M+1:2*M) = 0.5; %in units rCC
548 coordinates.x(2*M+1:3*M) = sqrt(3)*(0:M-1); %in units rCC
549 coordinates.y(2*M+1:3*M) = 1.5; %in units rCC
551 coordinates.x(3*M+1:4*M) = sqrt(3)*(1:M) - sqrt(3)/2; %in units rCC
552 coordinates.y(3*M+1:4*M) = 2; %in units rCC
554 %H1_transverse = sparse(M, M+1, -vargamma, 4*M, 4*M) + sparse(4*M, 2*M+1, -vargamma, 4*M, 4*M);
555 H1_transverse = sparse(M+1, M, -vargamma, 4*M, 4*M) + sparse(2*M+1, 4*M, -vargamma, 4*M, 4*M);
556 coordinates.b = [sqrt(3)*M, 0];
560 end % methods protected
function Transport(Energy, B)
Calculates the conductance at a given energy value.
function Hamiltonians(varargin)
Function to create the custom Hamiltonians for the 1D chain.
Class containing physical parameters of the Silicene lattice.
A class to calculate the Green functions and self energies of a translational invariant lead The nota...
Structure param contains data structures describing the physical parameters of the scattering center ...
Structure sites contains data to identify the individual sites in a matrix.
Class containing physical parameters of the Bilayer Graphene lattice.
A class to create the Hamiltonian of one unit cell in a translational invariant lead made of hexagona...
Structure containing the coordinates and other quantum number identifiers of the sites in the Hamilto...
function structures(name)