Line data Source code
1 :
2 : #if defined HAVE_CONFIG_H
3 : #include "config.h"
4 : #endif
5 :
6 : #include "abi_common.h"
7 :
8 : module m_tdep_qpt
9 :
10 : use defs_basis
11 : use m_errors
12 : use m_abicore
13 : use m_xmpi
14 : use m_tdep_dataset, only : atdep_dataset_type, MPI_enreg_type
15 : use m_tdep_latt, only : Lattice_type
16 :
17 : implicit none
18 :
19 : type QptBound_type
20 :
21 : integer :: ihol,center
22 : character (len=5) :: letter
23 : double precision :: x,y,z
24 :
25 : end type QptBound_type
26 :
27 : type Qpoints_type
28 :
29 : integer :: nqpt,qpt_tot,qptbound_tot
30 : integer, allocatable :: lgth_segments(:)
31 : double precision, allocatable :: qpt_red(:,:),qpt_cart(:,:)
32 : double precision, allocatable :: special_red(:,:),special_cart(:,:)
33 : character (len=5), allocatable :: special_qpt(:)
34 :
35 : end type Qpoints_type
36 :
37 : public :: tdep_make_qptpath
38 : public :: tdep_make_specialqpt
39 : public :: tdep_destroy_qpt
40 :
41 : contains
42 :
43 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
44 44 : subroutine tdep_make_specialqpt(Invar,Lattice,MPIdata,Qpt,QptBound)
45 :
46 : integer :: qpt_tot,qptbound_tot
47 : double precision :: zeta,eta,delta,mu,nu,angle_alpha
48 : type(atdep_dataset_type),intent(in) :: Invar
49 : type(QptBound_type), allocatable,intent(out) :: QptBound(:)
50 : type(Lattice_type),intent(in) :: Lattice
51 : type(Qpoints_type),intent(out) :: Qpt
52 : type(MPI_enreg_type), intent(in) :: MPIdata
53 :
54 : ! For bravais(1):
55 : ! The holohedral groups are numbered as follows
56 : ! (see international tables for crystallography (1983), p. 13)
57 : ! iholohedry=1 triclinic 1bar
58 : ! iholohedry=2 monoclinic 2/m
59 : ! iholohedry=3 orthorhombic mmm
60 : ! iholohedry=4 tetragonal 4/mmm
61 : ! iholohedry=5 trigonal 3bar m
62 : ! iholohedry=6 hexagonal 6/mmm
63 : ! iholohedry=7 cubic m3bar m
64 :
65 : ! For bravais(2):
66 : ! Centering
67 : ! center=0 no centering
68 : ! center=-1 body-centered
69 : ! center=-3 face-centered
70 : ! center=1 A-face centered
71 : ! center=2 B-face centered
72 : ! center=3 C-face centered
73 :
74 : ! Define the special Q points IN GENERAL
75 : ! Here we use the definitions of special Q points in reduced coordinates
76 : ! as defined in the article: Setyawan and Curtarolo CMS 49, 299 (2010)
77 44 : if ((Invar%bravais(1).eq.2).and.(Invar%bravais(2).eq.0)) then
78 : !FB qptbound_tot=16
79 1 : qptbound_tot=10
80 1 : angle_alpha=Lattice%angle_alpha
81 1 : eta=(1.-Lattice%acell_unitcell(2)*dcos(angle_alpha*pi/180.d0)/Lattice%acell_unitcell(3))/(2.*dsin(angle_alpha*pi/180.d0)**2)
82 1 : nu = 1./2.-eta*Lattice%acell_unitcell(3)*dcos(angle_alpha*pi/180.d0)/Lattice%acell_unitcell(2)
83 1 : ABI_MALLOC(QptBound,(qptbound_tot))
84 : QptBound(:)=(/ QptBound_type (2, 0,'G ', 0.000, 0.000, 0.000),&
85 : & QptBound_type (2, 0,'A ', 0.500, 0.500, 0.000),&
86 : & QptBound_type (2, 0,'C ', 0.000, 0.500, 0.500),&
87 : & QptBound_type (2, 0,'D ', 0.500, 0.000, 0.500),&
88 : & QptBound_type (2, 0,'D1', 0.500, 0.000,-0.500),&
89 : & QptBound_type (2, 0,'E ', 0.500, 0.500, 0.500),&
90 : !FB& QptBound_type (2, 0,'H ', 0.000, eta , 1-nu ),&
91 : !FB& QptBound_type (2, 0,'H1', 0.000, 1-eta, nu ),&
92 : !FB& QptBound_type (2, 0,'H2', 0.000, eta , -nu ),&
93 : !FB& QptBound_type (2, 0,'M ', 0.500, eta , 1-nu ),&
94 : !FB& QptBound_type (2, 0,'M1', 0.500, 1-eta, nu ),&
95 : !FB& QptBound_type (2, 0,'M2', 0.500, eta , -nu ),&
96 : & QptBound_type (2, 0,'X ', 0.000, 0.500, 0.000),&
97 : & QptBound_type (2, 0,'Y ', 0.000, 0.000, 0.500),&
98 : & QptBound_type (2, 0,'Y1', 0.000, 0.000,-0.500),&
99 11 : & QptBound_type (2, 0,'Z ', 0.500, 0.000, 0.000) /)
100 43 : else if ((Invar%bravais(1).eq.3).and.(Invar%bravais(2).eq.0)) then
101 2 : qptbound_tot=8
102 2 : ABI_MALLOC(QptBound,(qptbound_tot))
103 : QptBound(:)=(/ QptBound_type (3, 0,'G ', 0.000, 0.000, 0.000),&
104 : & QptBound_type (3, 0,'R ', 0.500, 0.500, 0.500),&
105 : & QptBound_type (3, 0,'S ', 0.500, 0.500, 0.000),&
106 : & QptBound_type (3, 0,'T ', 0.000, 0.500, 0.500),&
107 : & QptBound_type (3, 0,'U ', 0.500, 0.000, 0.500),&
108 : & QptBound_type (3, 0,'X ', 0.500, 0.000, 0.000),&
109 : & QptBound_type (3, 0,'Y ', 0.000, 0.500, 0.000),&
110 18 : & QptBound_type (3, 0,'Z ', 0.000, 0.000, 0.500) /)
111 41 : else if ((Invar%bravais(1).eq.3).and.(Invar%bravais(2).eq.-1)) then
112 0 : zeta =(1.d0+Lattice%acell_unitcell(1)**2/Lattice%acell_unitcell(3)**2)/4.d0
113 0 : eta =(1.d0+Lattice%acell_unitcell(2)**2/Lattice%acell_unitcell(3)**2)/4.d0
114 0 : delta=(Lattice%acell_unitcell(2)**2-Lattice%acell_unitcell(1)**2)/(4.d0*Lattice%acell_unitcell(3)**2)
115 0 : mu =(Lattice%acell_unitcell(1)**2+Lattice%acell_unitcell(2)**2)/(4.d0*Lattice%acell_unitcell(3)**2)
116 0 : qptbound_tot=13
117 0 : ABI_MALLOC(QptBound,(qptbound_tot))
118 : QptBound(:)=(/ QptBound_type (3,-1,'G ', 0.000 , 0.000 , 0.000),&
119 : & QptBound_type (3,-1,'L ',-mu , mu , 0.5-delta),&
120 : & QptBound_type (3,-1,'L1', mu ,-mu , 0.5+delta),&
121 : & QptBound_type (3,-1,'L2', 0.5-delta, 0.5+delta,-mu),&
122 : & QptBound_type (3,-1,'R ', 0.000 , 0.500 , 0.000),&
123 : & QptBound_type (3,-1,'S ', 0.500 , 0.000 , 0.000),&
124 : & QptBound_type (3,-1,'T ', 0.000 , 0.000 , 0.500),&
125 : & QptBound_type (3,-1,'W ', 0.250 , 0.250 , 0.250),&
126 : & QptBound_type (3,-1,'X ',-zeta , zeta , zeta ),&
127 : & QptBound_type (3,-1,'X1', zeta , 1-zeta ,-zeta),&
128 : & QptBound_type (3,-1,'Y ', eta ,-eta , eta),&
129 : & QptBound_type (3,-1,'Y1', 1-eta , eta ,-eta),&
130 0 : & QptBound_type (3,-1,'Z ', 0.500 , 0.500 ,-0.500) /)
131 41 : else if ((Invar%bravais(1).eq.3).and.(Invar%bravais(2).eq.3)) then
132 7 : zeta=(1.d0+Lattice%acell_unitcell(1)**2/Lattice%acell_unitcell(2)**2)/4.d0
133 7 : qptbound_tot=13
134 7 : ABI_MALLOC(QptBound,(qptbound_tot))
135 : QptBound(:)=(/ QptBound_type (3, 3,'G ', 0.000, 0.000, 0.000),&
136 : & QptBound_type (3, 3,'Gp', 1.000, 0.000, 0.000),&
137 : & QptBound_type (3, 3,'A ', zeta , zeta , 0.500),&
138 : & QptBound_type (3, 3,'A1',-zeta ,1-zeta, 0.500),&
139 : & QptBound_type (3, 3,'R ', 0.000, 0.500, 0.500),&
140 : & QptBound_type (3, 3,'S ', 0.000, 0.500, 0.000),&
141 : & QptBound_type (3, 3,'T ',-0.500, 0.500, 0.500),&
142 : & QptBound_type (3, 3,'X ', zeta , zeta , 0.000),&
143 : & QptBound_type (3, 3,'X1',-zeta ,1-zeta, 0.000),&
144 : & QptBound_type (3, 3,'Y ',-0.500, 0.500, 0.000),&
145 : & QptBound_type (3, 3,'Yp', 0.500, 0.500, 0.000),&
146 : & QptBound_type (3, 3,'Z ', 0.000, 0.000, 0.500),&
147 98 : & QptBound_type (3, 3,'Zp', 1.000, 0.000, 0.500) /)
148 34 : else if ((Invar%bravais(1).eq.4).and.(Invar%bravais(2).eq.0)) then
149 0 : qptbound_tot=6
150 0 : ABI_MALLOC(QptBound,(qptbound_tot))
151 : QptBound(:)=(/ QptBound_type (4, 0,'G ', 0.000, 0.000, 0.000),&
152 : & QptBound_type (4, 0,'A ', 0.500, 0.500, 0.500),&
153 : & QptBound_type (4, 0,'M ', 0.500, 0.500, 0.000),&
154 : & QptBound_type (4, 0,'R ', 0.000, 0.500, 0.500),&
155 : & QptBound_type (4, 0,'X ', 0.000, 0.500, 0.000),&
156 0 : & QptBound_type (4, 0,'Z ', 0.000, 0.000, 0.500) /)
157 34 : else if ((Invar%bravais(1).eq.4).and.(Invar%bravais(2).eq.-1)) then
158 2 : if (Lattice%acell_unitcell(3).lt.Lattice%acell_unitcell(1)) then
159 2 : qptbound_tot=7
160 2 : eta=(1.d0+Lattice%acell_unitcell(3)**2/Lattice%acell_unitcell(1)**2)/4.d0
161 2 : ABI_MALLOC(QptBound,(qptbound_tot))
162 : QptBound(:)=(/ QptBound_type (4,-1,'G ', 0.000, 0.000, 0.000),&
163 : & QptBound_type (4,-1,'M ',-0.500, 0.500, 0.500),&
164 : & QptBound_type (4,-1,'N ', 0.000, 0.500, 0.500),&
165 : & QptBound_type (4,-1,'P ', 0.250, 0.250, 0.250),&
166 : & QptBound_type (4,-1,'X ', 0.000, 0.000, 0.500),&
167 : & QptBound_type (4,-1,'Z ', eta , eta ,-eta ),&
168 16 : & QptBound_type (4,-1,'Z1',-eta ,1.-eta, eta ) /)
169 : else
170 0 : qptbound_tot=9
171 0 : eta=(1.d0+Lattice%acell_unitcell(1)**2/Lattice%acell_unitcell(3)**2)/4.d0
172 0 : zeta=Lattice%acell_unitcell(1)**2/Lattice%acell_unitcell(3)**2/2.d0
173 0 : ABI_MALLOC(QptBound,(qptbound_tot))
174 : QptBound(:)=(/ QptBound_type (4,-1,'G ', 0.000, 0.000, 0.000),&
175 : & QptBound_type (4,-1,'N ', 0.000, 0.500, 0.000),&
176 : & QptBound_type (4,-1,'P ', 0.250, 0.250, 0.250),&
177 : & QptBound_type (4,-1,'S ',-eta , eta , eta ),&
178 : & QptBound_type (4,-1,'S1', eta ,1.-eta,-eta ),&
179 : & QptBound_type (4,-1,'X ', 0.000, 0.000, 0.500),&
180 : & QptBound_type (4,-1,'Y ',-zeta , zeta , 0.500),&
181 : & QptBound_type (4,-1,'Y1', 0.500, 0.500,-zeta ),&
182 0 : & QptBound_type (4,-1,'Z ', 0.500, 0.500,-0.500) /)
183 : end if
184 32 : else if ((Invar%bravais(1).eq.5).and.(Invar%bravais(2).eq.0)) then
185 3 : qptbound_tot=9
186 3 : angle_alpha=Lattice%angle_alpha
187 3 : eta=(1d0+4*dcos(angle_alpha*pi/180d0))/(2d0+4*dcos(angle_alpha*pi/180d0))
188 3 : nu=3d0/4d0-eta/2d0
189 3 : ABI_MALLOC(QptBound,(qptbound_tot))
190 : QptBound(:)=(/ QptBound_type (5, 0,'G ', 0.000, 0.000, 0.000),&
191 : & QptBound_type (5, 0,'F ', 0.500, 0.500, 0.000),&
192 : & QptBound_type (5, 0,'F1 ', 0.500, 0.000, -0.500),&
193 : & QptBound_type (5, 0,'L ', 0.500, 0.000, 0.000),&
194 : & QptBound_type (5, 0,'Z ', 0.500, 0.500, 0.500),&
195 : & QptBound_type (5, 0,'Q ', 1-nu,nu,0),&
196 : & QptBound_type (5, 0,'X ', nu,0,-nu),&
197 : & QptBound_type (5, 0,'B1 ', 0.500,1-eta,eta-1),&
198 30 : & QptBound_type (5, 0,'B ', eta,0.500, 1-eta) /)
199 29 : else if ((Invar%bravais(1).eq.6).and.(Invar%bravais(2).eq.0)) then
200 4 : qptbound_tot=6
201 4 : ABI_MALLOC(QptBound,(qptbound_tot))
202 : QptBound(:)=(/ QptBound_type (6, 0,'G ', 0.000, 0.000, 0.000),&
203 : & QptBound_type (6, 0,'A ', 0.000, 0.000, 0.500),&
204 : & QptBound_type (6, 0,'H ', 0.333, 0.333, 0.500),&
205 : & QptBound_type (6, 0,'K ', 0.333, 0.333, 0.000),&
206 : & QptBound_type (6, 0,'L ', 0.500, 0.000, 0.500),&
207 28 : & QptBound_type (6, 0,'M ', 0.500, 0.000, 0.000) /)
208 25 : else if ((Invar%bravais(1).eq.7).and.(Invar%bravais(2).eq.0)) then
209 6 : qptbound_tot=8
210 6 : ABI_MALLOC(QptBound,(qptbound_tot))
211 : QptBound(:)=(/ QptBound_type (7, 0,'G ', 0.000, 0.000, 0.000),&
212 : & QptBound_type (7, 0,'M ', 0.500, 0.500, 0.000),&
213 : & QptBound_type (7, 0,'R ', 0.500, 0.500, 0.500),&
214 : & QptBound_type (7, 0,'X ', 0.000, 0.500, 0.000),&
215 : ! For testing purpose only!!!!!!!!
216 : & QptBound_type (7, 0,'A ', 0.000, 1.000, 0.000),&
217 : & QptBound_type (7, 0,'B ', 0.500, 1.000, 0.000),&
218 : & QptBound_type (7, 0,'C ', 1.000, 1.000, 0.000),&
219 54 : & QptBound_type (7, 0,'D ', 0.750, 0.750, 0.000) /)
220 19 : else if ((Invar%bravais(1).eq.7).and.(Invar%bravais(2).eq.-1)) then
221 4 : qptbound_tot=4
222 4 : ABI_MALLOC(QptBound,(qptbound_tot))
223 : QptBound(:)=(/ QptBound_type (7,-1,'G ', 0.000, 0.000, 0.000),&
224 : & QptBound_type (7,-1,'H ', 0.500,-0.500, 0.500),&
225 : & QptBound_type (7,-1,'P ', 0.250, 0.250, 0.250),&
226 20 : & QptBound_type (7,-1,'N ', 0.000, 0.000, 0.500) /)
227 15 : else if ((Invar%bravais(1).eq.7).and.(Invar%bravais(2).eq.-3)) then
228 15 : qptbound_tot=8
229 15 : ABI_MALLOC(QptBound,(qptbound_tot))
230 : QptBound(:)=(/ QptBound_type (7,-3,'G ', 0.000, 0.000, 0.000),&
231 : & QptBound_type (7,-3,'K ', 0.375, 0.375, 0.750),&
232 : & QptBound_type (7,-3,'L ', 0.500, 0.500, 0.500),&
233 : & QptBound_type (7,-3,'U ', 0.625, 0.250, 0.625),&
234 : & QptBound_type (7,-3,'W ', 0.500, 0.250, 0.750),&
235 : & QptBound_type (7,-3,'X ', 0.500, 0.000, 0.500),&
236 : & QptBound_type (7,-3,'M ', 0.500, 0.500, 0.000),&
237 135 : & QptBound_type (7,-3,'Xp', 0.500, 0.500, 1.000) /)
238 : end if
239 44 : Qpt%qptbound_tot=qptbound_tot
240 :
241 : ! Define the special Q points USED IN THE CALCULATIONS
242 : ! Two cases of generation: default (0) or by hand (>=1)
243 44 : if (Invar%bzpath.eq.0) then
244 34 : write(Invar%stdout,*) 'Generate the BZ path using the Q points defined by default'
245 34 : if (MPIdata%iam_master) then
246 34 : write(40,*) 'Generate the BZ path using the Q points defined by default'
247 : end if
248 34 : if ((Invar%bravais(1).eq.2).and.(Invar%bravais(2).eq.0)) then
249 : ! MONO: G-Y-H-C-E-M1-A-X-H1
250 : !FB qpt_tot=9
251 1 : qpt_tot=5
252 1 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
253 1 : Qpt%special_qpt(1)="X "
254 1 : Qpt%special_qpt(2)="G "
255 1 : Qpt%special_qpt(3)="Y "
256 1 : Qpt%special_qpt(4)="G "
257 1 : Qpt%special_qpt(5)="Z "
258 : !FB Qpt%special_qpt(1)="G "
259 : !FB Qpt%special_qpt(2)="Y "
260 : !FB Qpt%special_qpt(3)="H "
261 : !FB Qpt%special_qpt(4)="C "
262 : !FB Qpt%special_qpt(5)="E "
263 : !FB Qpt%special_qpt(6)="M1"
264 : !FB Qpt%special_qpt(7)="A "
265 : !FB Qpt%special_qpt(8)="X "
266 : !FB Qpt%special_qpt(9)="H1"
267 33 : else if ((Invar%bravais(1).eq.3).and.(Invar%bravais(2).eq.0)) then
268 : ! ORTH: G-X-S-Y-G-Z
269 2 : qpt_tot=6
270 2 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
271 2 : Qpt%special_qpt(1)="G "
272 2 : Qpt%special_qpt(2)="X "
273 2 : Qpt%special_qpt(3)="S "
274 2 : Qpt%special_qpt(4)="Y "
275 2 : Qpt%special_qpt(5)="G "
276 2 : Qpt%special_qpt(6)="Z "
277 31 : else if ((Invar%bravais(1).eq.3).and.(Invar%bravais(2).eq.-1)) then
278 : ! BCO: G-X-L-T-W-R-X1-Z-G-Y-S-W
279 0 : qpt_tot=12
280 0 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
281 0 : Qpt%special_qpt(1)="G "
282 0 : Qpt%special_qpt(2)="X "
283 0 : Qpt%special_qpt(3)="L "
284 0 : Qpt%special_qpt(4)="T "
285 0 : Qpt%special_qpt(5)="W "
286 0 : Qpt%special_qpt(6)="R "
287 0 : Qpt%special_qpt(7)="X1"
288 0 : Qpt%special_qpt(8)="Z "
289 0 : Qpt%special_qpt(9)="G "
290 0 : Qpt%special_qpt(10)="Y "
291 0 : Qpt%special_qpt(11)="S "
292 0 : Qpt%special_qpt(12)="W "
293 31 : else if ((Invar%bravais(1).eq.3).and.(Invar%bravais(2).eq.3)) then
294 : ! ORTH-C: G-Yp-Gp-Z
295 7 : qpt_tot=4
296 7 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
297 7 : Qpt%special_qpt(1) ="G "
298 7 : Qpt%special_qpt(2) ="Yp"
299 7 : Qpt%special_qpt(3) ="Gp"
300 7 : Qpt%special_qpt(4) ="Zp"
301 24 : else if ((Invar%bravais(1).eq.4).and.(Invar%bravais(2).eq.0)) then
302 : ! TET: G-X-M-G-Z-R-A-Z
303 0 : qpt_tot=8
304 0 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
305 0 : Qpt%special_qpt(1) ="G "
306 0 : Qpt%special_qpt(2) ="X "
307 0 : Qpt%special_qpt(3) ="M "
308 0 : Qpt%special_qpt(4) ="G "
309 0 : Qpt%special_qpt(5) ="Z "
310 0 : Qpt%special_qpt(6) ="R "
311 0 : Qpt%special_qpt(7) ="A "
312 0 : Qpt%special_qpt(8) ="Z "
313 24 : else if ((Invar%bravais(1).eq.4).and.(Invar%bravais(2).eq.-1)) then
314 2 : if (Lattice%acell_unitcell(3).lt.Lattice%acell_unitcell(1)) then
315 : ! BCT1: G-X-M-G-Z-P-N-Z1-M
316 2 : qpt_tot=9
317 2 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
318 2 : Qpt%special_qpt(1) ="G "
319 2 : Qpt%special_qpt(2) ="X "
320 2 : Qpt%special_qpt(3) ="M "
321 2 : Qpt%special_qpt(4) ="G "
322 2 : Qpt%special_qpt(5) ="Z "
323 2 : Qpt%special_qpt(6) ="P "
324 2 : Qpt%special_qpt(7) ="N "
325 2 : Qpt%special_qpt(8) ="Z1"
326 2 : Qpt%special_qpt(9) ="M "
327 : else
328 : ! BCT2: G-X-Y-S-G-Z-S1-N-P-Y1-Z
329 0 : qpt_tot=11
330 0 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
331 0 : Qpt%special_qpt(1) ="G "
332 0 : Qpt%special_qpt(2) ="X "
333 0 : Qpt%special_qpt(3) ="Y "
334 0 : Qpt%special_qpt(4) ="S "
335 0 : Qpt%special_qpt(5) ="G "
336 0 : Qpt%special_qpt(6) ="Z "
337 0 : Qpt%special_qpt(7) ="S1"
338 0 : Qpt%special_qpt(8) ="N "
339 0 : Qpt%special_qpt(9) ="P "
340 0 : Qpt%special_qpt(10)="Y1"
341 0 : Qpt%special_qpt(11)="Z "
342 : end if
343 22 : else if ((Invar%bravais(1).eq.5).and.(Invar%bravais(2).eq.0)) then
344 : ! RHOMBO:F1-Q-G-Z-B-B1-L-G-F
345 3 : qpt_tot=9
346 3 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
347 3 : Qpt%special_qpt(1)="F1"
348 3 : Qpt%special_qpt(2)="X"
349 3 : Qpt%special_qpt(3)="G "
350 3 : Qpt%special_qpt(4)="Z "
351 3 : Qpt%special_qpt(5)="B "
352 3 : Qpt%special_qpt(6)="B1 "
353 3 : Qpt%special_qpt(7)="L "
354 3 : Qpt%special_qpt(8)="G "
355 3 : Qpt%special_qpt(9)="F "
356 19 : else if ((Invar%bravais(1).eq.6).and.(Invar%bravais(2).eq.0)) then
357 : ! HEX: G-M-K-G-A-L-H-A
358 3 : qpt_tot=8
359 3 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
360 3 : Qpt%special_qpt(1)="G "
361 3 : Qpt%special_qpt(2)="M "
362 3 : Qpt%special_qpt(3)="K "
363 3 : Qpt%special_qpt(4)="G "
364 3 : Qpt%special_qpt(5)="A "
365 3 : Qpt%special_qpt(6)="L "
366 3 : Qpt%special_qpt(7)="H "
367 3 : Qpt%special_qpt(8)="A "
368 16 : else if ((Invar%bravais(1).eq.7).and.(Invar%bravais(2).eq.0)) then
369 : ! SC: G-X-M-G-R
370 2 : qpt_tot=5
371 2 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
372 2 : Qpt%special_qpt(1)="G "
373 2 : Qpt%special_qpt(2)="X "
374 2 : Qpt%special_qpt(3)="M "
375 2 : Qpt%special_qpt(4)="G "
376 2 : Qpt%special_qpt(5)="R "
377 14 : else if ((Invar%bravais(1).eq.7).and.(Invar%bravais(2).eq.-1)) then
378 : ! BCC: G-P-H-G-N
379 3 : qpt_tot=5
380 3 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
381 3 : Qpt%special_qpt(1)="G "
382 3 : Qpt%special_qpt(2)="P "
383 3 : Qpt%special_qpt(3)="H "
384 3 : Qpt%special_qpt(4)="G "
385 3 : Qpt%special_qpt(5)="N "
386 11 : else if ((Invar%bravais(1).eq.7).and.(Invar%bravais(2).eq.-3)) then
387 : ! FCC: G-X-W-Xp-K-G-L
388 11 : qpt_tot=7
389 11 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
390 11 : Qpt%special_qpt(1)="G "
391 11 : Qpt%special_qpt(2)="X "
392 11 : Qpt%special_qpt(3)="W "
393 11 : Qpt%special_qpt(4)="Xp"
394 11 : Qpt%special_qpt(5)="K "
395 11 : Qpt%special_qpt(6)="G "
396 11 : Qpt%special_qpt(7)="L "
397 : end if
398 10 : else if (Invar%bzpath.ge.1) then
399 10 : write(Invar%stdout,*) 'Generate the BZ path using the Q points given in the input file'
400 10 : if (MPIdata%iam_master) then
401 10 : write(40,*) 'Generate the BZ path using the Q points given in the input file'
402 : end if
403 10 : qpt_tot=Invar%bzpath
404 30 : ABI_MALLOC(Qpt%special_qpt,(qpt_tot))
405 64 : Qpt%special_qpt(:)=Invar%special_qpt(:)
406 : end if
407 44 : Qpt%qpt_tot=qpt_tot
408 :
409 44 : end subroutine tdep_make_specialqpt
410 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
411 44 : subroutine tdep_make_qptpath(Invar,Lattice,MPIdata,Qpt)
412 :
413 : integer :: ii,jj,kk,nqpt,iqpt,qpt_tot,tmp_int
414 : logical :: IsThisAllowed
415 : type(atdep_dataset_type),intent(in) :: Invar
416 : type(Lattice_type),intent(in) :: Lattice
417 : type(Qpoints_type),intent(out) :: Qpt
418 : type(MPI_enreg_type), intent(in) :: MPIdata
419 44 : type(QptBound_type), allocatable :: QptBound(:)
420 :
421 44 : nqpt=0
422 44 : if (MPIdata%iam_master) open(unit=40,file=trim(Invar%output_prefix)//'_qpt.dat')
423 44 : write(Invar%stdout,*) ' '
424 44 : write(Invar%stdout,*) '#############################################################################'
425 44 : write(Invar%stdout,*) '########################## Q points generation #############################'
426 44 : write(Invar%stdout,*) '#############################################################################'
427 : ! Define the special Q points
428 44 : call tdep_make_specialqpt(Invar,Lattice,MPIdata,Qpt,QptBound)
429 :
430 : ! Define the path in the BZ
431 : ! Two cases of generation: default (0) or by hand (>=1)
432 44 : qpt_tot =Qpt%qpt_tot
433 1074 : ABI_MALLOC(Qpt%special_red ,(qpt_tot,3)); Qpt%special_red (:,:)=zero
434 1030 : ABI_MALLOC(Qpt%special_cart,(qpt_tot,3)); Qpt%special_cart(:,:)=zero
435 :
436 44 : if (Invar%bzpath.ge.0) then
437 : ! If "by hand", verify that the Letter defining the Qpt bound is allowed for this
438 : ! crystallographic group
439 314 : do jj=1,qpt_tot
440 270 : IsThisAllowed=.false.
441 2453 : do ii=1,Qpt%qptbound_tot
442 2453 : if ((QptBound(ii)%ihol.eq.Invar%bravais(1)).and.(QptBound(ii)%center.eq.Invar%bravais(2))) then
443 2183 : if (QptBound(ii)%letter.eq.Qpt%special_qpt(jj)) then
444 270 : IsThisAllowed=.true.
445 270 : Qpt%special_red(jj,1)=QptBound(ii)%x
446 270 : Qpt%special_red(jj,2)=QptBound(ii)%y
447 270 : Qpt%special_red(jj,3)=QptBound(ii)%z
448 : end if
449 : end if
450 : end do
451 314 : if (.not.IsThisAllowed) then
452 0 : ABI_ERROR('One of the Qpt bound (letter) is not allowed.')
453 : end if
454 : end do
455 : ! Compute the cartesian coordinates of the special Q points in the reciprocical lattice
456 314 : do ii=1,qpt_tot
457 1124 : do jj=1,3
458 3510 : do kk=1,3
459 3240 : if (Lattice%line==2) then
460 414 : Qpt%special_cart(ii,jj)=Qpt%special_cart(ii,jj)+Lattice%gprimt(kk,jj)*Qpt%special_red(ii,kk)/Lattice%acell_unitcell(jj)
461 2016 : else if (Lattice%line==0.or.Lattice%line==1) then
462 2016 : Qpt%special_cart(ii,jj)=Qpt%special_cart(ii,jj)+Lattice%gprimt(kk,jj)*Qpt%special_red(ii,kk)/Lattice%acell_unitcell(kk)
463 : end if
464 : end do
465 : end do
466 : end do
467 :
468 44 : if (qpt_tot.gt.1) then
469 358 : ABI_MALLOC(Qpt%lgth_segments,(qpt_tot-1)); Qpt%lgth_segments(:)=0
470 270 : do ii=1,qpt_tot-1
471 : Qpt%lgth_segments(ii)=nint(dsqrt((Qpt%special_cart(ii,1)-Qpt%special_cart(ii+1,1))**2+&
472 : & (Qpt%special_cart(ii,2)-Qpt%special_cart(ii+1,2))**2+&
473 270 : & (Qpt%special_cart(ii,3)-Qpt%special_cart(ii+1,3))**2)*100*2*pi)
474 : end do
475 :
476 44 : tmp_int=Qpt%lgth_segments(1)
477 270 : do ii=1,qpt_tot-1
478 270 : if (Invar%bzlength.eq.0) then
479 216 : Qpt%lgth_segments(ii)=nint(real(Qpt%lgth_segments(ii)*100)/real(tmp_int))
480 10 : else if (Invar%bzlength.gt.0) then
481 10 : Qpt%lgth_segments(ii)=Invar%lgth_segments(ii)
482 : else if (Invar%bzlength.lt.0) then
483 0 : Qpt%lgth_segments(ii)=0
484 : end if
485 : end do
486 :
487 : ! Allocate and define the qpt points along the segments
488 270 : do ii=1,qpt_tot-1
489 270 : nqpt=nqpt+Qpt%lgth_segments(ii)
490 : end do
491 44 : nqpt=nqpt+1
492 90484 : ABI_MALLOC(Qpt%qpt_red ,(3,nqpt)); Qpt%qpt_red (:,:)=zero
493 90440 : ABI_MALLOC(Qpt%qpt_cart,(3,nqpt)); Qpt%qpt_cart(:,:)=zero
494 44 : iqpt=0
495 270 : do ii=1,qpt_tot-1
496 226 : if (Qpt%lgth_segments(ii).eq.0) cycle
497 22814 : do jj=1,Qpt%lgth_segments(ii)
498 22544 : iqpt=iqpt+1
499 : Qpt%qpt_red (:,iqpt)=((jj-1)*Qpt%special_red (ii+1,:)+(Qpt%lgth_segments(ii)-jj+1)*Qpt%special_red (ii,:))&
500 90176 : & /Qpt%lgth_segments(ii)
501 : Qpt%qpt_cart(:,iqpt)=((jj-1)*Qpt%special_cart(ii+1,:)+(Qpt%lgth_segments(ii)-jj+1)*Qpt%special_cart(ii,:))&
502 90402 : & /Qpt%lgth_segments(ii)
503 : end do
504 : end do
505 176 : Qpt%qpt_red (:,nqpt)=Qpt%special_red (qpt_tot,:)
506 176 : Qpt%qpt_cart(:,nqpt)=Qpt%special_cart(qpt_tot,:)
507 0 : else if (qpt_tot.eq.1) then
508 0 : nqpt=1
509 0 : ABI_MALLOC(Qpt%qpt_red ,(3,nqpt)); Qpt%qpt_red (:,:)=zero
510 0 : ABI_MALLOC(Qpt%qpt_cart,(3,nqpt)); Qpt%qpt_cart(:,:)=zero
511 0 : Qpt%qpt_red (:,1)=Qpt%special_red (1,:)
512 0 : Qpt%qpt_cart(:,1)=Qpt%special_cart(1,:)
513 : end if !qpt_tot.gt.1
514 44 : if (MPIdata%iam_master) then
515 44 : write(40,*) ' In reduced coordinates:'
516 314 : do ii=1,qpt_tot
517 314 : write(40,'(a,1x,3(f10.5,1x))') Qpt%special_qpt(ii),Qpt%special_red(ii,1),Qpt%special_red(ii,2),Qpt%special_red(ii,3)
518 : end do
519 44 : write(40,*) ' '
520 44 : write(40,*) ' In cartesian coordinates:'
521 314 : do ii=1,qpt_tot
522 314 : write(40,'(a,1x,3(f10.5,1x))') Qpt%special_qpt(ii),Qpt%special_cart(ii,1),Qpt%special_cart(ii,2),Qpt%special_cart(ii,3)
523 : end do
524 44 : write(40,*) ' '
525 44 : write(40,*) ' Using gprimt='
526 44 : write(40,'(3(f10.5,1x))') Lattice%gprimt(1,1),Lattice%gprimt(1,2),Lattice%gprimt(1,3)
527 44 : write(40,'(3(f10.5,1x))') Lattice%gprimt(2,1),Lattice%gprimt(2,2),Lattice%gprimt(2,3)
528 44 : write(40,'(3(f10.5,1x))') Lattice%gprimt(3,1),Lattice%gprimt(3,2),Lattice%gprimt(3,3)
529 44 : write(40,*) ' '
530 44 : write(40,*) ' The number of points along each direction in the BZ='
531 44 : if (qpt_tot.gt.1) then
532 270 : do ii=1,qpt_tot-1
533 270 : write(40,'(a2,a,a2,1x,i4)') Qpt%special_qpt(ii),'-',Qpt%special_qpt(ii+1),Qpt%lgth_segments(ii)
534 : end do
535 : end if
536 : end if
537 :
538 : else
539 0 : write(Invar%stdout,*) 'The Q points path is defined in the input file'
540 0 : if (MPIdata%iam_master) write(40,*) 'The Q points path is defined in the input file'
541 0 : nqpt=abs(Invar%bzpath)
542 0 : ABI_MALLOC(Qpt%qpt_red ,(3,nqpt)); Qpt%qpt_red (:,:)=zero
543 0 : ABI_MALLOC(Qpt%qpt_cart,(3,nqpt)); Qpt%qpt_cart(:,:)=zero
544 0 : Qpt%qpt_red(:,:)=Invar%qpt(:,:)
545 0 : ABI_ERROR('The indices in the loop below are not consistent')
546 0 : do ii=1,nqpt
547 0 : do jj=1,3
548 0 : do kk=1,3
549 0 : if (Lattice%line==2) then
550 0 : Qpt%qpt_cart(ii,jj)=Qpt%qpt_cart(ii,jj)+Lattice%gprimt(kk,jj)*Qpt%qpt_red(ii,kk)/Lattice%acell_unitcell(jj)
551 0 : else if (Lattice%line==0.or.Lattice%line==1) then
552 0 : Qpt%qpt_cart(ii,jj)=Qpt%qpt_cart(ii,jj)+Lattice%gprimt(kk,jj)*Qpt%qpt_red(ii,kk)/Lattice%acell_unitcell(kk)
553 : end if
554 : end do
555 : end do
556 : end do
557 : end if !BZpath>=0
558 44 : write(Invar%stdout,*) 'See the qpt.dat file'
559 :
560 : ! Write the q-points along the path defined in the BZ, in the qpt.dat file
561 44 : if (MPIdata%iam_master) then
562 44 : write(40,*) ' '
563 44 : write(40,*) ' Q-points path (in reduced coordinates) and (in cartesian coordinates)='
564 22632 : do iqpt=1,nqpt
565 22588 : write(40,'(i4,1x,6(f10.5,1x))') iqpt,Qpt%qpt_red(1,iqpt),Qpt%qpt_red(2,iqpt),Qpt%qpt_red(3,iqpt),&
566 45220 : & Qpt%qpt_cart(1,iqpt),Qpt%qpt_cart(2,iqpt),Qpt%qpt_cart(3,iqpt)
567 : end do
568 44 : close(40)
569 : end if
570 44 : Qpt%nqpt=nqpt
571 44 : ABI_FREE(QptBound)
572 44 : end subroutine tdep_make_qptpath
573 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
574 :
575 44 : subroutine tdep_destroy_qpt(Qpt)
576 :
577 : type(Qpoints_type),intent(inout) :: Qpt
578 :
579 44 : ABI_FREE(Qpt%special_qpt)
580 44 : ABI_FREE(Qpt%special_red)
581 44 : ABI_FREE(Qpt%special_cart)
582 44 : ABI_FREE(Qpt%lgth_segments)
583 44 : ABI_FREE(Qpt%qpt_red)
584 44 : ABI_FREE(Qpt%qpt_cart)
585 :
586 44 : end subroutine tdep_destroy_qpt
587 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
588 :
589 0 : end module m_tdep_qpt
|