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 : !!***
|