Branch data Line data Source code
1 : : !!****m* ABINIT/m_a2ftr
2 : : !! NAME
3 : : !! m_a2ftr
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 2004-2026 ABINIT group (JPC, MJV, BXU)
10 : : !! This file is distributed under the terms of the
11 : : !! GNU General Public License, see ~abinit/COPYING
12 : : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : : !!
14 : : !! SOURCE
15 : :
16 : : #if defined HAVE_CONFIG_H
17 : : #include "config.h"
18 : : #endif
19 : :
20 : : #include "abi_common.h"
21 : :
22 : : module m_a2ftr
23 : :
24 : : use defs_basis
25 : : use defs_elphon
26 : : use m_errors
27 : : use m_abicore
28 : : use m_xmpi
29 : : use m_splines
30 : : use m_ebands
31 : :
32 : : use m_io_tools, only : open_file
33 : : use m_numeric_tools, only : simpson_int
34 : : use m_hide_lapack, only : matrginv
35 : : use m_geometry, only : phdispl_cart2red
36 : : use m_crystal, only : crystal_t
37 : : use m_ifc, only : ifc_type
38 : : use m_dynmat, only : ftgam_init, ftgam
39 : : use m_epweights, only : d2c_wtq, ep_ph_weights, ep_el_weights, ep_ph_weights
40 : :
41 : : implicit none
42 : :
43 : : private
44 : : !!***
45 : :
46 : : public :: mka2f_tr
47 : : public :: mka2f_tr_lova
48 : : public :: get_tau_k
49 : : !!***
50 : :
51 : : contains
52 : : !!***
53 : :
54 : : !!****f* ABINIT/mka2f_tr
55 : : !!
56 : : !! NAME
57 : : !! mka2f_tr
58 : : !!
59 : : !! FUNCTION
60 : : !! calculates the FS averaged Transport alpha^2F_tr function
61 : : !! calculates and outputs the associated electrical conductivity, relaxation time, and Seebeck coefficient
62 : : !! and thermal conductivities
63 : : !! for the first task : copied from mka2F
64 : : !!
65 : : !! INPUTS
66 : : !! crystal<crystal_t>=data type gathering info on the crystalline structure.
67 : : !! Ifc<ifc_type>=Object containing the interatomic force constants.
68 : : !! elph_ds
69 : : !! elph_ds%gkk2 = gkk2 matrix elements on full FS grid for each phonon mode
70 : : !! elph_ds%nbranch = number of phonon branches = 3*natom
71 : : !! elph_ds%nFSband = number of bands included in the FS integration
72 : : !! elph_ds%k_phon%nkpt = number of kpts included in the FS integration
73 : : !! elph_ds%k_phon%wtk = integration weights on the FS
74 : : !! delph_ds%n0 = DOS at the Fermi level calculated from the k_phon integration weights
75 : : !! elph_ds%k_phon%kpt = coordinates of all FS kpoints
76 : : !! mustar = coulomb pseudopotential parameter eventually for 2 spin channels
77 : : !! natom = number of atoms
78 : : !! ntemper = number of temperature points to calculate, from tempermin to tempermin+ntemper*temperinc
79 : : !! tempermin = minimum temperature at which resistivity etc are calculated (in K)
80 : : !! temperinc = interval for temperature grid on which resistivity etc are calculated (in K)
81 : : !! elph_tr_ds%dos_n0 = DOS at the Fermi level calculated from the k_phon integration
82 : : !! weights, but has a temperature dependence
83 : : !! elph_tr_ds%dos_n = DOS at varied energy levels around Fermi level
84 : : !! elph_tr_ds%veloc_sq0 = Fermi velocity square with T dependence
85 : : !!
86 : : !! OUTPUT
87 : : !! elph_ds
88 : : !!
89 : : !! NOTES
90 : : !! copied from ftiaf9.f
91 : : !!
92 : : !! SOURCE
93 : :
94 : 0 : subroutine mka2f_tr(crystal,ifc,elph_ds,ntemper,tempermin,temperinc,pair2red,elph_tr_ds)
95 : :
96 : : !Arguments ------------------------------------
97 : : !scalars
98 : : integer,intent(in) :: ntemper
99 : : real(dp),intent(in) :: tempermin,temperinc
100 : : type(ifc_type),intent(in) :: ifc
101 : : type(crystal_t),intent(in) :: crystal
102 : : type(elph_tr_type),intent(inout) :: elph_tr_ds
103 : : type(elph_type),intent(inout) :: elph_ds
104 : : !arrays
105 : : integer,intent(in) :: pair2red(elph_ds%nenergy,elph_ds%nenergy)
106 : :
107 : : !Local variables -------------------------
108 : : !x =w/(2kbT)
109 : : !scalars
110 : : integer :: iFSqpt,ibranch,iomega,isppol,jbranch,nerr
111 : : integer :: unit_a2f_tr,natom,ii,jj
112 : : integer :: idir, iatom, k1, kdir
113 : : integer :: unit_lor,unit_rho,unit_tau,unit_sbk, unit_therm
114 : : integer :: itemp, tmp_nenergy
115 : : integer :: itrtensor, icomp, jcomp!, kcomp
116 : : integer :: ie, ie_1, ie2, ie_2, ie1, ie_tmp, ssp, s1(4), s2(4)
117 : : integer :: ie2_left, ie2_right
118 : : integer :: ik_this_proc, ierr,nrpt
119 : : logical,parameter :: debug=.False.
120 : : real(dp) :: Temp,chgu,chwu,diagerr,ucvol
121 : : real(dp) :: a2fprefactor, gtemp
122 : : real(dp) :: lambda_tr,lor0,lorentz,maxerr,omega
123 : : real(dp) :: rho,tau,wtherm,xtr
124 : : real(dp) :: lambda_tr_trace
125 : : real(dp) :: domega, omega_min, omega_max
126 : : real(dp) :: gaussval, gaussprefactor, gaussfactor, gaussmaxarg, xx
127 : : real(dp) :: qnorm2, tmp_fermie
128 : : real(dp) :: e1, e2, diff, xe
129 : : real(dp) :: occ_omega, occ_e1, occ_e2
130 : : real(dp) :: nv1, nv2, sigma1, sigma2
131 : : real(dp) :: dos_n_e2, veloc_sq_icomp, veloc_sq_jcomp
132 : : real(dp) :: tointegq00_1, tointegq00_2, tointegq01_1, tointegq01_2,tointegq11_1, tointegq11_2
133 : : real(dp) :: j00, j01, j11
134 : : real(dp) :: tointegq00,tointegq01,tointegq11
135 : : real(dp) :: pref_s, pref_w, tmp_veloc_sq0, tmp_veloc_sq1, tmp_veloc_sq2
136 : : character(len=500) :: message
137 : : character(len=fnlen) :: fname
138 : : !arrays
139 : : complex(dp),parameter :: c0=dcmplx(0.d0,0.d0),c1=dcmplx(1.d0,0.d0)
140 : : real(dp) :: gprimd(3,3)
141 : 0 : real(dp) :: eigval(elph_ds%nbranch)
142 : 0 : real(dp) :: displ_red(2,elph_ds%nbranch,elph_ds%nbranch)
143 : 0 : real(dp) :: gam_now(2,elph_ds%nbranch*elph_ds%nbranch)
144 : 0 : real(dp) :: tmpa2f(elph_ds%na2f)
145 : 0 : real(dp) :: tmpgam1(2,elph_ds%nbranch,elph_ds%nbranch)
146 : 0 : real(dp) :: tmpgam2(2,elph_ds%nbranch,elph_ds%nbranch)
147 : : real(dp) :: q11_inv(3,3)
148 : : !real(dp) :: fullq(6,6)
149 : 0 : real(dp),allocatable :: phfrq(:,:)
150 : 0 : real(dp),allocatable :: tmp_a2f_1d_tr(:,:,:,:,:)
151 : 0 : real(dp),allocatable :: displ(:,:,:,:)
152 : 0 : real(dp),allocatable :: pheigvec(:,:)
153 : 0 : real(dp),allocatable :: tmp_wtq(:,:,:)
154 : 0 : real(dp),allocatable :: integrho(:), tointegrho(:)
155 : 0 : real(dp),allocatable :: integrand_q00(:),integrand_q01(:),integrand_q11(:)
156 : 0 : real(dp),allocatable :: q00(:,:,:,:), q01(:,:,:,:),q11(:,:,:,:)
157 : 0 : real(dp),allocatable :: seebeck(:,:,:,:)!, rho_nm(:,:,:,:)
158 : 0 : real(dp),allocatable :: rho_T(:)
159 : 0 : real(dp),allocatable :: coskr(:,:), sinkr(:,:), coskr_tmp(:), sinkr_tmp(:)
160 : 0 : real(dp),allocatable :: gam_rpt(:,:,:)
161 : :
162 : : ! *********************************************************************
163 : : !calculate a2f_tr for frequencies between 0 and omega_max
164 : :
165 : :
166 : 0 : write(std_out,*) 'mka2f_tr : enter '
167 : :
168 : 0 : ucvol = crystal%ucvol
169 : 0 : natom = crystal%natom
170 [ # # # # ]: 0 : gprimd = crystal%gprimd
171 : :
172 : : ! number of real-space points for FT interpolation
173 : 0 : nrpt = ifc%nrpt
174 : : !
175 : : !MG: the step should be calculated locally using nomega and the extrema of the spectrum.
176 : : !One should not rely on previous calls for the setup of elph_ds%domega
177 : : !I will remove elph_ds%domega since mka2f.F90 will become a method of gamma_t
178 : 0 : domega =elph_ds%domega
179 : 0 : omega_min = elph_ds%omega_min
180 : 0 : omega_max = elph_ds%omega_max
181 : :
182 [ # # ]: 0 : if (elph_ds%ep_lova .eq. 1) then
183 : : tmp_nenergy = 1
184 [ # # ]: 0 : else if (elph_ds%ep_lova .eq. 0) then
185 : 0 : tmp_nenergy = elph_ds%nenergy
186 : : end if
187 : :
188 : : !! defaults for number of temperature steps and max T (all in Kelvin...)
189 : : !ntemper=1000
190 : : !tempermin=zero
191 : : !temperinc=one
192 : :
193 [ # # # # : 0 : ABI_MALLOC(rho_T,(ntemper))
# # # # #
# # # ]
194 : :
195 : :
196 : 0 : gaussprefactor = sqrt(piinv) / elph_ds%a2fsmear
197 : 0 : gaussfactor = one / elph_ds%a2fsmear
198 : 0 : gaussmaxarg = sqrt(-log(1.d-90))
199 : : !lor0=(pi*kb_HaK)**2/3.
200 : 0 : lor0=pi**2/3.0_dp
201 : :
202 : : !maximum value of frequency (a grid has to be chosen for the representation of alpha^2 F)
203 : : !WARNING! supposes this value has been set in mkelph_linwid.
204 : :
205 : : !ENDMG
206 : :
207 : 0 : maxerr=0.
208 : 0 : nerr=0
209 : :
210 [ # # # # : 0 : ABI_MALLOC(tmp_wtq,(elph_ds%nbranch, elph_ds%k_fine%nkpt, elph_ds%na2f+1))
# # # # #
# # # # #
# # # # #
# # # ]
211 [ # # # # : 0 : ABI_MALLOC(elph_ds%k_fine%wtq,(elph_ds%nbranch, elph_ds%k_fine%nkpt, elph_ds%na2f))
# # # # #
# # # # #
# # # # #
# # # ]
212 [ # # # # : 0 : ABI_MALLOC(elph_ds%k_phon%wtq,(elph_ds%nbranch, elph_ds%k_phon%nkpt, elph_ds%na2f))
# # # # #
# # # # #
# # # # #
# # # ]
213 : :
214 [ # # # # : 0 : ABI_MALLOC(phfrq,(elph_ds%nbranch, elph_ds%k_fine%nkpt))
# # # # #
# # # # #
# # ]
215 [ # # # # : 0 : ABI_MALLOC(displ,(2, elph_ds%nbranch, elph_ds%nbranch, elph_ds%k_fine%nkpt))
# # # # #
# # # # #
# # # # #
# ]
216 [ # # # # : 0 : ABI_MALLOC(pheigvec,(2*elph_ds%nbranch*elph_ds%nbranch, elph_ds%k_fine%nkpt))
# # # # #
# # # # #
# # # # ]
217 : :
218 [ # # ]: 0 : do iFSqpt=1,elph_ds%k_fine%nkpt
219 : 0 : call ifc%fourq(crystal,elph_ds%k_fine%kpt(:,iFSqpt),phfrq(:,iFSqpt),displ(:,:,:,iFSqpt),out_eigvec=pheigvec(:,iFSqpt))
220 : : end do
221 : 0 : omega_min = omega_min - domega
222 : :
223 : : !bxu, obtain wtq for the q_fine, then condense to q_phon
224 : : call ep_ph_weights(phfrq,elph_ds%a2fsmear,omega_min,omega_max,elph_ds%na2f+1,gprimd,elph_ds%kptrlatt_fine, &
225 : 0 : & elph_ds%nbranch,elph_ds%telphint,elph_ds%k_fine,tmp_wtq)
226 : : !call ep_ph_weights(phfrq,elph_ds%a2fsmear,omega_min,omega_max,elph_ds%na2f+1,gprimd,elph_ds%kptrlatt_fine, &
227 : : !& elph_ds%nbranch,1,elph_ds%k_fine,tmp_wtq)
228 : 0 : omega_min = omega_min + domega
229 : :
230 [ # # ]: 0 : do iomega = 1, elph_ds%na2f
231 [ # # # # ]: 0 : elph_ds%k_fine%wtq(:,:,iomega) = tmp_wtq(:,:,iomega+1)
232 : : end do
233 [ # # ]: 0 : ABI_FREE(tmp_wtq)
234 : :
235 [ # # ]: 0 : if (elph_ds%use_k_fine == 1) then
236 : 0 : call d2c_wtq(elph_ds)
237 : : end if
238 : :
239 [ # # ]: 0 : ABI_FREE(phfrq)
240 [ # # ]: 0 : ABI_FREE(displ)
241 [ # # ]: 0 : ABI_FREE(pheigvec)
242 : :
243 : : !reduce the dimension from fine to phon for phfrq and pheigvec
244 [ # # # # : 0 : ABI_MALLOC(phfrq,(elph_ds%nbranch, elph_ds%k_phon%nkpt))
# # # # #
# # # # #
# # ]
245 [ # # # # : 0 : ABI_MALLOC(displ,(2, elph_ds%nbranch, elph_ds%nbranch, elph_ds%k_phon%nkpt))
# # # # #
# # # # #
# # # # #
# ]
246 [ # # # # : 0 : ABI_MALLOC(pheigvec,(2*elph_ds%nbranch*elph_ds%nbranch, elph_ds%k_phon%nkpt))
# # # # #
# # # # #
# # # # ]
247 : :
248 [ # # ]: 0 : do iFSqpt=1,elph_ds%k_phon%nkpt
249 : 0 : call ifc%fourq(crystal,elph_ds%k_phon%kpt(:,iFSqpt),phfrq(:,iFSqpt),displ(:,:,:,iFSqpt),out_eigvec=pheigvec(:,iFSqpt))
250 : : end do
251 : :
252 [ # # # # : 0 : ABI_MALLOC(elph_tr_ds%a2f_1d_tr,(elph_ds%na2f,9,elph_ds%nsppol,4,tmp_nenergy**2,ntemper))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # ]
253 [ # # # # : 0 : ABI_MALLOC(tmp_a2f_1d_tr,(elph_ds%na2f,9,elph_ds%nsppol,4,tmp_nenergy**2))
# # # # #
# # # # #
# # # # #
# ]
254 : :
255 : : ! prepare phase factors
256 [ # # # # : 0 : ABI_MALLOC(coskr, (elph_ds%k_phon%nkpt, nrpt))
# # # # #
# # # # #
# # ]
257 [ # # # # : 0 : ABI_MALLOC(sinkr, (elph_ds%k_phon%nkpt, nrpt))
# # # # #
# # # ]
258 : 0 : call ftgam_init(ifc%gprim, elph_ds%k_phon%nkpt, nrpt, elph_ds%k_phon%kpt, ifc%rpt, coskr, sinkr)
259 : :
260 [ # # # # : 0 : elph_tr_ds%a2f_1d_tr = zero
# # # # #
# # # ]
261 [ # # # # : 0 : tmp_a2f_1d_tr = zero
# # # # #
# ]
262 : :
263 [ # # # # : 0 : ABI_MALLOC(gam_rpt,(2,3*natom*3*natom,nrpt))
# # # # #
# # # # #
# # # # ]
264 [ # # # # : 0 : ABI_MALLOC(coskr_tmp,(nrpt))
# # # # #
# # # ]
265 [ # # # # : 0 : ABI_MALLOC(sinkr_tmp,(nrpt))
# # # # ]
266 : :
267 [ # # ]: 0 : do ie = 1, elph_ds%n_pair
268 [ # # ]: 0 : do ssp = 1,4
269 [ # # ]: 0 : do isppol = 1, elph_ds%nsppol
270 : :
271 : : ! loop over qpoint in full kpt grid (presumably dense)
272 [ # # ]: 0 : do ik_this_proc =1,elph_ds%k_phon%my_nkpt
273 : 0 : iFSqpt = elph_ds%k_phon%my_ikpt(ik_this_proc)
274 : :
275 [ # # ]: 0 : qnorm2 = sum(elph_ds%k_phon%kpt(:,iFSqpt)**2)
276 : : ! if (flag_to_exclude_soft_modes = .false.) qnorm2 = zero
277 [ # # ]: 0 : do itrtensor=1,9
278 : :
279 [ # # ]: 0 : if (elph_ds%ep_int_gkk == 1) then
280 [ # # # # ]: 0 : gam_now(:,:) = elph_tr_ds%gamma_qpt_tr(:,itrtensor,:,isppol,iFSqpt)
281 : : else
282 : : ! Do FT from real-space gamma grid to 1 qpt.
283 [ # # # # : 0 : gam_rpt(:,:,:)=elph_tr_ds%gamma_rpt_tr(:,itrtensor,:,isppol,:,ssp,ie)
# # ]
284 [ # # ]: 0 : coskr_tmp(:)=coskr(iFSqpt,:)
285 [ # # ]: 0 : sinkr_tmp(:)=sinkr(iFSqpt,:)
286 : 0 : call ftgam(ifc%wghatm,gam_now,gam_rpt,natom,1,nrpt,0,coskr_tmp, sinkr_tmp)
287 : : end if
288 : :
289 : : ! Diagonalize gamma matrix at this qpoint (complex matrix).
290 : :
291 : : ! if ep_scalprod==0 we have to dot in the displacement vectors here
292 [ # # ]: 0 : if (elph_ds%ep_scalprod==0) then
293 : :
294 [ # # # # : 0 : displ_red(:,:,:) = zero
# # ]
295 [ # # ]: 0 : do jbranch=1,elph_ds%nbranch
296 [ # # ]: 0 : do iatom=1,natom
297 [ # # ]: 0 : do idir=1,3
298 : 0 : ibranch=idir+3*(iatom-1)
299 [ # # ]: 0 : do kdir=1,3
300 : 0 : k1 = kdir+3*(iatom-1)
301 : : displ_red(1,ibranch,jbranch) = displ_red(1,ibranch,jbranch) + &
302 : 0 : & gprimd(kdir,idir)*displ(1,k1,jbranch,iFSqpt)
303 : : displ_red(2,ibranch,jbranch) = displ_red(2,ibranch,jbranch) + &
304 : 0 : & gprimd(kdir,idir)*displ(2,k1,jbranch,iFSqpt)
305 : : end do
306 : : end do
307 : : end do
308 : : end do
309 : :
310 [ # # ]: 0 : tmpgam2 = reshape (gam_now, (/2,elph_ds%nbranch,elph_ds%nbranch/))
311 : 0 : call gam_mult_displ(elph_ds%nbranch, displ_red, tmpgam2, tmpgam1)
312 [ # # ]: 0 : do jbranch=1,elph_ds%nbranch
313 : 0 : eigval(jbranch) = tmpgam1(1, jbranch, jbranch)
314 : : end do
315 : :
316 [ # # ]: 0 : else if (elph_ds%ep_scalprod == 1) then
317 : :
318 : :
319 : : ! NOTE: in these calls gam_now and pheigvec do not have the right rank, but blas usually does not care
320 : :
321 : : call ZGEMM ( 'N', 'N', 3*natom, 3*natom, 3*natom, c1, gam_now, 3*natom,&
322 : 0 : & pheigvec(:,iFSqpt), 3*natom, c0, tmpgam1, 3*natom)
323 : : call ZGEMM ( 'C', 'N', 3*natom, 3*natom, 3*natom, c1, pheigvec(:,iFSqpt), 3*natom,&
324 : 0 : & tmpgam1, 3*natom, c0, tmpgam2, 3*natom)
325 : 0 : diagerr = zero
326 [ # # ]: 0 : do ibranch=1,elph_ds%nbranch
327 : 0 : eigval(ibranch) = tmpgam2(1,ibranch,ibranch)
328 [ # # ]: 0 : do jbranch=1,ibranch-1
329 : 0 : diagerr = diagerr + abs(tmpgam2(1,jbranch,ibranch))
330 : : end do
331 [ # # ]: 0 : do jbranch=ibranch+1,elph_ds%nbranch
332 : 0 : diagerr = diagerr + abs(tmpgam2(1,jbranch,ibranch))
333 : : end do
334 : : end do
335 [ # # ]: 0 : if (diagerr > tol12) then
336 : 0 : nerr=nerr+1
337 : 0 : maxerr=max(diagerr, maxerr)
338 : : end if
339 : : end if ! end ep_scalprod if
340 : :
341 : : ! Add all contributions from the phonon modes at this qpoint to a2f and the phonon dos.
342 [ # # ]: 0 : do ibranch=1,elph_ds%nbranch
343 : : ! if (abs(phfrq(ibranch,iFSqpt)) < tol10) then
344 [ # # # # : 0 : if ( abs(phfrq(ibranch,iFSqpt)) < tol7 .or. &
# # ]
345 : : & (phfrq(ibranch,iFSqpt) < tol4 .and. qnorm2 > 0.03 )) then
346 : : ! note: this should depend on the velocity of sound, to accept acoustic modes!
347 : : a2fprefactor = zero
348 : : else
349 : : ! a2fprefactor = eigval (ibranch)/(two_pi*abs(phfrq(ibranch,iFSqpt))*elph_ds%n0(isppol))
350 : : ! Use the dos_n0 at the lowest input temperature, assuming to be low
351 : 0 : a2fprefactor = eigval (ibranch)/(two_pi*abs(phfrq(ibranch,iFSqpt)))
352 : : end if
353 : :
354 : 0 : omega = omega_min
355 [ # # ]: 0 : tmpa2f(:) = zero
356 [ # # ]: 0 : do iomega=1,elph_ds%na2f
357 : 0 : xx = (omega-phfrq(ibranch,iFSqpt))*gaussfactor
358 : 0 : omega = omega+domega
359 [ # # ]: 0 : if (abs(xx) > gaussmaxarg) cycle
360 : :
361 : 0 : gaussval = gaussprefactor*exp(-xx*xx)
362 : 0 : gtemp = gaussval*a2fprefactor
363 : :
364 [ # # ]: 0 : if (dabs(gtemp) < 1.0d-50) gtemp = zero
365 : 0 : tmpa2f(iomega) = tmpa2f(iomega) + gtemp
366 : : end do
367 : :
368 : : ! tmpa2f(:) = zero
369 : : ! do iomega=1,elph_ds%na2f
370 : : ! gtemp = a2fprefactor*elph_ds%k_phon%wtq(ibranch,iFSqpt,iomega)
371 : : ! if (dabs(gtemp) < 1.0d-50) gtemp = zero
372 : : ! tmpa2f(iomega) = tmpa2f(iomega) + gtemp
373 : : ! end do
374 : :
375 [ # # ]: 0 : tmp_a2f_1d_tr (:,itrtensor,isppol,ssp,ie) = tmp_a2f_1d_tr (:,itrtensor,isppol,ssp,ie) + tmpa2f(:)
376 : :
377 : : end do ! end ibranch
378 : : end do ! end itrtensor
379 : : end do ! end iFSqpt - loop done in parallel
380 : : end do ! end isppol
381 : : end do ! ss'
382 : : end do ! n_pair
383 : :
384 : : ! MG: FIXME: Why xmpi_world? besides only one CPU should perform IO (see below)
385 : : ! Likely this routine is never executed in parallel
386 : 0 : call xmpi_sum (tmp_a2f_1d_tr, xmpi_world, ierr)
387 : :
388 [ # # ]: 0 : ABI_FREE(gam_rpt)
389 [ # # ]: 0 : ABI_FREE(coskr_tmp)
390 [ # # ]: 0 : ABI_FREE(sinkr_tmp)
391 [ # # ]: 0 : ABI_FREE(coskr)
392 [ # # ]: 0 : ABI_FREE(sinkr)
393 : :
394 [ # # ]: 0 : do itemp=1,ntemper ! runs over termperature in K
395 [ # # ]: 0 : do isppol=1,elph_ds%nsppol
396 [ # # ]: 0 : do jj=1,tmp_nenergy**2
397 [ # # ]: 0 : do ii=1,4
398 [ # # # # ]: 0 : elph_tr_ds%a2f_1d_tr(:,:,isppol,ii,jj,itemp) = tmp_a2f_1d_tr(:,:,isppol,ii,jj)/elph_tr_ds%dos_n0(itemp,isppol)
399 : : end do
400 : : end do
401 : : end do
402 : : end do
403 : :
404 [ # # ]: 0 : ABI_FREE(tmp_a2f_1d_tr)
405 : :
406 : : !second 1 / elph_ds%k_phon%nkpt factor for the integration weights
407 [ # # # # : 0 : elph_tr_ds%a2f_1d_tr = elph_tr_ds%a2f_1d_tr / elph_ds%k_phon%nkpt
# # # # #
# # # ]
408 : :
409 [ # # ]: 0 : if (elph_ds%ep_scalprod == 1) then
410 : 0 : write(std_out,*) 'mka2f_tr: errors in diagonalization of gamma_tr with phon eigenvectors: ', nerr,maxerr
411 : : end if
412 : :
413 : : !output the elph_tr_ds%a2f_1d_tr
414 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_A2F_TR'
415 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_a2f_tr,status='unknown') /= 0) then
416 : 0 : ABI_ERROR(message)
417 : : end if
418 : :
419 : 0 : write (unit_a2f_tr,'(a)') '#'
420 : 0 : write (unit_a2f_tr,'(a)') '# ABINIT package : a2f_tr file'
421 : 0 : write (unit_a2f_tr,'(a)') '#'
422 : 0 : write (unit_a2f_tr,'(a)') '# a2f_tr function integrated over the FS. omega in a.u.'
423 : 0 : write (unit_a2f_tr,'(a,I10)') '# number of kpoints integrated over : ', elph_ds%k_phon%nkpt
424 : 0 : write (unit_a2f_tr,'(a,I10)') '# number of energy points : ',elph_ds%na2f
425 : 0 : write (unit_a2f_tr,'(a,E16.6,a,E16.6,a)') '# between omega_min = ', omega_min,' Ha and omega_max = ', omega_max, ' Ha'
426 : 0 : write (unit_a2f_tr,'(a,E16.6)') '# and the smearing width for gaussians is ', elph_ds%a2fsmear
427 : 0 : write (unit_a2f_tr,'(a)') '#'
428 : :
429 : : !done with header
430 [ # # ]: 0 : do isppol=1,elph_ds%nsppol
431 : 0 : write (unit_a2f_tr,'(a,E16.6)') '# The DOS at Fermi level is ', elph_tr_ds%dos_n0(1,isppol)
432 : 0 : omega = omega_min
433 [ # # ]: 0 : do iomega=1,elph_ds%na2f
434 : : ! bxu, at which eps and eps' should I save it
435 : : ! better to save them all, but could be too many
436 : 0 : write (unit_a2f_tr, '(10D16.6)') omega, elph_tr_ds%a2f_1d_tr(iomega,:,isppol,1,INT(elph_ds%n_pair/2)+1,1)
437 : 0 : omega=omega+domega
438 : : end do
439 : 0 : write (unit_a2f_tr,*)
440 : : end do !isppol
441 : :
442 : 0 : close (unit=unit_a2f_tr)
443 : :
444 : : !calculation of transport properties
445 [ # # # # : 0 : ABI_MALLOC(integrho,(elph_ds%na2f))
# # # # #
# # # ]
446 [ # # # # : 0 : ABI_MALLOC(tointegrho,(elph_ds%na2f))
# # # # ]
447 [ # # # # : 0 : ABI_MALLOC(integrand_q00,(elph_ds%na2f))
# # # # ]
448 [ # # # # : 0 : ABI_MALLOC(integrand_q01,(elph_ds%na2f))
# # # # ]
449 [ # # # # : 0 : ABI_MALLOC(integrand_q11,(elph_ds%na2f))
# # # # ]
450 [ # # # # : 0 : ABI_MALLOC(q00,(ntemper,3,3,elph_ds%nsppol))
# # # # #
# # # # #
# # # # ]
451 [ # # # # : 0 : ABI_MALLOC(q01,(ntemper,3,3,elph_ds%nsppol))
# # # # #
# # # ]
452 [ # # # # : 0 : ABI_MALLOC(q11,(ntemper,3,3,elph_ds%nsppol))
# # # # #
# # # ]
453 [ # # # # : 0 : ABI_MALLOC(seebeck,(elph_ds%nsppol,ntemper,3,3))
# # # # #
# # # # #
# # # # #
# ]
454 : : !ABI_MALLOC(rho_nm,(elph_ds%nsppol,ntemper,3,3))
455 : :
456 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_RHO'
457 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_rho,status='unknown') /= 0) then
458 : 0 : ABI_ERROR(message)
459 : : end if
460 : : !print header to resistivity file
461 : 0 : write (unit_rho,*) '# Resistivity as a function of temperature.'
462 : 0 : write (unit_rho,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
463 : 0 : write (unit_rho,*) '# '
464 : 0 : write (unit_rho,*) '# Columns are: '
465 : 0 : write (unit_rho,*) '# temperature[K] rho[au] rho [SI] rho/temp [au]'
466 : 0 : write (unit_rho,*) '# '
467 : :
468 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_TAU'
469 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_tau,status='unknown') /= 0) then
470 : 0 : ABI_ERROR(message)
471 : : end if
472 : : !print header to relaxation time file
473 : 0 : write (unit_tau,*) '# Relaxation time as a function of temperature.'
474 : 0 : write (unit_tau,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
475 : 0 : write (unit_tau,*) '# '
476 : 0 : write (unit_tau,*) '# Columns are: '
477 : 0 : write (unit_tau,*) '# temperature[K] tau[au] tau [SI] '
478 : 0 : write (unit_tau,*) '# '
479 : :
480 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_SBK'
481 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_sbk,status='unknown') /= 0) then
482 : 0 : ABI_ERROR(message)
483 : : end if
484 : : !print header to relaxation time file
485 : 0 : write (unit_sbk,*) '# Seebeck Coefficint as a function of temperature.'
486 : 0 : write (unit_sbk,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
487 : 0 : write (unit_sbk,*) '# '
488 : 0 : write (unit_sbk,*) '# Columns are: '
489 : 0 : write (unit_sbk,*) '# temperature[K] S [au] S [SI] '
490 : 0 : write (unit_sbk,*) '# '
491 : :
492 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_WTH'
493 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_therm,status='unknown') /= 0) then
494 : 0 : ABI_ERROR(message)
495 : : end if
496 : :
497 : : !print header to thermal conductivity file
498 : 0 : write (unit_therm,'(a)') '# Thermal conductivity/resistivity as a function of temperature.'
499 : 0 : write (unit_therm,'(a)') '# the formalism is isotropic, so non-cubic crystals may be wrong'
500 : 0 : write (unit_therm,'(a)') '# '
501 : 0 : write (unit_therm,'(a)') '# Columns are: '
502 : 0 : write (unit_therm,'(a)') '# temperature[K] thermal rho[au] thermal cond [au] thermal rho [SI] thermal cond [SI]'
503 : 0 : write (unit_therm,'(a)') '# '
504 : :
505 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_LOR'
506 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_lor,status='unknown') /= 0) then
507 : 0 : ABI_ERROR(message)
508 : : end if
509 : :
510 : : !print header to lorentz file
511 : 0 : write (unit_lor,*) '# Lorentz number as a function of temperature.'
512 : 0 : write (unit_lor,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
513 : 0 : write (unit_lor,*) '# '
514 : 0 : write (unit_lor,*) '# Columns are: '
515 : 0 : write (unit_lor,*) '# temperature[K] Lorentz number[au] Lorentz quantum = (pi*kb_HaK)**2/3'
516 : 0 : write (unit_lor,*) '# '
517 : :
518 [ # # ]: 0 : do isppol=1,elph_ds%nsppol
519 : 0 : lambda_tr_trace = zero
520 [ # # ]: 0 : do itrtensor=1,9
521 : 0 : omega = omega_min
522 [ # # ]: 0 : tointegrho = zero
523 [ # # ]: 0 : do iomega=1,elph_ds%na2f
524 [ # # ]: 0 : if(omega<=0) then
525 : 0 : omega=omega+domega
526 : 0 : cycle
527 : : end if
528 : : ! bxu, agian, which eps and eps' to use?
529 : : ! sometimes Ef is in the gap
530 : 0 : tointegrho(iomega)=two*elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,1,1,1)/omega
531 : 0 : omega=omega+domega
532 : : end do
533 : :
534 [ # # ]: 0 : integrho = zero
535 : 0 : call simpson_int(elph_ds%na2f,domega,tointegrho,integrho)
536 : 0 : lambda_tr=integrho(elph_ds%na2f)
537 : : write (message, '(a,2i3,a,es16.6)' )&
538 : 0 : & ' mka2f_tr: TRANSPORT lambda for isppol itrtensor', isppol, itrtensor, ' = ', lambda_tr
539 : 0 : call wrtout(std_out,message,'COLL')
540 [ # # ]: 0 : if (itrtensor == 1 .or. itrtensor == 5 .or. itrtensor == 9) lambda_tr_trace = lambda_tr_trace + lambda_tr
541 : : end do !end itrtensor do
542 : :
543 : 0 : lambda_tr_trace = lambda_tr_trace / three
544 : : write (message, '(a,i3,a,es16.6)' )&
545 : 0 : & ' mka2f_tr: 1/3 trace of TRANSPORT lambda for isppol ', isppol, ' = ', lambda_tr_trace
546 : 0 : call wrtout(std_out,message,'COLL')
547 : 0 : call wrtout(ab_out,message,'COLL')
548 : : end do !end isppol do
549 : :
550 : : !constant to change units of rho from au to SI
551 : 0 : chgu=2.173969*1.0d-7 ! REPLACE WITH DATA FROM DEFS_BASIS
552 : 0 : chwu=9.270955772*1.0d-5 ! au to mK/W ! REPLACE WITH DATA FROM DEFS_BASIS
553 : :
554 : : !change the fermi level to zero, as required for q01 to vanish.
555 : 0 : tmp_fermie = elph_ds%fermie
556 : : !Get Q00, Q01, Q11, and derive rho, tau
557 [ # # # # : 0 : q00 = zero
# # # # ]
558 [ # # # # : 0 : q01 = zero
# # # # ]
559 [ # # # # : 0 : q11 = zero
# # # # ]
560 : : ! prepare s1 and s2 arrays
561 : 0 : s1 = (/1, 1, -1, -1/)
562 : 0 : s2 = (/1, -1, 1, -1/)
563 : :
564 [ # # ]: 0 : do isppol=1,elph_ds%nsppol
565 [ # # ]: 0 : do icomp=1, 3
566 [ # # ]: 0 : do jcomp=1, 3
567 : 0 : itrtensor=(icomp-1)*3+jcomp
568 : :
569 : 0 : write(unit_rho,*) '# Rho for isppol, itrten = ', isppol, itrtensor
570 : 0 : write(unit_tau,*) '# Tau for isppol, itrten = ', isppol, itrtensor
571 : :
572 [ # # ]: 0 : do itemp=1,ntemper ! runs over termperature in K
573 : 0 : Temp=tempermin+temperinc*dble(itemp)
574 : 0 : tmp_veloc_sq0 = sqrt(elph_tr_ds%veloc_sq0(itemp,icomp,isppol)*elph_tr_ds%veloc_sq0(itemp,jcomp,isppol))
575 : :
576 [ # # ]: 0 : integrand_q00 = zero
577 [ # # ]: 0 : integrand_q01 = zero
578 [ # # ]: 0 : integrand_q11 = zero
579 : :
580 : 0 : omega = omega_min
581 [ # # ]: 0 : do iomega=1,elph_ds%na2f
582 [ # # ]: 0 : if(omega .le. 0) then
583 : 0 : omega=omega+domega
584 : 0 : cycle
585 : : end if
586 : 0 : xtr=omega/(kb_HaK*Temp)
587 : 0 : occ_omega=1.0_dp/(exp(xtr)-1.0_dp)
588 : :
589 : 0 : tmp_veloc_sq1 = zero
590 : 0 : tmp_veloc_sq2 = zero
591 [ # # ]: 0 : do ie1=1,elph_ds%nenergy
592 : 0 : e1 = elph_tr_ds%en_all(isppol,ie1)
593 : :
594 : : !! BXU, the tolerance here needs to be used with caution
595 : : !! which depends on the dimensions of the system
596 : : !! E.g. in 2D system, DOS can be much smaller
597 [ # # ]: 0 : if (elph_tr_ds%dos_n(ie1,isppol)/natom .lt. 0.1d0) cycle ! energy in the gap forbidden
598 : :
599 : 0 : xtr=(e1-tmp_fermie)/(kb_HaK*Temp)
600 : 0 : occ_e1=1.0_dp/(exp(xtr)+1.0_dp)
601 : :
602 : 0 : e2 = e1 + omega
603 : 0 : xtr=(e2-tmp_fermie)/(kb_HaK*Temp)
604 : 0 : occ_e2=1.0_dp/(exp(xtr)+1.0_dp)
605 : : ! Do we need to change the fermie to the one with T dependence?
606 : : ! find which ie2 give the closest energy
607 [ # # ]: 0 : if (e2 .gt. elph_tr_ds%en_all(isppol,elph_ds%nenergy)) then
608 : 0 : ie2 = 0
609 : : cycle
610 : : else
611 : 0 : ie_tmp = 1
612 : 0 : diff = dabs(e2-elph_tr_ds%en_all(isppol,1))
613 [ # # ]: 0 : do ie2 = 2, elph_ds%nenergy
614 [ # # ]: 0 : if (dabs(e2-elph_tr_ds%en_all(isppol,ie2)) .lt. diff) then
615 : 0 : diff = dabs(e2-elph_tr_ds%en_all(isppol,ie2))
616 : 0 : ie_tmp = ie2
617 : : end if
618 : : end do
619 : 0 : ie2 = ie_tmp
620 : :
621 [ # # ]: 0 : if (e2 < elph_tr_ds%en_all(isppol,ie2)) then
622 : 0 : ie2_right = ie2
623 : 0 : ie2_left = ie2-1
624 : : else
625 : 0 : ie2_right = ie2+1
626 : 0 : ie2_left = ie2
627 : : end if
628 : :
629 : : end if
630 : :
631 [ # # ]: 0 : if (elph_tr_ds%dos_n(ie2,isppol)/natom .lt. 0.1d0) cycle
632 : :
633 : 0 : tointegq00 = zero
634 : 0 : tointegq01 = zero
635 : 0 : tointegq11 = zero
636 : :
637 : : ! BXU linear interpolation of volec_sq and dos_n
638 : : xe=(e2-elph_tr_ds%en_all(isppol,ie2_left))/ &
639 : 0 : & (elph_tr_ds%en_all(isppol,ie2_right)-elph_tr_ds%en_all(isppol,ie2_left))
640 : : veloc_sq_icomp = elph_tr_ds%veloc_sq(icomp,isppol,ie2_left)*(1.0d0-xe) + &
641 : 0 : & elph_tr_ds%veloc_sq(icomp,isppol,ie2_right)*xe
642 : : veloc_sq_jcomp = elph_tr_ds%veloc_sq(jcomp,isppol,ie2_left)*(1.0d0-xe) + &
643 : 0 : & elph_tr_ds%veloc_sq(jcomp,isppol,ie2_right)*xe
644 : : dos_n_e2 = elph_tr_ds%dos_n(ie2_left,isppol)*(1.0d0-xe) + &
645 : 0 : & elph_tr_ds%dos_n(ie2_right,isppol)*xe
646 : :
647 : 0 : tmp_veloc_sq1 = sqrt(elph_tr_ds%veloc_sq(icomp,isppol,ie1)*elph_tr_ds%veloc_sq(jcomp,isppol,ie1))
648 : : ! tmp_veloc_sq2 = sqrt(elph_tr_ds%veloc_sq(icomp,isppol,ie2)*elph_tr_ds%veloc_sq(jcomp,isppol,ie2))
649 : 0 : tmp_veloc_sq2 = sqrt(veloc_sq_icomp*veloc_sq_jcomp)
650 : :
651 : : ! ie_1 = (ie1-1)*elph_ds%nenergy + ie2
652 : : ! ie_2 = (ie2-1)*elph_ds%nenergy + ie1
653 : 0 : ie_1 = pair2red(ie1,ie2)
654 : 0 : ie_2 = pair2red(ie2,ie1)
655 [ # # ]: 0 : if (ie_1 .eq. 0 .or. ie_2 .eq. 0) then
656 : 0 : ABI_BUG('CHECK pair2red!')
657 : : end if
658 : :
659 [ # # ]: 0 : do ssp=1,4 ! (s,s'=+/-1, condense the indices)
660 : :
661 : 0 : nv1 = 1.0_dp/(elph_tr_ds%dos_n(ie1,isppol)*sqrt(tmp_veloc_sq1))
662 : 0 : sigma1 = sqrt(3.0_dp)*(e1-tmp_fermie)/(pi*Temp*kb_HaK)
663 : : !DEBUG
664 [ # # ]: 0 : if (elph_ds%ep_lova .eq. 1) then
665 : 0 : nv1 = 1.0_dp/(elph_tr_ds%dos_n0(itemp,isppol)*sqrt(tmp_veloc_sq0))
666 : 0 : sigma1 = sqrt(3.0_dp)*(e1-tmp_fermie)/(pi*Temp*kb_HaK)
667 : : end if
668 : : !ENDDEBUG
669 : :
670 : 0 : tointegq00_1 = zero
671 : 0 : tointegq01_1 = zero
672 : 0 : tointegq11_1 = zero
673 : :
674 : : !DEBUG
675 [ # # ]: 0 : if (elph_ds%ep_lova .eq. 1) then
676 : 0 : nv2 = 1.0_dp/(elph_tr_ds%dos_n0(itemp,isppol)*sqrt(tmp_veloc_sq0))
677 : 0 : sigma2 = sqrt(3.0_dp)*(e2-tmp_fermie)/(pi*Temp*kb_HaK)
678 : 0 : j00 = (nv1 + s1(ssp)*nv2)*(nv1 + s2(ssp)*nv2)/4.0_dp
679 : 0 : j01 = (nv1 + s1(ssp)*nv2)*(nv1*sigma1 + s2(ssp)*nv2*sigma2)/4.0_dp
680 : 0 : j11 = (nv1*sigma1 + s1(ssp)*nv2*sigma2)*(nv1*sigma1 + s2(ssp)*nv2*sigma2)/4.0_dp
681 : : tointegq00_1 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,1,itemp)* &
682 : 0 : & occ_e1*(1.0_dp-occ_e2)*j00*occ_omega
683 : : tointegq01_1 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,1,itemp)* &
684 : 0 : & occ_e1*(1.0_dp-occ_e2)*j01*occ_omega
685 : : tointegq11_1 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,1,itemp)* &
686 : 0 : & occ_e1*(1.0_dp-occ_e2)*j11*occ_omega
687 : : !END DEBUG
688 [ # # ]: 0 : else if (elph_ds%ep_lova .eq. 0) then
689 : 0 : nv2 = 1.0_dp/(dos_n_e2*sqrt(tmp_veloc_sq2))
690 : 0 : sigma2 = sqrt(3.0_dp)*(e2-tmp_fermie)/(pi*Temp*kb_HaK)
691 : 0 : j00 = (nv1 + s1(ssp)*nv2)*(nv1 + s2(ssp)*nv2)/4.0_dp
692 : 0 : j01 = (nv1 + s1(ssp)*nv2)*(nv1*sigma1 + s2(ssp)*nv2*sigma2)/4.0_dp
693 : 0 : j11 = (nv1*sigma1 + s1(ssp)*nv2*sigma2)*(nv1*sigma1 + s2(ssp)*nv2*sigma2)/4.0_dp
694 : : ! bxu TEST
695 : : if (debug) then
696 : : if (ssp .eq. 1 .and. itrtensor .eq. 1) then
697 : : write(21,"(3i5,4E20.12)") iomega, ie1, ie2, &
698 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp), j01, &
699 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)*j01, &
700 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)*j01*occ_e1*(1.0_dp-occ_e2)*occ_omega
701 : : end if
702 : : if (ssp .eq. 2 .and. itrtensor .eq. 1) then
703 : : write(22,"(3i5,4E20.12)") iomega, ie1, ie2, &
704 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp), j01, &
705 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)*j01, &
706 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)*j01*occ_e1*(1.0_dp-occ_e2)*occ_omega
707 : : end if
708 : : if (ssp .eq. 3 .and. itrtensor .eq. 1) then
709 : : write(23,"(3i5,4E20.12)") iomega, ie1, ie2, &
710 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp), j01, &
711 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)*j01, &
712 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)*j01*occ_e1*(1.0_dp-occ_e2)*occ_omega
713 : : end if
714 : : if (ssp .eq. 4 .and. itrtensor .eq. 1) then
715 : : write(24,"(3i5,4E20.12)") iomega, ie1, ie2, &
716 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp), j01, &
717 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)*j01, &
718 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)*j01*occ_e1*(1.0_dp-occ_e2)*occ_omega
719 : : end if
720 : : end if
721 : : tointegq00_1 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)* &
722 : 0 : & occ_e1*(1.0_dp-occ_e2)*j00*occ_omega
723 : : tointegq01_1 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)* &
724 : 0 : & occ_e1*(1.0_dp-occ_e2)*j01*occ_omega
725 : : tointegq11_1 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_1,itemp)* &
726 : 0 : & occ_e1*(1.0_dp-occ_e2)*j11*occ_omega
727 : : end if
728 : :
729 : 0 : tointegq00_2 = zero
730 : 0 : tointegq01_2 = zero
731 : 0 : tointegq11_2 = zero
732 : :
733 : : !DEBUG
734 [ # # ]: 0 : if (elph_ds%ep_lova .eq. 1) then
735 : 0 : nv2 = 1.0_dp/(elph_tr_ds%dos_n0(itemp,isppol)*sqrt(tmp_veloc_sq0))
736 : 0 : sigma2 = sqrt(3.0_dp)*(e2-tmp_fermie)/(pi*Temp*kb_HaK)
737 : 0 : j00 = (nv2 + s1(ssp)*nv1)*(nv2 + s2(ssp)*nv1)/4.0_dp
738 : 0 : j01 = (nv2 + s1(ssp)*nv1)*(nv2*sigma2 + s2(ssp)*nv1*sigma1)/4.0_dp
739 : 0 : j11 = (nv2*sigma2 + s1(ssp)*nv1*sigma1)*(nv2*sigma2 + s2(ssp)*nv1*sigma1)/4.0_dp
740 : : tointegq00_2 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,1,itemp)* &
741 : 0 : & occ_e1*(1.0_dp-occ_e2)*j00*(occ_omega+1)
742 : : tointegq01_2 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,1,itemp)* &
743 : 0 : & occ_e1*(1.0_dp-occ_e2)*j01*(occ_omega+1)
744 : : tointegq11_2 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,1,itemp)* &
745 : 0 : & occ_e1*(1.0_dp-occ_e2)*j11*(occ_omega+1)
746 : : !END DEBUG
747 [ # # ]: 0 : else if (elph_ds%ep_lova .eq. 0) then
748 : 0 : nv2 = 1.0_dp/(dos_n_e2*sqrt(tmp_veloc_sq2))
749 : 0 : sigma2 = sqrt(3.0_dp)*(e2-tmp_fermie)/(pi*Temp*kb_HaK)
750 : 0 : j00 = (nv2 + s1(ssp)*nv1)*(nv2 + s2(ssp)*nv1)/4.0_dp
751 : 0 : j01 = (nv2 + s1(ssp)*nv1)*(nv2*sigma2 + s2(ssp)*nv1*sigma1)/4.0_dp
752 : 0 : j11 = (nv2*sigma2 + s1(ssp)*nv1*sigma1)*(nv2*sigma2 + s2(ssp)*nv1*sigma1)/4.0_dp
753 : : !DEBUG bxu TEST
754 : : if (debug) then
755 : : if (ssp .eq. 1 .and. itrtensor .eq. 1) then
756 : : write(31,"(3i5,4E20.12)") iomega, ie2, ie1, &
757 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp), j01, &
758 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)*j01, &
759 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)*j01*occ_e2*(1.0_dp-occ_e1)*(occ_omega+1)
760 : : end if
761 : : if (ssp .eq. 2 .and. itrtensor .eq. 1) then
762 : : write(32,"(3i5,4E20.12)") iomega, ie2, ie1, &
763 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp), j01, &
764 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)*j01, &
765 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)*j01*occ_e2*(1.0_dp-occ_e1)*(occ_omega+1)
766 : : end if
767 : : if (ssp .eq. 3 .and. itrtensor .eq. 1) then
768 : : write(33,"(3i5,4E20.12)") iomega, ie2, ie1, &
769 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp), j01, &
770 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)*j01, &
771 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)*j01*occ_e2*(1.0_dp-occ_e1)*(occ_omega+1)
772 : : end if
773 : : if (ssp .eq. 4 .and. itrtensor .eq. 1) then
774 : : write(34,"(3i5,4E20.12)") iomega, ie2, ie1, &
775 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp), j01, &
776 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)*j01, &
777 : : & elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)*j01*occ_e2*(1.0_dp-occ_e1)*(occ_omega+1)
778 : : end if
779 : : end if
780 : : !ENDDEBUG
781 : : tointegq00_2 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)* &
782 : 0 : & occ_e2*(1.0_dp-occ_e1)*j00*(occ_omega+1)
783 : : tointegq01_2 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)* &
784 : 0 : & occ_e2*(1.0_dp-occ_e1)*j01*(occ_omega+1)
785 : : tointegq11_2 = elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,ssp,ie_2,itemp)* &
786 : 0 : & occ_e2*(1.0_dp-occ_e1)*j11*(occ_omega+1)
787 : : end if ! elph_ds%ep_lova
788 : :
789 : 0 : tointegq00 = tointegq00 + tointegq00_1 + tointegq00_2
790 : 0 : tointegq01 = tointegq01 + tointegq01_1 + tointegq01_2
791 : 0 : tointegq11 = tointegq11 + tointegq11_1 + tointegq11_2
792 : :
793 : : end do ! ss' = 4
794 : 0 : integrand_q00(iomega) = integrand_q00(iomega) + elph_tr_ds%de_all(isppol,ie1)*tointegq00
795 : 0 : integrand_q01(iomega) = integrand_q01(iomega) + elph_tr_ds%de_all(isppol,ie1)*tointegq01
796 : 0 : integrand_q11(iomega) = integrand_q11(iomega) + elph_tr_ds%de_all(isppol,ie1)*tointegq11
797 : : end do ! ie1 ~ 20
798 : 0 : omega=omega+domega
799 : : q00(itemp,icomp,jcomp,isppol) = q00(itemp,icomp,jcomp,isppol) +&
800 : 0 : & domega*integrand_q00(iomega)
801 : : q01(itemp,icomp,jcomp,isppol) = q01(itemp,icomp,jcomp,isppol) +&
802 : 0 : & domega*integrand_q01(iomega)
803 : : q11(itemp,icomp,jcomp,isppol) = q11(itemp,icomp,jcomp,isppol) +&
804 : 0 : & domega*integrand_q11(iomega)
805 : : end do ! omega ~ 400
806 : :
807 : : q00(itemp,icomp,jcomp,isppol)=q00(itemp,icomp,jcomp,isppol)* &
808 : 0 : & ucvol*two_pi*elph_tr_ds%dos_n0(itemp,isppol)/(kb_HaK*Temp)
809 : : q01(itemp,icomp,jcomp,isppol)=q01(itemp,icomp,jcomp,isppol)* &
810 : 0 : & ucvol*two_pi*elph_tr_ds%dos_n0(itemp,isppol)/(kb_HaK*Temp)
811 : : q11(itemp,icomp,jcomp,isppol)=q11(itemp,icomp,jcomp,isppol)* &
812 : 0 : & ucvol*two_pi*elph_tr_ds%dos_n0(itemp,isppol)/(kb_HaK*Temp)
813 : :
814 : 0 : rho = 0.5_dp*q00(itemp,icomp,jcomp,isppol)
815 : : ! is tau energy dependent?
816 : 0 : tau = 2.0d0*ucvol/(q00(itemp,icomp,jcomp,isppol)*elph_tr_ds%dos_n0(itemp,isppol)*tmp_veloc_sq0)
817 : 0 : write(unit_rho,'(4D20.10)')temp,rho,rho*chgu,rho/temp
818 : 0 : write(unit_tau,'(3D20.10)')temp,tau,tau*Time_Sec
819 : 0 : rho_T(itemp)=rho
820 : : end do ! temperature = 1?
821 : 0 : write(unit_rho,*)
822 : 0 : write(unit_tau,*)
823 : :
824 : : end do ! jcomp = 3
825 : : end do ! icomp = 3
826 : : end do ! isppol = 2
827 : :
828 : : !-----------------------------
829 : :
830 [ # # # # : 0 : seebeck = zero
# # # # ]
831 : : !rho_nm = zero
832 : :
833 : : !do isppol=1,elph_ds%nsppol
834 : : !do itemp=1,ntemper
835 : : !q11_inv(:,:)=q11(itemp,:,:,isppol)
836 : : !call matrginv(q11_inv,3,3)
837 : : !do icomp=1,3
838 : : !do jcomp=1,3
839 : : !do kcomp=1,3
840 : : !seebeck(isppol,itemp,icomp,jcomp) = seebeck(isppol,itemp,icomp,jcomp) + &
841 : : !& q01(itemp,icomp,kcomp,isppol)*q11_inv(kcomp,jcomp)
842 : : !end do
843 : : !end do
844 : : !end do
845 : : !end do
846 : : !end do
847 : :
848 [ # # ]: 0 : do isppol=1,elph_ds%nsppol
849 [ # # ]: 0 : do itemp=1,ntemper
850 [ # # # # ]: 0 : q11_inv(:,:)=q11(itemp,:,:,isppol)
851 : 0 : call matrginv(q11_inv,3,3)
852 : : call DGEMM('N','N',3,3,3,one,q01(itemp,:,:,isppol),3,q11_inv,&
853 [ # # # # : 0 : & 3,zero,seebeck(isppol,itemp,:,:),3)
# # # # #
# # # # #
# # # # #
# # # #
# ]
854 : : ! call DGEMM('N','N',3,3,3,one,seebeck(isppol,itemp,:,:),3,q01(itemp,:,:,isppol),&
855 : : ! & 3,zero,rho_nm(isppol,itemp,:,:),3)
856 : : end do
857 : : end do
858 : : pref_s = pi/sqrt(3.0_dp)
859 [ # # # # : 0 : seebeck=pref_s*seebeck
# # # # ]
860 : :
861 : : !fullq = zero
862 : : !do icomp=1,3
863 : : !do jcomp=1,3
864 : : !fullq(icomp,jcomp) = q00(1,icomp,jcomp,1)
865 : : !end do
866 : : !end do
867 : : !do icomp=1,3
868 : : !do jcomp=4,6
869 : : !fullq(icomp,jcomp) = q01(1,icomp,jcomp-3,1)
870 : : !end do
871 : : !end do
872 : : !do icomp=4,6
873 : : !do jcomp=1,3
874 : : !fullq(icomp,jcomp) = q01(1,icomp-3,jcomp,1)
875 : : !end do
876 : : !end do
877 : : !do icomp=4,6
878 : : !do jcomp=4,6
879 : : !fullq(icomp,jcomp) = q11(1,icomp-3,jcomp-3,1)
880 : : !end do
881 : : !end do
882 : : !write(*,*)' fullq'
883 : : !write(*,"(6E20.12)") (fullq(1,jcomp),jcomp=1,6)
884 : : !write(*,"(6E20.12)") (fullq(2,jcomp),jcomp=1,6)
885 : : !write(*,"(6E20.12)") (fullq(3,jcomp),jcomp=1,6)
886 : : !write(*,"(6E20.12)") (fullq(4,jcomp),jcomp=1,6)
887 : : !write(*,"(6E20.12)") (fullq(5,jcomp),jcomp=1,6)
888 : : !write(*,"(6E20.12)") (fullq(6,jcomp),jcomp=1,6)
889 : 0 : write(message,'(a)') 'q00:'
890 : 0 : call wrtout(std_out,message,'COLL')
891 : 0 : write(message,'(3E20.12)') (q00(1,1,jcomp,1),jcomp=1,3)
892 : 0 : call wrtout(std_out,message,'COLL')
893 : 0 : write(message,'(3E20.12)') (q00(1,2,jcomp,1),jcomp=1,3)
894 : 0 : call wrtout(std_out,message,'COLL')
895 : 0 : write(message,'(3E20.12)') (q00(1,3,jcomp,1),jcomp=1,3)
896 : 0 : call wrtout(std_out,message,'COLL')
897 : 0 : write(message,'(a)') 'q01:'
898 : 0 : call wrtout(std_out,message,'COLL')
899 : 0 : write(message,'(3E20.12)') (q01(1,1,jcomp,1),jcomp=1,3)
900 : 0 : call wrtout(std_out,message,'COLL')
901 : 0 : write(message,'(3E20.12)') (q01(1,2,jcomp,1),jcomp=1,3)
902 : 0 : call wrtout(std_out,message,'COLL')
903 : 0 : write(message,'(3E20.12)') (q01(1,3,jcomp,1),jcomp=1,3)
904 : 0 : call wrtout(std_out,message,'COLL')
905 : 0 : write(message,'(a)') 'q11, q11_inv:'
906 : 0 : call wrtout(std_out,message,'COLL')
907 : 0 : write(message,'(6E20.12)') (q11(1,1,jcomp,1),jcomp=1,3),(q11_inv(1,jcomp),jcomp=1,3)
908 : 0 : call wrtout(std_out,message,'COLL')
909 : 0 : write(message,'(6E20.12)') (q11(1,2,jcomp,1),jcomp=1,3),(q11_inv(2,jcomp),jcomp=1,3)
910 : 0 : call wrtout(std_out,message,'COLL')
911 : 0 : write(message,'(6E20.12)') (q11(1,3,jcomp,1),jcomp=1,3),(q11_inv(3,jcomp),jcomp=1,3)
912 : 0 : call wrtout(std_out,message,'COLL')
913 : : !q11_inv = zero
914 : : !do icomp = 1, 3
915 : : !q11_inv(icomp,icomp) = 2.0_dp
916 : : !end do
917 : :
918 : : !call matrginv(fullq,6,6)
919 : :
920 : : !do isppol=1,elph_ds%nsppol
921 : : !do itemp=1,ntemper
922 : : !rho_nm(isppol,itemp,:,:) = q00(itemp,:,:,isppol) - rho_nm(isppol,itemp,:,:)
923 : : !end do
924 : : !end do
925 : : !rho_nm = 0.5_dp*rho_nm
926 : :
927 : : !Output of Seebeck coefficient
928 [ # # ]: 0 : do isppol=1,elph_ds%nsppol
929 [ # # ]: 0 : do icomp=1,3
930 [ # # ]: 0 : do jcomp=1,3
931 : 0 : itrtensor=(icomp-1)*3+jcomp
932 : 0 : write(unit_sbk,*) '# Seebeck for isppol, itrten = ', isppol, itrtensor
933 : : ! write(88,*) '# Rho for isppol, itrten = ', isppol, itrtensor
934 : : ! write(89,*) '# Rho for isppol, itrten = ', isppol, itrtensor
935 [ # # ]: 0 : do itemp=1,ntemper
936 : 0 : Temp=tempermin+temperinc*dble(itemp)
937 : 0 : write(unit_sbk,'(3D20.10)')temp, seebeck(isppol,itemp,icomp,jcomp), seebeck(isppol,itemp,icomp,jcomp)*kb_HaK
938 : : ! write(88,'(3D20.10)')temp, rho_nm(isppol,itemp,icomp,jcomp), rho_nm(isppol,itemp,icomp,jcomp)*chgu
939 : : ! write(89,'(3D20.10)')temp, 0.5_dp/fullq(1,1), 0.5_dp*chgu/fullq(1,1)
940 : : end do ! temperature
941 : 0 : write(unit_sbk,*)
942 : : ! write(88,*)
943 : : ! write(89,*)
944 : : end do ! jcomp
945 : : end do ! icomp
946 : : end do ! isppol
947 : :
948 : : !Get thermal resistivity, based on eqn. (52) in Allen's PRB 17, 3725 (1978) [[cite:Allen1978]]
949 : : !WARNING: before 6.13.1 the thermal resistivity and Lorentz number were not in
950 : : !atomic units, BUT the SI units are good.
951 : 0 : pref_w = 3.0_dp/(2.0_dp*pi**2.0d0)
952 [ # # ]: 0 : do isppol=1,elph_ds%nsppol
953 [ # # ]: 0 : do icomp=1, 3
954 [ # # ]: 0 : do jcomp=1, 3
955 : 0 : itrtensor=(icomp-1)*3+jcomp
956 : :
957 : 0 : write(unit_therm,*) '# Thermal resistivity for isppol, itrten= ', isppol
958 : 0 : write(unit_lor,*) '# Lorentz coefficient for isppol, itrten= ', isppol
959 : :
960 [ # # ]: 0 : do itemp=1,ntemper
961 : :
962 : 0 : Temp=tempermin + temperinc*dble(itemp)
963 : :
964 : 0 : wtherm = pref_w*q11(itemp,icomp,jcomp,isppol)/(kb_HaK*Temp)
965 : :
966 : : ! write(unit_therm,'(5D20.10)')temp,wtherm,1./wtherm,wtherm/3.4057d9,1./(wtherm) *3.4057d9
967 : 0 : write(unit_therm,'(5D20.10)')temp,wtherm,1.0_dp/wtherm,wtherm*chwu,1.0_dp/(wtherm*chwu)
968 : :
969 : 0 : lorentz=rho_T(itemp)/(wtherm*kb_HaK*Temp)
970 : 0 : write(unit_lor,*)temp,lorentz,lor0
971 : :
972 : : end do
973 : 0 : write(unit_therm,*)
974 : 0 : write(unit_lor,*)
975 : : end do ! jcomp
976 : : end do ! icomp
977 : : end do ! isppol
978 : :
979 : :
980 [ # # ]: 0 : ABI_FREE(phfrq)
981 [ # # ]: 0 : ABI_FREE(displ)
982 [ # # ]: 0 : ABI_FREE(pheigvec)
983 [ # # ]: 0 : ABI_FREE(integrand_q00)
984 [ # # ]: 0 : ABI_FREE(integrand_q01)
985 [ # # ]: 0 : ABI_FREE(integrand_q11)
986 [ # # ]: 0 : ABI_FREE(q00)
987 [ # # ]: 0 : ABI_FREE(q01)
988 [ # # ]: 0 : ABI_FREE(q11)
989 [ # # ]: 0 : ABI_FREE(seebeck)
990 [ # # ]: 0 : ABI_FREE(rho_T)
991 [ # # ]: 0 : ABI_FREE(integrho)
992 [ # # ]: 0 : ABI_FREE(tointegrho)
993 : :
994 : 0 : close (unit=unit_lor)
995 : 0 : close (unit=unit_rho)
996 : 0 : close (unit=unit_tau)
997 : 0 : close (unit=unit_sbk)
998 : 0 : close (unit=unit_therm)
999 : :
1000 [ # # ]: 0 : ABI_FREE(elph_ds%k_fine%wtq)
1001 [ # # ]: 0 : ABI_FREE(elph_ds%k_phon%wtq)
1002 : :
1003 [ # # ]: 0 : ABI_FREE(elph_tr_ds%a2f_1d_tr)
1004 : :
1005 [ # # ]: 0 : ABI_FREE(elph_tr_ds%gamma_qpt_tr)
1006 [ # # ]: 0 : ABI_FREE(elph_tr_ds%gamma_rpt_tr)
1007 : 0 : write(std_out,*) ' mka2f_tr : end '
1008 : :
1009 [ # # ]: 0 : end subroutine mka2f_tr
1010 : : !!***
1011 : :
1012 : :
1013 : : !!****f* ABINIT/mka2f_tr_lova
1014 : : !!
1015 : : !! NAME
1016 : : !! mka2f_tr_lova
1017 : : !!
1018 : : !! FUNCTION
1019 : : !! calculates the FS averaged Transport alpha^2F_tr alpha^2F_trout alpha^2F_trin functions
1020 : : !! calculates and outputs the associated electrical and thermal conductivities
1021 : : !! for the first task: copied from mka2F
1022 : : !!
1023 : : !! INPUTS
1024 : : !! crystal<crystal_t>=data type gathering info on the crystalline structure.
1025 : : !! Ifc<ifc_type>=Object containing the interatomic force constants.
1026 : : !! elph_ds
1027 : : !! elph_ds%gkk2 = gkk2 matrix elements on full FS grid for each phonon mode
1028 : : !! elph_ds%nbranch = number of phonon branches = 3*natom
1029 : : !! elph_ds%nFSband = number of bands included in the FS integration
1030 : : !! elph_ds%k_fine%nkpt = number of kpts included in the FS integration
1031 : : !! elph_ds%k_fine%wtk = integration weights on the FS
1032 : : !! delph_ds%n0 = DOS at the Fermi level calculated from the k_fine integration weights
1033 : : !! elph_ds%k_fine%kpt = coordinates of all FS kpoints
1034 : : !! mustar = coulomb pseudopotential parameter
1035 : : !! eventually for 2 spin channels
1036 : : !! ntemper = number of temperature points to calculate, from tempermin to tempermin+ntemper*temperinc
1037 : : !! tempermin = minimum temperature at which resistivity etc are calculated (in K)
1038 : : !! temperinc = interval for temperature grid on which resistivity etc are calculated (in K)
1039 : : !!
1040 : : !! OUTPUT
1041 : : !! elph_ds
1042 : : !!
1043 : : !! NOTES
1044 : : !! copied from ftiaf9.f
1045 : : !!
1046 : : !! SOURCE
1047 : :
1048 : 5 : subroutine mka2f_tr_lova(crystal,ifc,elph_ds,ntemper,tempermin,temperinc,elph_tr_ds)
1049 : :
1050 : : !Arguments ------------------------------------
1051 : : !scalars
1052 : : integer,intent(in) :: ntemper
1053 : : real(dp),intent(in) :: tempermin,temperinc
1054 : : type(crystal_t),intent(in) :: crystal
1055 : : type(ifc_type),intent(in) :: ifc
1056 : : type(elph_tr_type),intent(inout) :: elph_tr_ds
1057 : : type(elph_type),intent(inout) :: elph_ds
1058 : :
1059 : : !Local variables -------------------------
1060 : : !x =w/(2kbT)
1061 : : !scalars
1062 : : integer :: iFSqpt,ibranch,iomega,isppol,jbranch,nerr
1063 : : integer :: unit_a2f_tr, unit_a2f_trout, unit_a2f_trin, natom
1064 : : integer :: idir, iatom, k1, kdir,unit_lor,unit_rho,unit_tau,unit_therm
1065 : : integer :: itemp,nrpt,itrtensor, icomp, jcomp
1066 : : real(dp) :: Temp,chgu,femto,diagerr,firh,firhT,gaussfactor,domega
1067 : : real(dp) :: firh_tau,firhT_tau ! added by BX to get Tau
1068 : : real(dp) :: a2fprefactor_in, temp_in
1069 : : real(dp) :: a2fprefactor_out, temp_out
1070 : : real(dp) :: gaussprefactor,gaussval,lambda_tr,lor0,lorentz,maxerr,maxx,omega
1071 : : real(dp) :: rho,tau,tolexp,wtherm,xtr,xx
1072 : : real(dp) :: lambda_tr_trace,omega_min, omega_max,qnorm2,spinfact
1073 : : character(len=500) :: message
1074 : : character(len=fnlen) :: fname
1075 : : !arrays
1076 : : complex(dp),parameter :: c0=dcmplx(0.d0,0.d0),c1=dcmplx(1.d0,0.d0)
1077 : : real(dp) :: gprimd(3,3)
1078 : 10 : real(dp) :: eigval_in(elph_ds%nbranch)
1079 : 10 : real(dp) :: eigval_out(elph_ds%nbranch)
1080 : 10 : real(dp) :: displ_red(2,elph_ds%nbranch,elph_ds%nbranch)
1081 : 10 : real(dp) :: gam_now_in (2,elph_ds%nbranch*elph_ds%nbranch)
1082 : 10 : real(dp) :: gam_now_out(2,elph_ds%nbranch*elph_ds%nbranch)
1083 : 10 : real(dp) :: tmpa2f_in (elph_ds%na2f)
1084 : 10 : real(dp) :: tmpa2f_out(elph_ds%na2f)
1085 : 10 : real(dp) :: tmpgam1(2,elph_ds%nbranch,elph_ds%nbranch)
1086 : 10 : real(dp) :: tmpgam2(2,elph_ds%nbranch,elph_ds%nbranch)
1087 : 5 : real(dp),allocatable :: phfrq(:,:)
1088 : 5 : real(dp),allocatable :: displ(:,:,:,:)
1089 : 5 : real(dp),allocatable :: pheigvec(:,:)
1090 : 5 : real(dp),allocatable :: integrho(:),integtau(:),tointegrho(:),tointega2f(:),tointegtau(:)
1091 : 5 : real(dp),allocatable :: rho_T(:),tau_T(:)
1092 : 5 : real(dp),allocatable :: coskr(:,:)
1093 : 5 : real(dp),allocatable :: sinkr(:,:)
1094 : : !real(dp),allocatable :: gam_rpt(:,:,:)
1095 : : ! *********************************************************************
1096 : :
1097 : : !calculate a2f_tr for frequencies between 0 and omega_max
1098 : 5 : write(std_out,*) 'mka2f_tr_lova : enter '
1099 : : !
1100 : : !MG: the step should be calculated locally using nomega and the extrema of the spectrum.
1101 : : !One should not rely on previous calls for the setup of elph_ds%domega
1102 : : !I will remove elph_ds%domega since mka2f.F90 will become a method of gamma_t
1103 : 5 : domega =elph_ds%domega
1104 : :
1105 : : ! Number of points for FFT interpolation
1106 : 5 : nrpt = ifc%nrpt
1107 : 5 : natom = crystal%natom
1108 [ + + + + ]: 65 : gprimd = crystal%gprimd
1109 : :
1110 [ - + + - : 20 : ABI_MALLOC(elph_tr_ds%a2f_1d_tr,(elph_ds%na2f,9,elph_ds%nsppol,1,1,1))
- + + - +
- + - - +
- + - + ]
1111 [ - + + - : 15 : ABI_MALLOC(elph_tr_ds%a2f_1d_trin,(elph_ds%na2f,9,elph_ds%nsppol))
- + + - -
+ - + -
+ ]
1112 [ - + + - : 15 : ABI_MALLOC(elph_tr_ds%a2f_1d_trout,(elph_ds%na2f,9,elph_ds%nsppol))
- + + - -
+ - + -
+ ]
1113 : :
1114 : : !! defaults for number of temperature steps and max T (all in Kelvin...)
1115 : : !ntemper=1000
1116 : : !tempermin=zero
1117 : : !temperinc=one
1118 [ - + + - : 15 : ABI_MALLOC(rho_T,(ntemper))
+ - + - -
+ - + ]
1119 [ - + + - : 10 : ABI_MALLOC(tau_T,(ntemper))
- + - + ]
1120 : :
1121 : :
1122 : : !tolerance on gaussian being = 0
1123 : 5 : tolexp = 1.d-100
1124 : 5 : maxx = sqrt(-log(tolexp))
1125 : 5 : lor0=(pi*kb_HaK)**2/3.
1126 : :
1127 : : !maximum value of frequency (a grid has to be chosen for the representation of alpha^2 F)
1128 : : !WARNING! supposes this value has been set in mkelph_linwid.
1129 : :
1130 : 5 : gaussprefactor = sqrt(piinv) / elph_ds%a2fsmear
1131 : 5 : gaussfactor = one / elph_ds%a2fsmear
1132 : :
1133 : : !spinfact should be 1 for a normal non sppol calculation without spinorbit
1134 : : !for spinors it should also be 1 as bands are twice as numerous but n0 has been divided by 2
1135 : : !for sppol 2 it should be 0.5 as we have 2 spin channels to sum
1136 : 5 : spinfact = one / elph_ds%nsppol !/ elph_ds%nspinor
1137 : :
1138 : : !ENDMG
1139 : :
1140 [ + + + + : 18070 : elph_tr_ds%a2f_1d_tr = zero
+ + + + +
+ + + ]
1141 [ + + + + : 18055 : elph_tr_ds%a2f_1d_trin = zero
+ + ]
1142 [ + + + + : 18055 : elph_tr_ds%a2f_1d_trout = zero
+ + ]
1143 : :
1144 : 5 : maxerr=0.
1145 : 5 : nerr=0
1146 : :
1147 [ - + + - : 20 : ABI_MALLOC(phfrq,(elph_ds%nbranch, elph_ds%k_fine%nkpt))
- + + - +
- + - - +
- + ]
1148 [ - + + - : 25 : ABI_MALLOC(displ,(2, elph_ds%nbranch, elph_ds%nbranch, elph_ds%k_fine%nkpt))
- + + - -
+ + - + -
+ - - + -
+ ]
1149 [ + - - + : 20 : ABI_MALLOC(pheigvec,(2*elph_ds%nbranch*elph_ds%nbranch, elph_ds%k_fine%nkpt))
+ - - + +
- + - + -
- + - + ]
1150 : :
1151 [ + + ]: 429 : do iFSqpt=1,elph_ds%k_fine%nkpt
1152 : 429 : call ifc%fourq(crystal,elph_ds%k_fine%kpt(:,iFSqpt),phfrq(:,iFSqpt),displ(:,:,:,iFSqpt),out_eigvec=pheigvec(:,iFSqpt))
1153 : : end do
1154 : :
1155 [ + + + + : 2133 : omega_min = minval(phfrq)
+ + + - -
+ - - ]
1156 [ + + + + : 2133 : omega_max = maxval(phfrq)
+ + + - -
+ - - ]
1157 : :
1158 [ - + + - : 20 : ABI_MALLOC(coskr, (elph_ds%k_fine%nkpt,nrpt))
- + + - +
- + - - +
- + ]
1159 [ - + + - : 15 : ABI_MALLOC(sinkr, (elph_ds%k_fine%nkpt,nrpt))
- + + - -
+ - + ]
1160 : 5 : call ftgam_init(Ifc%gprim, elph_ds%k_fine%nkpt, nrpt, elph_ds%k_fine%kpt, Ifc%rpt, coskr, sinkr)
1161 : :
1162 [ + + ]: 10 : do isppol=1,elph_ds%nsppol
1163 : :
1164 : : ! loop over qpoint in full kpt grid (presumably dense)
1165 [ + + ]: 434 : do iFSqpt=1,elph_ds%k_fine%nkpt
1166 [ + + ]: 1696 : qnorm2 = sum(elph_ds%k_fine%kpt(:,iFSqpt)**2)
1167 : : ! if (flag_to_exclude_soft_modes = .false.) qnorm2 = zero
1168 [ + + ]: 4245 : do itrtensor=1,9
1169 : : ! Do FT from real-space gamma grid to 1 qpt.
1170 : :
1171 [ - + ]: 3816 : if (elph_ds%ep_int_gkk == 1) then
1172 [ # # # # ]: 0 : gam_now_in(:,:) = elph_tr_ds%gamma_qpt_trin(:,itrtensor,:,isppol,iFSqpt)
1173 [ # # # # ]: 0 : gam_now_out(:,:) = elph_tr_ds%gamma_qpt_trout(:,itrtensor,:,isppol,iFSqpt)
1174 : : else
1175 : : call ftgam(Ifc%wghatm,gam_now_in, elph_tr_ds%gamma_rpt_trin(:,itrtensor,:,isppol,:),natom,1,nrpt,0,&
1176 [ + - + - : 9908856 : & coskr(iFSqpt,:), sinkr(iFSqpt,:))
+ + + + +
+ + - + -
+ + + - +
- + + + -
+ + + + +
+ + - +
- ]
1177 : : call ftgam(Ifc%wghatm,gam_now_out,elph_tr_ds%gamma_rpt_trout(:,itrtensor,:,isppol,:),natom,1,nrpt,0,&
1178 [ + - + - : 9908856 : & coskr(iFSqpt,:), sinkr(iFSqpt,:))
+ + + + +
+ + - + -
+ + + - +
- + + + -
+ + + + +
+ + - +
- ]
1179 : : end if
1180 : :
1181 : : ! Diagonalize gamma matrix at this qpoint (complex matrix).
1182 : :
1183 : : ! if ep_scalprod==0 we have to dot in the displacement vectors here
1184 [ + + ]: 3816 : if (elph_ds%ep_scalprod==0) then
1185 : :
1186 [ + + + + : 60264 : displ_red(:,:,:) = zero
+ + ]
1187 [ + + ]: 7776 : do jbranch=1,elph_ds%nbranch
1188 [ + + ]: 13608 : do iatom=1,natom
1189 [ + + ]: 29160 : do idir=1,3
1190 : 17496 : ibranch=idir+3*(iatom-1)
1191 [ + + ]: 75816 : do kdir=1,3
1192 : 52488 : k1 = kdir+3*(iatom-1)
1193 : : displ_red(1,ibranch,jbranch) = displ_red(1,ibranch,jbranch) + &
1194 : 52488 : & gprimd(kdir,idir)*displ(1,k1,jbranch,iFSqpt)
1195 : : displ_red(2,ibranch,jbranch) = displ_red(2,ibranch,jbranch) + &
1196 : 69984 : & gprimd(kdir,idir)*displ(2,k1,jbranch,iFSqpt)
1197 : : end do
1198 : : end do
1199 : : end do
1200 : : end do
1201 : :
1202 [ + + ]: 7776 : tmpgam2 = reshape (gam_now_in, (/2,elph_ds%nbranch,elph_ds%nbranch/))
1203 : 1944 : call gam_mult_displ(elph_ds%nbranch, displ_red, tmpgam2, tmpgam1)
1204 [ + + ]: 7776 : do jbranch=1,elph_ds%nbranch
1205 : 7776 : eigval_in(jbranch) = tmpgam1(1, jbranch, jbranch)
1206 : : end do
1207 : :
1208 [ + + ]: 7776 : tmpgam2 = reshape (gam_now_out, (/2,elph_ds%nbranch,elph_ds%nbranch/))
1209 : 1944 : call gam_mult_displ(elph_ds%nbranch, displ_red, tmpgam2, tmpgam1)
1210 [ + + ]: 7776 : do jbranch=1,elph_ds%nbranch
1211 : 7776 : eigval_out(jbranch) = tmpgam1(1, jbranch, jbranch)
1212 : : end do
1213 : :
1214 [ + - ]: 1872 : else if (elph_ds%ep_scalprod == 1) then
1215 : :
1216 : : !
1217 : : ! NOTE: in these calls gam_now and pheigvec do not have the right rank, but blas usually does not care
1218 : : call ZGEMM ( 'N', 'N', 3*natom, 3*natom, 3*natom, c1, gam_now_in, 3*natom,&
1219 : 1872 : & pheigvec(:,iFSqpt), 3*natom, c0, tmpgam1, 3*natom)
1220 : : call ZGEMM ( 'C', 'N', 3*natom, 3*natom, 3*natom, c1, pheigvec(:,iFSqpt), 3*natom,&
1221 : 1872 : & tmpgam1, 3*natom, c0, tmpgam2, 3*natom)
1222 : 1872 : diagerr = zero
1223 : :
1224 [ + + ]: 11376 : do ibranch=1,elph_ds%nbranch
1225 : 9504 : eigval_in(ibranch) = tmpgam2(1,ibranch,ibranch)
1226 [ + + ]: 30672 : do jbranch=1,ibranch-1
1227 : 30672 : diagerr = diagerr + abs(tmpgam2(1,jbranch,ibranch))
1228 : : end do
1229 [ + + ]: 32544 : do jbranch=ibranch+1,elph_ds%nbranch
1230 : 30672 : diagerr = diagerr + abs(tmpgam2(1,jbranch,ibranch))
1231 : : end do
1232 : : end do
1233 [ + + ]: 1872 : if (diagerr > tol12) then
1234 : 1036 : nerr=nerr+1
1235 : 1036 : maxerr=max(diagerr, maxerr)
1236 : : end if
1237 : :
1238 : : call ZGEMM ( 'N', 'N', 3*natom, 3*natom, 3*natom, c1, gam_now_out, 3*natom,&
1239 : 1872 : & pheigvec(:,iFSqpt), 3*natom, c0, tmpgam1, 3*natom)
1240 : : call ZGEMM ( 'C', 'N', 3*natom, 3*natom, 3*natom, c1, pheigvec(:,iFSqpt), 3*natom,&
1241 : 1872 : & tmpgam1, 3*natom, c0, tmpgam2, 3*natom)
1242 : 1872 : diagerr = zero
1243 : :
1244 [ + + ]: 11376 : do ibranch=1,elph_ds%nbranch
1245 : 9504 : eigval_out(ibranch) = tmpgam2(1,ibranch,ibranch)
1246 [ + + ]: 30672 : do jbranch=1,ibranch-1
1247 : 30672 : diagerr = diagerr + abs(tmpgam2(1,jbranch,ibranch))
1248 : : end do
1249 [ + + ]: 32544 : do jbranch=ibranch+1,elph_ds%nbranch
1250 : 30672 : diagerr = diagerr + abs(tmpgam2(1,jbranch,ibranch))
1251 : : end do
1252 : : end do
1253 [ + + ]: 1872 : if (diagerr > tol12) then
1254 : 1036 : nerr=nerr+1
1255 : 1036 : maxerr=max(diagerr, maxerr)
1256 : : end if
1257 : : end if
1258 : : ! end ep_scalprod if
1259 : :
1260 : : ! Add all contributions from the phonon modes at this qpoint to
1261 : : ! a2f and the phonon dos.
1262 [ + + ]: 19576 : do ibranch=1,elph_ds%nbranch
1263 : : ! if (abs(phfrq(ibranch,iFSqpt)) < tol10) then
1264 [ + + + + : 15336 : if ( abs(phfrq(ibranch,iFSqpt)) < tol7 .or. &
- + ]
1265 : : & (phfrq(ibranch,iFSqpt) < tol4 .and. qnorm2 > 0.03 )) then !
1266 : : ! note: this should depend on the velocity of sound, to accept acoustic
1267 : : ! modes!
1268 : : a2fprefactor_in = zero
1269 : : a2fprefactor_out= zero
1270 : : else
1271 : 14067 : a2fprefactor_in = eigval_in (ibranch)/(two_pi*abs(phfrq(ibranch,iFSqpt))*elph_ds%n0(isppol))
1272 : 14067 : a2fprefactor_out = eigval_out(ibranch)/(two_pi*abs(phfrq(ibranch,iFSqpt))*elph_ds%n0(isppol))
1273 : : end if
1274 : :
1275 : 15336 : omega = omega_min
1276 [ + + ]: 6149736 : tmpa2f_in (:) = zero
1277 [ + + ]: 6149736 : tmpa2f_out(:) = zero
1278 [ + + ]: 6149736 : do iomega=1,elph_ds%na2f
1279 : 6134400 : xx = (omega-phfrq(ibranch,iFSqpt))*gaussfactor
1280 : 6134400 : gaussval = gaussprefactor*exp(-xx*xx)
1281 : :
1282 : 6134400 : temp_in = gaussval*a2fprefactor_in
1283 : 6134400 : temp_out = gaussval*a2fprefactor_out
1284 : :
1285 [ + + ]: 6134400 : if (dabs(temp_in) < 1.0d-50) temp_in = zero
1286 [ + + ]: 6134400 : if (dabs(temp_out) < 1.0d-50) temp_out = zero
1287 : 6134400 : tmpa2f_in (iomega) = tmpa2f_in (iomega) + temp_in
1288 : 6134400 : tmpa2f_out(iomega) = tmpa2f_out(iomega) + temp_out
1289 : 6149736 : omega = omega+domega
1290 : : end do
1291 : :
1292 [ + + ]: 6149736 : elph_tr_ds%a2f_1d_trin (:,itrtensor,isppol) = elph_tr_ds%a2f_1d_trin (:,itrtensor,isppol) + tmpa2f_in(:)
1293 [ + + ]: 6153552 : elph_tr_ds%a2f_1d_trout(:,itrtensor,isppol) = elph_tr_ds%a2f_1d_trout(:,itrtensor,isppol) + tmpa2f_out(:)
1294 : :
1295 : : end do ! end ibranch do
1296 : : end do ! end itrtensor do
1297 : : end do ! end iFSqpt do
1298 : : end do ! end isppol
1299 : :
1300 [ - + ]: 5 : ABI_FREE(coskr)
1301 [ - + ]: 5 : ABI_FREE(sinkr)
1302 : :
1303 : : !second 1 / elph_ds%k_fine%nkpt factor for the integration weights
1304 [ + + + + : 18055 : elph_tr_ds%a2f_1d_trin = elph_tr_ds%a2f_1d_trin / elph_ds%k_fine%nkpt
+ + ]
1305 [ + + + + : 18055 : elph_tr_ds%a2f_1d_trout = elph_tr_ds%a2f_1d_trout / elph_ds%k_fine%nkpt
+ + ]
1306 : :
1307 [ + + ]: 5 : if (elph_ds%ep_scalprod == 1) then
1308 : 4 : write(std_out,*) 'mka2f_tr_lova: errors in diagonalization of gamma_tr with phon eigenvectors: ', nerr,maxerr
1309 : : end if
1310 : :
1311 [ + + + + : 18055 : elph_tr_ds%a2f_1d_tr(:,:,:,1,1,1) = elph_tr_ds%a2f_1d_trout(:,:,:) - elph_tr_ds%a2f_1d_trin(:,:,:)
+ + ]
1312 : :
1313 : : !output the elph_tr_ds%a2f_1d_tr
1314 [ + - ]: 5 : fname = trim(elph_ds%elph_base_name) // '_A2F_TR'
1315 [ - + ]: 5 : if (open_file (fname,message,newunit=unit_a2f_tr,status='unknown') /= 0) then
1316 : 0 : ABI_ERROR(message)
1317 : : end if
1318 : :
1319 [ + - ]: 5 : fname = trim(elph_ds%elph_base_name) // '_A2F_TRIN'
1320 [ - + ]: 5 : if (open_file(fname,message,newunit=unit_a2f_trin,status='unknown') /= 0) then
1321 : 0 : ABI_ERROR(message)
1322 : : end if
1323 : :
1324 [ + - ]: 5 : fname = trim(elph_ds%elph_base_name) // '_A2F_TROUT'
1325 [ - + ]: 5 : if (open_file (fname,message,newunit=unit_a2f_trout,status='unknown') /=0) then
1326 : 0 : ABI_ERROR(message)
1327 : : end if
1328 : :
1329 : 5 : write (unit_a2f_tr,'(a)') '#'
1330 : 5 : write (unit_a2f_tr,'(a)') '# ABINIT package : a2f_tr file'
1331 : 5 : write (unit_a2f_tr,'(a)') '#'
1332 : 5 : write (unit_a2f_tr,'(a)') '# a2f_tr function integrated over the FS. omega in a.u.'
1333 : 5 : write (unit_a2f_tr,'(a,I10)') '# number of kpoints integrated over : ', elph_ds%k_fine%nkpt
1334 : 5 : write (unit_a2f_tr,'(a,I10)') '# number of energy points : ',elph_ds%na2f
1335 : 5 : write (unit_a2f_tr,'(a,E16.6,a,E16.6,a)') '# between omega_min = ', omega_min,' Ha and omega_max = ', omega_max, ' Ha'
1336 : 5 : write (unit_a2f_tr,'(a,E16.6)') '# and the smearing width for gaussians is ', elph_ds%a2fsmear
1337 : 5 : write (unit_a2f_tr,'(a)') '#'
1338 : :
1339 : 5 : write (unit_a2f_trin,'(a)') '#'
1340 : 5 : write (unit_a2f_trin,'(a)') '# ABINIT package : a2f_trin file'
1341 : 5 : write (unit_a2f_trin,'(a)') '#'
1342 : 5 : write (unit_a2f_trin,'(a)') '# a2f_trin function integrated over the FS. omega in a.u.'
1343 : 5 : write (unit_a2f_trin,'(a,I10)') '# number of kpoints integrated over : ', elph_ds%k_fine%nkpt
1344 : 5 : write (unit_a2f_trin,'(a,I10)') '# number of energy points : ',elph_ds%na2f
1345 : 5 : write (unit_a2f_trin,'(a,E16.6,a,E16.6,a)') '# between omega_min = ', omega_min,' Ha and omega_max = ', omega_max, ' Ha'
1346 : 5 : write (unit_a2f_trin,'(a,E16.6)') '# and the smearing width for gaussians is ', elph_ds%a2fsmear
1347 : 5 : write (unit_a2f_trin,'(a)') '#'
1348 : :
1349 : 5 : write (unit_a2f_trout,'(a)') '#'
1350 : 5 : write (unit_a2f_trout,'(a)') '# ABINIT package : a2f_trout file'
1351 : 5 : write (unit_a2f_trout,'(a)') '#'
1352 : 5 : write (unit_a2f_trout,'(a)') '# a2f_trout function integrated over the FS. omega in a.u.'
1353 : 5 : write (unit_a2f_trout,'(a,I10)') '# number of kpoints integrated over : ', elph_ds%k_fine%nkpt
1354 : 5 : write (unit_a2f_trout,'(a,I10)') '# number of energy points : ',elph_ds%na2f
1355 : 5 : write (unit_a2f_trout,'(a,E16.6,a,E16.6,a)') '# between omega_min = ', omega_min,' Ha and omega_max = ', omega_max, ' Ha'
1356 : 5 : write (unit_a2f_trout,'(a,E16.6)') '# and the smearing width for gaussians is ', elph_ds%a2fsmear
1357 : 5 : write (unit_a2f_trout,'(a)') '#'
1358 : :
1359 : : !done with header
1360 [ + + ]: 10 : do isppol=1,elph_ds%nsppol
1361 : 5 : write (unit_a2f_tr,'(a,E16.6)') '# The DOS at Fermi level is ', elph_ds%n0(isppol)
1362 : 5 : write (unit_a2f_trin,'(a,E16.6)') '# The DOS at Fermi level is ', elph_ds%n0(isppol)
1363 : 5 : write (unit_a2f_trout,'(a,E16.6)') '# The DOS at Fermi level is ', elph_ds%n0(isppol)
1364 : : ! omega = zero
1365 : 5 : omega = omega_min
1366 [ + + ]: 2005 : do iomega=1,elph_ds%na2f
1367 : 2000 : write (unit_a2f_tr, '(10D16.6)') omega, elph_tr_ds%a2f_1d_tr (iomega,:,isppol,1,1,1)
1368 : 2000 : write (unit_a2f_trin, '(10D16.6)') omega, elph_tr_ds%a2f_1d_trin (iomega,:,isppol)
1369 : 2000 : write (unit_a2f_trout,'(10D16.6)') omega, elph_tr_ds%a2f_1d_trout(iomega,:,isppol)
1370 : 2005 : omega=omega+domega
1371 : : end do
1372 : 5 : write (unit_a2f_tr,*)
1373 : 5 : write (unit_a2f_trin,*)
1374 : 10 : write (unit_a2f_trout,*)
1375 : : end do !isppol
1376 : :
1377 : 5 : close (unit=unit_a2f_tr)
1378 : 5 : close (unit=unit_a2f_trin)
1379 : 5 : close (unit=unit_a2f_trout)
1380 : :
1381 : : !calculation of transport properties
1382 [ - + + - : 15 : ABI_MALLOC(integrho,(elph_ds%na2f))
+ - + - -
+ - + ]
1383 [ - + + - : 10 : ABI_MALLOC(tointegrho,(elph_ds%na2f))
- + - + ]
1384 [ - + + - : 10 : ABI_MALLOC(tointega2f,(elph_ds%na2f))
- + - + ]
1385 [ - + + - : 10 : ABI_MALLOC(integtau,(elph_ds%na2f))
- + - + ]
1386 [ - + + - : 10 : ABI_MALLOC(tointegtau,(elph_ds%na2f))
- + - + ]
1387 : :
1388 [ + - ]: 5 : fname = trim(elph_ds%elph_base_name) // '_RHO'
1389 [ - + ]: 5 : if (open_file(fname,message,newunit=unit_rho,status='unknown') /= 0) then
1390 : 0 : ABI_ERROR(message)
1391 : : end if
1392 : :
1393 : : !print header to resistivity file
1394 : 5 : write (unit_rho,*) '# Resistivity as a function of temperature.'
1395 : 5 : write (unit_rho,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
1396 : 5 : write (unit_rho,*) '# '
1397 : 5 : write (unit_rho,*) '# Columns are: '
1398 : 5 : write (unit_rho,*) '# temperature[K] rho[au] rho [SI] rho/temp [au]'
1399 : 5 : write (unit_rho,*) '# '
1400 : :
1401 [ + - ]: 5 : fname = trim(elph_ds%elph_base_name) // '_TAU'
1402 [ - + ]: 5 : if (open_file(fname,message,newunit=unit_tau,status='unknown') /= 0) then
1403 : 0 : ABI_ERROR(message)
1404 : : end if
1405 : :
1406 : : !print header to relaxation time file
1407 : 5 : write (unit_tau,*) '# Relaxation time as a function of temperature.'
1408 : 5 : write (unit_tau,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
1409 : 5 : write (unit_tau,*) '# '
1410 : 5 : write (unit_tau,*) '# Columns are: '
1411 : 5 : write (unit_tau,*) '# temperature[K] tau[au] tau [femtosecond] '
1412 : 5 : write (unit_tau,*) '# '
1413 : :
1414 [ + - ]: 5 : fname = trim(elph_ds%elph_base_name) // '_WTH'
1415 [ - + ]: 5 : if (open_file(fname,message,newunit=unit_therm,status='unknown') /= 0) then
1416 : 0 : ABI_ERROR(message)
1417 : : end if
1418 : :
1419 : : !print header to thermal conductivity file
1420 : 5 : write (unit_therm,'(a)') '# Thermal conductivity/resistivity as a function of temperature.'
1421 : 5 : write (unit_therm,'(a)') '# the formalism is isotropic, so non-cubic crystals may be wrong'
1422 : 5 : write (unit_therm,'(a)') '# '
1423 : 5 : write (unit_therm,'(a)') '# Columns are: '
1424 : 5 : write (unit_therm,'(a)') '# temperature[K] thermal rho[au] thermal cond [au] thermal rho [SI] thermal cond [SI]'
1425 : 5 : write (unit_therm,'(a)') '# '
1426 : :
1427 [ + - ]: 5 : fname = trim(elph_ds%elph_base_name) // '_LOR'
1428 [ - + ]: 5 : if (open_file(fname,message,newunit=unit_lor,status='unknown') /= 0) then
1429 : 0 : ABI_ERROR(message)
1430 : : end if
1431 : :
1432 : : !print header to lorentz file
1433 : 5 : write (unit_lor,*) '# Lorentz number as a function of temperature.'
1434 : 5 : write (unit_lor,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
1435 : 5 : write (unit_lor,*) '# '
1436 : 5 : write (unit_lor,*) '# Columns are: '
1437 : 5 : write (unit_lor,*) '# temperature[K] Lorentz number[au] Lorentz quantum = (pi*kb_HaK)**2/3'
1438 : 5 : write (unit_lor,*) '# '
1439 : :
1440 [ + + ]: 10 : do isppol=1,elph_ds%nsppol
1441 : 5 : lambda_tr_trace = zero
1442 [ + + ]: 50 : do itrtensor=1,9
1443 : 45 : omega = omega_min
1444 [ + + ]: 18045 : tointega2f = zero
1445 [ + + ]: 18045 : do iomega=1,elph_ds%na2f
1446 [ + + ]: 18000 : if(omega<=0) then
1447 : 2682 : omega=omega+domega
1448 : 2682 : cycle
1449 : : end if
1450 : 15318 : tointega2f(iomega)=elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,1,1,1)/omega
1451 : 15363 : omega=omega+domega
1452 : : end do
1453 : :
1454 [ + + ]: 18045 : integrho = zero
1455 : 45 : call simpson_int(elph_ds%na2f,domega,tointega2f,integrho)
1456 : 45 : lambda_tr = two * spinfact * integrho(elph_ds%na2f)
1457 : : write (message, '(a,2i3,a,es16.6)' )&
1458 : 45 : & ' mka2f_tr_lova : TRANSPORT lambda for isppol itrtensor', isppol, itrtensor, ' = ', lambda_tr
1459 : 45 : call wrtout(std_out,message,'COLL')
1460 [ + + ]: 50 : if (itrtensor == 1 .or. itrtensor == 5 .or. itrtensor == 9) lambda_tr_trace = lambda_tr_trace + lambda_tr
1461 : : end do !end itrtensor do
1462 : :
1463 : 5 : lambda_tr_trace = lambda_tr_trace / three
1464 : : write (message, '(a,i3,a,es16.6)' )&
1465 : 5 : & ' mka2f_tr_lova: 1/3 trace of TRANSPORT lambda for isppol ', isppol, ' = ', lambda_tr_trace
1466 : 5 : call wrtout(std_out,message,'COLL')
1467 : 10 : call wrtout(ab_out,message,'COLL')
1468 : : end do !end isppol do
1469 : :
1470 : : !constant to change units of rho from au to SI
1471 : 5 : chgu=2.173969d-7
1472 : 5 : femto=1.0d-15
1473 : :
1474 [ + + ]: 10 : do isppol=1,elph_ds%nsppol
1475 [ + + ]: 25 : do icomp=1, 3
1476 [ + + ]: 65 : do jcomp=1, 3
1477 : 45 : itrtensor=(icomp-1)*3+jcomp
1478 : :
1479 : : ! prefactor for resistivity integral
1480 : : ! firh=6.d0*pi*crystal%ucvol*kb_HaK/(elph_ds%n0(isppol)*elph_tr_ds%FSelecveloc_sq(isppol))
1481 : : ! FIXME: check factor of 2 which is different from Savrasov paper. 6 below for thermal conductivity is correct.
1482 : : firh=2.d0*pi*crystal%ucvol*kb_HaK/elph_ds%n0(isppol)/&
1483 : 45 : & sqrt(elph_tr_ds%FSelecveloc_sq(icomp,isppol)*elph_tr_ds%FSelecveloc_sq(jcomp,isppol))
1484 : :
1485 : : ! Add by BX to get Tau_elph
1486 : 45 : firh_tau = 2.0d0*pi*kb_HaK
1487 : : ! End Adding
1488 : :
1489 : 45 : write(unit_rho,*) '# Rho for isppol, itrten = ', isppol, itrtensor
1490 : 45 : write(unit_tau,*) '# Tau for isppol, itrten = ', isppol, itrtensor
1491 : :
1492 : : ! jmb
1493 [ + + ]: 18045 : tointegtau(:)=0.
1494 [ + + ]: 18045 : tointegrho(:)=0.
1495 [ + + ]: 495 : do itemp=1,ntemper ! runs over termperature in K
1496 : 450 : Temp=tempermin+temperinc*dble(itemp)
1497 : 450 : firhT=firh*Temp
1498 : 450 : firhT_tau=firh_tau*Temp
1499 : 450 : omega = omega_min
1500 [ + + ]: 180450 : do iomega=1,elph_ds%na2f
1501 [ + + ]: 180000 : if(omega<=0) then
1502 : 26820 : omega=omega+domega
1503 : 26820 : cycle
1504 : : end if
1505 : 153180 : xtr=omega/(2*kb_HaK*Temp)
1506 [ + - ]: 153180 : if(xtr < log(huge(zero)*tol16)/2)then
1507 : : tointegrho(iomega)=spinfact*firhT*omega*elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,1,1,1) &
1508 : 153180 : & /(((2*Temp*kb_HaK)**2)*((exp(xtr)-exp(-xtr))/2)**2)
1509 : : ! Add by BX to get Tau
1510 : : tointegtau(iomega)=spinfact*firhT_tau*omega*elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,1,1,1) &
1511 : 153180 : & /(((2*Temp*kb_HaK)**2)*((exp(xtr)-exp(-xtr))/2)**2)
1512 : : else
1513 : 0 : tointegrho(iomega)=zero
1514 : 0 : tointegtau(iomega)=zero
1515 : : end if
1516 : 153630 : omega=omega+domega
1517 : : end do
1518 : :
1519 : 450 : call simpson_int(elph_ds%na2f,domega,tointegrho,integrho)
1520 : 450 : call simpson_int(elph_ds%na2f,domega,tointegtau,integtau)
1521 : 450 : rho=integrho(elph_ds%na2f)
1522 : 450 : tau=1.0d99
1523 [ + + ]: 450 : if(dabs(integtau(elph_ds%na2f)) < tol7) then
1524 : 301 : write(message,'(a)') ' Cannot get a physical relaxation time '
1525 : 301 : ABI_WARNING(message)
1526 : : else
1527 : 149 : tau=1.0d0/integtau(elph_ds%na2f)
1528 : : end if
1529 : : ! if(elph_ds%na2f < 350.0) then
1530 : : ! tau=1.0d0/integtau(elph_ds%na2f)
1531 : : ! end if
1532 : 450 : write(unit_rho,'(4D20.10)')temp,rho,rho*chgu,rho/temp
1533 : 450 : write(unit_tau,'(3D20.10)')temp,tau,tau*Time_Sec/femto
1534 : 450 : rho_T(itemp)=rho
1535 : 495 : tau_T(itemp)=tau
1536 : : end do ! temperature
1537 : 45 : write(unit_rho,*)
1538 : 60 : write(unit_tau,*)
1539 : :
1540 : : end do ! jcomp
1541 : : end do ! icomp
1542 : : end do ! isppol
1543 : :
1544 : : !-----------------------------
1545 : :
1546 : :
1547 [ + + ]: 10 : do isppol=1,elph_ds%nsppol
1548 [ + + ]: 25 : do icomp=1, 3
1549 [ + + ]: 65 : do jcomp=1, 3
1550 : 45 : itrtensor=(icomp-1)*3+jcomp
1551 : : ! prefactor for integral of thermal conductivity
1552 : : ! firh=(18.*crystal%ucvol)/(pi*kb_HaK*elph_ds%n0(isppol)*elph_tr_ds%FSelecveloc_sq(isppol))
1553 : : firh=(6.d0*crystal%ucvol)/(pi*kb_HaK*elph_ds%n0(isppol))/ &
1554 : 45 : & sqrt(elph_tr_ds%FSelecveloc_sq(icomp,isppol)*elph_tr_ds%FSelecveloc_sq(jcomp,isppol))
1555 : :
1556 : :
1557 : 45 : write(unit_therm,*) '# Thermal resistivity for isppol, itrten= ', isppol
1558 : 45 : write(unit_lor,*) '# Lorentz coefficient for isppol, itrten= ', isppol
1559 : :
1560 [ + + ]: 18045 : tointegrho(:)=0.
1561 [ + + ]: 495 : do itemp=1,ntemper
1562 : :
1563 : 450 : Temp=tempermin + temperinc*dble(itemp)
1564 : 450 : omega = omega_min
1565 [ + + ]: 180450 : do iomega=1,elph_ds%na2f
1566 [ + + ]: 180000 : if(omega<=0) then
1567 : 26820 : omega=omega+domega
1568 : 26820 : cycle
1569 : : end if
1570 : 153180 : xtr=omega/(2*kb_HaK*Temp)
1571 [ + - ]: 153180 : if(xtr < log(huge(zero)*tol16)/2)then
1572 : : tointegrho(iomega) = spinfact*xtr**2/omega*&
1573 : : & ( elph_tr_ds%a2f_1d_tr(iomega,itrtensor,isppol,1,1,1)+&
1574 : : & 4*xtr**2*elph_tr_ds%a2f_1d_trout(iomega,itrtensor,isppol)/pi**2+ &
1575 : : & 2*xtr**2*elph_tr_ds%a2f_1d_trin(iomega,itrtensor,isppol)/pi**2) &
1576 : 153180 : & /(((exp(xtr)-exp(-xtr))/2)**2)
1577 : : else
1578 : 0 : tointegrho(iomega) = zero
1579 : : end if
1580 : 153630 : omega=omega+domega
1581 : : end do
1582 : :
1583 : 450 : call simpson_int(elph_ds%na2f,domega,tointegrho,integrho)
1584 : 450 : wtherm=integrho(elph_ds%na2f)*firh
1585 : :
1586 [ + + ]: 495 : if(abs(wtherm) > tol12)then
1587 : 422 : write(unit_therm,'(5D20.10)')temp,wtherm,1./wtherm,wtherm/3.4057d9,1./(wtherm) *3.4057d9
1588 : :
1589 : 422 : lorentz=rho_T(itemp)/(wtherm*temp)
1590 : 422 : write(unit_lor,*)temp,lorentz,lor0
1591 : : else
1592 : 28 : write(unit_therm,'(5D20.10)')temp,zero,huge(one),zero,huge(one)
1593 : 28 : write(unit_lor,*)temp,huge(one),lor0
1594 : : end if
1595 : :
1596 : : end do
1597 : 45 : write(unit_therm,*)
1598 : 60 : write(unit_lor,*)
1599 : : end do ! jcomp
1600 : : end do ! icomp
1601 : : end do !end isppol do
1602 : :
1603 : :
1604 [ - + ]: 5 : ABI_FREE(phfrq)
1605 [ - + ]: 5 : ABI_FREE(displ)
1606 [ - + ]: 5 : ABI_FREE(pheigvec)
1607 [ - + ]: 5 : ABI_FREE(rho_T)
1608 [ - + ]: 5 : ABI_FREE(tau_T)
1609 : :
1610 : 5 : close (unit=unit_lor)
1611 : 5 : close (unit=unit_rho)
1612 : 5 : close (unit=unit_tau)
1613 : 5 : close (unit=unit_therm)
1614 : :
1615 [ - + ]: 5 : ABI_FREE(integrho)
1616 [ - + ]: 5 : ABI_FREE(integtau)
1617 [ - + ]: 5 : ABI_FREE(tointega2f)
1618 [ - + ]: 5 : ABI_FREE(tointegrho)
1619 [ - + ]: 5 : ABI_FREE(tointegtau)
1620 [ - + ]: 5 : ABI_FREE(elph_tr_ds%a2f_1d_tr)
1621 [ - + ]: 5 : ABI_FREE(elph_tr_ds%a2f_1d_trin)
1622 [ - + ]: 5 : ABI_FREE(elph_tr_ds%a2f_1d_trout)
1623 : :
1624 [ - + ]: 5 : ABI_FREE(elph_tr_ds%gamma_qpt_trin)
1625 [ - + ]: 5 : ABI_FREE(elph_tr_ds%gamma_qpt_trout)
1626 [ - + ]: 5 : ABI_FREE(elph_tr_ds%gamma_rpt_trin)
1627 [ - + ]: 5 : ABI_FREE(elph_tr_ds%gamma_rpt_trout)
1628 : :
1629 : : !DEBUG
1630 : 5 : write(std_out,*) ' mka2f_tr_lova : end '
1631 : : !ENDDEBUG
1632 : :
1633 : 5 : end subroutine mka2f_tr_lova
1634 : : !!***
1635 : :
1636 : : !!****f* ABINIT/get_tau_k
1637 : : !! NAME
1638 : : !! get_tau_k
1639 : : !!
1640 : : !! FUNCTION
1641 : : !! Calculate the k-dependent relaxation time due to EPC. Impelementation based
1642 : : !! on derivation from Grmvall's book or
1643 : : !! OD Restrepo's paper (PRB 94 212103 (2009) [[cite:Restrepo2009]])
1644 : : !!
1645 : : !! INPUTS
1646 : : !! Cryst<crystal_t>=Info on the unit cell and on its symmetries.
1647 : : !! Ifc<ifc_type>=Object containing the interatomic force constants.
1648 : : !! elph_ds = elphon datastructure with data and dimensions
1649 : : !! eigenGS = Ground State eigenvalues
1650 : : !! max_occ = maximal occupancy for a band
1651 : : !!
1652 : : !! OUTPUT
1653 : : !! tau_k(nsppol,nkptirr,nband)=mode relaxation time due to electron phonono coupling
1654 : : !! rate_e(nene)= scattering rate due to electron phonono coupling vs. energy
1655 : : !!
1656 : : !! SOURCE
1657 : :
1658 : 0 : subroutine get_tau_k(Cryst,ifc,Bst,elph_ds,elph_tr_ds,eigenGS,max_occ)
1659 : :
1660 : : !Arguments ------------------------------------
1661 : : type(crystal_t),intent(in) :: Cryst
1662 : : type(ifc_type),intent(in) :: ifc
1663 : : type(ebands_t),intent(inout) :: Bst
1664 : : type(elph_type),intent(inout) :: elph_ds
1665 : : type(elph_tr_type), intent(inout) :: elph_tr_ds
1666 : : real(dp),intent(in) :: max_occ
1667 : : real(dp),intent(in) :: eigenGS(elph_ds%nband,elph_ds%k_phon%nkpt,elph_ds%nsppol)
1668 : :
1669 : : !Local variables-------------------------------
1670 : : !scalars
1671 : : character(len=500) :: message
1672 : : character(len=fnlen) :: fname
1673 : : integer :: ntemper,nsppol,nbranch,nband,natom
1674 : : integer :: nkpt,nqpt,nkptirr,nqptirr,new_nkptirr
1675 : : integer :: isppol,iFSkpt,iFSqpt,iqpt,iqpt_fullbz,imqpt_fullbz,ikpt_kpq,ikpt_kmq
1676 : : integer :: iband,jband,jpband,jbeff,ibranch,jbranch,itemp
1677 : : integer :: irec,ierr,nrpt,ik_this_proc
1678 : : integer :: unit_tau,unit_invtau
1679 : : integer :: nene,nene_all,iene,iene_fine,unit_taue,unit_mfp
1680 : : integer :: icomp,jcomp,itensor
1681 : : integer :: ikpt_irr,iomega,unit_cond,unit_therm,unit_sbk
1682 : : integer :: nskip,nspline
1683 : : real(dp) :: occ_omega,occ_e
1684 : : real(dp) :: xx,Temp,therm_factor
1685 : : real(dp) :: factor,dfermide
1686 : : real(dp) :: e_k,rate_e,mfp_e
1687 : : real(dp) :: ene,enemin,enemax,deltaene
1688 : : real(dp) :: omega,omega_min,omega_max,domega
1689 : : real(dp) :: diagerr
1690 : : real(dp) :: chu_cond,chu_cth,femto
1691 : 0 : real(dp) :: displ_red(2,elph_ds%nbranch,elph_ds%nbranch)
1692 : 0 : real(dp) :: eigval(elph_ds%nbranch),eigval2(elph_ds%nbranch)
1693 : 0 : real(dp) :: imeigval(elph_ds%nbranch)
1694 : : real(dp) :: tmp_wtkpq, tmp_wtkmq, tol_wtk
1695 : : real(dp) :: yp1,ypn
1696 : : !arrays
1697 : 0 : integer,allocatable :: FSfullpktofull(:,:),mqtofull(:)
1698 : 0 : integer,allocatable :: kpttokpt(:,:,:)
1699 : : real(dp) :: cond_inv(3,3)
1700 : 0 : real(dp),allocatable :: fermie(:)
1701 : 0 : real(dp),allocatable :: tmp_eigenGS(:,:,:)
1702 : 0 : real(dp),allocatable :: tmp_gkk_qpt(:,:,:),tmp_gkk_rpt(:,:,:),tmp_gkk_kpt(:,:)
1703 : 0 : real(dp),allocatable :: tmp_gkk_kpt2(:,:,:), gkk_kpt(:,:,:)
1704 : 0 : real(dp),allocatable :: tau_k(:,:,:,:),inv_tau_k(:,:,:,:),tmp_tau_k(:,:,:,:)
1705 : 0 : real(dp),allocatable :: phfrq(:,:),pheigvec(:,:)
1706 : 0 : real(dp),allocatable :: displ(:,:,:,:)
1707 : 0 : real(dp),allocatable :: a2f_2d(:),a2f_2d2(:)
1708 : 0 : real(dp),allocatable :: tmp_wtk(:,:,:,:),tmp2_wtk(:),tmp_wtk1(:),tmp_wtk2(:)
1709 : 0 : real(dp),allocatable :: ene_pt(:),ene_ptfine(:),ff2(:)
1710 : 0 : real(dp),allocatable :: wtq(:,:,:),tmp_wtq(:,:,:),tmp2_wtq(:,:)
1711 : 0 : real(dp),allocatable :: dos_e(:,:)
1712 : 0 : real(dp),allocatable :: coskr1(:,:),sinkr1(:,:)
1713 : 0 : real(dp),allocatable :: coskr2(:,:),sinkr2(:,:)
1714 : 0 : real(dp),allocatable :: cond_e(:,:,:,:),cond(:,:,:,:),sbk(:,:,:,:),seebeck(:,:,:,:),cth(:,:,:,:)
1715 : :
1716 : : ! *************************************************************************
1717 : :
1718 : 0 : write(std_out,*) 'get_tau_k : enter '
1719 : :
1720 : 0 : nrpt = ifc%nrpt
1721 : 0 : natom = cryst%natom
1722 : :
1723 : 0 : nsppol = elph_ds%nsppol
1724 : 0 : nbranch = elph_ds%nbranch
1725 : 0 : nband = elph_ds%ngkkband
1726 : 0 : nkpt = elph_ds%k_phon%nkpt
1727 : 0 : nqpt = elph_ds%nqpt_full
1728 : 0 : nkptirr = elph_ds%k_phon%nkptirr
1729 : 0 : new_nkptirr = elph_ds%k_phon%new_nkptirr
1730 : 0 : nqptirr = elph_ds%nqptirred
1731 : 0 : ntemper = elph_ds%ntemper
1732 : 0 : nene = 2*elph_ds%na2f-1 ! only need e_k +- omega_max range, take deltaene=delta_oemga
1733 : :
1734 : 0 : chu_cond = 4.59988159904764*1.0d6 ! REPLACE WITH DATA FROM DEFS_BASIS
1735 : 0 : chu_cth = 1.078637439971599*1.0d4 ! REPLACE WITH DATA FROM DEFS_BASIS
1736 : 0 : femto = 1.0d-15
1737 : :
1738 : 0 : tol_wtk = tol7/nkptirr/nband
1739 : :
1740 [ # # # # : 0 : ABI_MALLOC(fermie ,(ntemper))
# # # # #
# # # ]
1741 [ # # # # : 0 : ABI_MALLOC(tmp_gkk_qpt ,(2,nbranch**2,nqpt))
# # # # #
# # # # #
# # ]
1742 [ # # # # : 0 : ABI_MALLOC(tmp_gkk_rpt ,(2,nbranch**2,nrpt))
# # # # #
# # # # #
# # ]
1743 [ # # # # : 0 : ABI_MALLOC(tmp_gkk_kpt ,(2,nbranch**2))
# # # # #
# # # ]
1744 [ # # # # : 0 : ABI_MALLOC(tmp_gkk_kpt2 ,(2,nbranch,nbranch))
# # # # #
# # # # #
# # ]
1745 [ # # # # : 0 : ABI_MALLOC(gkk_kpt ,(2,nbranch,nbranch))
# # # # #
# # # ]
1746 [ # # # # : 0 : ABI_MALLOC(a2f_2d, (nene))
# # # # #
# # # ]
1747 [ # # # # : 0 : ABI_MALLOC(a2f_2d2, (nene))
# # # # ]
1748 [ # # # # : 0 : ABI_MALLOC(inv_tau_k, (ntemper,nsppol,nkpt,nband))
# # # # #
# # # # #
# # # # #
# # # # #
# # ]
1749 [ # # # # : 0 : ABI_MALLOC(tau_k, (ntemper,nsppol,nkpt,nband))
# # # # #
# # # # #
# # # # #
# ]
1750 [ # # # # : 0 : ABI_MALLOC(tmp_tau_k ,(ntemper,nsppol,new_nkptirr,nband))
# # # # #
# # # # #
# # # # #
# # # #
# ]
1751 : :
1752 [ # # ]: 0 : if (elph_ds%gkqwrite == 0) then
1753 : 0 : call wrtout(std_out,' get_tau_k : keeping gkq matrices in memory','COLL')
1754 [ # # ]: 0 : else if (elph_ds%gkqwrite == 1) then
1755 [ # # ]: 0 : fname=trim(elph_ds%elph_base_name) // '_GKKQ'
1756 : 0 : write (message,'(2a)')' get_tau_k : reading gkq matrices from file ',trim(fname)
1757 : 0 : call wrtout(std_out,message,'COLL')
1758 : : else
1759 : 0 : write (message,'(a,i0)')' Wrong value for gkqwrite = ',elph_ds%gkqwrite
1760 : 0 : ABI_BUG(message)
1761 : : end if
1762 : :
1763 : : !=========================================================
1764 : : !Get equivalence between a kpt_phon pair and a qpt in qpt_full
1765 : : !only works if the qpt grid is complete (identical to
1766 : : !the kpt one, with a basic shift of (0,0,0)
1767 : : !=========================================================
1768 : :
1769 : : !mapping of k + q onto k' for k and k' in full BZ
1770 : : !for dense k grid
1771 [ # # # # : 0 : ABI_MALLOC(FSfullpktofull,(nkpt,nkpt))
# # # # #
# # # # #
# # ]
1772 [ # # # # : 0 : ABI_MALLOC(mqtofull,(nkpt))
# # # # #
# # # ]
1773 : :
1774 : : !kpttokpt(itim,isym,iqpt) = kpoint index which transforms to ikpt under isym and with time reversal itim.
1775 [ # # # # : 0 : ABI_MALLOC(kpttokpt,(2,Cryst%nsym,nkpt))
# # # # #
# # # # #
# # ]
1776 : :
1777 : 0 : call wrtout(std_out,'get_tau_k: calling mkqptequiv to set up the FS kpoint set',"COLL")
1778 : :
1779 : 0 : call mkqptequiv (FSfullpktofull,Cryst,elph_ds%k_phon%kpt,nkpt,nkpt,kpttokpt,elph_ds%k_phon%kpt,mqtofull)
1780 : :
1781 : : !=========================================================
1782 : : !=========================================================
1783 : :
1784 : 0 : omega_max = elph_ds%omega_max
1785 : 0 : omega_min = elph_ds%omega_min
1786 : 0 : domega = elph_ds%domega
1787 [ # # # # : 0 : enemax = maxval(eigenGS(elph_ds%maxFSband,:,:))
# # # # #
# # # ]
1788 [ # # # # : 0 : enemin = minval(eigenGS(elph_ds%minFSband,:,:))
# # # # #
# # # ]
1789 : :
1790 [ # # ]: 0 : if (enemin < (elph_ds%fermie-0.2)) then
1791 : 0 : enemin = elph_ds%fermie-0.2
1792 : : end if
1793 [ # # ]: 0 : if (enemax > (elph_ds%fermie+0.2)) then
1794 : 0 : enemax = elph_ds%fermie+0.2
1795 : : end if
1796 : :
1797 : 0 : nspline = elph_ds%ep_nspline
1798 : 0 : nene_all = INT((enemax-enemin+domega)/(nspline*domega)) + 1
1799 : 0 : deltaene = domega
1800 : 0 : write(std_out,*) 'E_min= ',enemin, 'E_max= ',enemax
1801 : 0 : write(std_out,*) 'Number of energy points= ',nene_all
1802 : 0 : write(std_out,'(a,I8)') 'scale factor for spline interpolation in RTA = ', elph_ds%ep_nspline
1803 : 0 : write(std_out,*) 'delta_ene before spline interpolation= ',deltaene*nspline
1804 : 0 : write(std_out,*) 'delta_ene after spline interpolation= ',deltaene
1805 : 0 : write(std_out,*) 'Omega_min= ',omega_min, 'Omega_max= ',omega_max
1806 : 0 : write(std_out,*) 'Number of phonon points= ',elph_ds%na2f
1807 : 0 : write(std_out,*) 'delta_omega= ',domega
1808 : 0 : write(std_out,*) 'number of bands= ', elph_ds%nband, nband
1809 : :
1810 [ # # # # : 0 : ABI_MALLOC(tmp_wtk,(nband,nkpt,nsppol,nene_all))
# # # # #
# # # # #
# # # # #
# # # #
# ]
1811 [ # # # # : 0 : ABI_MALLOC(tmp2_wtk,(nene_all))
# # # # #
# # # ]
1812 [ # # # # : 0 : ABI_MALLOC(ff2,(nene_all))
# # # # ]
1813 [ # # # # : 0 : ABI_MALLOC(ene_pt,(nene_all))
# # # # ]
1814 [ # # # # : 0 : ABI_MALLOC(ene_ptfine,(nene_all*nspline))
# # # # #
# # # ]
1815 [ # # # # : 0 : ABI_MALLOC(tmp_wtk1,(nene_all*nspline))
# # # # ]
1816 [ # # # # : 0 : ABI_MALLOC(tmp_wtk2,(nene_all*nspline))
# # # # ]
1817 [ # # # # : 0 : ABI_MALLOC(dos_e,(nsppol,nene_all))
# # # # #
# # # # #
# # ]
1818 : :
1819 : : !Get energy points for spline interpolation
1820 [ # # ]: 0 : do iene = 1, nene_all
1821 : 0 : ene_pt(iene) = enemin + (iene-1)*nspline*deltaene
1822 : : end do
1823 : :
1824 [ # # ]: 0 : do iene = 1, nene_all*nspline
1825 : 0 : ene_ptfine(iene) = enemin + (iene-1)*deltaene
1826 : : end do
1827 : :
1828 [ # # # # : 0 : ABI_MALLOC(tmp_wtq,(elph_ds%nbranch, elph_ds%k_phon%nkpt, elph_ds%na2f+1))
# # # # #
# # # # #
# # # # #
# # # ]
1829 [ # # # # : 0 : ABI_MALLOC(wtq,(elph_ds%nbranch, elph_ds%k_phon%nkpt, elph_ds%na2f))
# # # # #
# # # # #
# # # # #
# ]
1830 [ # # # # : 0 : ABI_MALLOC(tmp2_wtq,(elph_ds%nbranch, elph_ds%na2f))
# # # # #
# # # # #
# # ]
1831 : :
1832 : : !phonon
1833 [ # # # # : 0 : ABI_MALLOC(phfrq,(nbranch, nkptirr))
# # # # #
# # # # #
# # ]
1834 [ # # # # : 0 : ABI_MALLOC(displ,(2, nbranch, nbranch, nkptirr))
# # # # #
# # # # #
# # # # #
# ]
1835 [ # # # # : 0 : ABI_MALLOC(pheigvec,(2*nbranch*nbranch, nkptirr))
# # # # #
# # # # #
# # # # ]
1836 : :
1837 [ # # ]: 0 : do iFSqpt = 1, nkptirr
1838 : 0 : call ifc%fourq(cryst,elph_ds%k_phon%kptirr(:,iFSqpt),phfrq(:,iFSqpt),displ(:,:,:,iFSqpt),out_eigvec=pheigvec(:,iFSqpt))
1839 : : end do
1840 : :
1841 : 0 : omega_min = omega_min - domega
1842 : :
1843 : : !bxu, obtain wtq for the q_fine, then condense to q_phon
1844 : : call ep_ph_weights(phfrq,elph_ds%a2fsmear,omega_min,omega_max,elph_ds%na2f+1,Cryst%gprimd,elph_ds%kptrlatt, &
1845 : 0 : & elph_ds%nbranch,elph_ds%telphint,elph_ds%k_phon,tmp_wtq)
1846 : 0 : omega_min = omega_min + domega
1847 : :
1848 [ # # ]: 0 : do iomega = 1, elph_ds%na2f
1849 [ # # # # ]: 0 : wtq(:,:,iomega) = tmp_wtq(:,:,iomega+1)
1850 : : !write(1005,*) omega_min+(iomega-1)*domega, sum(tmp_wtq(:,:,iomega+1))/nkpt
1851 : : end do
1852 [ # # ]: 0 : ABI_FREE(tmp_wtq)
1853 : :
1854 : : ! electron
1855 [ # # # # : 0 : tmp_wtk =zero
# # # # ]
1856 [ # # # # ]: 0 : dos_e = zero
1857 : : call ep_el_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS(elph_ds%minFSband:elph_ds%minFSband+nband-1,:,:), &
1858 : : & elph_ds%elphsmear, &
1859 : : & enemin, enemax, nene_all, Cryst%gprimd, elph_ds%k_phon%irredtoGS, elph_ds%kptrlatt, max_occ, &
1860 [ # # # # : 0 : & 1, nband, elph_ds%nFSband, nsppol, elph_ds%telphint, elph_ds%k_phon, tmp_wtk)
# # # # #
# # # ]
1861 : : !& elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, nsppol, elph_ds%telphint, elph_ds%k_phon, tmp_wtk)
1862 : :
1863 [ # # ]: 0 : do isppol = 1, nsppol
1864 [ # # ]: 0 : do iene = 1, nene_all
1865 [ # # # # ]: 0 : dos_e(isppol,iene) = sum(tmp_wtk(:,:,isppol,iene))/nkpt
1866 : : end do
1867 : : end do
1868 : :
1869 [ # # # # : 0 : ABI_MALLOC(coskr1, (nqpt,nrpt))
# # # # #
# # # # #
# # ]
1870 [ # # # # : 0 : ABI_MALLOC(sinkr1, (nqpt,nrpt))
# # # # #
# # # ]
1871 : 0 : call ftgam_init(ifc%gprim, nqpt, nrpt, elph_ds%k_phon%kpt, Ifc%rpt, coskr1, sinkr1)
1872 [ # # # # : 0 : ABI_MALLOC(coskr2, (nkptirr,nrpt))
# # # # #
# # # # #
# # ]
1873 [ # # # # : 0 : ABI_MALLOC(sinkr2, (nkptirr,nrpt))
# # # # #
# # # ]
1874 : 0 : call ftgam_init(ifc%gprim, nkptirr, nrpt, elph_ds%k_phon%kpt, Ifc%rpt, coskr2, sinkr2)
1875 : :
1876 : : !get fermie for itemp
1877 [ # # ]: 0 : fermie = elph_ds%fermie
1878 [ # # ]: 0 : do itemp=1,ntemper ! runs over termperature in K
1879 : 0 : Temp=elph_ds%tempermin+elph_ds%temperinc*dble(itemp)
1880 : :
1881 : 0 : Bst%occopt = 3
1882 : 0 : Bst%tsmear = Temp*kb_HaK
1883 : 0 : call Bst%update_occ(-99.99_dp)
1884 : 0 : write(message,'(a,f12.6,a,E20.12)')'At T=',Temp,' Fermi level is:',Bst%fermie
1885 : 0 : call wrtout(std_out,message,'COLL')
1886 : :
1887 [ # # ]: 0 : if (abs(elph_ds%fermie) < tol10) then
1888 : 0 : fermie(itemp) = Bst%fermie
1889 : : end if
1890 : : end do
1891 : :
1892 [ # # # # : 0 : inv_tau_k = zero
# # # # ]
1893 : : !get a2f_2d = \sum_{q,nbranch,jband'} |gkk|^2*\delta(\epsilon_{k'j'}-\epsilon')*\delta(\omega_q-\omega)
1894 [ # # ]: 0 : do isppol=1,nsppol
1895 : 0 : write (std_out,*) '##############################################'
1896 : 0 : write (std_out,*) 'get_tau_k : Treating spin polarization ', isppol
1897 : 0 : write (std_out,*) '##############################################'
1898 : :
1899 : : ! do iFSkpt =1,nkpt
1900 [ # # ]: 0 : do ik_this_proc =1,elph_ds%k_phon%my_nkpt
1901 : 0 : iFSkpt = elph_ds%k_phon%my_ikpt(ik_this_proc)
1902 : 0 : write (std_out,*) 'get_tau_k : working on kpt # ', iFSkpt, '/', nkpt
1903 [ # # ]: 0 : do jband = 1, nband
1904 : : ! write(*,*)'i am here 1 ', isppol,iFSkpt,jband
1905 [ # # ]: 0 : a2f_2d = zero
1906 [ # # ]: 0 : a2f_2d2 = zero
1907 : :
1908 : : !sum from here
1909 : 0 : nskip = 0
1910 [ # # ]: 0 : do jpband = 1, nband
1911 : 0 : jbeff = jpband+(jband-1)*nband
1912 : :
1913 [ # # ]: 0 : if (elph_ds%gkqwrite == 0) then
1914 [ # # # # : 0 : tmp_gkk_qpt(:,:,:) = elph_ds%gkk_qpt(:,jbeff,:,ik_this_proc,isppol,:)
# # ]
1915 [ # # ]: 0 : else if (elph_ds%gkqwrite == 1) then
1916 : 0 : irec = (ik_this_proc-1)*elph_ds%k_phon%my_nkpt + iqpt
1917 [ # # ]: 0 : if (iFSkpt == 1) then
1918 : 0 : write (std_out,*) ' get_tau_k read record ', irec
1919 : : end if
1920 : 0 : read (elph_ds%unitgkq,REC=irec) tmp_gkk_qpt(:,:,iqpt_fullbz)
1921 : : end if
1922 : :
1923 : : !FT to real space
1924 : 0 : call ftgam(Ifc%wghatm,tmp_gkk_qpt,tmp_gkk_rpt,natom,nqpt,nrpt,1,coskr1,sinkr1)
1925 : :
1926 : : !sum over irred q over k_phon, with corresponding weights
1927 [ # # ]: 0 : do iFSqpt = 1, nkptirr
1928 : 0 : iqpt_fullbz = elph_ds%k_phon%irredtoGS(iFSqpt)
1929 : 0 : ikpt_kpq = FSfullpktofull(iFSkpt,iqpt_fullbz)
1930 : :
1931 : 0 : imqpt_fullbz = mqtofull(iqpt_fullbz)
1932 : 0 : ikpt_kmq = FSfullpktofull(iFSkpt,imqpt_fullbz)
1933 : :
1934 : : !Do FT from real-space gamma grid to 1 kpt in k_phon%new_kptirr
1935 [ # # # # : 0 : call ftgam(Ifc%wghatm,tmp_gkk_kpt,tmp_gkk_rpt,natom,1,nrpt,0,coskr2(iqpt_fullbz,:),sinkr2(iqpt_fullbz,:))
# # # # #
# # # # #
# # ]
1936 : : !tmp_gkk_kpt(:,:)=tmp_gkk_qpt(:,:,iFSqpt)
1937 : :
1938 : : !if ep_scalprod==0 we have to dot in the displacement vectors here
1939 [ # # ]: 0 : if (elph_ds%ep_scalprod==0) then
1940 : :
1941 : 0 : call phdispl_cart2red(natom,Cryst%gprimd,displ(:,:,:,iFSqpt),displ_red)
1942 : :
1943 [ # # ]: 0 : tmp_gkk_kpt2 = reshape (tmp_gkk_kpt(:,:), (/2,nbranch,nbranch/))
1944 : 0 : call gam_mult_displ(nbranch, displ_red, tmp_gkk_kpt2, gkk_kpt)
1945 : :
1946 [ # # ]: 0 : do jbranch=1,nbranch
1947 : 0 : eigval(jbranch) = gkk_kpt(1, jbranch, jbranch)
1948 : 0 : imeigval(jbranch) = gkk_kpt(2, jbranch, jbranch)
1949 : :
1950 [ # # ]: 0 : if (abs(imeigval(jbranch)) > tol10) then
1951 : 0 : write (message,'(a,i0,a,es16.8)')" real values branch = ",jbranch,' eigval = ',eigval(jbranch)
1952 : 0 : ABI_WARNING(message)
1953 : 0 : write (message,'(a,i0,a,es16.8)')" imaginary values branch = ",jbranch,' imeigval = ',imeigval(jbranch)
1954 : 0 : ABI_WARNING(message)
1955 : : end if
1956 : :
1957 : : end do
1958 : :
1959 : : ! if ep_scalprod==1 we have to diagonalize the matrix we interpolated.
1960 [ # # ]: 0 : else if (elph_ds%ep_scalprod == 1) then
1961 : :
1962 : : ! MJV NOTE : gam_now is being recast as a (3*natom)**2 matrix here
1963 : : call ZGEMM ( 'N', 'N', 3*natom, 3*natom, 3*natom, cone, tmp_gkk_kpt, 3*natom,&
1964 : 0 : & pheigvec(:,iFSqpt), 3*natom, czero, tmp_gkk_kpt2, 3*natom)
1965 : :
1966 : : call ZGEMM ( 'C', 'N', 3*natom, 3*natom, 3*natom, cone, pheigvec(:,iFSqpt), 3*natom,&
1967 : 0 : & tmp_gkk_kpt2, 3*natom, czero, gkk_kpt, 3*natom)
1968 : :
1969 : 0 : diagerr = zero
1970 [ # # ]: 0 : do ibranch=1,nbranch
1971 : 0 : eigval(ibranch) = gkk_kpt(1,ibranch,ibranch)
1972 [ # # ]: 0 : do jbranch=1,ibranch-1
1973 : 0 : diagerr = diagerr + abs(gkk_kpt(1,jbranch,ibranch))
1974 : : end do
1975 [ # # ]: 0 : do jbranch=ibranch+1,nbranch
1976 : 0 : diagerr = diagerr + abs(gkk_kpt(1,jbranch,ibranch))
1977 : : end do
1978 : : end do
1979 : :
1980 [ # # ]: 0 : if (diagerr > tol12) then
1981 : 0 : write(message,'(a,es15.8)') 'get_tau_k: residual in diagonalization of gamma with phon eigenvectors: ', diagerr
1982 : 0 : ABI_WARNING(message)
1983 : : end if
1984 : :
1985 : : else
1986 : 0 : write (message,'(a,i0)')' Wrong value for ep_scalprod = ',elph_ds%ep_scalprod
1987 : 0 : ABI_BUG(message)
1988 : : end if ! end ep_scalprod if
1989 : :
1990 : : !For k'=k-q
1991 : : !Do FT from real-space gamma grid to 1 kpt in k_phon%new_kptirr
1992 [ # # # # : 0 : call ftgam(Ifc%wghatm,tmp_gkk_kpt,tmp_gkk_rpt,natom,1,nrpt,0,coskr2(imqpt_fullbz,:),sinkr2(imqpt_fullbz,:))
# # # # #
# # # # #
# # ]
1993 : : !tmp_gkk_kpt(:,:)=tmp_gkk_qpt(:,:,iFSqpt)
1994 : :
1995 : : !if ep_scalprod==0 we have to dot in the displacement vectors here
1996 [ # # ]: 0 : if (elph_ds%ep_scalprod==0) then
1997 : :
1998 : 0 : call phdispl_cart2red(natom,Cryst%gprimd,displ(:,:,:,iFSqpt),displ_red)
1999 : :
2000 [ # # ]: 0 : tmp_gkk_kpt2 = reshape (tmp_gkk_kpt(:,:), (/2,nbranch,nbranch/))
2001 : 0 : call gam_mult_displ(nbranch, displ_red, tmp_gkk_kpt2, gkk_kpt)
2002 : :
2003 [ # # ]: 0 : do jbranch=1,nbranch
2004 : 0 : eigval2(jbranch) = gkk_kpt(1, jbranch, jbranch)
2005 : 0 : imeigval(jbranch) = gkk_kpt(2, jbranch, jbranch)
2006 : :
2007 [ # # ]: 0 : if (abs(imeigval(jbranch)) > tol10) then
2008 : 0 : write (message,'(a,i0,a,es16.8)')" real values branch = ",jbranch,' eigval = ',eigval2(jbranch)
2009 : 0 : ABI_WARNING(message)
2010 : 0 : write (message,'(a,i0,a,es16.8)')" imaginary values branch = ",jbranch,' imeigval = ',imeigval(jbranch)
2011 : 0 : ABI_WARNING(message)
2012 : : end if
2013 : :
2014 : : end do
2015 : :
2016 : : ! if ep_scalprod==1 we have to diagonalize the matrix we interpolated.
2017 [ # # ]: 0 : else if (elph_ds%ep_scalprod == 1) then
2018 : :
2019 : : ! MJV NOTE : gam_now is being recast as a (3*natom)**2 matrix here
2020 : : call ZGEMM ( 'N', 'N', 3*natom, 3*natom, 3*natom, cone, tmp_gkk_kpt, 3*natom,&
2021 : 0 : & pheigvec(:,iFSqpt), 3*natom, czero, tmp_gkk_kpt2, 3*natom)
2022 : :
2023 : : call ZGEMM ( 'C', 'N', 3*natom, 3*natom, 3*natom, cone, pheigvec(:,iFSqpt), 3*natom,&
2024 : 0 : & tmp_gkk_kpt2, 3*natom, czero, gkk_kpt, 3*natom)
2025 : :
2026 : 0 : diagerr = zero
2027 [ # # ]: 0 : do ibranch=1,nbranch
2028 : 0 : eigval2(ibranch) = gkk_kpt(1,ibranch,ibranch)
2029 [ # # ]: 0 : do jbranch=1,ibranch-1
2030 : 0 : diagerr = diagerr + abs(gkk_kpt(1,jbranch,ibranch))
2031 : : end do
2032 [ # # ]: 0 : do jbranch=ibranch+1,nbranch
2033 : 0 : diagerr = diagerr + abs(gkk_kpt(1,jbranch,ibranch))
2034 : : end do
2035 : : end do
2036 : :
2037 [ # # ]: 0 : if (diagerr > tol12) then
2038 : 0 : write(message,'(a,es15.8)') 'get_tau_k: residual in diagonalization of gamma with phon eigenvectors: ', diagerr
2039 : 0 : ABI_WARNING(message)
2040 : : end if
2041 : :
2042 : : else
2043 : 0 : write (message,'(a,i0)')' Wrong value for ep_scalprod = ',elph_ds%ep_scalprod
2044 : 0 : ABI_BUG(message)
2045 : : end if ! end ep_scalprod if
2046 : :
2047 [ # # ]: 0 : tmp2_wtk(:) = tmp_wtk(jpband,ikpt_kpq,isppol,:)
2048 : 0 : yp1 = (tmp2_wtk(2)-tmp2_wtk(1))/nspline/deltaene
2049 : 0 : ypn = (tmp2_wtk(nene_all)-tmp2_wtk(nene_all-1))/nspline/deltaene
2050 : 0 : call spline(ene_pt,tmp2_wtk,nene_all,yp1,ypn,ff2)
2051 : 0 : call splint(nene_all,ene_pt,tmp2_wtk,ff2,nene_all*nspline,ene_ptfine,tmp_wtk1)
2052 : :
2053 [ # # ]: 0 : tmp2_wtk(:) = tmp_wtk(jpband,ikpt_kmq,isppol,:)
2054 : 0 : yp1 = (tmp2_wtk(2)-tmp2_wtk(1))/nspline/deltaene
2055 : 0 : ypn = (tmp2_wtk(nene_all)-tmp2_wtk(nene_all-1))/nspline/deltaene
2056 : 0 : call spline(ene_pt,tmp2_wtk,nene_all,yp1,ypn,ff2)
2057 : 0 : call splint(nene_all,ene_pt,tmp2_wtk,ff2,nene_all*nspline,ene_ptfine,tmp_wtk2)
2058 : :
2059 [ # # # # ]: 0 : tmp2_wtq(:,:) = wtq(:,iFSqpt,:)
2060 [ # # ]: 0 : do iene=1,nene
2061 : 0 : e_k = eigenGS(elph_ds%minFSband+jband-1,iFSkpt,isppol)
2062 : 0 : ene = e_k - omega_max + (iene-1)*deltaene
2063 [ # # # # ]: 0 : if (ene<enemin .or. ene>enemax) cycle
2064 : 0 : iene_fine = NINT((ene-enemin+deltaene)/deltaene)
2065 : 0 : tmp_wtkpq = tmp_wtk1(iene_fine) * elph_ds%k_phon%wtkirr(iFSqpt)
2066 : 0 : tmp_wtkmq = tmp_wtk2(iene_fine) * elph_ds%k_phon%wtkirr(iFSqpt)
2067 : :
2068 [ # # ]: 0 : if (tmp_wtkpq+tmp_wtkmq < tol_wtk ) then
2069 : 0 : nskip = nskip +1
2070 : : cycle
2071 : : end if
2072 : :
2073 [ # # ]: 0 : do ibranch = 1, nbranch
2074 [ # # ]: 0 : if (abs(phfrq(ibranch,iFSqpt)) < tol7) cycle
2075 : :
2076 [ # # ]: 0 : if (ene > e_k) then
2077 : 0 : omega = ene - e_k
2078 [ # # # # ]: 0 : if (abs(omega) < tol7 .or. abs(omega) > omega_max) cycle
2079 : 0 : iomega = NINT((omega-omega_min+domega)/domega)
2080 : :
2081 : : a2f_2d(iene) = a2f_2d(iene) +&
2082 : : & eigval(ibranch)/phfrq(ibranch,iFSqpt)*&
2083 : 0 : & tmp_wtkpq * tmp2_wtq(ibranch,iomega)
2084 : : end if
2085 : :
2086 [ # # ]: 0 : if (ene < e_k) then
2087 : 0 : omega = e_k - ene
2088 [ # # # # ]: 0 : if (abs(omega) < tol7 .or. abs(omega) > omega_max) cycle
2089 : 0 : iomega = NINT((omega-omega_min+domega)/domega)
2090 : :
2091 : : a2f_2d2(iene) = a2f_2d2(iene) +&
2092 : : & eigval(ibranch)/phfrq(ibranch,iFSqpt)*&
2093 : 0 : & tmp_wtkmq * tmp2_wtq(ibranch,iomega)
2094 : : end if
2095 : :
2096 : : end do ! ibranch 3
2097 : : end do ! nene 800
2098 : : end do ! kptirr 216
2099 : : end do ! j' band 3
2100 : : ! print *, ' skipped ', nskip, ' energy points out of ', nene*nband*nkptirr
2101 : :
2102 : : ! get inv_tau_k
2103 [ # # ]: 0 : do itemp=1,ntemper ! runs over termperature in K
2104 : 0 : Temp=elph_ds%tempermin+elph_ds%temperinc*dble(itemp)
2105 [ # # ]: 0 : do iene=1,nene
2106 : 0 : e_k = eigenGS(elph_ds%minFSband+jband-1,iFSkpt,isppol)
2107 : 0 : ene = e_k - omega_max + (iene-1)*deltaene
2108 [ # # # # ]: 0 : if (ene<enemin .or. ene>enemax) cycle
2109 : :
2110 : 0 : xx=(ene-fermie(itemp))/(kb_HaK*Temp)
2111 : 0 : occ_e=1.0_dp/(exp(xx)+1.0_dp)
2112 [ # # # # ]: 0 : if (ene > e_k .and. (ene-e_k) .le. omega_max) then
2113 : 0 : omega = ene - e_k
2114 [ # # ]: 0 : if (abs(omega) < tol7) cycle
2115 : 0 : xx = omega/(kb_HaK*Temp)
2116 : 0 : occ_omega=1.0_dp/(exp(xx)-1.0_dp)
2117 : :
2118 : 0 : therm_factor = occ_e + occ_omega
2119 : :
2120 : : inv_tau_k(itemp,isppol,iFSkpt,jband) = inv_tau_k(itemp,isppol,iFSkpt,jband) +&
2121 : 0 : a2f_2d(iene)*therm_factor*deltaene
2122 : : end if
2123 [ # # # # ]: 0 : if (ene < e_k .and. (e_k-ene) .le. omega_max) then
2124 : 0 : omega = e_k - ene
2125 [ # # ]: 0 : if (abs(omega) < tol7) cycle
2126 : 0 : xx = omega/(kb_HaK*Temp)
2127 : 0 : occ_omega=1.0_dp/(exp(xx)-1.0_dp)
2128 : :
2129 : 0 : therm_factor = 1 - occ_e + occ_omega
2130 : :
2131 : : inv_tau_k(itemp,isppol,iFSkpt,jband) = inv_tau_k(itemp,isppol,iFSkpt,jband) +&
2132 : 0 : a2f_2d2(iene)*therm_factor*deltaene
2133 : : end if
2134 : :
2135 : : end do ! nene
2136 : : end do ! Temp
2137 : : ! write(*,*)'i am here 2 ', isppol,iFSkpt,jband
2138 : : end do ! jband
2139 : : end do ! kpt
2140 : : end do ! nsppol
2141 : :
2142 : : !write (300+mpi_enreg%me,*) inv_tau_k
2143 : 0 : call xmpi_sum (inv_tau_k, xmpi_world, ierr)
2144 : :
2145 [ # # ]: 0 : ABI_FREE(phfrq)
2146 [ # # ]: 0 : ABI_FREE(displ)
2147 [ # # ]: 0 : ABI_FREE(pheigvec)
2148 [ # # ]: 0 : ABI_FREE(tmp2_wtk)
2149 [ # # ]: 0 : ABI_FREE(ff2)
2150 [ # # ]: 0 : ABI_FREE(ene_pt)
2151 [ # # ]: 0 : ABI_FREE(ene_ptfine)
2152 [ # # ]: 0 : ABI_FREE(tmp_wtk1)
2153 [ # # ]: 0 : ABI_FREE(tmp_wtk2)
2154 [ # # ]: 0 : ABI_FREE(tmp2_wtq)
2155 [ # # ]: 0 : ABI_FREE(wtq)
2156 [ # # ]: 0 : ABI_FREE(coskr1)
2157 [ # # ]: 0 : ABI_FREE(sinkr1)
2158 [ # # ]: 0 : ABI_FREE(coskr2)
2159 [ # # ]: 0 : ABI_FREE(sinkr2)
2160 [ # # ]: 0 : ABI_FREE(kpttokpt)
2161 [ # # ]: 0 : ABI_FREE(FSfullpktofull)
2162 [ # # ]: 0 : ABI_FREE(mqtofull)
2163 [ # # ]: 0 : ABI_FREE(tmp_gkk_qpt)
2164 [ # # ]: 0 : ABI_FREE(tmp_gkk_rpt)
2165 [ # # ]: 0 : ABI_FREE(tmp_gkk_kpt)
2166 [ # # ]: 0 : ABI_FREE(tmp_gkk_kpt2)
2167 [ # # ]: 0 : ABI_FREE(gkk_kpt)
2168 [ # # ]: 0 : ABI_FREE(a2f_2d)
2169 [ # # ]: 0 : ABI_FREE(a2f_2d2)
2170 : :
2171 : : !output inv_tau_k and tau_k
2172 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_INVTAUK'
2173 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_invtau,status='unknown') /= 0) then
2174 : 0 : ABI_ERROR(message)
2175 : : end if
2176 : :
2177 : : !print header to relaxation time file
2178 : 0 : write (unit_invtau,*) '# k-dep inverse of the relaxation time as a function of temperature.'
2179 : 0 : write (unit_invtau,*) '# '
2180 : 0 : write (unit_invtau,*) '# nkptirr= ', nkptirr, 'nband= ', nband
2181 : 0 : write (unit_invtau,*) '# number of temperatures= ', ntemper
2182 : 0 : write (unit_invtau,*) '# tau [femtosecond^-1] '
2183 : :
2184 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_TAUK'
2185 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_tau,status='unknown') /= 0) then
2186 : 0 : ABI_ERROR(message)
2187 : : end if
2188 : :
2189 : : !print header to relaxation time file
2190 : 0 : write (unit_tau,*) '# k-dep relaxation time as a function of temperature.'
2191 : 0 : write (unit_tau,*) '# '
2192 : 0 : write (unit_tau,*) '# nkptirr= ', nkptirr, 'nband= ', nband
2193 : 0 : write (unit_tau,*) '# number of temperatures= ', ntemper
2194 : 0 : write (unit_tau,*) '# tau [femtosecond] '
2195 : :
2196 [ # # # # : 0 : tau_k = zero
# # # # ]
2197 [ # # ]: 0 : do itemp=1,ntemper ! runs over termperature in K
2198 : 0 : Temp=elph_ds%tempermin+elph_ds%temperinc*dble(itemp)
2199 : 0 : write(unit_invtau,'(a,f16.8)') '# Temperature = ', Temp
2200 : 0 : write(unit_tau,'(a,f16.8)') '# Temperature = ', Temp
2201 [ # # ]: 0 : do isppol=1,nsppol
2202 : 0 : write(unit_invtau,'(a,i6)') '# For isppol = ', isppol
2203 : 0 : write(unit_tau,'(a,i6)') '# For isppol = ', isppol
2204 [ # # ]: 0 : do iFSkpt = 1,nkpt
2205 : : !FIXME: check when tau_k is too small, whether there should be a phonon
2206 : : !scattering or not, and should tau_k be zero or not.
2207 [ # # ]: 0 : do jband = 1,nband
2208 [ # # ]: 0 : if (abs(inv_tau_k(itemp,isppol,iFSkpt,jband)) < tol9) then
2209 : 0 : inv_tau_k(itemp,isppol,iFSkpt,jband) = zero
2210 : 0 : tau_k(itemp,isppol,iFSkpt,jband) = zero
2211 : : else
2212 : : !no need to *nkpt due to wtkirr, as we need /nkpt for the sum
2213 : : !no need to *two_pi due to the missing prefactor in gkk (see mka2f_tr_lova)
2214 : 0 : inv_tau_k(itemp,isppol,iFSkpt,jband) = inv_tau_k(itemp,isppol,iFSkpt,jband)*elph_ds%occ_factor
2215 : 0 : tau_k(itemp,isppol,iFSkpt,jband) = one/inv_tau_k(itemp,isppol,iFSkpt,jband)
2216 : : end if
2217 : : end do ! nband
2218 : 0 : write(unit_invtau,'(a,i8,a,3f12.6)') '# kpt# ', iFSkpt, ' kpt=', elph_ds%k_phon%kptirr(:,iFSkpt)
2219 [ # # # # ]: 0 : write(unit_invtau,'(100D16.8)') (inv_tau_k(itemp,isppol,iFSkpt,iband)*femto/Time_Sec,iband=1,nband)
2220 : 0 : write(unit_tau,'(a,i8,a,3f12.6)') '# kpt# ', iFSkpt, ' kpt=', elph_ds%k_phon%kptirr(:,iFSkpt)
2221 [ # # # # ]: 0 : write(unit_tau,'(100D16.8)') (tau_k(itemp,isppol,iFSkpt,iband)*Time_Sec/femto,iband=1,nband)
2222 : : end do ! nkptirr
2223 : 0 : write(unit_invtau,*) ' '
2224 : 0 : write(unit_tau,*) ' '
2225 : : end do ! nsppol
2226 : 0 : write(unit_invtau,*) ' '
2227 : 0 : write(unit_invtau,*) ' '
2228 : 0 : write(unit_tau,*) ' '
2229 : 0 : write(unit_tau,*) ' '
2230 : : end do ! ntemper
2231 : :
2232 : : ! Only use the irred k for eigenGS and tau_k
2233 [ # # # # : 0 : ABI_MALLOC(tmp_eigenGS,(elph_ds%nband,elph_ds%k_phon%new_nkptirr,elph_ds%nsppol))
# # # # #
# # # # #
# # # # #
# ]
2234 : :
2235 [ # # ]: 0 : do ikpt_irr = 1, new_nkptirr
2236 [ # # # # ]: 0 : tmp_eigenGS(:,ikpt_irr,:) = eigenGS(:,elph_ds%k_phon%new_irredtoGS(ikpt_irr),:)
2237 [ # # # # : 0 : tmp_tau_k(:,:,ikpt_irr,:) = tau_k(:,:,elph_ds%k_phon%new_irredtoGS(ikpt_irr),:)*Time_Sec
# # ]
2238 : : end do
2239 : :
2240 : : !BoltzTraP output files in SIESTA format
2241 [ # # ]: 0 : if (elph_ds%prtbltztrp == 1) then
2242 : : !Prevent use in case occopt = 9
2243 [ # # ]: 0 : if (Bst%occopt==9) then
2244 : 0 : ABI_ERROR("Boltztrap outputting not possible with occopt = 9 at the moment")
2245 : : end if
2246 : : call ebands_prtbltztrp_tau_out (tmp_eigenGS(elph_ds%minFSband:elph_ds%maxFSband,:,:),&
2247 : : & elph_ds%tempermin,elph_ds%temperinc,ntemper,fermie, &
2248 : : & elph_ds%elph_base_name,elph_ds%k_phon%new_kptirr,nband,elph_ds%nelect,new_nkptirr, &
2249 [ # # # # : 0 : & elph_ds%nspinor,nsppol,Cryst%nsym,Cryst%rprimd,Cryst%symrel,tmp_tau_k)
# # # # #
# # # ]
2250 : : end if !prtbltztrp
2251 [ # # ]: 0 : ABI_FREE(tmp_eigenGS)
2252 [ # # ]: 0 : ABI_FREE(tmp_tau_k)
2253 : :
2254 : : !Get the energy dependence of tau.
2255 : : !Eq. (6) in Restrepo et al. Appl. Phys. Lett. 94, 212103 (2009) [[cite:Restrepo2009]]
2256 : :
2257 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_TAUE'
2258 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_taue,status='unknown') /= 0) then
2259 : 0 : ABI_ERROR(message)
2260 : : end if
2261 : :
2262 : : !print header to relaxation time file
2263 : 0 : write (unit_taue,*) '# Energy-dep relaxation time as a function of temperature.'
2264 : 0 : write (unit_taue,*) '# '
2265 : 0 : write (unit_taue,*) '# number of temperatures= ', ntemper
2266 : 0 : write (unit_taue,*) '# ene[Ha] tau [femtosecond] DOS[au] '
2267 : :
2268 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_MFP'
2269 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_mfp,status='unknown') /= 0) then
2270 : 0 : ABI_ERROR(message)
2271 : : end if
2272 : :
2273 : 0 : write (unit_mfp,*) '# Energy-dep mean free path as a function of temperature.'
2274 : 0 : write (unit_mfp,*) '# '
2275 : 0 : write (unit_mfp,*) '# number of temperatures= ', ntemper
2276 : 0 : write (unit_mfp,*) '# ene[Ha] mfp [femtometer] '
2277 : :
2278 [ # # ]: 0 : do itemp=1,ntemper ! runs over termperature in K
2279 : 0 : Temp=elph_ds%tempermin+elph_ds%temperinc*dble(itemp)
2280 : 0 : write(unit_taue,'(a,f16.8)') '# Temperature = ', Temp
2281 [ # # ]: 0 : do isppol = 1, nsppol
2282 : 0 : write(unit_taue,*) '# Tau_e for isppol = ',isppol
2283 [ # # ]: 0 : do iene = 1, nene_all
2284 : 0 : rate_e = zero
2285 [ # # ]: 0 : do iFSkpt = 1, nkpt
2286 [ # # ]: 0 : do jband = 1, nband
2287 : : rate_e = rate_e + inv_tau_k(itemp,isppol,iFSkpt,jband)* &
2288 : 0 : & tmp_wtk(jband,iFSkpt,isppol,iene)
2289 : : end do ! jband
2290 : : end do ! kpt
2291 [ # # ]: 0 : if (dabs(dos_e(isppol,iene)) < tol7) then
2292 : : rate_e = zero
2293 : : else
2294 : 0 : rate_e = rate_e/nkpt/dos_e(isppol,iene)
2295 : : end if
2296 : 0 : write(unit_taue,"(3D16.8)") enemin+(iene-1)*deltaene*nspline, rate_e*femto/Time_Sec, dos_e(isppol,iene)
2297 : : end do ! number of energies
2298 : 0 : write(unit_taue,*) ' '
2299 : : end do ! nsppol
2300 : 0 : write(unit_taue,*) ' '
2301 : : end do ! ntemperature
2302 : :
2303 : : ! calculate and output mean free path
2304 [ # # ]: 0 : do itemp=1,ntemper ! runs over termperature in K
2305 : 0 : Temp=elph_ds%tempermin+elph_ds%temperinc*dble(itemp)
2306 : 0 : write(unit_mfp,'(a,f16.8)') '# Temperature = ', Temp
2307 [ # # ]: 0 : do isppol = 1, nsppol
2308 [ # # ]: 0 : do icomp = 1, 3
2309 : 0 : write(unit_mfp,*) '# Mean free path for isppol, icomp= ',isppol,icomp
2310 [ # # ]: 0 : do iene = 1, nene_all
2311 : 0 : mfp_e = zero
2312 [ # # ]: 0 : do iFSkpt = 1, nkptirr
2313 [ # # ]: 0 : do jband = 1, nband
2314 : : mfp_e = mfp_e + tau_k(itemp,isppol,iFSkpt,jband)* &
2315 : : & elph_tr_ds%el_veloc(iFSkpt,elph_ds%minFSband+jband-1,icomp,isppol)* &
2316 : 0 : & tmp_wtk(jband,iFSkpt,isppol,iene)
2317 : : !& elph_ds%k_phon%new_wtkirr(iFSqpt)
2318 : : end do ! jband
2319 : : end do ! kpt
2320 [ # # ]: 0 : if (dabs(dos_e(isppol,iene)) < tol7) then
2321 : : mfp_e = zero
2322 : : else
2323 : 0 : mfp_e = mfp_e/nkptirr/dos_e(isppol,iene)
2324 : : end if
2325 : 0 : write(unit_mfp,"(2D16.8)") enemin+(iene-1)*deltaene*nspline, mfp_e*Bohr_Ang*1.0d-10/femto
2326 : : end do ! number of energies
2327 : 0 : write(unit_mfp,*) ' '
2328 : : end do ! icomp
2329 : 0 : write(unit_mfp,*) ' '
2330 : : end do ! nsppol
2331 : 0 : write(unit_mfp,*) ' '
2332 : : end do ! ntemperature
2333 : :
2334 [ # # # # : 0 : ABI_MALLOC(cond_e ,(ntemper,nsppol,nene_all,9))
# # # # #
# # # # #
# # # # #
# # # #
# ]
2335 : :
2336 : : !get cond_e
2337 [ # # # # : 0 : cond_e = zero
# # # # ]
2338 [ # # ]: 0 : do itemp=1,ntemper ! runs over termperature in K
2339 [ # # ]: 0 : do isppol = 1, nsppol
2340 [ # # ]: 0 : do iene = 1, nene_all
2341 : : ! do iFSkpt =1,nkpt
2342 [ # # ]: 0 : do ik_this_proc =1,elph_ds%k_phon%my_nkpt
2343 : 0 : iFSkpt = elph_ds%k_phon%my_ikpt(ik_this_proc)
2344 [ # # ]: 0 : do jband = 1, nband
2345 [ # # ]: 0 : do icomp = 1, 3
2346 [ # # ]: 0 : do jcomp = 1, 3
2347 : 0 : itensor = (icomp-1)*3+jcomp
2348 : : cond_e(itemp,isppol,iene,itensor) = cond_e(itemp,isppol,iene,itensor) + &
2349 : : & tau_k(itemp,isppol,iFSkpt,jband)* &
2350 : : & elph_tr_ds%el_veloc(iFSkpt,elph_ds%minFSband+jband-1,icomp,isppol)* &
2351 : : & elph_tr_ds%el_veloc(iFSkpt,elph_ds%minFSband+jband-1,jcomp,isppol)* &
2352 : 0 : & tmp_wtk(jband,iFSkpt,isppol,iene)
2353 : : end do
2354 : : end do
2355 : : end do ! jband
2356 : : end do ! kpt
2357 : : end do ! number of energies
2358 : : end do ! nsppol
2359 : : end do ! ntemperature
2360 : :
2361 : : ! MG FIXME: Why xmpi_world, besides only master should perform IO in the section below.
2362 : 0 : call xmpi_sum (cond_e, xmpi_world, ierr)
2363 : :
2364 [ # # # # : 0 : cond_e = cond_e/nkpt
# # # # ]
2365 : :
2366 : : !get transport coefficients
2367 : :
2368 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_COND'
2369 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_cond,status='unknown') /= 0) then
2370 : 0 : ABI_ERROR(message)
2371 : : end if
2372 : :
2373 : : !print header to conductivity file
2374 : 0 : write (unit_cond,*) '# Conductivity as a function of temperature.'
2375 : 0 : write (unit_cond,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
2376 : 0 : write (unit_cond,*) '# '
2377 : 0 : write (unit_cond,*) '# Columns are: '
2378 : 0 : write (unit_cond,*) '# temperature[K] cond[au] cond [SI] '
2379 : 0 : write (unit_cond,*) '# '
2380 : :
2381 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_CTH'
2382 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_therm,status='unknown') /= 0) then
2383 : 0 : ABI_ERROR(message)
2384 : : end if
2385 : :
2386 : : !print header to thermal conductivity file
2387 : 0 : write (unit_therm,'(a)') '# Thermal conductivity as a function of temperature.'
2388 : 0 : write (unit_therm,'(a)') '# the formalism is isotropic, so non-cubic crystals may be wrong'
2389 : 0 : write (unit_therm,'(a)') '# '
2390 : 0 : write (unit_therm,'(a)') '# Columns are: '
2391 : 0 : write (unit_therm,'(a)') '# temperature[K] thermal cond [au] thermal cond [SI]'
2392 : 0 : write (unit_therm,'(a)') '# '
2393 : :
2394 [ # # ]: 0 : fname = trim(elph_ds%elph_base_name) // '_SBK'
2395 [ # # ]: 0 : if (open_file(fname,message,newunit=unit_sbk,status='unknown') /=0) then
2396 : 0 : ABI_ERROR(message)
2397 : : end if
2398 : :
2399 : : !print header to relaxation time file
2400 : 0 : write (unit_sbk,*) '# Seebeck Coefficint as a function of temperature.'
2401 : 0 : write (unit_sbk,*) '# the formalism is isotropic, so non-cubic crystals may be wrong'
2402 : 0 : write (unit_sbk,*) '# '
2403 : 0 : write (unit_sbk,*) '# Columns are: '
2404 : 0 : write (unit_sbk,*) '# temperature[K] S [au] S [SI] '
2405 : 0 : write (unit_sbk,*) '# '
2406 : :
2407 [ # # # # : 0 : ABI_MALLOC(cond ,(ntemper,nsppol,3,3))
# # # # #
# # # # #
# # # # #
# ]
2408 [ # # # # : 0 : ABI_MALLOC(cth ,(ntemper,nsppol,3,3))
# # # # #
# # # ]
2409 [ # # # # : 0 : ABI_MALLOC(sbk ,(ntemper,nsppol,3,3))
# # # # #
# # # ]
2410 [ # # # # : 0 : ABI_MALLOC(seebeck ,(ntemper,nsppol,3,3))
# # # # #
# # # ]
2411 : :
2412 [ # # # # : 0 : cond = zero
# # # # ]
2413 [ # # # # : 0 : cth = zero
# # # # ]
2414 [ # # # # : 0 : sbk = zero
# # # # ]
2415 [ # # # # : 0 : seebeck = zero
# # # # ]
2416 [ # # ]: 0 : do isppol=1,nsppol
2417 [ # # ]: 0 : do icomp=1, 3
2418 [ # # ]: 0 : do jcomp=1, 3
2419 : 0 : itensor=(icomp-1)*3+jcomp
2420 [ # # ]: 0 : do itemp=1,ntemper
2421 : 0 : Temp=elph_ds%tempermin + elph_ds%temperinc*dble(itemp)
2422 [ # # ]: 0 : do iene = 1, nene_all
2423 : 0 : factor = (enemin+(iene-1)*deltaene*nspline - fermie(itemp))/(kb_HaK*Temp)
2424 [ # # ]: 0 : if (factor < -40.0d0) then
2425 : : dfermide = zero
2426 [ # # ]: 0 : else if (factor > 40.0d0) then
2427 : : dfermide = zero
2428 : : else
2429 : 0 : dfermide = EXP(factor)/(kb_HaK*Temp*(EXP(factor)+one)**2.0d0)
2430 : : end if
2431 : : cond(itemp,isppol,icomp,jcomp) = cond(itemp,isppol,icomp,jcomp) + &
2432 : 0 : & cond_e(itemp,isppol,iene,itensor)*dfermide*deltaene*nspline
2433 : : cth(itemp,isppol,icomp,jcomp) = cth(itemp,isppol,icomp,jcomp) + cond_e(itemp,isppol,iene,itensor)* &
2434 : 0 : & (enemin+(iene-1)*deltaene*nspline - fermie(itemp))**2.0d0*dfermide*deltaene*nspline
2435 : : sbk(itemp,isppol,icomp,jcomp) = sbk(itemp,isppol,icomp,jcomp) + cond_e(itemp,isppol,iene,itensor)* &
2436 : 0 : & (enemin+(iene-1)*deltaene*nspline - fermie(itemp))*dfermide*deltaene*nspline
2437 : : end do
2438 : : end do ! temperature
2439 : : end do ! jcomp
2440 : : end do ! icomp
2441 : : end do !end isppol
2442 : :
2443 [ # # ]: 0 : do isppol=1,nsppol
2444 [ # # ]: 0 : do itemp=1,ntemper
2445 [ # # # # ]: 0 : cond_inv(:,:)=cond(itemp,isppol,:,:)
2446 : 0 : call matrginv(cond_inv,3,3)
2447 : : call DGEMM('N','N',3,3,3,one,sbk(itemp,isppol,:,:),3,cond_inv,&
2448 [ # # # # : 0 : & 3,zero,seebeck(itemp,isppol,:,:),3)
# # # # #
# # # # #
# # # # #
# # # #
# ]
2449 : : end do
2450 : : end do
2451 : :
2452 [ # # ]: 0 : do isppol=1,nsppol
2453 [ # # ]: 0 : do icomp=1, 3
2454 [ # # ]: 0 : do jcomp=1, 3
2455 : 0 : itensor=(icomp-1)*3+jcomp
2456 : 0 : write(unit_cond,*) '# Conductivity for isppol, itrten= ',isppol,itensor
2457 : 0 : write(unit_therm,*) '# Thermal conductivity for isppol, itrten= ',isppol,itensor
2458 : 0 : write(unit_sbk,*) '# Seebeck coefficient for isppol, itrten= ',isppol,itensor
2459 [ # # ]: 0 : do itemp=1,ntemper
2460 : 0 : Temp=elph_ds%tempermin + elph_ds%temperinc*dble(itemp)
2461 : :
2462 : 0 : seebeck(itemp,isppol,icomp,jcomp) = -1.0d0*seebeck(itemp,isppol,icomp,jcomp)/(kb_HaK*Temp)
2463 : 0 : cond(itemp,isppol,icomp,jcomp) = cond(itemp,isppol,icomp,jcomp)/cryst%ucvol
2464 : 0 : cth(itemp,isppol,icomp,jcomp) = cth(itemp,isppol,icomp,jcomp)/(kb_HaK*Temp)/cryst%ucvol
2465 : 0 : write(unit_cond,'(3D20.10)')Temp,cond(itemp,isppol,icomp,jcomp),cond(itemp,isppol,icomp,jcomp)*chu_cond
2466 : 0 : write(unit_therm,'(3D20.10)')Temp,cth(itemp,isppol,icomp,jcomp),cth(itemp,isppol,icomp,jcomp)*chu_cth
2467 : 0 : write(unit_sbk,'(3D20.10)')Temp,seebeck(itemp,isppol,icomp,jcomp),seebeck(itemp,isppol,icomp,jcomp)*kb_HaK
2468 : : end do ! temperature
2469 : 0 : write(unit_cond,*)
2470 : 0 : write(unit_therm,*)
2471 : 0 : write(unit_sbk,*)
2472 : : end do ! jcomp
2473 : : end do ! icomp
2474 : : end do !end isppol
2475 : :
2476 : :
2477 [ # # ]: 0 : ABI_FREE(inv_tau_k)
2478 [ # # ]: 0 : ABI_FREE(tau_k)
2479 [ # # ]: 0 : ABI_FREE(tmp_wtk)
2480 [ # # ]: 0 : ABI_FREE(dos_e)
2481 [ # # ]: 0 : ABI_FREE(cond_e)
2482 [ # # ]: 0 : ABI_FREE(fermie)
2483 [ # # ]: 0 : ABI_FREE(cond)
2484 [ # # ]: 0 : ABI_FREE(sbk)
2485 [ # # ]: 0 : ABI_FREE(cth)
2486 [ # # ]: 0 : ABI_FREE(seebeck)
2487 : :
2488 : 0 : close (unit=unit_tau)
2489 : 0 : close (unit=unit_taue)
2490 : 0 : close (unit=unit_mfp)
2491 : 0 : close (unit=unit_invtau)
2492 : 0 : close (unit=unit_cond)
2493 : 0 : close (unit=unit_therm)
2494 : 0 : close (unit=unit_sbk)
2495 : :
2496 [ # # # # ]: 0 : end subroutine get_tau_k
2497 : : !!***
2498 : :
2499 : : end module m_a2ftr
2500 : : !!***
|