Branch data Line data Source code
1 : : !!****m* ABINIT/m_read_plowannier
2 : : !! NAME
3 : : !! m_read_plowannier
4 : : !!
5 : : !! FUNCTION
6 : : !! Read Wannier coefficient in the file forlb.ovlp for ucrpa calculation
7 : : !! this file was typically created in a DFT run with usedmft=1 and nbandkss -1
8 : : !!
9 : : !! COPYRIGHT
10 : : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
11 : : !! This file is distributed under the terms of the
12 : : !! GNU General Public License, see ~abinit/COPYING
13 : : !! or http://www.gnu.org/copyleft/gpl.txt .
14 : : !!
15 : : !! INPUTS
16 : : !!
17 : : !! OUTPUT
18 : : !!
19 : : !! SOURCE
20 : :
21 : : #if defined HAVE_CONFIG_H
22 : : #include "config.h"
23 : : #endif
24 : :
25 : : #include "abi_common.h"
26 : :
27 : : MODULE m_read_plowannier
28 : :
29 : : use defs_basis
30 : : use m_abicore
31 : : use m_errors
32 : :
33 : : use m_io_tools, only : open_file
34 : : use m_crystal, only : crystal_t
35 : : use m_bz_mesh, only : kmesh_t
36 : : use m_pawang, only : pawang_type
37 : :
38 : : implicit none
39 : :
40 : : private
41 : :
42 : : public :: read_plowannier
43 : : !!***
44 : :
45 : : contains
46 : :
47 : : !!****m* m_read_plowannier/read_plowannier
48 : : !! NAME
49 : : !! read_plowannier
50 : : !!
51 : : !! FUNCTION
52 : : !! Read Wannier coefficient in the file forlb.ovlp for ucrpa calculation
53 : : !! this file was typically created in a DFT run with usedmft=1 and nbandkss -1
54 : : !!
55 : : !! COPYRIGHT
56 : : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
57 : : !! This file is distributed under the terms of the
58 : : !! GNU General Public License, see ~abinit/COPYING
59 : : !! or http://www.gnu.org/copyleft/gpl.txt .
60 : : !!
61 : : !!
62 : : !! INPUTS
63 : : !! Cryst<cryst_t>= data type gathering info on symmetries and unit cell
64 : : !! %natom=number of atoms
65 : : !! %nsym=number of symmetries
66 : : !! %xred(3,natom)=reduced coordinated of atoms
67 : : !! %typat(natom)=type of each atom
68 : : !! %rprimd(3,3)=dimensional primitive translations in real space (bohr)
69 : : !! %timrev= 2 if time reversal can be used, 1 otherwise
70 : : !! Kmesh <kmesh_t>= datatype gathering parameters related to the k-point sampling
71 : : !! %nibz=number of k-points in the IBZ
72 : : !! %nbz=number of k-points in the BZ
73 : : !! %bz(3,nbz)=reduced coordinates for k-points in the full Brillouin zone
74 : : !! %ibz(3,nibz)=reduced coordinates for k-points in the irreducible wedge
75 : : !! %tab(nbz)=mapping between a kpt in the BZ (array bz) and the irred point in the array ibz
76 : : !! %tabi(nbz)= -1 if inversion is needed to obtain this particular kpt in the BZ, 1 means identity
77 : : !! %tabo(nbz)= for each point in the BZ, the index of the symmetry operation S in reciprocal
78 : : !! space which rotates k_IBZ onto \pm k_BZ (depending on tabi)
79 : : !! %tabp(nbz)= For each k_BZ, it gives the phase factors associated to non-symmorphic operations, i.e
80 : : !! e^{-i 2 \pi k_IBZ \cdot R{^-1}t} == e{-i 2\pi k_BZ cdot t} where :
81 : : !! \transpose R{-1}=S and (S k_IBZ) = \pm k_BZ (depending on ktabi)
82 : : !! %tabr(nfftot,nbz) For each point r on the real mesh and for each k-point in the BZ, tabr
83 : : !! gives the index of (R^-1 (r-t)) in the FFT array where R=\transpose S^{-1} and k_BZ=S k_IBZ.
84 : : !! t is the fractional translation associated to R
85 : : !! luwindow: T if ucrpa_window is activated, F if not.
86 : : !! prtvol: integer to give the amount of printing.
87 : : !! nsppol : number of spin polarization.
88 : : !! Pawang<pawang_type> angular mesh discretization and related data:
89 : : !!
90 : : !! OUTPUT
91 : : !! bandinf, bandsup : lower and upper bands for define Wannier functions
92 : : !! coeffW_BZ(nsppol,bandinf:bandsup,nvz,2*lcor+1)
93 : : !! lcor : angular momentum for correlated orbitals
94 : : !! itypatcor : correlated species
95 : : !!
96 : : !! SOURCE
97 : :
98 : 0 : subroutine read_plowannier(cryst,bandinf,bandsup,coeffW_BZ,itypatcor,Kmesh,lcor,luwindow,nspinor,nsppol,pawang,prtvol,ucrpa_bands)
99 : :
100 : : !Arguments ------------------------------------
101 : : !types and arrays
102 : : type(kmesh_t),intent(in) :: Kmesh
103 : : type(crystal_t),intent(in) :: Cryst
104 : : complex(dp), allocatable, intent(inout) :: coeffW_BZ(:,:,:,:,:,:)
105 : : type(Pawang_type),intent(in) :: Pawang
106 : : !scalars
107 : : logical, intent(inout) :: luwindow
108 : : integer, intent(out) :: bandinf,bandsup,itypatcor,lcor
109 : : integer, intent(in) :: nspinor,nsppol,prtvol
110 : : integer, intent(in) :: ucrpa_bands(2)
111 : :
112 : : !Local variables-------------------------------
113 : : character(len=500) :: message,msg
114 : : integer :: at_indx,ik_ibz,band1,m1,m2,spin,ik_bz,dummy,isym,itim,iat,indx,ispinor,unt
115 : : real(dp) :: xx,yy
116 : : real(dp) :: kbz(3)
117 : 0 : complex(dp), allocatable :: coeffW_IBZ(:,:,:,:,:,:)
118 : : ! *********************************************************************
119 : 0 : write(message,*) "Read wannier in iBZ"
120 : 0 : call wrtout(std_out,message,'COLL')
121 : :
122 [ # # ]: 0 : if (open_file('forlb.ovlp',msg,newunit=unt,form='formatted',status='unknown') /= 0) then
123 : 0 : ABI_ERROR(msg)
124 : : end if
125 : 0 : rewind(unt)
126 : 0 : read(unt,*) message
127 : 0 : read(unt,*) message, lcor,itypatcor
128 : 0 : read(unt,*) message, bandinf,bandsup
129 : 0 : write(std_out,*) 'read from forlb.ovlp',lcor, bandinf,bandsup
130 : 0 : write(std_out,*) "for wannier", bandinf,bandsup
131 : : if(prtvol>0) then
132 : : endif
133 : :
134 [ # # # # : 0 : if(.not.luwindow.and.(ucrpa_bands(1)/=bandinf.or.ucrpa_bands(2)/=bandsup)) then
# # ]
135 : 0 : write(msg,'(a,a)')' Bands used for Wannier construction and cRPA construction differ',&
136 : 0 : & 'It might be physically correct and it is possible with the current implementation'
137 : 0 : call wrtout(std_out,msg,'COLL')
138 : 0 : call wrtout(ab_out,msg,'COLL')
139 : : ! ABI_ERROR(msg)
140 : : end if
141 : :
142 : : !Do not dead the bandinf, bandinf redondance information
143 : :
144 [ # # # # : 0 : ABI_MALLOC(coeffW_IBZ,(Cryst%nattyp(itypatcor),nsppol,bandinf:bandsup,Kmesh%nibz,nspinor,2*lcor+1))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # #
# ]
145 [ # # # # : 0 : coeffW_IBZ=czero
# # # # #
# # # ]
146 [ # # ]: 0 : do spin=1,nsppol
147 [ # # ]: 0 : do ik_ibz=1,Kmesh%nibz
148 : : !read k
149 : 0 : read(unt,*)
150 [ # # ]: 0 : do band1=bandinf,bandsup
151 : : !read band
152 : 0 : read(unt,*)
153 : : !read projection
154 [ # # ]: 0 : do ispinor=1,nspinor
155 [ # # ]: 0 : do iat=1,Cryst%nattyp(itypatcor)
156 [ # # ]: 0 : do m1=1,2*lcor+1
157 : 0 : read(unt,*) dummy,dummy,dummy,dummy,xx,yy
158 : 0 : coeffW_IBZ(iat,spin,band1,ik_ibz,ispinor,m1)=cmplx(xx,yy)
159 : : end do
160 : : end do
161 : : end do
162 : : end do
163 : : end do
164 : : end do
165 : 0 : close(unt)
166 : :
167 [ # # # # : 0 : ABI_MALLOC(coeffW_BZ,(Cryst%nattyp(itypatcor),nsppol,bandinf:bandsup,Kmesh%nbz,nspinor,2*lcor+1))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # ]
168 [ # # # # : 0 : coeffW_BZ=czero
# # # # #
# # # ]
169 : :
170 [ # # ]: 0 : if (Kmesh%nbz==Kmesh%nibz) then
171 [ # # # # : 0 : coeffW_BZ=coeffW_IBZ
# # # # #
# # # # #
# # # # #
# # # # #
# # ]
172 [ # # ]: 0 : else if (Cryst%nsym==1) then
173 : 0 : write(message,*) "Reconstruct in full BZ"
174 : 0 : call wrtout(std_out,message,'COLL')
175 : 0 : call wrtout(ab_out,message,'COLL')
176 [ # # ]: 0 : do ik_bz=1,Kmesh%nbz
177 : : ! if(prtvol>=10) write(6,*) "ik",ik_bz,Kmesh%tab(ik_bz),Kmesh%tabi(ik_bz),Kmesh%tabo(ik_bz)
178 [ # # ]: 0 : if(Kmesh%tabi(ik_bz)==1) then
179 [ # # # # : 0 : coeffW_BZ(:,:,:,ik_bz,:,:)=coeffW_IBZ(:,:,:,Kmesh%tab(ik_bz),:,:)
# # # # #
# ]
180 [ # # ]: 0 : else if(Kmesh%tabi(ik_bz)==-1) then
181 [ # # # # : 0 : coeffW_BZ(:,:,:,ik_bz,:,:)=conjg(coeffW_IBZ(:,:,:,Kmesh%tab(ik_bz),:,:))
# # # # #
# ]
182 : : endif
183 : : ! if(prtvol>=10)write(6,*) "coeffW 21",coeffW_BZ(1,1,bandinf,ik_bz,:)
184 : : ! if(prtvol>=10)write(6,*) "coeffW 21",coeffW_BZ(1,1,bandinf+1,ik_bz,:)
185 : : ! if(prtvol>=10)write(6,*) "coeffW 25",coeffW_BZ(1,1,bandsup,ik_bz,:)
186 : : enddo
187 [ # # ]: 0 : else if (Cryst%nsym>1) then
188 : 0 : write(message,*) "Reconstruct in full BZ (nsym=0)"
189 : 0 : call wrtout(std_out,message,'COLL')
190 [ # # ]: 0 : do ik_bz=1,Kmesh%nbz
191 : : !write(6,*) ik_bz,Kmesh%nbz
192 : 0 : call kmesh%get_BZ_item(ik_bz,kbz,ik_ibz,isym,itim)
193 [ # # ]: 0 : do indx=1,cryst%nattyp(itypatcor)
194 : 0 : iat=cryst%atindx1(indx) ! correct index for the full atom list
195 : 0 : at_indx=cryst%indsym(4,isym,iat) !! see eg sym_matlu and m_crystal
196 [ # # ]: 0 : do spin=1,nsppol
197 [ # # ]: 0 : do ispinor=1,nspinor
198 [ # # ]: 0 : do m1=1,2*lcor+1
199 [ # # ]: 0 : do m2=1,2*lcor+1
200 : : coeffW_BZ(indx,spin,:,ik_bz,ispinor,m1)= coeffW_BZ(indx,spin,:,ik_bz,ispinor,m1)&
201 [ # # ]: 0 : & +coeffW_IBZ(at_indx,spin,:,ik_ibz,ispinor,m2)*pawang%zarot(m2,m1,lcor+1,isym)
202 : : enddo
203 : : ! write(6,'(20f7.3)') (pawang%zarot(m1,m2,lcor+1,isym),m2=1,2*lcor+1)
204 : : enddo
205 : : enddo
206 : : enddo
207 : : enddo
208 : : ! do m1=1,2*lcor+1
209 : : ! write(6,*) "coeffW_IBZ",coeffW_IBZ(1,8,ik_ibz,m1)
210 : : ! enddo
211 : : ! do m1=1,2*lcor+1
212 : : ! write(6,*) "coeffW_ BZ",coeffW_BZ(1,8,ik_bz,m1)
213 : : ! enddo
214 : : enddo
215 : : end if
216 [ # # ]: 0 : ABI_FREE(coeffW_IBZ)
217 : :
218 : :
219 : 0 : end subroutine read_plowannier
220 : : !!***
221 : :
222 : : END MODULE m_read_plowannier
223 : : !!***
|