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 Class to create the Hamiltonian of one unit cell in a translational invariant lead made of TMDC_Monolayer lattice structure.
22 %> @brief Class to create the Hamiltonian of one unit cell in a translational invariant lead made of TMDC_Monolayer lattice structure.
27 methods (Access =
public)
28 %% TMDC_Monolayer_Hamiltonians
29 %> @brief Creates
Hamiltonians H_0 and H_1
for TMDC_Monolayer lattice structure
30 %> @image html TMDC_monolayer.jpg
31 %> @image latex TMDC_monolayer.jpg
33 %> @
param M Number of
sites in the cross section of the lead.
34 %> @
return [1] The Hamiltonian of one slab in the ribbon.
35 %> @
return [2] The coupling between the slabs.
36 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
37 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
38 function [H0, H1, H1_transverse, H1_skew_left, cCoordinates] = TMDC_Monolayer_Hamiltonians( obj, lead_param, M )
40 % check the structure containing the physical parameters
41 supClasses = superclasses(lead_param);
42 if sum( strcmp( supClasses,
'Lattice_TMDC_Monolayer' ) ) == 0
43 error([
'EQuUs:Lattices:',
class(obj),
':TMDC_Monolayer_Hamiltonians'],
'Invalid type of the input parameter');
47 error([
'EQuUs:Lattices:',
class(obj),
':TMDC_Monolayer_Hamiltonians'],
'The input parameter M is empty')
50 % defining orbital types according to Table II in <a href="https:
51 orbitals = {
'd0_xz',
'd0_yz',
'p0_z',
'p0_x',
'p0_y',
'de_z2',
'de_xy',
'de_x2y2',
'pe_z',
'pe_x',
'pe_y'};
56 % coordinates shift of the atomic
sites 58 a2 = [-0.5; sqrt(3)/2 ];
59 coordinates_shift = (2*a1+a2)/3;
60 coordinates_shifts = { [0;0], [0;0], coordinates_shift, coordinates_shift, coordinates_shift, [0;0], [0;0], [0;0], coordinates_shift, coordinates_shift, coordinates_shift };
63 H0_orbitals = cell( orbitals_num, 1);
64 H1_orbitals = cell( orbitals_num, 1);
65 H1_orbitals_transverse = cell( orbitals_num, 1);
66 H1_orbitals_skew_left = cell( orbitals_num, 1);
68 % creating cell array of the coordinates
69 cCoordinates_orbitals = cell( orbitals_num, 1);
71 % obtaining derived hopping parameters t_2__i_i
72 t_2__hoppings = lead_param.Calc_t_2__i_i();
74 % creating triangular lattice
for each atomic orbital
75 for idx = 1:orbitals_num
77 parameter_extension = [
'__', num2str(idx),
'_', num2str(idx)];
78 epsilon = lead_param.([
'epsilon', num2str(idx)]);
79 t_1 = lead_param.([
't_1', parameter_extension]);
80 t_2 = t_2__hoppings.([
't_2', parameter_extension]);
81 [H0_orbitals{idx}, H1_orbitals{idx}, H1_orbitals_transverse{idx}, H1_orbitals_skew_left{idx}, cCoordinates_orbitals{idx}] = obj.Triangle_Lattice_Hamiltonians( epsilon, t_1, t_2, M );
82 cCoordinates_orbitals{idx}.OrbitalTypes = cell( length(cCoordinates_orbitals{idx}.x), 1);
83 cCoordinates_orbitals{idx}.OrbitalTypes(:) = {orbitals{idx}};
85 % shift the given sublattice coordinates
86 cCoordinates_orbitals{idx} = cCoordinates_orbitals{idx}.Shift( coordinates_shifts{idx} );
90 % creating the big Hamiltonian from the block-diagonal parts
91 H0 = blkdiag(H0_orbitals{:});
92 H1 = blkdiag(H1_orbitals{:});
93 H1_transverse = blkdiag(H1_orbitals_transverse{:});
94 H1_skew_left = blkdiag(H1_orbitals_skew_left{:});
97 cCoordinates = cCoordinates_orbitals{1};
98 for idx = 2:orbitals_num
99 cCoordinates = cCoordinates.Combine( cCoordinates_orbitals{idx} );
102 % setting the lattice constant
103 cCoordinates.LatticeConstant = lead_param.a;
108 % ********** adding off-diagonal coupling elements between the same atom types *********
110 % obtaining derived hopping parameters t_2__i_j
111 t_2__hoppings = lead_param.Calc_t_2__i_j();
113 % obtaining derived hopping parameters t_3__i_j
114 t_3__hoppings = lead_param.Calc_t_3__i_j();
116 % M_2 symmetry (+), EQ (5) in <a href="https:
117 orbital_indexes1 = [3, 6, 9];
118 orbital_indexes2 = [5, 8, 11];
119 for idx = 1:length( orbital_indexes1 )
120 orbital_index1 = orbital_indexes1(idx);
121 orbital_index2 = orbital_indexes2(idx);
122 row_indexes = (orbital_index1-1)*M + (1:M);
123 col_indexes = (orbital_index2-1)*M + (1:M);
126 hopping_ampliude_4 = lead_param.(['t_1__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
127 H1( col_indexes, row_indexes ) = H1( col_indexes, row_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
128 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
131 hopping_ampliude_4 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
132 H1( col_indexes, row_indexes ) = H1( col_indexes, row_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_4, M, M );
134 hopping_ampliude_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
135 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_3, M, M );
137 H1_skew_left( col_indexes, row_indexes ) = H1_skew_left( col_indexes, row_indexes ) + sparse( M, 1, hopping_ampliude_4, M, M);
138 H1_skew_left( row_indexes, col_indexes ) = H1_skew_left( row_indexes, col_indexes ) + sparse( M, 1, hopping_ampliude_3, M, M);
140 % +delta_3 directions
141 hopping_ampliude_4 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
142 hopping_ampliude_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
143 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_4, M, M );
144 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_3, M, M );
145 H1_transverse( col_indexes, row_indexes ) = H1_transverse( col_indexes, row_indexes ) + sparse( M, 1, hopping_ampliude_4, M, M);
146 H1_transverse( row_indexes, col_indexes ) = H1_transverse( row_indexes, col_indexes ) + sparse( M, 1, hopping_ampliude_3, M, M);
148 % - delta_3 direction
149 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 2:M, 1:M-1, hopping_ampliude_3, M, M );
150 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 2:M, 1:M-1, hopping_ampliude_4, M, M );
157 % M_2 symmetry (-), EQ (6) in <a href="https:
158 orbital_indexes1 = [1, 3, 4, 6, 7, 9, 10];
159 orbital_indexes2 = [2, 4, 5, 7, 8, 10, 11];
160 for idx = 1:length( orbital_indexes1 )
161 orbital_index1 = orbital_indexes1(idx);
162 orbital_index2 = orbital_indexes2(idx);
163 row_indexes = (orbital_index1-1)*M + (1:M);
164 col_indexes = (orbital_index2-1)*M + (1:M);
167 hopping_ampliude_1 = lead_param.(['t_1__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
168 H1( col_indexes, row_indexes ) = H1( col_indexes, row_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_1, M, M );
169 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) - sparse( 1:M, 1:M, hopping_ampliude_1, M, M );
172 hopping_ampliude_2 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
173 H1( col_indexes, row_indexes ) = H1( col_indexes, row_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_2, M, M );
175 hopping_ampliude_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
176 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) - sparse( 1:M-1, 2:M, hopping_ampliude_3, M, M );
178 H1_skew_left( col_indexes, row_indexes ) = H1_skew_left( col_indexes, row_indexes ) + sparse( M, 1, hopping_ampliude_2, M, M);
179 H1_skew_left( row_indexes, col_indexes ) = H1_skew_left( row_indexes, col_indexes ) - sparse( M, 1, hopping_ampliude_3, M, M);
181 % +delta_3 directions
182 hopping_ampliude_2 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
183 hopping_ampliude_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
184 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) - sparse( 1:M-1, 2:M, hopping_ampliude_2, M, M );
185 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_3, M, M );
186 H1_transverse( col_indexes, row_indexes ) = H1_transverse( col_indexes, row_indexes ) - sparse( M, 1, hopping_ampliude_2, M, M);
187 H1_transverse( row_indexes, col_indexes ) = H1_transverse( row_indexes, col_indexes ) + sparse( M, 1, hopping_ampliude_3, M, M);
189 % - delta_3 direction
190 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 2:M, 1:M-1, hopping_ampliude_3, M, M );
191 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) - sparse( 2:M, 1:M-1, hopping_ampliude_2, M, M );
196 % ********** adding off-diagonal coupling elements between the different atom types *********
198 % obtaining derived hopping parameters t_4__i_j
199 t_4__hoppings = lead_param.Calc_t_4__i_j();
201 % M_2 symmetry (+), EQ (7) in <a href="https:
202 orbital_indexes1 = [3, 5, 4, 10, 9, 11, 10];
203 orbital_indexes2 = [1, 1, 2, 6, 7, 7, 8];
204 for idx = 1:length( orbital_indexes1 )
205 orbital_index1 = orbital_indexes1(idx);
206 orbital_index2 = orbital_indexes2(idx);
207 row_indexes = (orbital_index1-1)*M + (1:M);
208 col_indexes = (orbital_index2-1)*M + (1:M);
210 % +/-delta_4 direction
211 hopping_ampliude_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
212 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
213 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
215 % + delta_6 direction
216 hopping_ampliude_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
217 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) - sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
224 % M_2 symmetry (-), EQ (8) in <a href="https:
225 orbital_indexes1 = [4, 3, 5, 9, 11, 10, 9, 11];
226 orbital_indexes2 = [1, 2, 2, 6, 6, 7, 8, 8];
227 for idx = 1:length( orbital_indexes1 )
228 orbital_index1 = orbital_indexes1(idx);
229 orbital_index2 = orbital_indexes2(idx);
230 row_indexes = (orbital_index1-1)*M + (1:M);
231 col_indexes = (orbital_index2-1)*M + (1:M);
233 % +/-delta_4 direction
234 hopping_ampliude_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
235 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
236 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
238 % + delta_6 direction
239 hopping_ampliude_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
240 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
242 % + delta_5 direction
243 hopping_ampliude_5 = lead_param.(['t_5__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
244 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_5, M, M );
245 H1_skew_left( row_indexes, col_indexes ) = H1_skew_left( row_indexes, col_indexes ) + sparse( M, 1, hopping_ampliude_5, M, M);
253 end % end public methods
256 methods (Access = protected, Static = true)
259 %% Triangle_Lattice_Hamiltonians
260 %> @brief Creates
Hamiltonians H_0 and H_1 for a simple triangle lattice
261 %> @
param epsilon The on-site energy
262 %> @
param t_1 ?????????
263 %> @
param t_2 ?????????
264 %> @
param M Number of
sites in the cross section of the lead.
265 %> @return [1] The Hamiltonian of one slab in the ribbon.
266 %> @return [2] The coupling between the slabs.
267 %> @return [3] The transverse coupling between the slabs for transverse calculations.
268 %> @return [4] A structure
Coordinates containing the coordinates of the
sites.
269 function [H0, H1, H1_transverse, H1_skew_left, cCoordinates] = Triangle_Lattice_Hamiltonians( epsilon, t_1, t_2, M )
275 H0 = sparse( 1:M, 1:M, epsilon, M, M) + ... on-site terms
276 sparse( 2:M, 1:M-1, t_2, M, M) + ... hopping term (-delta_3 direction)
277 sparse( 1:M-1, 2:M, t_2, M, M); % hopping term (delta_3 direction)
279 H1 = sparse( 1:M, 1:M, t_1, M, M) + ... hopping terms (delta_1 direction)
280 sparse( 1:M-1, 2:M, t_2, M, M); % hopping terms (delta_2 direction)
282 % creating coordinates
284 cCoordinates.LatticeConstant = 1;
285 cCoordinates.a = [1; 0];
286 cCoordinates.b = [-0.5; sqrt(3)/2 ];
288 cCoordinates.x = cCoordinates.b(1)*(1:M)';
289 cCoordinates.y = cCoordinates.b(2)*(1:M)';
291 % Transverse coupling
292 H1_transverse = sparse( M, 1, t_2, M, M); % (delta_3 direction)
294 % skew coupling in the left direction
295 H1_skew_left = sparse( M, 1, t_2, M, M); % (delta_2 direction)
300 end % end static methods
Class containing physical parameters of the lattice of monolayer transitional dichalcogenides accordi...
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 ...
Class to create the Hamiltonian of one unit cell in a translational invariant lead made of TMDC_Monol...
Structure sites contains data to identify the individual sites in a matrix.
Structure containing the coordinates and other quantum number identifiers of the sites in the Hamilto...
function structures(name)