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
31 %> @
param M Number of
sites in the cross section of the lead.
32 %> @
return [1] The Hamiltonian of one slab in the ribbon.
33 %> @
return [2] The coupling between the slabs.
34 %> @
return [3] The transverse coupling between the slabs
for transverse calculations.
35 %> @
return [4] A structure
Coordinates containing the coordinates of the
sites.
36 function [H0, H1, H1_transverse, H1_skew_left, cCoordinates] = TMDC_Monolayer_Hamiltonians( obj, lead_param, M )
38 % check the structure containing the physical parameters
39 supClasses = superclasses(lead_param);
40 if sum( strcmp( supClasses,
'Lattice_TMDC_Monolayer' ) ) == 0
41 error([
'EQuUs:Lattices:',
class(obj),
':TMDC_Monolayer_Hamiltonians'],
'Invalid type of the input parameter');
45 error([
'EQuUs:Lattices:',
class(obj),
':TMDC_Monolayer_Hamiltonians'],
'The input parameter M is empty')
48 % defining orbital types according to Table II in <a href="https:
49 orbitals = {
'd0_xz',
'd0_yz',
'p0_z',
'p0_x',
'p0_y',
'de_z2',
'de_xy',
'de_x2y2',
'pe_z',
'pe_x',
'pe_y'};
54 % coordinates shift of the atomic
sites 56 a2 = [-0.5; sqrt(3)/2 ];
57 coordinates_shift = (2*a1+a2)/3;
58 coordinates_shifts = { [0;0], [0;0], coordinates_shift, coordinates_shift, coordinates_shift, [0;0], [0;0], [0;0], coordinates_shift, coordinates_shift, coordinates_shift };
61 H0_orbitals = cell( orbitals_num, 1);
62 H1_orbitals = cell( orbitals_num, 1);
63 H1_orbitals_transverse = cell( orbitals_num, 1);
64 H1_orbitals_skew_left = cell( orbitals_num, 1);
66 % creating cell array of the coordinates
67 cCoordinates_orbitals = cell( orbitals_num, 1);
69 % obtaining derived hopping parameters t_2__i_i
70 t_2__hoppings = lead_param.Calc_t_2__i_i();
72 % creating triangular lattice
for each atomic orbital
73 for idx = 1:orbitals_num
75 parameter_extension = [
'__', num2str(idx),
'_', num2str(idx)];
76 epsilon = lead_param.([
'epsilon', num2str(idx)]);
77 t_1 = lead_param.([
't_1', parameter_extension]);
78 t_2 = t_2__hoppings.([
't_2', parameter_extension]);
79 [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 );
80 cCoordinates_orbitals{idx}.OrbitalTypes = cell( length(cCoordinates_orbitals{idx}.x), 1);
81 cCoordinates_orbitals{idx}.OrbitalTypes(:) = {orbitals{idx}};
83 % shift the given sublattice coordinates
84 cCoordinates_orbitals{idx} = cCoordinates_orbitals{idx}.Shift( coordinates_shifts{idx} );
88 % creating the big Hamiltonian from the block-diagonal parts
89 H0 = blkdiag(H0_orbitals{:});
90 H1 = blkdiag(H1_orbitals{:});
91 H1_transverse = blkdiag(H1_orbitals_transverse{:});
92 H1_skew_left = blkdiag(H1_orbitals_skew_left{:});
95 cCoordinates = cCoordinates_orbitals{1};
96 for idx = 2:orbitals_num
97 cCoordinates = cCoordinates.Combine( cCoordinates_orbitals{idx} );
100 % setting the lattice constant
101 cCoordinates.LatticeConstant = lead_param.a;
106 % ********** adding off-diagonal coupling elements between the same atom types *********
108 % obtaining derived hopping parameters t_2__i_j
109 t_2__hoppings = lead_param.Calc_t_2__i_j();
111 % obtaining derived hopping parameters t_3__i_j
112 t_3__hoppings = lead_param.Calc_t_3__i_j();
114 % M_2 symmetry (+), EQ (5) in <a href="https:
115 orbital_indexes1 = [3, 6, 9];
116 orbital_indexes2 = [5, 8, 11];
117 for idx = 1:length( orbital_indexes1 )
118 orbital_index1 = orbital_indexes1(idx);
119 orbital_index2 = orbital_indexes2(idx);
120 row_indexes = (orbital_index1-1)*M + (1:M);
121 col_indexes = (orbital_index2-1)*M + (1:M);
124 hopping_ampliude_4 = lead_param.(['t_1__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
125 H1( col_indexes, row_indexes ) = H1( col_indexes, row_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
126 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
129 hopping_ampliude_4 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
130 H1( col_indexes, row_indexes ) = H1( col_indexes, row_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_4, M, M );
132 hopping_ampliude_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
133 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_3, M, M );
135 H1_skew_left( col_indexes, row_indexes ) = H1_skew_left( col_indexes, row_indexes ) + sparse( M, 1, hopping_ampliude_4, M, M);
136 H1_skew_left( row_indexes, col_indexes ) = H1_skew_left( row_indexes, col_indexes ) + sparse( M, 1, hopping_ampliude_3, M, M);
138 % +delta_3 directions
139 hopping_ampliude_4 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
140 hopping_ampliude_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
141 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_4, M, M );
142 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_3, M, M );
143 H1_transverse( col_indexes, row_indexes ) = H1_transverse( col_indexes, row_indexes ) + sparse( M, 1, hopping_ampliude_4, M, M);
144 H1_transverse( row_indexes, col_indexes ) = H1_transverse( row_indexes, col_indexes ) + sparse( M, 1, hopping_ampliude_3, M, M);
146 % - delta_3 direction
147 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 2:M, 1:M-1, hopping_ampliude_3, M, M );
148 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 2:M, 1:M-1, hopping_ampliude_4, M, M );
155 % M_2 symmetry (-), EQ (6) in <a href="https:
156 orbital_indexes1 = [1, 3, 4, 6, 7, 9, 10];
157 orbital_indexes2 = [2, 4, 5, 7, 8, 10, 11];
158 for idx = 1:length( orbital_indexes1 )
159 orbital_index1 = orbital_indexes1(idx);
160 orbital_index2 = orbital_indexes2(idx);
161 row_indexes = (orbital_index1-1)*M + (1:M);
162 col_indexes = (orbital_index2-1)*M + (1:M);
165 hopping_ampliude_1 = lead_param.(['t_1__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
166 H1( col_indexes, row_indexes ) = H1( col_indexes, row_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_1, M, M );
167 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) - sparse( 1:M, 1:M, hopping_ampliude_1, M, M );
170 hopping_ampliude_2 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
171 H1( col_indexes, row_indexes ) = H1( col_indexes, row_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_2, M, M );
173 hopping_ampliude_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
174 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) - sparse( 1:M-1, 2:M, hopping_ampliude_3, M, M );
176 H1_skew_left( col_indexes, row_indexes ) = H1_skew_left( col_indexes, row_indexes ) + sparse( M, 1, hopping_ampliude_2, M, M);
177 H1_skew_left( row_indexes, col_indexes ) = H1_skew_left( row_indexes, col_indexes ) - sparse( M, 1, hopping_ampliude_3, M, M);
179 % +delta_3 directions
180 hopping_ampliude_2 = t_2__hoppings.(['t_2__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
181 hopping_ampliude_3 = t_3__hoppings.(['t_3__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
182 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) - sparse( 1:M-1, 2:M, hopping_ampliude_2, M, M );
183 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_3, M, M );
184 H1_transverse( col_indexes, row_indexes ) = H1_transverse( col_indexes, row_indexes ) - sparse( M, 1, hopping_ampliude_2, M, M);
185 H1_transverse( row_indexes, col_indexes ) = H1_transverse( row_indexes, col_indexes ) + sparse( M, 1, hopping_ampliude_3, M, M);
187 % - delta_3 direction
188 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 2:M, 1:M-1, hopping_ampliude_3, M, M );
189 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) - sparse( 2:M, 1:M-1, hopping_ampliude_2, M, M );
194 % ********** adding off-diagonal coupling elements between the different atom types *********
196 % obtaining derived hopping parameters t_4__i_j
197 t_4__hoppings = lead_param.Calc_t_4__i_j();
199 % M_2 symmetry (+), EQ (7) in <a href="https:
200 orbital_indexes1 = [3, 5, 4, 10, 9, 11, 10];
201 orbital_indexes2 = [1, 1, 2, 6, 7, 7, 8];
202 for idx = 1:length( orbital_indexes1 )
203 orbital_index1 = orbital_indexes1(idx);
204 orbital_index2 = orbital_indexes2(idx);
205 row_indexes = (orbital_index1-1)*M + (1:M);
206 col_indexes = (orbital_index2-1)*M + (1:M);
208 % +/-delta_4 direction
209 hopping_ampliude_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
210 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
211 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
213 % + delta_6 direction
214 hopping_ampliude_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
215 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) - sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
222 % M_2 symmetry (-), EQ (8) in <a href="https:
223 orbital_indexes1 = [4, 3, 5, 9, 11, 10, 9, 11];
224 orbital_indexes2 = [1, 2, 2, 6, 6, 7, 8, 8];
225 for idx = 1:length( orbital_indexes1 )
226 orbital_index1 = orbital_indexes1(idx);
227 orbital_index2 = orbital_indexes2(idx);
228 row_indexes = (orbital_index1-1)*M + (1:M);
229 col_indexes = (orbital_index2-1)*M + (1:M);
231 % +/-delta_4 direction
232 hopping_ampliude_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
233 H0( col_indexes, row_indexes ) = H0( col_indexes, row_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
234 H0( row_indexes, col_indexes ) = H0( row_indexes, col_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
236 % + delta_6 direction
237 hopping_ampliude_4 = t_4__hoppings.(['t_4__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
238 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) + sparse( 1:M, 1:M, hopping_ampliude_4, M, M );
240 % + delta_5 direction
241 hopping_ampliude_5 = lead_param.(['t_5__', num2str(orbital_index1), '_', num2str(orbital_index2)]);
242 H1( row_indexes, col_indexes ) = H1( row_indexes, col_indexes ) + sparse( 1:M-1, 2:M, hopping_ampliude_5, M, M );
243 H1_skew_left( row_indexes, col_indexes ) = H1_skew_left( row_indexes, col_indexes ) + sparse( M, 1, hopping_ampliude_5, M, M);
251 end % end public methods
254 methods (Access = protected, Static = true)
257 %% Triangle_Lattice_Hamiltonians
258 %> @brief Creates
Hamiltonians H_0 and H_1 for a simple triangle lattice
259 %> @
param epsilon The on-site energy
260 %> @
param t_1 ?????????
261 %> @
param t_2 ?????????
262 %> @
param M Number of
sites in the cross section of the lead.
263 %> @return [1] The Hamiltonian of one slab in the ribbon.
264 %> @return [2] The coupling between the slabs.
265 %> @return [3] The transverse coupling between the slabs for transverse calculations.
266 %> @return [4] A structure
Coordinates containing the coordinates of the
sites.
267 function [H0, H1, H1_transverse, H1_skew_left, cCoordinates] = Triangle_Lattice_Hamiltonians( epsilon, t_1, t_2, M )
273 H0 = sparse( 1:M, 1:M, epsilon, M, M) + ... on-site terms
274 sparse( 2:M, 1:M-1, t_2, M, M) + ... hopping term (-delta_3 direction)
275 sparse( 1:M-1, 2:M, t_2, M, M); % hopping term (delta_3 direction)
277 H1 = sparse( 1:M, 1:M, t_1, M, M) + ... hopping terms (delta_1 direction)
278 sparse( 1:M-1, 2:M, t_2, M, M); % hopping terms (delta_2 direction)
280 % creating coordinates
282 cCoordinates.LatticeConstant = 1;
283 cCoordinates.a = [1; 0];
284 cCoordinates.b = [-0.5; sqrt(3)/2 ];
286 cCoordinates.x = cCoordinates.b(1)*(1:M)';
287 cCoordinates.y = cCoordinates.b(2)*(1:M)';
289 % Transverse coupling
290 H1_transverse = sparse( M, 1, t_2, M, M); % (delta_3 direction)
292 % skew coupling in the left direction
293 H1_skew_left = sparse( M, 1, t_2, M, M); % (delta_2 direction)
298 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)