Line data Source code
1 : !!****m* ABINIT/m_dftu_self
2 : !! NAME
3 : !! m_dftu_self
4 : !!
5 : !! FUNCTION
6 : !! Compute DFT+U self energy for DMFT
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
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 : !! INPUTS
15 : !!
16 : !! OUTPUT
17 : !!
18 : !! SOURCE
19 :
20 : #if defined HAVE_CONFIG_H
21 : #include "config.h"
22 : #endif
23 :
24 : #include "abi_common.h"
25 :
26 : MODULE m_dftu_self
27 :
28 : use defs_basis
29 : use m_abicore
30 : use m_errors
31 :
32 : use m_crystal, only : crystal_t
33 : use m_green, only : green_type
34 : use m_self, only : self_type
35 : use m_oper, only : print_oper
36 : use m_energy, only : energy_type,compute_energy
37 : use m_pawtab, only : pawtab_type
38 : use m_pawdij, only : pawpupot
39 : use m_paw_dmft, only : paw_dmft_type
40 : use m_paw_correlations, only : setnoccmmp
41 :
42 : implicit none
43 :
44 : private
45 :
46 : public :: dftu_self
47 : !!***
48 :
49 : contains
50 :
51 : !!****f* m_dftu_self/dftu_self
52 : !! NAME
53 : !! dftu_self
54 : !!
55 : !! FUNCTION
56 : !! Use DFT+U to compute self-energy
57 : !!
58 : !! COPYRIGHT
59 : !! Copyright (C) 1999-2026 ABINIT group (BAmadon)
60 : !! This file is distributed under the terms of the
61 : !! GNU General Public License, see ~abinit/COPYING
62 : !! or http://www.gnu.org/copyleft/gpl.txt .
63 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
64 : !!
65 : !! INPUTS
66 : !! cryst_struc
67 : !! istep = step of iteration for DFT.
68 : !! mpi_enreg=information about MPI parallelization
69 : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
70 : !! pawang <type(pawang)>=paw angular mesh and related data
71 : !! pawtab <type(pawtab)>
72 : !!
73 : !! OUTPUT
74 : !!
75 : !! NOTES
76 : !!
77 : !! SOURCE
78 :
79 2 : subroutine dftu_self(cryst_struc,green,paw_dmft,pawtab,self,opt_dftu,prtopt)
80 :
81 : !Arguments ------------------------------------
82 : !scalars
83 : ! type(pawang_type), intent(in) :: pawang
84 : type(crystal_t),intent(in) :: cryst_struc
85 : type(green_type), intent(in) :: green
86 : type(paw_dmft_type), intent(in) :: paw_dmft
87 : type(pawtab_type),target,intent(in) :: pawtab(cryst_struc%ntypat)
88 : type(self_type), intent(inout) :: self !vz_i
89 : integer, intent(in) :: opt_dftu,prtopt
90 :
91 : !Local variables ------------------------------
92 : !scalars
93 : character(len=500) :: message
94 : integer :: iatom,idijeff,isppol,ispinor,ispinor1,lpawu
95 : integer :: ifreq,im,im1,ldim,natom,nocc,nsppol,nspinor,nsploop
96 : !arrays
97 : integer,parameter :: spinor_idxs(2,4)=RESHAPE((/1,1,2,2,1,2,2,1/),(/2,4/))
98 2 : real(dp),allocatable :: noccmmp(:,:,:,:),nocctot(:)
99 2 : real(dp),allocatable :: vpawu(:,:,:,:)
100 : type(pawtab_type),pointer :: pawtab_
101 :
102 : !************************************************************************
103 :
104 : ABI_UNUSED(opt_dftu)
105 :
106 2 : natom=cryst_struc%natom
107 2 : nsppol=paw_dmft%nsppol
108 2 : nspinor=paw_dmft%nspinor
109 2 : nsploop=max(nsppol,nspinor**2)
110 2 : nocc=nsploop
111 2 : isppol=0
112 2 : ispinor=0
113 2 : ispinor1=0
114 :
115 : !===============================
116 : !Impose density matrix
117 : !===============================
118 : !todo_ab build pawrhoij or suppress it in setnoccmmp
119 : !dimdmat=2*maxval(pawtab(:)%lpawu)+1
120 : !call setnoccmmp(0,dimdmat,paw_dmft%dmatpawu(1:dimdmat,1:dimdmat,1:nsppol*nspinor,1:natpawu),&
121 : !& 1,1,cryst_struc%indsym,cryst_struc%natom,cryst_struc%natom,natpawu,&
122 : !& paw_dmft%nspinor,paw_dmft%nsppol,cryst_struc%nsym,cryst_struc%ntypat,paw_ij,pawang,3,&
123 : !& pawrhoij_dum,pawtab,cryst_struc%spinat,cryst_struc%symafm,struct%typat,0,10)
124 :
125 6 : do iatom=1,cryst_struc%natom
126 4 : lpawu=paw_dmft%lpawu(iatom)
127 4 : pawtab_ => pawtab(cryst_struc%typat(iatom))
128 6 : if(lpawu.ne.-1) then
129 2 : ldim=2*lpawu+1
130 10 : ABI_MALLOC(vpawu,(2,ldim,ldim,nocc))
131 :
132 10 : ABI_MALLOC(noccmmp,(2,2*pawtab_%lpawu+1,2*pawtab_%lpawu+1,nocc))
133 6 : ABI_MALLOC(nocctot,(nocc))
134 332 : noccmmp(:,:,:,:)=zero ; nocctot(:)=zero ! contains nmmp in the n m representation
135 :
136 : ! ===============================
137 : ! Begin loop over spin/spinors to initialize noccmmp
138 6 : do idijeff=1,nsploop
139 : ! ===============================
140 4 : if(nsploop==2) then
141 4 : isppol=spinor_idxs(1,idijeff)
142 4 : ispinor=1
143 4 : ispinor1=1
144 0 : else if(nsploop==4) then
145 0 : isppol=1
146 0 : ispinor=spinor_idxs(1,idijeff)
147 0 : ispinor1=spinor_idxs(2,idijeff)
148 0 : else if(nsploop==1) then
149 : isppol=1
150 : ispinor=1
151 : ispinor1=1
152 : else
153 0 : write(message,'(2a)') " BUG in dftu_self: nsploop should be equal to 1, 2 or 4"
154 0 : call wrtout(std_out,message,'COLL')
155 : end if
156 : ! ===============================
157 : ! Initialize noccmmp
158 : ! ===============================
159 24 : do im1 = 1 , ldim
160 124 : do im = 1 , ldim
161 : ! noccmmp(1,im,im1,idijeff)=real(green%occup%matlu(iatom)%mat(im,im1,isppol,ispinor,ispinor1))
162 : ! noccmmp(2,im,im1,idijeff)=imag(green%occup%matlu(iatom)%mat(im,im1,isppol,ispinor,ispinor1))
163 100 : noccmmp(1,im,im1,idijeff)=real(green%occup%matlu(iatom)%mat(im1+(ispinor-1)*ldim,im+(ispinor1-1)*ldim,isppol))
164 120 : noccmmp(2,im,im1,idijeff)=aimag(green%occup%matlu(iatom)%mat(im1+(ispinor-1)*ldim,im+(ispinor1-1)*ldim,isppol))
165 : end do
166 : end do
167 :
168 : ! ===============================
169 : ! Compute nocctot for pawpupot =
170 : ! ===============================
171 26 : do im1=1,ldim
172 24 : if(nsploop==4) then
173 0 : if(idijeff<=2) then
174 0 : nocctot(1)=nocctot(1)+noccmmp(1,im1,im1,idijeff)
175 : end if
176 : else
177 20 : nocctot(idijeff)=nocctot(idijeff)+noccmmp(1,im1,im1,idijeff)
178 : end if
179 : end do
180 : ! write(message,'(2a)') ch10," == The noccmmp matrix is"
181 : ! call wrtout(std_out,message,'COLL')
182 : ! do im=1,ldim
183 : ! write(message,'(12(1x,9(1x,f10.5)))') (noccmmp(1,im,im1,idijeff),im1=1,ldim)
184 : ! call wrtout(std_out,message,'COLL')
185 : ! write(message,'(12(1x,9(1x,f10.5)))') (noccmmp(2,im,im1,idijeff),im1=1,ldim)
186 : ! call wrtout(std_out,message,'COLL')
187 : ! end do
188 : ! ! write(message,'(2a)') ch10," == The nocctot are"
189 : ! call wrtout(std_out,message,'COLL')
190 : ! write(std_out,*) nocctot(idijeff)
191 : end do
192 :
193 : ! warning dmft works here if nspden=nsppol (this is checked elsewhere)
194 :
195 : ! ===============================
196 : ! Compute DFT+U vpawu from noccmmp
197 : ! ===============================
198 2 : call pawpupot(2,nocc,noccmmp,nocctot,2,pawtab_,vpawu)
199 : ! do idijeff=1,size(vpawu,4)
200 : ! write(message,'(2a)') ch10," == The vpawu matrix is"
201 : ! call wrtout(std_out,message,'COLL')
202 : ! do im=1,ldim
203 : ! write(message,'(12(1x,9(1x,f10.5)))') (vpawu(1,im,im1,idijeff),im1=1,ldim)
204 : ! call wrtout(std_out,message,'COLL')
205 : ! write(message,'(12(1x,9(1x,f10.5)))') (vpawu(2,im,im1,idijeff),im1=1,ldim)
206 : ! call wrtout(std_out,message,'COLL')
207 : ! end do
208 : ! end do
209 :
210 : ! ===============================
211 : ! Begin loop over spin/spinors to compute self%oper
212 6 : do idijeff=1,nsploop
213 : ! ===============================
214 4 : if(nsploop==2) then
215 4 : isppol=spinor_idxs(1,idijeff)
216 4 : ispinor=1
217 4 : ispinor1=1
218 0 : else if(nsploop==4) then
219 0 : isppol=1
220 0 : ispinor=spinor_idxs(1,idijeff)
221 0 : ispinor1=spinor_idxs(2,idijeff)
222 0 : else if(nsploop==1) then
223 : isppol=1
224 : ispinor=1
225 : ispinor1=1
226 : else
227 0 : write(message,'(2a)') " BUG in dftu_self: nsploop should be equal to 1, 2 or 4"
228 0 : call wrtout(std_out,message,'COLL')
229 : end if
230 :
231 : ! ===============================
232 : ! vpawu -> self%oper
233 : ! ===============================
234 26 : do im1 = 1 , ldim
235 124 : do im = 1 , ldim
236 3320 : do ifreq=1,self%nw
237 : self%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*ldim,im1+(ispinor1-1)*ldim,isppol)=&
238 : ! & cmplx(vpawu(1,im1,im),vpawu(2,im1,im),kind=dp)
239 : ! One take the transpose in orbital index to be coherent with the
240 : ! current DFT+U implementation in Abinit.
241 3300 : & cmplx(vpawu(1,im,im1,idijeff),vpawu(2,im,im1,idijeff),kind=dp)
242 : end do
243 : end do
244 : end do
245 :
246 : end do ! idijeff
247 : ! write(std_out,*) "check im,im1 in vpawu",iatom
248 2 : ABI_FREE(vpawu)
249 :
250 : ! ===============================
251 : ! Compute energy
252 : ! ===============================
253 :
254 2 : ABI_FREE(noccmmp)
255 2 : ABI_FREE(nocctot)
256 : end if
257 : end do
258 :
259 : if(abs(prtopt)>0) then
260 : end if
261 :
262 2 : end subroutine dftu_self
263 : !!***
264 :
265 : END MODULE m_dftu_self
266 : !!***
|