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 lattices Lattices
20 %> @brief A
class to create the Hamiltonian of one unit cell in a translational invariant graphene bilayer lead.
22 %> @brief A
class to create the Hamiltonian of one unit cell in a translational invariant graphene bilayer lead.
27 methods ( Access =
public )
31 %% Graphene_Bilayer_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_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_Hamiltonians'],
'Invalid type of the input parameter');
51 error([
'EQuUs:Lattices:',
class(obj),
':Graphene_Bilayer_Hamiltonians'],
'The input parameter M is empty')
54 [H0_lower,H1_lower,H1_transverse_lower,coordinates_lower] = obj.Graphene_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_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);
152 % combining
sites of the upper and lower layer
153 coordinates = coordinates_lower.Combine( coordinates_upper );
161 %% Graphene_Bilayer_Hamiltonians2
162 %> @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.
163 %> @image html bilayer_type2.jpg
164 %> @image latex bilayer_type2.jpg
165 %> @
param lead_param An instance of structure
#Lattice_Bilayer_Graphene (or its subclass) containing the physical parameters. 166 %> @
param M Number of
sites in the cross section of the lead.
167 %> @
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)
168 %> @
return [1] The Hamiltonian of one slab in the ribbon.
169 %> @
return [2] The coupling between the slabs.
170 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
171 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
172 function [H0, H1, H1_transverse, coordinates] = Graphene_Bilayer_Hamiltonians2(obj, lead_param, M, End_Type, varargin )
174 % check the structure containing the physical parameters
175 supClasses = superclasses(lead_param);
176 if sum( strcmp( supClasses,
'Lattice_Graphene_Bilayer' ) ) == 0
177 error([
'EQuUs:Lattices:',
class(obj),
':Graphene_Bilayer_Hamiltonians2'],
'Invalid type of the input parameter');
181 error([
'EQuUs:',
class(obj),
':Graphene_Bilayer_Hamiltonians2'],
'The input parameter M is empty')
185 % zigzag edged bilayer ribbon
186 if strcmp(End_Type, 'A')
190 [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Hamiltonians(lead_param, Mtmp, End_Type, varargin{:});
192 sites_to_be_removed = [1, 2, Mtmp+1, Mtmp+2, Mtmp-1, Mtmp, 2*Mtmp, ... lower sheet
193 [1, 2, Mtmp+1, Mtmp-1, Mtmp, 2*Mtmp-1, 2*Mtmp] + 2*Mtmp]; %upper sheet
195 logical_indexes =
true(size(H0, 1),1);
196 % Sites with
false values will be removed from the structure.
197 logical_indexes(sites_to_be_removed) =
false;
199 H0 = H0(logical_indexes, logical_indexes);
200 H1 = H1(logical_indexes, logical_indexes);
202 if ~isempty(H1_transverse)
203 H1_transverse = H1_transverse(logical_indexes, logical_indexes);
206 % removing
sites from the coordinates
207 coordinates = coordinates.KeepSites( logical_indexes );
211 % armchair edged bilayer ribbon
212 elseif strcmp(End_Type,
'Z')
213 [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Hamiltonians(lead_param, M, End_Type, varargin{:});
221 %% Graphene_Bilayer_Hamiltonians3
222 %> @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.
224 %> @
param M Number of
sites in the cross section of the lead.
225 %> @
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)
226 %> @
param varargin Optional parameters (https:
227 %> @
param 'q' The transverse momentum. Set to empty (
default)
for computations without transverse momentums.
228 %> @
return [1] The Hamiltonian of one slab in the ribbon.
229 %> @
return [2] The coupling between the slabs.
230 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
231 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
232 function [H0, H1, H1_transverse, coordinates] = Graphene_Bilayer_Hamiltonians3(obj, lead_param, M, End_Type )
234 % check the structure containing the physical parameters
235 supClasses = superclasses(lead_param);
236 if sum( strcmp( supClasses,
'Lattice_Graphene_Bilayer' ) ) == 0
237 error([
'EQuUs:Lattices:',
class(obj),
':Graphene_Bilayer_Hamiltonians3'],
'Invalid type of the input parameter');
241 error([
'EQuUs:',
class(obj),
':Graphene_Bilayer_Hamiltonians3'],
'The input parameter M is empty')
246 [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Hamiltonians(lead_param, Mtmp, End_Type );
248 sites_to_be_removed = [1, Mtmp+1, ... lower sheet
249 [Mtmp, 2*Mtmp] + 2*Mtmp]; %upper sheet
251 logical_indexes = true(size(H0, 1),1);
252 % Sites with false values will be removed from the structure.
253 logical_indexes(sites_to_be_removed) = false;
255 H0 = H0(logical_indexes, logical_indexes);
256 H1 = H1(logical_indexes, logical_indexes);
258 if ~isempty(H1_transverse)
259 H1_transverse = H1_transverse(logical_indexes, logical_indexes);
262 % removing
sites from the coordinates
263 coordinates = coordinates.KeepSites( logical_indexes );
A class to create the Hamiltonian of one unit cell in a translational invariant graphene bilayer lead...
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.
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)