Eötvös Quantum Utilities  v4.8.141
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 basic Basic Functionalities
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 %> @param lead_param An instance of structure lead_param containing the physical parameters of the ribbon
34 %> @param M Number of sites in the cross section of the lead.
35 %> @param End_Type The type of the end of the ribbon ('A' for armchair or 'Z' for zigzag type end)
36 %> @param varargin Optional parameters (https://www.mathworks.com/help/matlab/ref/varargin.html):
37 %> @param 'q' The transverse momentum. Set to empty (default) for computations without transverse momentums.
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, varargin)
43 
44  if isempty(M)
45  error(['EQuUs:', class(obj), ':Graphene_Bilayer_Lead_Hamiltonians'], 'The input parameter M is empty')
46  end
47 
48  p = inputParser;
49  p.addParameter('q', []);
50 
51  p.parse(varargin{:});
52  q = p.Results.q;
53 
54  [H0_lower,H1_lower,H1_transverse_lower,coordinates_lower] = obj.Graphene_Lead_Hamiltonians(lead_param, M, End_Type, 'q', q);
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 )
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 %> @param lead_param An instance of structure lead_param containing the physical parameters of the ribbon
174 %> @param M Number of sites in the cross section of the lead.
175 %> @param End_Type The type of the end of the ribbon ('A' for armchair or 'Z' for zigzag type end)
176 %> @param varargin Optional parameters (https://www.mathworks.com/help/matlab/ref/varargin.html):
177 %> @param 'q' The transverse momentum. Set to empty (default) for computations without transverse momentums.
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  if isempty(M)
185  error(['EQuUs:', class(obj), ':Graphene_Bilayer_Lead_Hamiltonians2'], 'The input parameter M is empty')
186  end
187 
188 
189  % zigzag edged bilayer ribbon
190  if strcmp(End_Type, 'A')
191 
192  Mtmp = M+4;
193 
194  [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Lead_Hamiltonians(lead_param, Mtmp, End_Type, varargin{:});
195 
196  sites_to_be_removed = [1, 2, Mtmp+1, Mtmp+2, Mtmp-1, Mtmp, 2*Mtmp, ... lower sheet
197  [1, 2, Mtmp+1, Mtmp-1, Mtmp, 2*Mtmp-1, 2*Mtmp] + 2*Mtmp]; %upper sheet
198 
199  logical_indexes = true(size(H0, 1),1);
200  logical_indexes(sites_to_be_removed) = false;
201 
202  H0 = H0(logical_indexes, logical_indexes);
203  H1 = H1(logical_indexes, logical_indexes);
204 
205  if ~isempty(H1_transverse)
206  H1_transverse = H1_transverse(logical_indexes, logical_indexes);
207  end
208 
209 
210  fields = fieldnames( coordinates );
211  for idx = 1:length( fields )
212  fieldname = fields{idx};
213  if strcmpi( fieldname, 'a') || strcmpi( fieldname, 'b') || isempty(coordinates.(fieldname)) || strcmpi( fieldname, 'LatticeConstant')
214  continue
215  end
216 
217  coordinates.(fieldname) = coordinates.(fieldname)(logical_indexes);
218 
219  end
220 
221 
222  % armchair edged bilayer ribbon
223  elseif strcmp(End_Type, 'Z')
224  [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Lead_Hamiltonians(lead_param, M, End_Type, varargin{:});
225  end
226 
227 
228 end
229 
230 
231 
232 %% Graphene_Bilayer_Lead_Hamiltonians3
233 %> @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.
234 %> @param lead_param An instance of structure lead_param containing the physical parameters of the ribbon
235 %> @param M Number of sites in the cross section of the lead.
236 %> @param End_Type The type of the end of the ribbon ('A' for armchair or 'Z' for zigzag type end)
237 %> @param varargin Optional parameters (https://www.mathworks.com/help/matlab/ref/varargin.html):
238 %> @param 'q' The transverse momentum. Set to empty (default) for computations without transverse momentums.
239 %> @return [1] The Hamiltonian of one slab in the ribbon.
240 %> @return [2] The coupling between the slabs.
241 %> @return [3] The transverse coupling between the slabs for transverse calculations.
242 %> @return [4] A structure #coordinates containing the coordinates of the sites.
243 function [H0, H1, H1_transverse, coordinates] = Graphene_Bilayer_Lead_Hamiltonians3(obj, lead_param, M, End_Type, varargin)
244 
245  if isempty(M)
246  error(['EQuUs:', class(obj), ':Graphene_Bilayer_Lead_Hamiltonians3'], 'The input parameter M is empty')
247  end
248 
249  p = inputParser;
250  p.addParameter('q', []);
251 
252  p.parse(varargin{:});
253  q = p.Results.q;
254 
255  Mtmp = M+2;
256 
257  [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Lead_Hamiltonians(lead_param, Mtmp, End_Type, varargin{:});
258 
259  sites_to_be_removed = [1, Mtmp+1, ... lower sheet
260  [Mtmp, 2*Mtmp] + 2*Mtmp]; %upper sheet
261 
262  logical_indexes = true(size(H0, 1),1);
263  logical_indexes(sites_to_be_removed) = false;
264 
265  H0 = H0(logical_indexes, logical_indexes);
266  H1 = H1(logical_indexes, logical_indexes);
267 
268  if ~isempty(H1_transverse)
269  H1_transverse = H1_transverse(logical_indexes, logical_indexes);
270  end
271 
272 
273  fields = fieldnames( coordinates );
274  for idx = 1:length( fields )
275  fieldname = fields{idx};
276  if strcmpi( fieldname, 'a') || strcmpi( fieldname, 'b') || isempty(coordinates.(fieldname))
277  continue
278  end
279 
280  coordinates.(fieldname) = coordinates.(fieldname)(logical_indexes);
281 
282  end
283 
284 
285 
286 end
287 
288 %% Silicene_Lead_Hamiltonians
289 %> @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.
290 %> @param lead_param An instance of structure lead_param containing the physical parameters of the ribbon
291 %> @param M Number of sites in the cross section of the lead.
292 %> @param End_Type The type of the end of the ribbon ('A' for armchair end)
293 %> @param varargin Optional parameters (https://www.mathworks.com/help/matlab/ref/varargin.html):
294 %> @param 'q' The transverse momentum. Set to empty (default) for computations without transverse momentums.
295 %> @return [1] The Hamiltonian of one slab in the ribbon.
296 %> @return [2] The coupling between the slabs.
297 %> @return [3] The transverse coupling between the slabs for transverse calculations.
298 %> @return [4] A structure #coordinates containing the coordinates of the sites.
299 function [H0, H1, H1_transverse, coordinates] = Silicene_Lead_Hamiltonians(obj, lead_param, M, End_Type, varargin)
300  % Hamiltonian created according to arXiv:1305.3684v1
301 
302  if isempty(M)
303  error(['EQuUs:', class(obj), ':Silicene_Lead_Hamiltonians'], 'The input parameter M is empty')
304  end
305 
306  p = inputParser;
307  p.addParameter('q', []);
308 
309  p.parse(varargin{:});
310  q = p.Results.q;
311 
312  if strcmp( End_Type, 'Z' )
313  error('Silicene Hamiltonian developed only for Armchair ended leads')
314  end
315 
316 
317  if isprop( lead_param, 'SOintrinsic' )
318  SOintrinsic = -lead_param.SOintrinsic/(3*sqrt(3));
319  else
320  SOintrinsic = -0.3*vargamma/(3*sqrt(3));
321  end
322  if isprop( lead_param, 'SO_rashba_intrinsic' )
323  SO_rashba_intrinsic = lead_param.SO_rashba_intrinsic*2/3;
324  else
325  SO_rashba_intrinsic = 0.07*vargamma;
326  end
327 
328 
329  sgn = 1;
330 
331  [H0,H1,H1_transverse,coordinates] = Graphene_Lead_Hamiltonians(obj, lead_param, M, End_Type, 'q', q);
332  coordinates.spinup = [ true( size(coordinates.x) ); false( size(coordinates.x) ) ];
333  coordinates.x = [ coordinates.x; coordinates.x];
334  coordinates.y = [ coordinates.y; coordinates.y];
335 
336 
337  % intrinsic SO coupling
338  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)) + ...
339  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));
340  HSOintrinsic_H0 = HSOintrinsic_H0 + HSOintrinsic_H0';
341 
342  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)) + ...
343  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)) + ...
344  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)) + ...
345  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));
346 
347 
348  % intrinsic Rashba SO coupling
349  % next-nearest vectors
350  d1 = [coordinates.x(M+2) - coordinates.x(1); coordinates.y(M+2) - coordinates.y(1)]; d1 = d1/norm(d1);
351  d2 = [coordinates.x(M+1) - coordinates.x(2); coordinates.y(M+1) - coordinates.y(2)]; d2 = d2/norm(d2);
352  d3 = coordinates.a; d3 = d3/norm(d3);
353 
354  muvec = 0:M-1;
355  muvec_firstrow = (-1).^(muvec) * sgn;
356  muvec_secondrow = -muvec_firstrow;
357  % matrix of spin updown
358  HSO_rashba_intrinsic_H0 = ...
359  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)) + ...
360  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)) + ...
361  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)) + ...
362  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));
363  HSO_rashba_intrinsic_H1 = ...
364  sparse( 1:M, 1:M, -1i*SO_rashba_intrinsic*(d3(2)+1i*d3(1))*muvec_firstrow, size(H1,1), size(H1,2)) + ...
365  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)) + ...
366  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)) + ...
367  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));
368 
369  % matrix of spin downup
370  HSO_rashba_intrinsic_H0b = ...
371  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)) + ...
372  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)) + ...
373  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)) + ...
374  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));
375  HSO_rashba_intrinsic_H1b = ...
376  sparse( 1:M, 1:M, -1i*SO_rashba_intrinsic*(d3(2)-1i*d3(1))*muvec_firstrow, size(H0,1), size(H1,2)) + ...
377  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));
378  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)) + ...
379  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));
380 
381 
382  % expand by spin up/down
383  H0 = [H0 + HSOintrinsic_H0, HSO_rashba_intrinsic_H0; ...
384  HSO_rashba_intrinsic_H0b, H0 - HSOintrinsic_H0];
385  H1 = [H1 + HSOintrinsic_H1, HSO_rashba_intrinsic_H1; ...
386  HSO_rashba_intrinsic_H1b, H1 - HSOintrinsic_H1];
387 
388 end
389 
390 %% Graphene_Lead_Hamiltonians
391 %> @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.
392 %> @param lead_param An instance of structure lead_param containing the physical parameters of the ribbon
393 %> @param M Number of sites in the cross section of the lead.
394 %> @param End_Type The type of the end of the ribbon ('A' for armchair or 'Z' for zigzag type end)
395 %> @param varargin Optional parameters (https://www.mathworks.com/help/matlab/ref/varargin.html):
396 %> @param 'q' The transverse momentum. Set to empty (default) for computations without transverse momentums.
397 %> @return [1] The Hamiltonian of one slab in the ribbon.
398 %> @return [2] The coupling between the slabs.
399 %> @return [3] The transverse coupling between the slabs for transverse calculations.
400 %> @return [4] A structure #coordinates containing the coordinates of the sites.
401 function [H0, H1, H1_transverse, coordinates] = Graphene_Lead_Hamiltonians(obj, lead_param, M, End_Type, varargin)
402 
403  if isempty(M)
404  error(['EQuUs:', class(obj), ':Graphene_Lead_Hamiltonians'], 'The input parameter M is empty')
405  end
406 
407  p = inputParser;
408  p.addParameter('q', []);
409 
410  p.parse(varargin{:});
411  q = p.Results.q;
412 
413  if isfield( lead_param, 'epsilon' ) && ~isempty(lead_param.epsilon)
414  epsilon = lead_param.epsilon;
415  else
416  epsilon = 0;
417  end
418  if isfield( lead_param, 'vargamma' ) && ~isempty(lead_param.vargamma)
419  vargamma = lead_param.vargamma;
420  else
421  vargamma = 2.97;
422  end
423  if isfield( lead_param, 'deltaAB' ) && ~isempty(lead_param.deltaAB)
424  deltaAB = lead_param.deltaAB;
425  else
426  deltaAB = 0;
427  end
428 
429 
430 
431  if strcmp(End_Type, 'A')
432  [H0,H1, H1_transverse, coordinates] = obj.Armchair_End(epsilon,vargamma,M,q);
433  elseif strcmp(End_Type, 'Z')
434  [H0, H1, H1_transverse, coordinates] = obj.Zigzag_End(epsilon,vargamma,M,q);
435  else
436  warning('Unrecognized Lead type, creating lead with zigzag edge');
437  [H0,H1, H1_transverse, coordinates] = Armchair_End(epsilon,vargamma,M,q);
438  end
439 
440  % staggered A-B potential tuned by perpendicular electric field
441  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)) + ...
442  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));
443 
444  H0 = H0 + H_DeltaAB;
445 
446 % if ~isempty(q)
447 % H0 = H0 + H1_transverse*exp(1i*q) + H1_transverse'*exp(-1i*q);
448 % end
449 
450 
451 
452 
453 end
454 
455 
456 end % methods public
457 
458 methods ( Access = protected )
459 
460 %> @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.
461 %> @param epsilon The onsite potential.
462 %> @param vargamma The hopping amplitude.
463 %> @param M Number of sites in the cross section of the lead.
464 %> @param q The transverse momentum quantum number.
465 %> @return [1] The Hamiltonian of one slab in the ribbon.
466 %> @return [2] The coupling between the slabs.
467 %> @return [3] The transverse coupling between the slabs for transverse calculations.
468 %> @return [4] A structure #coordinates containing the coordinates of the sites.
469 function [H0,H1,H1_transverse,coordinates] = Armchair_End(obj, epsilon,vargamma,M,q)
470 
471  if isempty(M)
472  error(['EQuUs:', class(obj), ':Armchair_End'], 'The input parameter M is empty')
473  end
474 
475 
476  H0 = sparse( 1:2:M-1, 2:2:M, -vargamma, 2*M, 2*M) + ...
477  sparse( M+2:2:2*M-1, M+3:2:2*M, -vargamma, 2*M, 2*M) + ...
478  sparse( 1:M, M+1:2*M, -vargamma, 2*M, 2*M);
479  H0 = H0 + H0' + sparse( 1:2*M, 1:2*M, epsilon, 2*M, 2*M);
480 
481  H1 = sparse( M+1:2*M, 1:M, -vargamma, 2*M, 2*M);
482 
483 
484  coordinates = structures('coordinates');
485  coordinates.a = zeros(2,1);
486  coordinates.x = zeros(2*M,1);
487  coordinates.y = zeros(2*M,1);
488  deltax1 = 2;
489  deltax2 = 1;
490  deltay = sqrt(3)/2;
491 
492  coordinates.x(1:2:M) = ((1:2:M)-1)*(deltax1+deltax2)/2; %in units rCC
493  coordinates.x(2:2:M) = ((2:2:M)-2)*(deltax1+deltax2)/2 + deltax2; %in units rCC
494  coordinates.x(M+(1:2:M)) = ((1:2:M)-1)*(deltax1+deltax2)/2 - deltax2/2; %in units rCC
495  coordinates.x(M+(2:2:M)) = ((2:2:M)-2)*(deltax1+deltax2)/2 + deltax1 - deltax2/2; %in units rCC
496  coordinates.y = [zeros(M,1); ones(M,1)*deltay]; %in units rCC
497  coordinates.a = [0; 2*deltay];% 1D lattice constant in uits of rCC
498 
499  if isempty(q)
500  H1_transverse = [];
501  else
502  if mod(M,2) == 0
503  H1_transverse = sparse( 2*M, M+1, -vargamma, 2*M, 2*M);
504  %H1_transverse = sparse( M+1, 2*M, -vargamma, 2*M, 2*M);
505  coordinates.b = [M/2*3; 0];
506  else
507 
508  H1_transverse = [];
509  end
510  end
511 
512 end
513 
514 %% Zigzag_End
515 %> @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.
516 %> @param epsilon The onsite potential.
517 %> @param vargamma The hopping amplitude.
518 %> @param M Number of sites in the cross section of the lead.
519 %> @param q The transverse momentum quantum number.
520 %> @param varargin Optional parameters (https://www.mathworks.com/help/matlab/ref/varargin.html):
521 %> @return [1] The Hamiltonian of one slab in the ribbon.
522 %> @return [2] The coupling between the slabs.
523 %> @return [3] The transverse coupling between the slabs for transverse calculations.
524 %> @return [4] A structure #coordinates containing the coordinates of the sites.
525 function [H0, H1, H1_transverse, coordinates] = Zigzag_End(obj, epsilon,vargamma,M,q)
526 
527  if isempty(M)
528  error(['EQuUs:', class(obj), ':Zigzag_End'], 'The input parameter M is empty')
529  end
530 
531  coordinates = structures('coordinates');
532  coordinates.a = [0;3]; %in units rCC
533 
534  vargamma_nnn = 0*vargamma;
535  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) +...
536  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) +...
537  sparse(2*M+1:3*M-1, 2*M+2:3*M, -vargamma_nnn, 4*M, 4*M) + ...
538  sparse(3*M+1:4*M-1, 3*M+2:4*M, -vargamma_nnn, 4*M, 4*M);
539 
540  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) + ...
541  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);
542 
543  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) + ...
544  sparse(M+1:2*M, 2*M+1:3*M, -vargamma, 4*M, 4*M) + ...
545  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);
546  H0 = H0 + H0' + sparse( 1:4*M, 1:4*M, epsilon, 4*M, 4*M) + H0nnn + H0nnn';
547 
548  H1 = sparse(3*M+1:4*M, 1:M, -vargamma, 4*M, 4*M) + H1nnn;
549 
550 
551  coordinates.x = zeros(4*M,1); %in units rCC
552  coordinates.y = zeros(4*M,1); %in units rCC
553 
554  coordinates.x(1:M) = sqrt(3)*(1:M) - sqrt(3)/2; %in units rCC
555  coordinates.y(1:M) = 0; %in units rCC
556 
557  coordinates.x(M+1:2*M) = sqrt(3)*(0:M-1); %in units rCC
558  coordinates.y(M+1:2*M) = 0.5; %in units rCC
559 
560  coordinates.x(2*M+1:3*M) = sqrt(3)*(0:M-1); %in units rCC
561  coordinates.y(2*M+1:3*M) = 1.5; %in units rCC
562 
563  coordinates.x(3*M+1:4*M) = sqrt(3)*(1:M) - sqrt(3)/2; %in units rCC
564  coordinates.y(3*M+1:4*M) = 2; %in units rCC
565 
566  if isempty(q)
567  H1_transverse = [];
568  else
569  %H1_transverse = sparse(M, M+1, -vargamma, 4*M, 4*M) + sparse(4*M, 2*M+1, -vargamma, 4*M, 4*M);
570  H1_transverse = sparse(M+1, M, -vargamma, 4*M, 4*M) + sparse(2*M+1, 4*M, -vargamma, 4*M, 4*M);
571  coordinates.b = [sqrt(3)*M, 0];
572  end
573 
574 end
575 
576 end % methods protected
577 
578 end
vargamma3
A physical parameter, see the individual lattice documentations for details.
Definition: structures.m:103
function Transport(Energy, B)
creating the Ribbon class representing the twoterminal setup
function Hamiltonians(varargin)
Function to create the custom Hamiltonians for the 1D chain.
Structure containing the physical parameters describing a given lead.
Definition: structures.m:85
A class to calculate the Green functions and self energies of a translational invariant lead The nota...
Definition: Lead.m:29
Structure param contains data structures describing the physical parameters of the scattering center ...
Definition: structures.m:45
vargamma1
A physical parameter, see the individual lattice documentations for details.
Definition: structures.m:99
Structure sites contains data to identify the individual sites in a matrix.
Definition: structures.m:247
SOintrinsic
A physical parameter, see the individual lattice documentations for details.
Definition: structures.m:91
SO_rashba_intrinsic
A physical parameter, see the individual lattice documentations for details.
Definition: structures.m:95
A class to create the Hamiltonian of one unit cell in a translational invariant lead made of hexagona...
function structures(name)