Eötvös Quantum Utilities  v4.9.146
Providing the Horsepowers in the Quantum Realm
TMDC_Monolayer_Lead_Hamiltonians.m
Go to the documentation of this file.
1 %% Eotvos Quantum Transport Utilities - TMDC_Monolayer_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 lattices Lattices
18 %> @{
20 %> @brief Class to create the Hamiltonian of one unit cell in a translational invariant lead made of TMDC_Monolayer lattice structure.
21 %> @}
22 %> @brief Class to create the Hamiltonian of one unit cell in a translational invariant lead made of TMDC_Monolayer lattice structure.
23 %%
25 
26 
27 methods (Access = public)
28 %% TMDC_Monolayer_Hamiltonians
29 %> @brief Creates Hamiltonians H_0 and H_1 for TMDC_Monolayer lattice structure
30 %> @param lead_param An instance of structure #Lattice_TMDC_Monolayer (or its subclass) containing the physical parameters.
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 )
37 
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');
42  end
43 
44  if isempty(M)
45  error(['EQuUs:Lattices:', class(obj), ':TMDC_Monolayer_Hamiltonians'], 'The input parameter M is empty')
46  end
47 
48  % defining orbital types according to Table II in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
49  orbitals = {'d0_xz', 'd0_yz', 'p0_z', 'p0_x', 'p0_y', 'de_z2', 'de_xy', 'de_x2y2', 'pe_z', 'pe_x', 'pe_y'};
50 
51  % number of orbitals
52  orbitals_num = 11;
53 
54  % coordinates shift of the atomic sites
55  a1 = [1; 0];
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 };
59 
60  % creating cell arrays for the Hamiltonians
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);
65 
66  % creating cell array of the coordinates
67  cCoordinates_orbitals = cell( orbitals_num, 1);
68 
69  % obtaining derived hopping parameters t_2__i_i
70  t_2__hoppings = lead_param.Calc_t_2__i_i();
71 
72  % creating triangular lattice for each atomic orbital
73  for idx = 1:orbitals_num
74 
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}};
82 
83  % shift the given sublattice coordinates
84  cCoordinates_orbitals{idx} = cCoordinates_orbitals{idx}.Shift( coordinates_shifts{idx} );
85 
86  end
87 
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{:});
93 
94  % combining coordinates structures
95  cCoordinates = cCoordinates_orbitals{1};
96  for idx = 2:orbitals_num
97  cCoordinates = cCoordinates.Combine( cCoordinates_orbitals{idx} );
98  end
99 
100  % setting the lattice constant
101  cCoordinates.LatticeConstant = lead_param.a;
102 
103 
104 
105 
106  % ********** adding off-diagonal coupling elements between the same atom types *********
107 
108  % obtaining derived hopping parameters t_2__i_j
109  t_2__hoppings = lead_param.Calc_t_2__i_j();
110 
111  % obtaining derived hopping parameters t_3__i_j
112  t_3__hoppings = lead_param.Calc_t_3__i_j();
113 
114  % M_2 symmetry (+), EQ (5) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
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);
122 
123  % +delta_1 direction
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 );
127 
128  % +delta_2 direction
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 );
131 
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 );
134 
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);
137 
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);
145 
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 );
149  end
150 
151 
152 
153 
154 
155  % M_2 symmetry (-), EQ (6) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
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);
163 
164  % -delta_1 direction
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 );
168 
169  % +delta_2 direction
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 );
172 
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 );
175 
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);
178 
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);
186 
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 );
190  end
191 
192 
193 
194  % ********** adding off-diagonal coupling elements between the different atom types *********
195 
196  % obtaining derived hopping parameters t_4__i_j
197  t_4__hoppings = lead_param.Calc_t_4__i_j();
198 
199  % M_2 symmetry (+), EQ (7) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
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);
207 
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 );
212 
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 );
216 
217  end
218 
219 
220 
221 
222  % M_2 symmetry (-), EQ (8) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
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);
230 
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 );
235 
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 );
239 
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);
244 
245  end
246 
247 
248  end
249 
250 
251 end % end public methods
252 
253 
254 methods (Access = protected, Static = true)
255 
256 
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 )
268 
269  if isempty(M)
270  error(['EQuUs:TMDC_Monolayer_Lead_Hamiltonians:Triangle_Lattice_Hamiltonians'], 'The input parameter M is empty')
271  end
272 
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)
276 
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)
279 
280  % creating coordinates
281  cCoordinates = structures('coordinates');
282  cCoordinates.LatticeConstant = 1;
283  cCoordinates.a = [1; 0];
284  cCoordinates.b = [-0.5; sqrt(3)/2 ];
285 
286  cCoordinates.x = cCoordinates.b(1)*(1:M)';
287  cCoordinates.y = cCoordinates.b(2)*(1:M)';
288 
289  % Transverse coupling
290  H1_transverse = sparse( M, 1, t_2, M, M); % (delta_3 direction)
291 
292  % skew coupling in the left direction
293  H1_skew_left = sparse( M, 1, t_2, M, M); % (delta_2 direction)
294 
295  end
296 
297 
298 end % end static methods
299 
300 end
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.
function()
Structure param contains data structures describing the physical parameters of the scattering center ...
Definition: structures.m:45
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.
Definition: structures.m:187
Structure containing the coordinates and other quantum number identifiers of the sites in the Hamilto...
Definition: Coordinates.m:24
function structures(name)