Eötvös Quantum Utilities  v5.0.144
Providing the Horsepowers in the Quantum Realm
Graphene_Bilayer_Lead_Hamiltonians.m
Go to the documentation of this file.
1 %% Eotvos Quantum Transport Utilities - Graphene_Bilayer_Lead_Hamiltonians
2 % Copyright (C) 2018 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 %> @{
20 %> @brief A class to create the Hamiltonian of one unit cell in a translational invariant graphene bilayer lead.
21 %> @}
22 %> @brief A class to create the Hamiltonian of one unit cell in a translational invariant graphene bilayer lead.
23 %%
25 
26 
27 methods ( Access = public )
28 
29 
30 
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
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_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_Hamiltonians'], 'Invalid type of the input parameter');
48  end
49 
50  if isempty(M)
51  error(['EQuUs:Lattices:', class(obj), ':Graphene_Bilayer_Hamiltonians'], 'The input parameter M is empty')
52  end
53 
54  [H0_lower,H1_lower,H1_transverse_lower,coordinates_lower] = obj.Graphene_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_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  % combining sites of the upper and lower layer
153  coordinates = coordinates_lower.Combine( coordinates_upper );
154 
155 
156 
157 end
158 
159 
160 
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 )
173 
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');
178  end
179 
180  if isempty(M)
181  error(['EQuUs:', class(obj), ':Graphene_Bilayer_Hamiltonians2'], 'The input parameter M is empty')
182  end
183 
184 
185  % zigzag edged bilayer ribbon
186  if strcmp(End_Type, 'A')
187 
188  Mtmp = M+4;
189 
190  [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Hamiltonians(lead_param, Mtmp, End_Type, varargin{:});
191 
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
194 
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;
198 
199  H0 = H0(logical_indexes, logical_indexes);
200  H1 = H1(logical_indexes, logical_indexes);
201 
202  if ~isempty(H1_transverse)
203  H1_transverse = H1_transverse(logical_indexes, logical_indexes);
204  end
205 
206  % removing sites from the coordinates
207  coordinates = coordinates.KeepSites( logical_indexes );
208 
209 
210 
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{:});
214  end
215 
216 
217 end
218 
219 
220 
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.
223 %> @param lead_param An instance of structure #Lattice_Bilayer_Graphene (or its subclass) containing the physical parameters.
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://www.mathworks.com/help/matlab/ref/varargin.html):
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 )
233 
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');
238  end
239 
240  if isempty(M)
241  error(['EQuUs:', class(obj), ':Graphene_Bilayer_Hamiltonians3'], 'The input parameter M is empty')
242  end
243 
244  Mtmp = M+2;
245 
246  [H0, H1, H1_transverse, coordinates] = obj.Graphene_Bilayer_Hamiltonians(lead_param, Mtmp, End_Type );
247 
248  sites_to_be_removed = [1, Mtmp+1, ... lower sheet
249  [Mtmp, 2*Mtmp] + 2*Mtmp]; %upper sheet
250 
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;
254 
255  H0 = H0(logical_indexes, logical_indexes);
256  H1 = H1(logical_indexes, logical_indexes);
257 
258  if ~isempty(H1_transverse)
259  H1_transverse = H1_transverse(logical_indexes, logical_indexes);
260  end
261 
262  % removing sites from the coordinates
263  coordinates = coordinates.KeepSites( logical_indexes );
264 
265 
266 
267 end
268 
269 
270 
271 end % methods public
272 
273 
274 end
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 ...
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)