Eötvös Quantum Utilities  v5.0.144
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 %> @image html TMDC_monolayer.jpg
31 %> @image latex TMDC_monolayer.jpg
32 %> @param lead_param An instance of structure #Lattice_TMDC_Monolayer (or its subclass) containing the physical parameters.
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 )
39 
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');
44  end
45 
46  if isempty(M)
47  error(['EQuUs:Lattices:', class(obj), ':TMDC_Monolayer_Hamiltonians'], 'The input parameter M is empty')
48  end
49 
50  % 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>
51  orbitals = {'d0_xz', 'd0_yz', 'p0_z', 'p0_x', 'p0_y', 'de_z2', 'de_xy', 'de_x2y2', 'pe_z', 'pe_x', 'pe_y'};
52 
53  % number of orbitals
54  orbitals_num = 11;
55 
56  % coordinates shift of the atomic sites
57  a1 = [1; 0];
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 };
61 
62  % creating cell arrays for the Hamiltonians
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);
67 
68  % creating cell array of the coordinates
69  cCoordinates_orbitals = cell( orbitals_num, 1);
70 
71  % obtaining derived hopping parameters t_2__i_i
72  t_2__hoppings = lead_param.Calc_t_2__i_i();
73 
74  % creating triangular lattice for each atomic orbital
75  for idx = 1:orbitals_num
76 
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}};
84 
85  % shift the given sublattice coordinates
86  cCoordinates_orbitals{idx} = cCoordinates_orbitals{idx}.Shift( coordinates_shifts{idx} );
87 
88  end
89 
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{:});
95 
96  % combining coordinates structures
97  cCoordinates = cCoordinates_orbitals{1};
98  for idx = 2:orbitals_num
99  cCoordinates = cCoordinates.Combine( cCoordinates_orbitals{idx} );
100  end
101 
102  % setting the lattice constant
103  cCoordinates.LatticeConstant = lead_param.a;
104 
105 
106 
107 
108  % ********** adding off-diagonal coupling elements between the same atom types *********
109 
110  % obtaining derived hopping parameters t_2__i_j
111  t_2__hoppings = lead_param.Calc_t_2__i_j();
112 
113  % obtaining derived hopping parameters t_3__i_j
114  t_3__hoppings = lead_param.Calc_t_3__i_j();
115 
116  % M_2 symmetry (+), EQ (5) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
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);
124 
125  % +delta_1 direction
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 );
129 
130  % +delta_2 direction
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 );
133 
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 );
136 
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);
139 
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);
147 
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 );
151  end
152 
153 
154 
155 
156 
157  % M_2 symmetry (-), EQ (6) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
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);
165 
166  % -delta_1 direction
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 );
170 
171  % +delta_2 direction
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 );
174 
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 );
177 
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);
180 
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);
188 
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 );
192  end
193 
194 
195 
196  % ********** adding off-diagonal coupling elements between the different atom types *********
197 
198  % obtaining derived hopping parameters t_4__i_j
199  t_4__hoppings = lead_param.Calc_t_4__i_j();
200 
201  % M_2 symmetry (+), EQ (7) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
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);
209 
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 );
214 
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 );
218 
219  end
220 
221 
222 
223 
224  % M_2 symmetry (-), EQ (8) in <a href="https://journals.aps.org/prb/abstract/10.1103/PhysRevB.92.205108">PRB 92 205108</a>
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);
232 
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 );
237 
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 );
241 
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);
246 
247  end
248 
249 
250  end
251 
252 
253 end % end public methods
254 
255 
256 methods (Access = protected, Static = true)
257 
258 
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 )
270 
271  if isempty(M)
272  error(['EQuUs:TMDC_Monolayer_Lead_Hamiltonians:Triangle_Lattice_Hamiltonians'], 'The input parameter M is empty')
273  end
274 
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)
278 
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)
281 
282  % creating coordinates
283  cCoordinates = structures('coordinates');
284  cCoordinates.LatticeConstant = 1;
285  cCoordinates.a = [1; 0];
286  cCoordinates.b = [-0.5; sqrt(3)/2 ];
287 
288  cCoordinates.x = cCoordinates.b(1)*(1:M)';
289  cCoordinates.y = cCoordinates.b(2)*(1:M)';
290 
291  % Transverse coupling
292  H1_transverse = sparse( M, 1, t_2, M, M); % (delta_3 direction)
293 
294  % skew coupling in the left direction
295  H1_skew_left = sparse( M, 1, t_2, M, M); % (delta_2 direction)
296 
297  end
298 
299 
300 end % end static methods
301 
302 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.
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)