Eötvös Quantum Utilities  v4.9.146
Providing the Horsepowers in the Quantum Realm
Hex_Lead_Hamiltonians.m
Go to the documentation of this file.
1 %% Eotvos Quantum Transport Utilities - Hex_Lead_Hamiltonians
2 % Copyright (C) 2009-2015 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 lattices Lattices
18 %> @{
19 %> @file Hex_Lead_Hamiltonians.m
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.
21 %> @}
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.
23 %%
25 
26 
27 methods ( Access = public )
28 
29 
30 
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
35 %> @param lead_param An instance of structure #Lattice_Bilayer_Graphene (or its subclass) containing the physical parameters.
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 )
43 
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');
48  end
49 
50  if isempty(M)
51  error(['EQuUs:', class(obj), ':Graphene_Bilayer_Lead_Hamiltonians'], 'The input parameter M is empty')
52  end
53 
54  [H0_lower,H1_lower,H1_transverse_lower,coordinates_lower] = obj.Graphene_Lead_Hamiltonians(lead_param, M, End_Type);
55 
56  coordinates_lower.z = zeros(size(coordinates_lower.x));
57 
58  H0_upper = H0_lower;
59  H1_upper = H1_lower;
60  H1_transverse_upper = H1_transverse_lower;
61 
62  if isempty( lead_param.vargamma1 )
63  lead_param.vargamma1 = 0.381;
64  end
65 
66  if isempty( lead_param.vargamma3 )
67  lead_param.vargamma3 = 0;
68  end
69 
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);
73 
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];
81 
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];
86 
87 
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];
96  else
97  H1_transverse = [];
98  end
99 
100 
101  % armchair edged bilayer ribbon: warping checked, but not for H1_transverse
102  elseif strcmp(End_Type, 'Z')
103 
104  Bernal_stack = [-0.5; sqrt(3)/2];
105 
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];
112 
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];
117 
118 
119 
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];
126  else
127  H1_transverse = [];
128  end
129 
130 
131  else
132  save('Hex_Lead_Hamiltonians_Graphene_Bilayer_Lead_Hamiltonians.mat');
133  error('Undefined lead end type')
134  end
135 
136 
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 ?
147  else
148  coordinates_upper.(fieldname) = coordinates_lower.(fieldname);
149  end
150  end
151 
152 
153  coordinates = structures( 'coordinates' );
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;
162  else
163  coordinates.(fieldname) = [coordinates_lower.(fieldname); coordinates_upper.(fieldname)];
164  end
165  end
166 
167 end
168 
169 
170 
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 )
183 
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');
188  end
189 
190  if isempty(M)
191  error(['EQuUs:', class(obj), ':Graphene_Bilayer_Lead_Hamiltonians2'], 'The input parameter M is empty')
192  end
193 
194 
195  % zigzag edged bilayer ribbon
196  if strcmp(End_Type, 'A')
197 
198  Mtmp = M+4;
199 
200  [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Lead_Hamiltonians(lead_param, Mtmp, End_Type, varargin{:});
201 
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
204 
205  logical_indexes = true(size(H0, 1),1);
206  logical_indexes(sites_to_be_removed) = false;
207 
208  H0 = H0(logical_indexes, logical_indexes);
209  H1 = H1(logical_indexes, logical_indexes);
210 
211  if ~isempty(H1_transverse)
212  H1_transverse = H1_transverse(logical_indexes, logical_indexes);
213  end
214 
215 
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')
220  continue
221  end
222 
223  coordinates.(fieldname) = coordinates.(fieldname)(logical_indexes);
224 
225  end
226 
227 
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{:});
231  end
232 
233 
234 end
235 
236 
237 
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.
240 %> @param lead_param An instance of structure #Lattice_Bilayer_Graphene (or its subclass) containing the physical parameters.
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://www.mathworks.com/help/matlab/ref/varargin.html):
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 )
250 
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');
255  end
256 
257  if isempty(M)
258  error(['EQuUs:', class(obj), ':Graphene_Bilayer_Lead_Hamiltonians3'], 'The input parameter M is empty')
259  end
260 
261  Mtmp = M+2;
262 
263  [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Lead_Hamiltonians(lead_param, Mtmp, End_Type );
264 
265  sites_to_be_removed = [1, Mtmp+1, ... lower sheet
266  [Mtmp, 2*Mtmp] + 2*Mtmp]; %upper sheet
267 
268  logical_indexes = true(size(H0, 1),1);
269  logical_indexes(sites_to_be_removed) = false;
270 
271  H0 = H0(logical_indexes, logical_indexes);
272  H1 = H1(logical_indexes, logical_indexes);
273 
274  if ~isempty(H1_transverse)
275  H1_transverse = H1_transverse(logical_indexes, logical_indexes);
276  end
277 
278 
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))
283  continue
284  end
285 
286  coordinates.(fieldname) = coordinates.(fieldname)(logical_indexes);
287 
288  end
289 
290 
291 
292 end
293 
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
305 
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');
310  end
311 
312  if isempty(M)
313  error(['EQuUs:', class(obj), ':Silicene_Lead_Hamiltonians'], 'The input parameter M is empty')
314  end
315 
316  if strcmp( End_Type, 'Z' )
317  error(['EQuUs:', class(obj), ':Silicene_Lead_Hamiltonians'], 'Silicene Hamiltonian developed only for Armchair ended leads')
318  end
319 
320 
321  if isprop( lead_param, 'SOintrinsic' )
322  SOintrinsic = -lead_param.SOintrinsic/(3*sqrt(3));
323  else
324  SOintrinsic = -0.3*vargamma/(3*sqrt(3));
325  end
326  if isprop( lead_param, 'SO_rashba_intrinsic' )
327  SO_rashba_intrinsic = lead_param.SO_rashba_intrinsic*2/3;
328  else
329  SO_rashba_intrinsic = 0.07*vargamma;
330  end
331 
332 
333  sgn = 1;
334 
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];
339 
340 
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';
345 
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));
350 
351 
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);
357 
358  muvec = 0:M-1;
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));
372 
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));
384 
385 
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];
391 
392 end
393 
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 )
406 
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');
411  end
412 
413  if isempty(M)
414  error(['EQuUs:', class(obj), ':Graphene_Lead_Hamiltonians'], 'The input parameter M is empty')
415  end
416 
417  epsilon = lead_param.epsilon;
418  vargamma = lead_param.vargamma;
419  deltaAB = lead_param.deltaAB;
420 
421 
422 
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);
427  else
428  warning('Unrecognized Lead type, creating lead with zigzag edge');
429  [H0,H1, H1_transverse, coordinates] = Armchair_End(epsilon,vargamma,M);
430  end
431 
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));
435 
436  H0 = H0 + H_DeltaAB;
437 
438 % if ~isempty(q)
439 % H0 = H0 + H1_transverse*exp(1i*q) + H1_transverse'*exp(-1i*q);
440 % end
441 
442 
443 
444 
445 end
446 
447 
448 end % methods public
449 
450 methods ( Access = protected )
451 
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)
462 
463  if isempty(M)
464  error(['EQuUs:', class(obj), ':Armchair_End'], 'The input parameter M is empty')
465  end
466 
467 
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);
472 
473  H1 = sparse( M+1:2*M, 1:M, -vargamma, 2*M, 2*M);
474 
475 
476  coordinates = structures('coordinates');
477  coordinates.a = zeros(2,1);
478  coordinates.x = zeros(2*M,1);
479  coordinates.y = zeros(2*M,1);
480  deltax1 = 2;
481  deltax2 = 1;
482  deltay = sqrt(3)/2;
483 
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
490 
491  if mod(M,2) == 0
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];
495  else
496 
497  H1_transverse = [];
498  end
499 
500 end
501 
502 %% Zigzag_End
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://www.mathworks.com/help/matlab/ref/varargin.html):
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)
514 
515  if isempty(M)
516  error(['EQuUs:', class(obj), ':Zigzag_End'], 'The input parameter M is empty')
517  end
518 
519  coordinates = structures('coordinates');
520  coordinates.a = [0;3]; %in units rCC
521 
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);
527 
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);
530 
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';
535 
536  H1 = sparse(3*M+1:4*M, 1:M, -vargamma, 4*M, 4*M) + H1nnn;
537 
538 
539  coordinates.x = zeros(4*M,1); %in units rCC
540  coordinates.y = zeros(4*M,1); %in units rCC
541 
542  coordinates.x(1:M) = sqrt(3)*(1:M) - sqrt(3)/2; %in units rCC
543  coordinates.y(1:M) = 0; %in units rCC
544 
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
547 
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
550 
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
553 
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];
557 
558 end
559 
560 end % methods protected
561 
562 end
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...
Definition: Lead.m:29
function()
Structure param contains data structures describing the physical parameters of the scattering center ...
Definition: structures.m:45
Structure sites contains data to identify the individual sites in a matrix.
Definition: structures.m:187
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...
Definition: Coordinates.m:24
function structures(name)