Branch data Line data Source code
1 : : !!****m* ABINIT/m_pawdij
2 : : !! NAME
3 : : !! m_pawdij
4 : : !!
5 : : !! FUNCTION
6 : : !! This module contains several routines used to compute the PAW pseudopotential
7 : : !! strengths Dij. The Dijs define the non-local PAW operator:
8 : : !! VNL = Sum_ij [ Dij |pi><pj| ], with pi, pj= projectors
9 : : !!
10 : : !! COPYRIGHT
11 : : !! Copyright (C) 2013-2026 ABINIT group (MT, FJ, BA, JWZ)
12 : : !! This file is distributed under the terms of the
13 : : !! GNU General Public License, see ~abinit/COPYING
14 : : !! or http://www.gnu.org/copyleft/gpl.txt .
15 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
16 : : !!
17 : : !! NOTES
18 : : !! FOR DEVELOPERS: in order to preserve the portability of libPAW library,
19 : : !! please consult ~abinit/src/??_libpaw/libpaw-coding-rules.txt
20 : : !!
21 : : !! SOURCE
22 : :
23 : : #include "libpaw.h"
24 : :
25 : : #define MATPACK(row,col) (MAX(row,col)*(MAX(row,col)-1)/2 + MIN(row,col))
26 : : #define LMPACK(lqn,mqn) (lqn*lqn+lqn+mqn+1)
27 : :
28 : : MODULE m_pawdij
29 : :
30 : : USE_DEFS
31 : : USE_MSG_HANDLING
32 : : USE_MPI_WRAPPERS
33 : : USE_MEMORY_PROFILING
34 : :
35 : : use m_paral_atom, only : get_my_atmtab, free_my_atmtab
36 : : use m_paw_io, only : pawio_print_ij
37 : : use m_pawang, only : pawang_type
38 : : use m_pawrad, only : pawrad_type, pawrad_deducer0, simp_gen, nderiv_gen
39 : : use m_pawtab, only : pawtab_type
40 : : use m_paw_an, only : paw_an_type
41 : : use m_paw_ij, only : paw_ij_type, paw_ij_print
42 : : use m_pawfgrtab, only : pawfgrtab_type
43 : : use m_pawrhoij, only : pawrhoij_type
44 : : use m_paw_finegrid, only : pawgylm, pawexpiqr
45 : : use m_paw_sphharm, only : initylmr,slxyzs,make_dyadic,realgaunt
46 : : use m_numeric_tools,only : geteuler
47 : :
48 : : implicit none
49 : :
50 : : private :: pawdijaa
51 : :
52 : :
53 : : !public procedures.
54 : : public :: pawdij ! Dij total
55 : : public :: pawdijhartree ! Dij Hartree
56 : : public :: pawdijfock ! Dij Fock exact-exchange
57 : : public :: pawdijxc ! Dij eXchange-Correlation (using (r,theta,phi) grid)
58 : : public :: pawdijxcm ! Dij eXchange-Correlation (using (l,m) moments)
59 : : public :: pawdijhat ! Dij^hat (compensation charge contribution)
60 : : public :: pawdijnd ! Dij nuclear dipole
61 : : public :: pawdijso ! Dij spin-orbit
62 : : public :: pawdiju ! Dij DFT+U
63 : : public :: pawdiju_euijkl ! Dij DFT+U, using pawrhoij instead of occupancies
64 : : public :: pawdijexxc ! Dij local exact-exchange
65 : : public :: pawdijfr ! 1st-order frozen Dij
66 : : public :: pawpupot ! On-site DFT+U potential
67 : : public :: pawxpot ! On-site local exact-exchange potential
68 : : public :: symdij ! Symmetrize total Dij or one part of it
69 : : public :: symdij_all ! Symmetrize all contributions to Dij
70 : : public :: pawdij_gather ! Perform a allgather operation on Dij
71 : : public :: pawdij_print_dij ! Print out a Dij matrix
72 : : public :: pawv1 ! On-site V1 potential
73 : : !!***
74 : :
75 : : CONTAINS
76 : :
77 : : !===========================================================
78 : : !!***
79 : :
80 : : !----------------------------------------------------------------------
81 : :
82 : : !!****f* m_pawdij/pawdij
83 : : !! NAME
84 : : !! pawdij
85 : : !!
86 : : !! FUNCTION
87 : : !! Compute the pseudopotential strengths Dij of the PAW non local operator as sum of
88 : : !! several contributions. Can compute first-order strengths Dij for RF calculations.
89 : : !! This routine is a driver calling, for each contribution to Dij, a specific
90 : : !! routines.
91 : : !! Within standard PAW formalism, Dij can be decomposd as follows:
92 : : !! Dij = Dij_atomic + Dij_Hartree + Dij_XC + Dij^hat
93 : : !! In case of additional approximations, several other terms can appear:
94 : : !! Dij_DFT+U, Dij_spin-orbit, Dij_local-exact-exchange, Dij_Fock...
95 : : !!
96 : : !! INPUTS
97 : : !! cplex=1 if no phase is applied (GS), 2 if a exp(-iqr) phase is applied (Response Function at q<>0)
98 : : !! enunit=choice for units of output Dij
99 : : !! gprimd(3,3)=dimensional primitive translations for reciprocal space
100 : : !! [hyb_mixing, hyb_mixing_sr]= -- optional-- mixing factors for the global (resp. screened) XC hybrid functional
101 : : !! ipert=index of perturbation (used only for RF calculation ; set ipert<=0 for GS calculations.
102 : : !! my_natom=number of atoms treated by current processor
103 : : !! natom=total number of atoms in cell
104 : : !! nfft=number of real space grid points (for current proc)
105 : : !! nfftot=total number of real space grid points
106 : : !! nspden=number of spin-density components
107 : : !! ntypat=number of types of atoms in unit cell.
108 : : !! paw_an(my_natom) <type(paw_an_type)>=paw arrays given on angular mesh
109 : : !! paw_ij(my_natom) <type(paw_ij_type)>=paw arrays given on (i,j) channels
110 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
111 : : !! pawfgrtab(my_natom) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid
112 : : !! pawprtvol=control print volume and debugging output for PAW
113 : : !! pawrad(ntypat) <type(pawrad_type)>=paw radial mesh and related data
114 : : !! pawrhoij(my_natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data
115 : : !! pawspnorb=flag: 1 if spin-orbit coupling is activated
116 : : !! pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
117 : : !! pawxcdev=Choice of XC development (0=no dev. (use of angular mesh) ; 1 or 2=dev. on moments)
118 : : !! qphon(3)=wavevector of the phonon
119 : : !! spnorbscl=scaling factor for spin-orbit coupling
120 : : !! ucvol=unit cell volume
121 : : !! vtrial(cplex*nfft,nspden)=GS potential on real space grid
122 : : !! vxc(cplex*nfft,nspden)=XC potential (Hartree) on real space grid
123 : : !! xred(3,my_natom)= reduced atomic coordinates
124 : : !! znuc(ntypat)=nuclear charges
125 : : !! ======== Optional arguments ==============
126 : : !! Parallelism over atomic sites:
127 : : !! mpi_atmtab(:)=indexes of the atoms treated by current proc
128 : : !! comm_atom=MPI communicator over atoms
129 : : !! mpi_comm_grid=MPI communicator over real space grid points
130 : : !! Application of a potential energy shift on atomic sites:
131 : : !! natvshift=number of atomic potential energy shifts (per atom) ; default=0
132 : : !! atvshift(natvshift,nsppol,natom)=potential energy shift for lm channel & spin & atom
133 : : !! fatvshift=factor that multiplies atvshift
134 : : !! Electrons-positron 2-component DFT:
135 : : !! electronpositron_calctype=type of calculation for electron-positron 2component-DFT:
136 : : !! 0: standard DFT (no positron) ; default value
137 : : !! 1: positron in the constant electrons potential
138 : : !! 2: electrons in the constant positron potential
139 : : !! electronpositron_pawrhoij(my_natom) <type(pawrhoij_type)>=
140 : : !! PAW occupation matrix of the "constant" particle(s)
141 : : !! (electrons if calctype=1, positron if calctype=2)
142 : : !! electronpositron_lmselect(lmmax,my_natom)=
143 : : !! Flags selecting the non-zero LM-moments of on-site densities
144 : : !! for the "constant" particle(s)
145 : : !! (electrons if calctype=1, positron if calctype=2)
146 : : !!
147 : : !! OUTPUT
148 : : !! paw_ij(iatom)%dij(cplex_dij*qphase*lmn2_size,ndij)= total Dij terms (GS calculation, ipert=0)
149 : : !! total 1st-order Dij terms (RF ccalc., ipert>0)
150 : : !! May be complex if cplex_dij=2
151 : : !! dij(:,1) contains Dij^up-up
152 : : !! dij(:,2) contains Dij^dn-dn
153 : : !! dij(:,3) contains Dij^up-dn (only if nspinor=2)
154 : : !! dij(:,4) contains Dij^dn-up (only if nspinor=2)
155 : : !! May also compute paw_ij(iatom)%dij0,paw_ij(iatom)%dijhartree,paw_ij(iatom)%dijxc,
156 : : !! paw_ij(iatom)%dijxc_hat,paw_ij(iatom)%dijxc_val,
157 : : !! paw_ij(iatom)%dijhat,paw_ij(iatom)dijso,
158 : : !! paw_ij(iatom)%dijU,paw_ij(iatom)%dijexxc,paw_ij(iatom)%dijfock
159 : : !!
160 : : !! NOTES
161 : : !! Response function calculations:
162 : : !! In order to compute first-order Dij, paw_an (resp. paw_ij) datastructures
163 : : !! must contain first-order quantities, namely paw_an1 (resp. paw_ij1).
164 : : !!
165 : : !! SOURCE
166 : :
167 : 21068 : subroutine pawdij(cplex,enunit,gprimd,ipert,my_natom,natom,nfft,nfftot,nspden,ntypat,&
168 : 63204 : & paw_an,paw_ij,pawang,pawfgrtab,pawprtvol,pawrad,pawrhoij,pawspnorb,pawtab,&
169 [ - + ]: 21068 : & pawxcdev,qphon,spnorbscl,ucvol,charge,vtrial,vxc,xred,znuc,&
170 [ + + + + : 21068 : & electronpositron_calctype,electronpositron_pawrhoij,electronpositron_lmselect,&
- + + + +
+ - + ]
171 [ + + + - : 21068 : & atvshift,fatvshift,natvshift,nucdipmom,eijkl_is_sym,&
- + ]
172 [ + + + + : 21068 : & mpi_atmtab,comm_atom,mpi_comm_grid,hyb_mixing,hyb_mixing_sr,spinaxis)
- + ]
173 : :
174 : : !Arguments ---------------------------------------------
175 : : !scalars
176 : : integer,intent(in) :: cplex,enunit,ipert,my_natom,natom,nfft,nfftot
177 : : integer,intent(in) :: nspden,ntypat,pawprtvol,pawspnorb,pawxcdev
178 : : integer,optional,intent(in) :: electronpositron_calctype
179 : : integer,optional,intent(in) :: comm_atom,mpi_comm_grid,natvshift
180 : : real(dp),intent(in) :: spnorbscl,ucvol,charge
181 : : real(dp),intent(in),optional ::fatvshift,hyb_mixing,hyb_mixing_sr
182 : : type(pawang_type),intent(in) :: pawang
183 : : !arrays
184 : : integer,optional,target,intent(in) :: mpi_atmtab(:)
185 : : logical,optional,intent(in) :: electronpositron_lmselect(:,:)
186 : : logical,optional,intent(in) :: eijkl_is_sym(ntypat)
187 : : real(dp),intent(in) :: gprimd(3,3),qphon(3)
188 : : real(dp),intent(in) :: vxc(:,:),xred(3,natom),znuc(ntypat)
189 : : real(dp),intent(in),target :: vtrial(cplex*nfft,nspden)
190 : : real(dp),intent(in),optional :: atvshift(:,:,:)
191 : : real(dp),intent(in),optional :: nucdipmom(3,natom)
192 : : real(dp),intent(in),optional :: spinaxis(3)
193 : : type(paw_an_type),intent(in) :: paw_an(my_natom)
194 : : type(paw_ij_type),target,intent(inout) :: paw_ij(my_natom)
195 : : type(pawfgrtab_type),intent(inout) :: pawfgrtab(my_natom)
196 : : type(pawrad_type),intent(in) :: pawrad(ntypat)
197 : : type(pawrhoij_type),intent(inout) :: pawrhoij(my_natom)
198 : : type(pawrhoij_type),intent(in),optional :: electronpositron_pawrhoij(:)
199 : : type(pawtab_type),intent(in) :: pawtab(ntypat)
200 : :
201 : : !Local variables ---------------------------------------
202 : : !scalars
203 : : !Possible algos for PAW+U: 1=using occupation matrix n_i,,2=using PAW matrix rho_ij
204 : : integer, parameter :: PAWU_ALGO_1=1,PAWU_ALGO_2=2
205 : : integer, parameter :: PAWU_FLL=1,PAWU_AMF=2
206 : : integer :: cplex_dij,iatom,iatom_tot,idij,ipositron,itypat,klmn,klmn1,lm_size,lmn2_size
207 : : integer :: lpawu,my_comm_atom,my_comm_grid,natvshift_,ndij,nsploop,nsppol
208 : : integer :: pawu_algo,pawu_dblec,qphase,usekden,usepawu,usexcnhat
209 : : logical :: dij_available,dij_need,dij_prereq
210 : : logical :: dij0_available,dij0_need,dij0_prereq
211 : : logical :: dijexxc_available,dijexxc_need,dijexxc_prereq
212 : : logical :: dijfock_available,dijfock_need,dijfock_prereq
213 : : logical :: dijhartree_available,dijhartree_need,dijhartree_prereq
214 : : logical :: dijhat_available,dijhat_need,dijhat_prereq
215 : : logical :: dijhatfr_available,dijhatfr_need,dijhatfr_prereq
216 : : logical :: dijnd_available,dijnd_need,dijnd_prereq
217 : : logical :: dijso_available,dijso_need,dijso_prereq
218 : : logical :: dijxc_available,dijxc_need,dijxc_prereq
219 : : logical :: dijxchat_available,dijxchat_need,dijxchat_prereq
220 : : logical :: dijxcval_available,dijxcval_need,dijxcval_prereq
221 : : logical :: dijU_available,dijU_need,dijU_prereq
222 : : logical :: has_nucdipmom,my_atmtab_allocated,is_sym
223 : : logical :: need_to_print,paral_atom,v_dijhat_allocated
224 : : real(dp) :: hyb_mixing_,hyb_mixing_sr_
225 : : character(len=500) :: msg
226 : : !arrays
227 : 21068 : integer,pointer :: my_atmtab(:)
228 : 21068 : logical,allocatable :: lmselect(:)
229 : : real(dp) :: spinaxis_in(3)
230 : 21068 : real(dp),allocatable :: dij0(:),dijhartree(:)
231 : 21068 : real(dp),allocatable :: dijhat(:,:),dijexxc(:,:),dijfock_cv(:,:),dijfock_vv(:,:),dijpawu(:,:)
232 : 21068 : real(dp),allocatable :: dijnd(:,:),dijso(:,:)
233 : 21068 : real(dp),allocatable :: dijxc(:,:),dij_ep(:),dijxchat(:,:),dijxcval(:,:)
234 : 21068 : real(dp),pointer :: v_dijhat(:,:),vpawu(:,:,:,:),vpawx(:,:,:)
235 : :
236 : : ! *************************************************************************
237 : :
238 : : !------------------------------------------------------------------------
239 : : !----- Check consistency of arguments
240 : : !------------------------------------------------------------------------
241 : :
242 : : ! === Check optional arguments ===
243 : :
244 : 15533 : hyb_mixing_ =zero ; if(present(hyb_mixing)) hyb_mixing_ =hyb_mixing
245 [ + + ]: 21068 : hyb_mixing_sr_=zero ; if(present(hyb_mixing_sr)) hyb_mixing_sr_=hyb_mixing_sr
246 : :
247 [ + + ]: 21068 : natvshift_=0;if (present(natvshift)) natvshift_=natvshift
248 [ + + ]: 21068 : if (natvshift_>0) then
249 [ - + ]: 196 : if ((.not.present(atvshift)).or.(.not.present(fatvshift))) then
250 : 0 : msg='when natvshift>0, atvshift and fatvshift arguments must be present!'
251 : 0 : LIBPAW_BUG(msg)
252 : : end if
253 : : end if
254 : :
255 [ + + ]: 21068 : ipositron=0;if (present(electronpositron_calctype)) ipositron=electronpositron_calctype
256 [ + + ]: 15533 : if (ipositron/=0) then
257 [ - + ]: 488 : if ((.not.present(electronpositron_pawrhoij)).or.&
258 : : & (.not.present(electronpositron_lmselect))) then
259 : 0 : msg='ep_pawrhoij and ep_lmselect must be present for electron-positron calculations!'
260 : 0 : LIBPAW_BUG(msg)
261 : : end if
262 : : end if
263 : :
264 : 21068 : has_nucdipmom=present(nucdipmom)
265 : :
266 : : ! === Check complex character of arguments ===
267 : :
268 [ + + - + ]: 21068 : if (nspden==4.and.cplex==2) then
269 : 0 : msg='nspden=4 probably not compatible with cplex=2!'
270 : 0 : LIBPAW_BUG(msg)
271 : : end if
272 [ + + ]: 21068 : if (my_natom>0) then
273 [ + + - + ]: 19304 : if (paw_ij(1)%ndij==4.and.paw_ij(1)%cplex_dij/=2) then
274 : 0 : msg='invalid cplex size for Dij (4 Dij components)!'
275 : 0 : LIBPAW_BUG(msg)
276 : : end if
277 [ - + ]: 19304 : if (paw_ij(1)%qphase/=paw_an(1)%cplex) then
278 : 0 : msg='paw_ij()%qphase and paw_an()%cplex must be equal!'
279 : 0 : LIBPAW_BUG(msg)
280 : : end if
281 [ + + - + ]: 19304 : if (ipert<=0.and.paw_ij(1)%qphase/=1) then
282 : 0 : msg='qphase must be 1 for GS calculations!'
283 : 0 : LIBPAW_BUG(msg)
284 : : end if
285 [ + + - + ]: 19304 : if (ipert>0.and.paw_ij(1)%qphase/=cplex) then
286 : 0 : msg='paw_ij()%qphase must be equal to cplex!'
287 : 0 : LIBPAW_BUG(msg)
288 : : end if
289 [ + + - + ]: 19304 : if (paw_an(1)%has_vxcval>0.and.paw_an(1)%has_vxctau==2) then
290 : 0 : msg='kinetic energy density not available for vxc_val!'
291 : 0 : LIBPAW_BUG(msg)
292 : : end if
293 : : end if
294 : :
295 : : !------------------------------------------------------------------------
296 : : !----- Initializations
297 : : !------------------------------------------------------------------------
298 : :
299 : : !Nothing to do for some perturbations (RF case)
300 [ + + + + ]: 21068 : if (ipert==natom+1.or.ipert==natom+10) then
301 [ + + ]: 2517 : do iatom=1,my_natom
302 [ + - + + : 257917 : if (paw_ij(iatom)%has_dij==1) paw_ij(iatom)%dij=zero
+ + ]
303 [ - + - - ]: 1626 : if (paw_ij(iatom)%has_dij0==1) paw_ij(iatom)%dij0=zero
304 [ - + - - : 1626 : if (paw_ij(iatom)%has_dijfock==1) paw_ij(iatom)%dijfock=zero
- - ]
305 [ + - + + ]: 88709 : if (paw_ij(iatom)%has_dijhartree==1) paw_ij(iatom)%dijhartree=zero
306 [ - + - - : 1626 : if (paw_ij(iatom)%has_dijxc==1) paw_ij(iatom)%dijxc=zero
- - ]
307 [ - + - - : 1626 : if (paw_ij(iatom)%has_dijhat==1) paw_ij(iatom)%dijhat=zero
- - ]
308 [ - + - - : 1626 : if (paw_ij(iatom)%has_dijso==1) paw_ij(iatom)%dijso=zero
- - ]
309 [ - + - - : 1626 : if (paw_ij(iatom)%has_dijU==1) paw_ij(iatom)%dijU=zero
- - ]
310 [ - + - - : 1626 : if (paw_ij(iatom)%has_dijexxc==1) paw_ij(iatom)%dijexxc=zero
- - ]
311 [ - + - - : 1626 : if (paw_ij(iatom)%has_dijxc_hat==1) paw_ij(iatom)%dijxc_hat=zero
- - ]
312 [ - + - - : 2517 : if (paw_ij(iatom)%has_dijxc_val==1) paw_ij(iatom)%dijxc_val=zero
- - ]
313 : : end do
314 : : return
315 : : end if
316 : :
317 : : !Set up parallelism over atoms
318 [ + + + + ]: 20177 : paral_atom=(present(comm_atom).and.(my_natom/=natom))
319 [ + + ]: 20177 : nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab
320 [ + + ]: 20177 : my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom
321 : 20177 : call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,my_natom_ref=my_natom)
322 : :
323 : : !----- Various initializations
324 : 20177 : nsppol=1;nsploop=1
325 [ + + ]: 20177 : if (my_natom>0) then
326 : 18413 : nsppol=paw_ij(1)%nsppol
327 [ + + ]: 18413 : nsploop=nsppol;if (paw_ij(1)%ndij==4) nsploop=4
328 : : end if
329 [ + + ]: 51071 : usexcnhat=maxval(pawtab(1:ntypat)%usexcnhat)
330 [ + + ]: 20177 : my_comm_grid=xmpi_comm_self;if (present(mpi_comm_grid)) my_comm_grid=mpi_comm_grid
331 : :
332 : : !------ Select potential for Dij^hat computation
333 : 20177 : v_dijhat_allocated=.false.
334 [ + + ]: 20177 : if (my_natom>0) then
335 [ - + - - : 18413 : if ((paw_ij(1)%has_dij==1).or.(paw_ij(1)%has_dijhat==1).or. &
- - - - ]
336 : : & (paw_ij(1)%has_dijhat==0.and.pawprtvol/=0)) then
337 [ + + ]: 18413 : if (usexcnhat==0) then
338 [ + - - + ]: 10845 : if (size(vxc,1)/=cplex*nfft.or.size(vxc,2)/=nspden) then
339 : 0 : msg='invalid size for vxc!'
340 : 0 : LIBPAW_BUG(msg)
341 : : end if
342 [ - + + - : 43380 : LIBPAW_POINTER_ALLOCATE(v_dijhat,(cplex*nfft,nspden))
- + + - +
- + - - +
- + ]
343 : 10845 : v_dijhat_allocated=.true.
344 : : !v_dijhat=vtrial-vxc
345 [ + + ]: 24342 : do idij=1,nspden
346 [ + + ]: 461414565 : do klmn=1,cplex*nfft
347 : 461403720 : v_dijhat(klmn,idij)=vtrial(klmn,idij)-vxc(klmn,idij)
348 : : end do
349 : : end do
350 : : else
351 : 7568 : v_dijhat => vtrial
352 : : end if
353 : : end if
354 : : end if
355 : :
356 : : !------------------------------------------------------------------------
357 : : !----- Loop over atoms
358 : : !------------------------------------------------------------------------
359 : :
360 [ + + ]: 64644 : do iatom=1,my_natom
361 [ + + ]: 44467 : iatom_tot=iatom;if (paral_atom) iatom_tot=my_atmtab(iatom)
362 : :
363 : : ! === Atom-dependent data ===
364 : :
365 : 44467 : itypat=paw_ij(iatom)%itypat
366 : 44467 : cplex_dij=paw_ij(iatom)%cplex_dij
367 : 44467 : qphase=paw_ij(iatom)%qphase
368 : 44467 : lm_size=paw_an(iatom)%lm_size
369 : 44467 : lmn2_size=paw_ij(iatom)%lmn2_size
370 : 44467 : ndij=paw_ij(iatom)%ndij
371 : 44467 : usepawu=pawtab(itypat)%usepawu
372 [ + + + + ]: 44467 : pawu_algo=merge(PAWU_ALGO_1,PAWU_ALGO_2,ipert<=0.and.usepawu>=0)
373 [ + + ]: 44467 : pawu_dblec=merge(PAWU_FLL,PAWU_AMF,abs(usepawu)==1.or.abs(usepawu)==4)
374 [ + + ]: 44467 : usekden=merge(0,1,paw_an(iatom)%has_vxctau/=2)
375 : : need_to_print=((abs(pawprtvol)>=1).and. &
376 [ + + + + : 44467 : & (iatom_tot==1.or.iatom_tot==natom.or.pawprtvol<0))
+ + + + ]
377 : :
378 : : ! === Determine which conditions and prerequisites are fulfilled for Dij ===
379 : :
380 [ + - ]: 44467 : if (my_natom>0) then
381 : : ! Total Dij: no condition ; no prerequisites
382 : 44467 : dij_available=.true.;dij_prereq=.true.
383 : : ! Dij0: not available for RF ; need kij for the positron
384 [ + + + - ]: 44467 : dij0_available=(ipert<=0);dij0_prereq=(ipositron/=1.or.pawtab(itypat)%has_kij==2)
385 : : ! DijFock:not available for RF, positron; only for Fock exact exch. ; Vxc_ex needed
386 [ + + + - : 44467 : dijfock_available=(paw_ij(iatom)%has_dijfock>0.and.ipert<=0.and.ipositron/=1)
- + ]
387 : 44467 : dijfock_prereq=(paw_ij(iatom)%has_dijfock==2)
388 : : ! DijHartree: no condition ; no prerequisites
389 : 44467 : dijhartree_available=.true.;dijhartree_prereq=.true.
390 : : ! DijXC: no condition ; Vxc needed
391 : 44467 : dijxc_available=.true.
392 [ + - + - ]: 44467 : dijxc_prereq=(paw_ij(iatom)%has_dijxc==2.or.paw_an(iatom)%has_vxc>0)
393 : : ! Dij^hat: no condition ; no prerequisites
394 : 44467 : dijhat_available=.true.;dijhat_prereq=.true.
395 : : ! Dij^hat_FR: only for RF and when it was previously computed
396 [ + + - + ]: 44467 : dijhatfr_available=(ipert>0.and.paw_ij(iatom)%has_dijfr==2) ; dijhatfr_prereq=.true.
397 : : ! DijND: requires non-zero nucdipmom
398 : 44467 : dijnd_available=.false. ; dijnd_prereq=(cplex_dij==2)
399 [ + + + + : 158064 : if (has_nucdipmom) dijnd_available=(any(abs(nucdipmom(:,iatom))>tol8))
+ + ]
400 : : ! DijSO: not available for RF, positron; only for spin-orbit ; VHartree and Vxc needed
401 [ + + + - : 44467 : dijso_available=(pawspnorb>0.and.ipert<=0.and.ipositron/=1)
- + ]
402 : : dijso_prereq=(paw_ij(iatom)%has_dijso==2.or.&
403 [ + + + + : 44467 : & (paw_an(iatom)%has_vhartree>0.and.paw_an(iatom)%has_vxc>0))
+ - ]
404 : : ! DijU: not available for positron; only for DFT+U
405 [ + + - + ]: 44467 : dijU_available=(pawtab(itypat)%usepawu/=0.and.ipositron/=1)
406 : : dijU_prereq=(paw_ij(iatom)%has_dijU==2.or.paw_ij(iatom)%has_pawu_occ>0.or. &
407 [ + + + + : 44467 : & (paw_ij(iatom)%has_dijU>0))
+ + ]
408 : : ! DijExxc: not available for RF, positron; only for local exact exch. ; Vxc_ex needed
409 [ + + + - : 44467 : dijexxc_available=(pawtab(itypat)%useexexch/=0.and.ipert<=0.and.ipositron/=1)
- + ]
410 [ + - + + ]: 44467 : dijexxc_prereq=(paw_ij(iatom)%has_dijexxc==2.or.paw_ij(iatom)%has_exexch_pot>0)
411 : : ! DijXC^hat: not available for RF ; Vxc needed
412 : 44467 : dijxchat_available=(ipert<=0)
413 [ + - + - ]: 44467 : dijxchat_prereq=(paw_ij(iatom)%has_dijxc_hat==2.or.paw_an(iatom)%has_vxc>0)
414 : : ! DijXC_val: not available for RF ; Vxc_val needed
415 : 44467 : dijxcval_available=(ipert<=0)
416 [ + - + + ]: 44467 : dijxcval_prereq=(paw_ij(iatom)%has_dijxc_val==2.or.paw_an(iatom)%has_vxcval>0)
417 : : end if
418 : :
419 : : ! === Determine which parts of Dij have to be computed ===
420 : :
421 : 44467 : dij_need=.false.;dij0_need=.false.;dijexxc_need=.false.;dijfock_need=.false.
422 : 44467 : dijhartree_need=.false.;dijhat_need=.false.;dijhatfr_need=.false.;
423 : 44467 : dijso_need=.false.;dijU_need=.false.;dijxc_need=.false.
424 : 44467 : dijxchat_need=.false.;dijxcval_need=.false.; dijnd_need=.false.
425 : :
426 : : if (dij_available) then
427 [ + - ]: 44467 : if (paw_ij(iatom)%has_dij==1) then
428 [ + + + + ]: 5586290 : dij_need=.true.;paw_ij(iatom)%dij(:,:)=zero
429 [ # # # # ]: 0 : else if (paw_ij(iatom)%has_dij==0.and.need_to_print) then
430 [ # # # # : 0 : LIBPAW_ALLOCATE(paw_ij(iatom)%dij,(cplex_dij*qphase*lmn2_size,ndij))
# # # # #
# # # # #
# # # # ]
431 [ # # # # ]: 0 : dij_need=.true.;paw_ij(iatom)%dij(:,:)=zero
432 : 0 : paw_ij(iatom)%has_dij=-1
433 : : end if
434 : : else if (paw_ij(iatom)%has_dij==1) then
435 : : paw_ij(iatom)%dij=zero
436 : : end if
437 : :
438 [ + + ]: 44467 : if (dij0_available) then
439 [ - + ]: 38364 : if (paw_ij(iatom)%has_dij0==1) then
440 [ # # ]: 0 : dij0_need=.true.;paw_ij(iatom)%dij0(:)=zero
441 [ + - + + ]: 38364 : else if (paw_ij(iatom)%has_dij0==0.and.need_to_print) then
442 [ - + + - : 5991 : LIBPAW_ALLOCATE(paw_ij(iatom)%dij0,(lmn2_size))
+ - + - -
+ - + -
+ ]
443 [ + + ]: 394984 : dij0_need=.true.;paw_ij(iatom)%dij0(:)=zero
444 : 1997 : paw_ij(iatom)%has_dij0=-1
445 : : end if
446 [ - + ]: 6103 : else if (paw_ij(iatom)%has_dij0==1) then
447 [ # # ]: 0 : paw_ij(iatom)%dij0=zero
448 : : end if
449 : :
450 [ + + ]: 44467 : if (dijfock_available) then
451 [ - + ]: 502 : if (paw_ij(iatom)%has_dijfock==1) then
452 [ # # # # ]: 0 : dijfock_need=.true.;paw_ij(iatom)%dijfock(:,:)=zero
453 [ - + - - ]: 502 : else if (paw_ij(iatom)%has_dijfock==0.and.need_to_print) then
454 [ # # # # : 0 : LIBPAW_ALLOCATE(paw_ij(iatom)%dijfock,(cplex_dij*lmn2_size,ndij))
# # # # #
# # # # #
# # # # ]
455 [ # # # # ]: 0 : dijfock_need=.true.;paw_ij(iatom)%dijfock(:,:)=zero
456 : 0 : paw_ij(iatom)%has_dijfock=-1
457 : : end if
458 [ - + ]: 43965 : else if (paw_ij(iatom)%has_dijfock==1) then
459 [ # # # # ]: 0 : paw_ij(iatom)%dijfock=zero
460 : : end if
461 : :
462 : : if (dijhartree_available) then
463 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijhartree==1) then
464 [ # # ]: 0 : dijhartree_need=.true.;paw_ij(iatom)%dijhartree(:)=zero
465 [ - + ]: 44467 : else if (paw_ij(iatom)%has_dijhartree==0) then
466 [ # # # # : 0 : LIBPAW_ALLOCATE(paw_ij(iatom)%dijhartree,(qphase*lmn2_size))
# # # # #
# # # #
# ]
467 [ # # ]: 0 : dijhartree_need=.true.;paw_ij(iatom)%dijhartree(:)=zero
468 : 0 : paw_ij(iatom)%has_dijhartree=-1
469 : : end if
470 : : else if (paw_ij(iatom)%has_dijhartree==1) then
471 : : paw_ij(iatom)%dijhartree=zero
472 : : end if
473 : :
474 : : if (dijxc_available) then
475 [ + + ]: 44467 : if (paw_ij(iatom)%has_dijxc==1) then
476 [ + + + + ]: 2095 : dijxc_need=.true.;paw_ij(iatom)%dijxc(:,:)=zero
477 [ + - + + ]: 44432 : else if (paw_ij(iatom)%has_dijxc==0.and.need_to_print) then
478 [ - + + - : 7972 : LIBPAW_ALLOCATE(paw_ij(iatom)%dijxc,(cplex_dij*qphase*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
479 [ + + + + ]: 1462265 : dijxc_need=.true.;paw_ij(iatom)%dijxc(:,:)=zero
480 : 1993 : paw_ij(iatom)%has_dijxc=-1
481 : : end if
482 : : else if (paw_ij(iatom)%has_dijxc==1) then
483 : : paw_ij(iatom)%dijxc=zero
484 : : end if
485 : :
486 : : if (dijhat_available) then
487 [ + + ]: 44467 : if (paw_ij(iatom)%has_dijhat==1) then
488 [ + + + + ]: 2300 : dijhat_need=.true.;paw_ij(iatom)%dijhat(:,:)=zero
489 [ + - + + ]: 44428 : else if (paw_ij(iatom)%has_dijhat==0.and.need_to_print) then
490 [ - + + - : 7972 : LIBPAW_ALLOCATE(paw_ij(iatom)%dijhat,(cplex_dij*qphase*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
491 [ + + + + ]: 1462265 : dijhat_need=.true.;paw_ij(iatom)%dijhat(:,:)=zero
492 : 1993 : paw_ij(iatom)%has_dijhat=-1
493 : : end if
494 : : else if (paw_ij(iatom)%has_dijhat==1) then
495 : : paw_ij(iatom)%dijhat=zero
496 : : end if
497 : :
498 [ + + ]: 44467 : if (dijnd_available) then
499 [ - + ]: 639 : if (paw_ij(iatom)%has_dijnd==1) then
500 [ # # # # ]: 0 : dijnd_need=.true.;paw_ij(iatom)%dijnd(:,:)=zero
501 [ - + - - ]: 639 : else if (paw_ij(iatom)%has_dijnd==0.and.need_to_print) then
502 [ # # # # : 0 : LIBPAW_ALLOCATE(paw_ij(iatom)%dijnd,(cplex_dij*lmn2_size,ndij))
# # # # #
# # # # #
# # # # ]
503 [ # # # # ]: 0 : dijnd_need=.true.;paw_ij(iatom)%dijnd(:,:)=zero
504 : 0 : paw_ij(iatom)%has_dijnd=-1
505 : : end if
506 [ + + ]: 43828 : else if (paw_ij(iatom)%has_dijnd==1) then
507 [ + + + + ]: 28595 : paw_ij(iatom)%dijnd=zero
508 : : end if
509 : :
510 [ + + ]: 44467 : if (dijso_available) then
511 [ - + ]: 2250 : if (paw_ij(iatom)%has_dijso==1) then
512 [ # # # # ]: 0 : dijso_need=.true.;paw_ij(iatom)%dijso(:,:)=zero
513 [ - + - - ]: 2250 : else if (paw_ij(iatom)%has_dijso==0.and.need_to_print) then
514 [ # # # # : 0 : LIBPAW_ALLOCATE(paw_ij(iatom)%dijso,(cplex_dij*qphase*lmn2_size,ndij))
# # # # #
# # # # #
# # # # ]
515 [ # # # # ]: 0 : dijso_need=.true.;paw_ij(iatom)%dijso(:,:)=zero
516 : 0 : paw_ij(iatom)%has_dijso=-1
517 : : end if
518 [ - + ]: 42217 : else if (paw_ij(iatom)%has_dijso==1) then
519 [ # # # # ]: 0 : paw_ij(iatom)%dijso=zero
520 : : end if
521 : :
522 [ + + ]: 44467 : if (dijU_available) then
523 [ + + ]: 2996 : if (paw_ij(iatom)%has_dijU==1) then
524 [ + + + + ]: 38480 : dijU_need=.true.;paw_ij(iatom)%dijU(:,:)=zero
525 [ + + + + ]: 2824 : else if (paw_ij(iatom)%has_dijU==0.and.need_to_print) then
526 [ - + + - : 5256 : LIBPAW_ALLOCATE(paw_ij(iatom)%dijU,(cplex_dij*qphase*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
527 [ + + + + ]: 1085996 : dijU_need=.true.;paw_ij(iatom)%dijU(:,:)=zero
528 : 1314 : paw_ij(iatom)%has_dijU=-1
529 : : end if
530 [ + + ]: 41471 : else if (paw_ij(iatom)%has_dijU==1) then
531 [ + + + + ]: 3077813 : paw_ij(iatom)%dijU=zero
532 : : end if
533 : :
534 [ + + + - ]: 44467 : if (dijexxc_available.and.paw_ij(iatom)%has_dijexxc/=2) then
535 [ - + ]: 42 : if (paw_ij(iatom)%has_dijexxc==1) then
536 [ # # # # ]: 0 : dijexxc_need=.true.;paw_ij(iatom)%dijexxc(:,:)=zero
537 [ + - - + ]: 42 : else if (paw_ij(iatom)%has_dijexxc==0.and.need_to_print) then
538 [ # # # # : 0 : LIBPAW_ALLOCATE(paw_ij(iatom)%dijexxc,(cplex_dij*lmn2_size,ndij))
# # # # #
# # # # #
# # # # ]
539 [ # # # # ]: 0 : dijexxc_need=.true.;paw_ij(iatom)%dijexxc(:,:)=zero
540 : 0 : paw_ij(iatom)%has_dijexxc=-1
541 : : end if
542 [ - + ]: 44425 : else if (paw_ij(iatom)%has_dijexxc==1) then
543 [ # # # # ]: 0 : paw_ij(iatom)%dijexxc=zero
544 : : end if
545 : :
546 [ + + ]: 44467 : if (dijxchat_available) then
547 [ + + ]: 38364 : if (paw_ij(iatom)%has_dijxc_hat==1) then
548 [ + + + + ]: 2095 : dijxchat_need=.true.;paw_ij(iatom)%dijxc_hat(:,:)=zero
549 : : ! else if (paw_ij(iatom)%has_dijxc_hat==0.and.need_to_print) then
550 : : ! LIBPAW_ALLOCATE(paw_ij(iatom)%dijxc_hat,(cplex_dij*qphase*lmn2_size,ndij))
551 : : ! dijxchat_need=.true.;paw_ij(iatom)%dijxc_hat(:,:)=zero
552 : : ! paw_ij(iatom)%has_dijxc_hat=-1
553 : : end if
554 [ - + ]: 6103 : else if (paw_ij(iatom)%has_dijxc_hat==1) then
555 [ # # # # ]: 0 : paw_ij(iatom)%dijxc_hat=zero
556 : : end if
557 : :
558 [ + + ]: 44467 : if (dijxcval_available) then
559 [ + + ]: 38364 : if (paw_ij(iatom)%has_dijxc_val==1) then
560 [ + + + + ]: 2095 : dijxcval_need=.true.;paw_ij(iatom)%dijxc_val(:,:)=zero
561 : : ! else if (paw_ij(iatom)%has_dijxc_val==0.and.need_to_print) then
562 : : ! LIBPAW_ALLOCATE(paw_ij(iatom)%dijxc_val,(cplex_dij*qphase*lmn2_size,ndij))
563 : : ! dijxcval_need=.true.;paw_ij(iatom)%dijxc_val(:,:)=zero
564 : : ! paw_ij(iatom)%has_dijxc_val=-1
565 : : end if
566 [ - + ]: 6103 : else if (paw_ij(iatom)%has_dijxc_val==1) then
567 [ # # # # ]: 0 : paw_ij(iatom)%dijxc_val=zero
568 : : end if
569 : :
570 : : ! === Print error messages if prerequisites are not fulfilled ===
571 : :
572 : : if (dij_need.and.(.not.dij_prereq)) then
573 : : msg='Dij prerequisites missing!'
574 : : LIBPAW_BUG(msg)
575 : : end if
576 [ - + ]: 44467 : if (dij0_need.and.(.not.dij0_prereq)) then
577 : 0 : msg='Dij0 prerequisites missing!'
578 : 0 : LIBPAW_BUG(msg)
579 : : end if
580 [ - + ]: 44467 : if (dijfock_need.and.(.not.dijfock_prereq)) then
581 : 0 : msg='DijFock prerequisites missing!'
582 : 0 : LIBPAW_BUG(msg)
583 : : end if
584 : :
585 : : if (dijhartree_need.and.(.not.dijhartree_prereq)) then
586 : : msg='DijHartree prerequisites missing!'
587 : : LIBPAW_BUG(msg)
588 : : end if
589 [ - + ]: 44467 : if (dijxc_need.and.(.not.dijxc_prereq)) then
590 : 0 : msg='Dij^XC prerequisites missing!'
591 : 0 : LIBPAW_BUG(msg)
592 : : end if
593 : : if (dijhat_need.and.(.not.dijhat_prereq)) then
594 : : msg='Dij^hat prerequisites missing!'
595 : : LIBPAW_BUG(msg)
596 : : end if
597 : : if (dijhatfr_need.and.(.not.dijhatfr_prereq)) then
598 : : msg='DijFR^hat prerequisites missing!'
599 : : LIBPAW_BUG(msg)
600 : : end if
601 [ - + ]: 44467 : if (dijnd_need.and.(.not.dijnd_prereq)) then
602 : 0 : msg='DijND prerequisites missing!'
603 : 0 : LIBPAW_BUG(msg)
604 : : end if
605 [ - + ]: 44467 : if (dijso_need.and.(.not.dijso_prereq)) then
606 : 0 : msg='DijSO prerequisites missing!'
607 : 0 : LIBPAW_BUG(msg)
608 : : end if
609 [ - + ]: 44467 : if (dijU_need.and.(.not.dijU_prereq)) then
610 : 0 : msg='DijU prerequisites missing!'
611 : 0 : LIBPAW_BUG(msg)
612 : : end if
613 [ - + ]: 44467 : if (dijexxc_need.and.(.not.dijexxc_prereq)) then
614 : 0 : msg='DijExcc prerequisites missing!'
615 : 0 : LIBPAW_BUG(msg)
616 : : end if
617 [ - + ]: 44467 : if (dijxchat_need.and.(.not.dijxchat_prereq)) then
618 : 0 : msg='DijXC^hat prerequisites missing!'
619 : 0 : LIBPAW_BUG(msg)
620 : : end if
621 [ - + ]: 44467 : if (dijxcval_need.and.(.not.dijxcval_prereq)) then
622 : 0 : msg='DijXC_val prerequisites missing!'
623 : 0 : LIBPAW_BUG(msg)
624 : : end if
625 : :
626 : : ! ------------------------------------------------------------------------
627 : : ! ----------- Add atomic Dij0 to Dij
628 : : ! ------------------------------------------------------------------------
629 : :
630 [ + - + + ]: 44467 : if ((dij0_need.or.dij_need).and.dij0_available) then
631 : :
632 [ - + + - : 115092 : LIBPAW_ALLOCATE(dij0,(lmn2_size))
+ - + - -
+ - + ]
633 : : ! ===== Dij0 already computed
634 [ - + ]: 38364 : if (paw_ij(iatom)%has_dij0==2) then
635 [ # # ]: 0 : dij0(:)=paw_ij(iatom)%dij0(:)
636 : : else
637 : : ! ===== Need to compute Dij0
638 [ + + ]: 2183849 : dij0(:)=pawtab(itypat)%dij0(:)
639 [ + + + + ]: 125784 : if (ipositron==1) dij0(:)=two*pawtab(itypat)%kij(:)-dij0(:)
640 [ + + + + ]: 69916 : if (pawu_algo==PAWU_ALGO_2.and.pawu_dblec==PAWU_FLL) dij0(:)=dij0(:)+pawtab(itypat)%euij_fll(:)
641 [ + + + + ]: 431351 : if (dij0_need) paw_ij(iatom)%dij0(:)=dij0(:)
642 : : end if
643 : :
644 [ + - ]: 38364 : if (dij_need) then
645 [ + + ]: 83926 : do idij=1,min(nsploop,2)
646 : : klmn1=1
647 [ + + ]: 3108260 : do klmn=1,lmn2_size
648 : 3024334 : paw_ij(iatom)%dij(klmn1,idij)=paw_ij(iatom)%dij(klmn1,idij)+dij0(klmn)
649 : 3069896 : klmn1=klmn1+cplex_dij
650 : : end do
651 : : end do
652 : : end if
653 [ - + ]: 38364 : LIBPAW_DEALLOCATE(dij0)
654 : : end if
655 : :
656 : : ! ------------------------------------------------------------------------
657 : : ! ------------------------------------------------------------------------
658 : : ! ----------- Add Dij_{Fock exact-exchange} to Dij
659 : : ! ------------------------------------------------------------------------
660 : :
661 [ + - + + ]: 44467 : if ((dijfock_need.or.dij_need).and.dijfock_available) then
662 : :
663 : : ! ===== DijFock already computed
664 [ + - ]: 502 : if (paw_ij(iatom)%has_dijfock==2) then
665 [ + - ]: 502 : if (dij_need) paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:)= &
666 : : & paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:) &
667 [ + + + + ]: 18901 : & +paw_ij(iatom)%dijfock(1:cplex_dij*lmn2_size,:)
668 : :
669 : : else
670 : :
671 : : ! ===== Need to compute DijFock
672 [ # # # # : 0 : LIBPAW_ALLOCATE(dijfock_vv,(cplex_dij*lmn2_size,ndij))
# # # # #
# # # # #
# # # # ]
673 [ # # # # : 0 : LIBPAW_ALLOCATE(dijfock_cv,(cplex_dij*lmn2_size,ndij))
# # # # #
# # # #
# ]
674 [ # # # # : 0 : dijfock_vv(:,:)=zero ; dijfock_cv(:,:)=zero
# # # # ]
675 : : ! Exact exchange is evaluated for electrons only
676 [ # # ]: 0 : if (ipositron/=1) then
677 : : call pawdijfock(dijfock_vv,dijfock_cv,cplex_dij,qphase,hyb_mixing_,hyb_mixing_sr_, &
678 : 0 : & ndij,pawrhoij(iatom),pawtab(itypat))
679 : : end if
680 [ # # # # : 0 : if (dijfock_need) paw_ij(iatom)%dijfock(:,:)=dijfock_vv(:,:)+dijfock_cv(:,:)
# # ]
681 [ # # ]: 0 : if (dij_need) paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:)= &
682 : : & paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:) &
683 [ # # # # ]: 0 : & +dijfock_vv(1:cplex_dij*lmn2_size,:)+dijfock_cv(1:cplex_dij*lmn2_size,:)
684 [ # # ]: 0 : LIBPAW_DEALLOCATE(dijfock_vv)
685 [ # # ]: 0 : LIBPAW_DEALLOCATE(dijfock_cv)
686 : : end if
687 : : end if
688 : :
689 : : ! ----------- Add Dij_Hartree to Dij
690 : : ! ------------------------------------------------------------------------
691 : :
692 [ + - ]: 44467 : if ((dijhartree_need.or.dij_need).and.dijhartree_available) then
693 : :
694 [ - + + - : 133401 : LIBPAW_ALLOCATE(dijhartree,(qphase*lmn2_size))
+ - + - -
+ - + -
+ ]
695 : : ! ===== DijHartree already computed
696 [ + - ]: 44467 : if (paw_ij(iatom)%has_dijhartree==2) then
697 [ + + ]: 2444212 : dijhartree(:)=paw_ij(iatom)%dijhartree(:)
698 : : else
699 : : ! ===== Need to compute DijHartree
700 : 0 : is_sym=.true.
701 [ # # ]: 0 : if(present(eijkl_is_sym)) is_sym=eijkl_is_sym(itypat)
702 [ # # ]: 0 : if (ipositron/=1) then
703 : 0 : call pawdijhartree(dijhartree,qphase,nspden,pawrhoij(iatom),pawtab(itypat),is_sym=is_sym)
704 : : else
705 [ # # ]: 0 : dijhartree(:)=zero
706 : : end if
707 [ # # ]: 0 : if (ipositron/=0) then
708 [ # # # # : 0 : LIBPAW_ALLOCATE(dij_ep,(qphase*lmn2_size))
# # # # #
# ]
709 : 0 : call pawdijhartree(dij_ep,qphase,nspden,electronpositron_pawrhoij(iatom),pawtab(itypat))
710 [ # # ]: 0 : dijhartree(:)=dijhartree(:)-dij_ep(:)
711 [ # # ]: 0 : LIBPAW_DEALLOCATE(dij_ep)
712 : : end if
713 [ # # # # ]: 0 : if (dijhartree_need) paw_ij(iatom)%dijhartree(:)=dijhartree(:)
714 : : end if
715 : :
716 [ + - ]: 44467 : if (dij_need) then
717 [ + + ]: 97592 : do idij=1,min(nsploop,2)
718 : : klmn1=1
719 [ + + ]: 3436818 : do klmn=1,qphase*lmn2_size
720 : 3339226 : paw_ij(iatom)%dij(klmn1,idij)=paw_ij(iatom)%dij(klmn1,idij)+dijhartree(klmn)
721 : 3392351 : klmn1=klmn1+cplex_dij
722 : : end do
723 : : end do
724 : : end if
725 : :
726 [ - + ]: 44467 : LIBPAW_DEALLOCATE(dijhartree)
727 : : end if
728 : :
729 : : ! ------------------------------------------------------------------------
730 : : ! ----------- Add Dij_xc to Dij
731 : : ! ------------------------------------------------------------------------
732 : :
733 [ + - ]: 44467 : if ((dijxc_need.or.dij_need).and.dijxc_available) then
734 : :
735 : : ! ===== Dijxc already computed
736 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijxc==2) then
737 [ # # # # : 0 : if (dij_need) paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)+paw_ij(iatom)%dijxc(:,:)
# # ]
738 : : else
739 : :
740 : : ! ===== Need to compute DijXC
741 [ - + + - : 177868 : LIBPAW_ALLOCATE(dijxc,(cplex_dij*qphase*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
742 [ + + ]: 44467 : if (pawxcdev/=0) then
743 [ - + + - : 125289 : LIBPAW_ALLOCATE(lmselect,(lm_size))
+ - + - -
+ - + -
+ ]
744 [ + + ]: 470831 : lmselect(:)=paw_an(iatom)%lmselect(:)
745 [ + + + + : 94647 : if (ipositron/=0) lmselect(:)=(lmselect(:).or.electronpositron_lmselect(1:lm_size,iatom))
+ + + + ]
746 : : call pawdijxcm(dijxc,cplex_dij,qphase,lmselect,ndij,nspden,nsppol,pawang,&
747 : : & pawrad(itypat),pawtab(itypat),paw_an(iatom)%vxc1,&
748 : 41763 : & paw_an(iatom)%vxct1,usexcnhat)
749 [ - + ]: 41763 : LIBPAW_DEALLOCATE(lmselect)
750 : : else
751 : : call pawdijxc(dijxc,cplex_dij,qphase,ndij,nspden,nsppol,&
752 : : & pawang,pawrad(itypat),pawtab(itypat),paw_an(iatom)%vxc1,&
753 : : & paw_an(iatom)%vxct1,usexcnhat,usekden,&
754 : 2704 : & vxctau1=paw_an(iatom)%vxctau1,vxcttau1=paw_an(iatom)%vxcttau1)
755 : : end if
756 [ + + + + : 1506799 : if (dijxc_need) paw_ij(iatom)%dijxc(:,:)=dijxc(:,:)
+ + ]
757 [ + - + + : 5586290 : if (dij_need) paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)+dijxc(:,:)
+ + ]
758 [ - + ]: 44467 : LIBPAW_DEALLOCATE(dijxc)
759 : : end if
760 : :
761 : : end if
762 : :
763 : : ! ------------------------------------------------------------------------
764 : : ! ----------- Add Dij_hat to Dij
765 : : ! ------------------------------------------------------------------------
766 : :
767 [ + - ]: 44467 : if ((dijhat_need.or.dij_need).and.dijhat_available) then
768 : :
769 : : ! ===== Dijhat already computed
770 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijhat==2) then
771 [ # # # # : 0 : if (dij_need) paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)+paw_ij(iatom)%dijhat(:,:)
# # ]
772 : : else
773 : :
774 : : ! ===== Need to compute Dijhat
775 [ - + + - : 177868 : LIBPAW_ALLOCATE(dijhat,(cplex_dij*qphase*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
776 : : call pawdijhat(dijhat,cplex_dij,qphase,gprimd,iatom_tot,&
777 : : & natom,ndij,nfft,nfftot,nspden,nsppol,pawang,pawfgrtab(iatom),&
778 [ - + ]: 44467 : & pawtab(itypat),v_dijhat,qphon,ucvol,xred,mpi_comm_grid=my_comm_grid)
779 [ + + + + : 1507000 : if (dijhat_need) paw_ij(iatom)%dijhat(:,:)=dijhat(:,:)
+ + ]
780 [ + - + + : 5586290 : if (dij_need) paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)+dijhat(:,:)
+ + ]
781 [ - + ]: 44467 : LIBPAW_DEALLOCATE(dijhat)
782 : : end if
783 : :
784 : : ! ===== RF: add frozen part of 1st-order Dij
785 [ + + ]: 44467 : if (dijhatfr_available) then
786 [ + + ]: 13666 : do idij=1,nsploop
787 [ + - ]: 7563 : if (dij_need) paw_ij(iatom)%dij(:,idij)=paw_ij(iatom)%dij(:,idij) &
788 [ + + ]: 322455 : & +paw_ij(iatom)%dijfr(:,idij)
789 [ - + ]: 7563 : if (dijhat_need) paw_ij(iatom)%dijhat(:,idij)=paw_ij(iatom)%dijhat(:,idij) &
790 [ - - ]: 6103 : & +paw_ij(iatom)%dijfr(:,idij)
791 : : end do
792 : : end if
793 : :
794 : : end if
795 : :
796 : : ! ------------------------------------------------------------------------
797 : : ! ----------- Add Dij nuclear dipole moments to Dij
798 : : ! ------------------------------------------------------------------------
799 : :
800 [ + - + + ]: 44467 : if ((dijnd_need.or.dij_need).and.dijnd_available) then
801 : :
802 : : ! ===== Dijnd already computed
803 [ + - ]: 639 : if (paw_ij(iatom)%has_dijnd==2) then
804 [ + - ]: 639 : if (dij_need) then
805 : : paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:)= &
806 : : & paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:) + &
807 [ + + + + ]: 113789 : & paw_ij(iatom)%dijnd(1:cplex_dij*lmn2_size,:)
808 : : end if
809 : :
810 : : else
811 : :
812 : : ! ===== Need to compute Dijnd
813 [ # # # # : 0 : LIBPAW_ALLOCATE(dijnd,(cplex_dij*lmn2_size,ndij))
# # # # #
# # # # #
# # # # ]
814 : : call pawdijnd(dijnd,cplex_dij,gprimd,iatom,natom,ndij,nspden,nucdipmom(1:3,1:natom),&
815 : : & pawang,pawrad(itypat),pawtab(itypat),pawxcdev,qphase,&
816 : 0 : & paw_an(iatom)%vh1,paw_an(iatom)%vxc1,xred,znuc(itypat),paw_ij(iatom)%zora)
817 [ # # # # : 0 : if (dijnd_need) paw_ij(iatom)%dijnd(:,:)=dijnd(:,:)
# # ]
818 [ # # ]: 0 : if (dij_need) then
819 : : paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:)= &
820 : : & paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:) + &
821 [ # # # # ]: 0 : & dijnd(1:cplex_dij*lmn2_size,:)
822 : : end if
823 [ # # ]: 0 : LIBPAW_DEALLOCATE(dijnd)
824 : : end if
825 : :
826 : : end if
827 : :
828 : : ! ------------------------------------------------------------------------
829 : : ! ----------- Add Dij spin-orbit to Dij
830 : : ! ------------------------------------------------------------------------
831 : :
832 [ + - + + ]: 44467 : if ((dijso_need.or.dij_need).and.dijso_available) then
833 : :
834 : : ! ===== DijSO already computed
835 [ + - ]: 2250 : if (paw_ij(iatom)%has_dijso==2) then
836 [ + - + + : 1867786 : if (dij_need) paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)+paw_ij(iatom)%dijso(:,:)
+ + ]
837 : : else
838 : :
839 : : ! ===== Need to compute DijSO
840 [ # # # # : 0 : LIBPAW_ALLOCATE(dijso,(cplex_dij*qphase*lmn2_size,ndij))
# # # # #
# # # # #
# # # # ]
841 [ # # ]: 0 : spinaxis_in = [zero, zero, one]; if (present(spinaxis)) spinaxis_in = spinaxis
842 : : call pawdijso(dijso,cplex_dij,qphase,ndij,nspden,&
843 : : & pawang,pawrad(itypat),pawtab(itypat),pawxcdev,spnorbscl,&
844 : : & paw_an(iatom)%vh1,paw_an(iatom)%vxc1,znuc(itypat),paw_ij(iatom)%zora,&
845 [ # # ]: 0 : & nucdipmom=nucdipmom(1:3,iatom),spinaxis=spinaxis_in)
846 [ # # # # : 0 : if (dijso_need) paw_ij(iatom)%dijso(:,:)=dijso(:,:)
# # ]
847 [ # # # # : 0 : if (dij_need) paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)+dijso(:,:)
# # ]
848 [ # # ]: 0 : LIBPAW_DEALLOCATE(dijso)
849 : : end if
850 : :
851 : : end if
852 : :
853 : : ! ------------------------------------------------------------------------
854 : : ! ----------- Add Dij_{DFT+U} to Dij
855 : : ! ------------------------------------------------------------------------
856 : :
857 [ + - + + ]: 44467 : if ((dijU_need.or.dij_need).and.dijU_available) then
858 : :
859 : : ! ===== DijU already computed
860 [ + + ]: 2996 : if (paw_ij(iatom)%has_dijU==2) then
861 [ + - + + : 170996 : if (dij_need) paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)+paw_ij(iatom)%dijU(:,:)
+ + ]
862 : : else
863 : :
864 : : ! ===== Need to compute DijU
865 [ - + + - : 11456 : LIBPAW_ALLOCATE(dijpawu,(cplex_dij*qphase*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
866 [ + + ]: 2864 : if (pawu_algo==PAWU_ALGO_2) then
867 : 170 : call pawdiju_euijkl(dijpawu,cplex_dij,qphase,ndij,pawrhoij(iatom),pawtab(itypat))
868 : : else
869 : 2694 : lpawu=pawtab(itypat)%lpawu
870 [ - + + - : 16164 : LIBPAW_POINTER_ALLOCATE(vpawu,(cplex_dij,lpawu*2+1,lpawu*2+1,ndij))
+ - - + +
- - + + -
- + + - +
- + - - +
- + ]
871 [ + + + + : 17542 : if (usepawu>=10) vpawu=zero ! if dmft, do not apply U in DFT+U
+ + + + +
+ ]
872 : : if (usepawu< 10) then
873 : : call pawpupot(cplex_dij,ndij,paw_ij(iatom)%noccmmp,paw_ij(iatom)%nocctot,&
874 : 2545 : & pawprtvol,pawtab(itypat),vpawu)
875 : : end if
876 [ + + ]: 2694 : if (natvshift_==0) then
877 : 2166 : call pawdiju(dijpawu,cplex_dij,qphase,ndij,nsppol,pawtab(itypat),vpawu)
878 : : else
879 : : call pawdiju(dijpawu,cplex_dij,qphase,ndij,nsppol,pawtab(itypat),vpawu,&
880 : : & natvshift=natvshift_,atvshift=atvshift(:,:,iatom_tot),&
881 [ + - - + ]: 528 : & fatvshift=fatvshift)
882 : : end if
883 [ - + ]: 2694 : LIBPAW_POINTER_DEALLOCATE(vpawu)
884 : : end if
885 [ + + + + : 1125854 : if (dijU_need) paw_ij(iatom)%dijU(:,:)=dijpawu(:,:)
+ + ]
886 [ + - + + : 1554778 : if (dij_need) paw_ij(iatom)%dij(:,:)=paw_ij(iatom)%dij(:,:)+dijpawu(:,:)
+ + ]
887 [ - + ]: 2864 : LIBPAW_DEALLOCATE(dijpawu)
888 : : end if
889 : :
890 : : end if
891 : :
892 : : ! ------------------------------------------------------------------------
893 : : ! ----------- Add Dij_{local exact-exchange} to Dij
894 : : ! ------------------------------------------------------------------------
895 : :
896 [ + - + + ]: 44467 : if ((dijexxc_need.or.dij_need).and.dijexxc_available) then
897 : :
898 : : ! ===== DijEXXC already computed
899 [ - + ]: 42 : if (paw_ij(iatom)%has_dijexxc==2) then
900 [ # # ]: 0 : if (dij_need) paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:)= &
901 : : & paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:) &
902 [ # # # # ]: 0 : & +paw_ij(iatom)%dijexxc(1:cplex_dij*lmn2_size,:)
903 : : else
904 : :
905 : : ! ===== Need to compute DijEXXC
906 [ - + + - : 168 : LIBPAW_ALLOCATE(dijexxc,(cplex_dij*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
907 [ + - ]: 42 : if (pawxcdev/=0) then
908 [ - + ]: 42 : if (paw_ij(iatom)%has_exexch_pot/=2) then
909 [ # # # # : 0 : LIBPAW_POINTER_ALLOCATE(vpawx,(1,lmn2_size,ndij))
# # # # #
# # # # #
# # ]
910 : 0 : call pawxpot(ndij,pawprtvol,pawrhoij(iatom),pawtab(itypat),vpawx)
911 : : else
912 : 42 : vpawx=>paw_ij(iatom)%vpawx
913 : : end if
914 [ - + + - : 126 : LIBPAW_ALLOCATE(lmselect,(lm_size))
+ - + - -
+ - + -
+ ]
915 [ + + ]: 1092 : lmselect(:)=paw_an(iatom)%lmselect(:)
916 [ - + - - : 42 : if (ipositron/=0) lmselect(:)=(lmselect(:).or.electronpositron_lmselect(1:lm_size,iatom))
- - - - ]
917 : : call pawdijexxc(dijexxc,cplex_dij,qphase,lmselect,ndij,nspden,nsppol,&
918 : 42 : & pawang,pawrad(itypat),pawtab(itypat),vpawx,paw_an(iatom)%vxc_ex)
919 [ - + ]: 42 : LIBPAW_DEALLOCATE(lmselect)
920 [ - + ]: 42 : if (paw_ij(iatom)%has_exexch_pot/=2) then
921 [ # # ]: 0 : LIBPAW_POINTER_DEALLOCATE(vpawx)
922 : : end if
923 [ - + - - : 42 : if (dijexxc_need) paw_ij(iatom)%dijexxc(:,:)=dijexxc(:,:)
- - ]
924 [ + - ]: 42 : if (dij_need) paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:)= &
925 : : & paw_ij(iatom)%dij(1:cplex_dij*lmn2_size,:) &
926 [ + + + + ]: 14490 : & +dijexxc(1:cplex_dij*lmn2_size,:)
927 [ - + ]: 42 : LIBPAW_DEALLOCATE(dijexxc)
928 : : end if
929 : : end if
930 : :
931 : : end if
932 : :
933 : : ! ------------------------------------------------------------------------
934 : : ! ----------- Add Dij background contribution to the total Dij
935 : : ! ------------------------------------------------------------------------
936 : :
937 [ + - + + ]: 44467 : if (dij_need.and.pawtab(itypat)%usepotzero==1 ) then
938 [ + + ]: 126 : do idij=1,min(nsploop,2)
939 : : klmn1=1
940 [ + + ]: 1134 : do klmn=1,lmn2_size
941 : 1008 : paw_ij(iatom)%dij(klmn1,idij)=paw_ij(iatom)%dij(klmn1,idij)+pawtab(itypat)%gammaij(klmn)*charge/ucvol
942 : 1071 : klmn1=klmn1+cplex_dij*qphase
943 : : end do
944 : : end do
945 : : end if
946 : :
947 : :
948 : : ! ------------------------------------------------------------------------
949 : : ! ----------- Compute Dijxc_hat
950 : : ! ------------------------------------------------------------------------
951 : :
952 [ + + ]: 44467 : if (dijxchat_need) then
953 : :
954 [ + + ]: 35 : if (usexcnhat/=0) then
955 [ - + + - : 124 : LIBPAW_ALLOCATE(dijxchat,(cplex_dij*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
956 : : call pawdijhat(dijxchat,cplex_dij,1,gprimd,iatom_tot,&
957 : : & natom,ndij,nfft,nfftot,nspden,nsppol,pawang,pawfgrtab(iatom),&
958 [ - + - - : 31 : & pawtab(itypat),vxc,qphon,ucvol,xred,mpi_comm_grid=my_comm_grid)
- - - - -
+ ]
959 [ + + + + ]: 1673 : paw_ij(iatom)%dijxc_hat(1:cplex_dij*lmn2_size,:)=dijxchat(1:cplex_dij*lmn2_size,:)
960 [ - + ]: 31 : LIBPAW_DEALLOCATE(dijxchat)
961 : :
962 : : else ! usexcnhat=0
963 [ + + + + ]: 422 : paw_ij(iatom)%dijxc_hat=zero
964 : : end if
965 : :
966 : : end if
967 : :
968 : : ! ------------------------------------------------------------------------
969 : : ! ----------- Compute Dijxc_val
970 : : ! ------------------------------------------------------------------------
971 : :
972 [ + + ]: 44467 : if (dijxcval_need) then
973 : :
974 [ - + + - : 140 : LIBPAW_ALLOCATE(dijxcval,(cplex_dij*lmn2_size,ndij))
- + + - +
- + - - +
- + - + ]
975 : : ! Note that usexcnhat=0 for this call (no compensation term)
976 [ + - ]: 35 : if (pawxcdev/=0) then
977 [ - + + - : 105 : LIBPAW_ALLOCATE(lmselect,(lm_size))
+ - + - -
+ - + -
+ ]
978 [ + + ]: 526 : lmselect(:)=paw_an(iatom)%lmselect(:)
979 [ - + - - : 35 : if (ipositron/=0) lmselect(:)=(lmselect(:).or.electronpositron_lmselect(1:lm_size,iatom))
- - - - ]
980 : : call pawdijxcm(dijxcval,cplex_dij,1,lmselect,ndij,nspden,nsppol,&
981 : : & pawang,pawrad(itypat),pawtab(itypat),paw_an(iatom)%vxc1_val,&
982 : 35 : & paw_an(iatom)%vxct1_val,0)
983 [ - + ]: 35 : LIBPAW_DEALLOCATE(lmselect)
984 : : else
985 : : call pawdijxc(dijxcval,cplex_dij,1,ndij,nspden,nsppol,&
986 : : & pawang,pawrad(itypat),pawtab(itypat),paw_an(iatom)%vxc1_val,&
987 : 0 : & paw_an(iatom)%vxct1_val,0,0)
988 : : end if
989 [ + + + + ]: 2095 : paw_ij(iatom)%dijxc_val(1:cplex_dij*lmn2_size,:)=dijxcval(1:cplex_dij*lmn2_size,:)
990 [ - + ]: 35 : LIBPAW_DEALLOCATE(dijxcval)
991 : :
992 : : end if
993 : :
994 : : ! ------------------------------------------------------------------------
995 : :
996 : : ! Update some flags
997 [ + - + - ]: 44467 : if (dij_need.and.paw_ij(iatom)%has_dij>=1) paw_ij(iatom)%has_dij=2
998 [ + + - + ]: 44467 : if (dij0_need.and.paw_ij(iatom)%has_dij0>=1) paw_ij(iatom)%has_dij0=2
999 [ - + - - ]: 44467 : if (dijfock_need.and.paw_ij(iatom)%has_dijfock>=1) paw_ij(iatom)%has_dijfock=2
1000 : :
1001 [ - + - - ]: 44467 : if (dijhartree_need.and.paw_ij(iatom)%has_dijhartree>=1) paw_ij(iatom)%has_dijhartree=2
1002 [ + + + + ]: 44467 : if (dijxc_need.and.paw_ij(iatom)%has_dijxc>=1) paw_ij(iatom)%has_dijxc=2
1003 [ + + + + ]: 44467 : if (dijhat_need.and.paw_ij(iatom)%has_dijhat>=1) paw_ij(iatom)%has_dijhat=2
1004 [ - + - - ]: 44467 : if (dijnd_need.and.paw_ij(iatom)%has_dijnd>=1) paw_ij(iatom)%has_dijnd=2
1005 [ - + - - ]: 44467 : if (dijso_need.and.paw_ij(iatom)%has_dijso>=1) paw_ij(iatom)%has_dijso=2
1006 [ + + + + ]: 44467 : if (dijU_need.and.paw_ij(iatom)%has_dijU>=1) paw_ij(iatom)%has_dijU=2
1007 [ - + - - ]: 44467 : if (dijexxc_need.and.paw_ij(iatom)%has_dijexxc>=1) paw_ij(iatom)%has_dijexxc=2
1008 [ + + + - ]: 44467 : if (dijxchat_need.and.paw_ij(iatom)%has_dijxc_hat>=1) paw_ij(iatom)%has_dijxc_hat=2
1009 [ + + + - ]: 64644 : if (dijxcval_need.and.paw_ij(iatom)%has_dijxc_val>=1) paw_ij(iatom)%has_dijxc_val=2
1010 : :
1011 : : !End loop over atoms
1012 : : end do ! iatom
1013 : :
1014 : : !------------------------------------------------------------------------
1015 : :
1016 : : !Final printing
1017 [ + + ]: 20177 : if (paral_atom) then
1018 : : call paw_ij_print(paw_ij,unit=std_out,pawprtvol=pawprtvol,pawspnorb=pawspnorb,&
1019 : : & comm_atom=my_comm_atom,mpi_atmtab=my_atmtab,natom=natom,&
1020 : 6332 : & mode_paral='PERS',enunit=enunit,ipert=ipert)
1021 : : else
1022 : : call paw_ij_print(paw_ij,unit=std_out,pawprtvol=pawprtvol,pawspnorb=pawspnorb,&
1023 : 13845 : & mode_paral='COLL',enunit=enunit,ipert=ipert)
1024 : : end if
1025 : :
1026 : : !Free temporary storage
1027 [ + + ]: 20177 : if (v_dijhat_allocated) then
1028 [ - + ]: 10845 : LIBPAW_POINTER_DEALLOCATE(v_dijhat)
1029 : : end if
1030 [ + + ]: 64644 : do iatom=1,my_natom
1031 [ + + ]: 44467 : if (paw_ij(iatom)%has_dij0==-1) then
1032 [ - + ]: 1997 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dij0)
1033 : 1997 : paw_ij(iatom)%has_dij0=0
1034 : : end if
1035 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijfock==-1) then
1036 [ # # ]: 0 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijfock)
1037 : 0 : paw_ij(iatom)%has_dijfock=0
1038 : : end if
1039 : :
1040 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijhartree==-1) then
1041 [ # # ]: 0 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijhartree)
1042 : 0 : paw_ij(iatom)%has_dijhartree=0
1043 : : end if
1044 [ + + ]: 44467 : if (paw_ij(iatom)%has_dijxc==-1) then
1045 [ - + ]: 1993 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijxc)
1046 : 1993 : paw_ij(iatom)%has_dijxc=0
1047 : : end if
1048 [ + + ]: 44467 : if (paw_ij(iatom)%has_dijhat==-1) then
1049 [ - + ]: 1993 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijhat)
1050 : 1993 : paw_ij(iatom)%has_dijhat=0
1051 : : end if
1052 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijfr==-1) then
1053 [ # # ]: 0 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijfr)
1054 : 0 : paw_ij(iatom)%has_dijfr=0
1055 : : end if
1056 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijso==-1) then
1057 [ # # ]: 0 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijso)
1058 : 0 : paw_ij(iatom)%has_dijso=0
1059 : : end if
1060 [ + + ]: 44467 : if (paw_ij(iatom)%has_dijU==-1) then
1061 [ - + ]: 1314 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijU)
1062 : 1314 : paw_ij(iatom)%has_dijU=0
1063 : : end if
1064 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijexxc==-1) then
1065 [ # # ]: 0 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijexxc)
1066 : 0 : paw_ij(iatom)%has_dijexxc=0
1067 : : end if
1068 [ - + ]: 44467 : if (paw_ij(iatom)%has_dijxc_hat==-1) then
1069 [ # # ]: 0 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijxc_hat)
1070 : 0 : paw_ij(iatom)%has_dijxc_hat=0
1071 : : end if
1072 [ - + ]: 64644 : if (paw_ij(iatom)%has_dijxc_val==-1) then
1073 [ # # ]: 0 : LIBPAW_DEALLOCATE(paw_ij(iatom)%dijxc_val)
1074 : 0 : paw_ij(iatom)%has_dijxc_val=0
1075 : : end if
1076 : : end do
1077 : :
1078 : : !Destroy atom table used for parallelism
1079 : 20177 : call free_my_atmtab(my_atmtab,my_atmtab_allocated)
1080 : :
1081 [ + + - + : 42136 : end subroutine pawdij
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + ]
1082 : : !!***
1083 : :
1084 : : !----------------------------------------------------------------------
1085 : :
1086 : : !!****f* m_pawdij/pawdijhartree
1087 : : !! NAME
1088 : : !! pawdijhartree
1089 : : !!
1090 : : !! FUNCTION
1091 : : !! Compute the Hartree contribution to the PAW pseudopotential strength Dij
1092 : : !! (for one atom only)
1093 : : !!
1094 : : !! INPUTS
1095 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
1096 : : !! nspden=number of spin density components
1097 : : !! pawrhoij <type(pawrhoij_type)>= paw rhoij occupancies (and related data) for current atom
1098 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data, for current atom
1099 : : !!
1100 : : !! OUTPUT
1101 : : !! dijhartree(qphase*lmn2_size)= D_ij^Hartree terms
1102 : : !! When a exp(-i.q.r) phase is included (qphase=2):
1103 : : !! dij(1:lmn2_size,:)
1104 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
1105 : : !! dij(lmn2_size+1:2*lmn2_size,:)
1106 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
1107 : : !!
1108 : : !! SOURCE
1109 : :
1110 [ - + ]: 55239 : subroutine pawdijhartree(dijhartree,qphase,nspden,pawrhoij,pawtab,&
1111 : : & is_sym)
1112 : :
1113 : : !Arguments ---------------------------------------------
1114 : : !scalars
1115 : : integer,intent(in) :: nspden,qphase
1116 : : logical,intent(in),optional :: is_sym
1117 : : !arrays
1118 : : real(dp),intent(out) :: dijhartree(:)
1119 : : type(pawrhoij_type),intent(in) :: pawrhoij
1120 : : type(pawtab_type),intent(in) :: pawtab
1121 : :
1122 : : !Local variables ---------------------------------------
1123 : : !scalars
1124 : : logical :: eijkl_is_sym
1125 : : integer :: cplex_rhoij,iq,iq0_dij,iq0_rhoij,irhoij,ispden,jrhoij,klmn,klmn1,lmn2_size,nspdiag
1126 : : real(dp) :: ro
1127 : : character(len=500) :: msg
1128 : : !arrays
1129 : :
1130 : : ! *************************************************************************
1131 : :
1132 : : !Check data consistency
1133 [ - + ]: 55239 : if (size(dijhartree,1)/=qphase*pawtab%lmn2_size) then
1134 : 0 : msg='invalid size for DijHartree!'
1135 : 0 : LIBPAW_BUG(msg)
1136 : : end if
1137 [ - + ]: 55239 : if (pawrhoij%qphase<qphase) then
1138 : 0 : msg='pawrhoij%qphase must be >=qphase!'
1139 : 0 : LIBPAW_BUG(msg)
1140 : : end if
1141 : :
1142 : : !Initialization
1143 [ + + ]: 2980518 : dijhartree=zero
1144 : 55239 : lmn2_size=pawrhoij%lmn2_size
1145 : 55239 : cplex_rhoij=pawrhoij%cplex_rhoij
1146 : 55239 : eijkl_is_sym=.true.
1147 [ + + ]: 55239 : if(present(is_sym)) eijkl_is_sym=is_sym
1148 : :
1149 : : !Loop over (diagonal) spin-components
1150 [ + + ]: 55239 : nspdiag=1;if (nspden==2) nspdiag=2
1151 [ + + ]: 118342 : do ispden=1,nspdiag
1152 : :
1153 : : !Loop over phase exp(iqr) phase real/imaginary part
1154 [ + + ]: 182653 : do iq=1,qphase
1155 : : !First loop: we store the real part in dij(1 -> lmn2_size)
1156 : : !2nd loop: we store the imaginary part in dij(lmn2_size+1 -> 2*lmn2_size)
1157 [ + + ]: 64311 : iq0_dij=merge(0,lmn2_size,iq==1)
1158 : 64311 : iq0_rhoij=cplex_rhoij*iq0_dij
1159 : :
1160 : : !Loop over rhoij elements
1161 : 64311 : jrhoij=iq0_rhoij+1
1162 [ + + ]: 2210402 : do irhoij=1,pawrhoij%nrhoijsel
1163 : 2082988 : klmn=pawrhoij%rhoijselect(irhoij)
1164 : :
1165 : 2082988 : ro=pawrhoij%rhoijp(jrhoij,ispden)*pawtab%dltij(klmn)
1166 : : !print *, "debug: irhoij, ro, pawtab%eijkl(klmn,klmn)", irhoij, ro, pawtab%eijkl(klmn,klmn)
1167 : :
1168 : : !Diagonal k=l
1169 : 2082988 : dijhartree(iq0_dij+klmn)=dijhartree(iq0_dij+klmn)+ro*pawtab%eijkl(klmn,klmn)
1170 : :
1171 : : !k<=l
1172 [ + + ]: 115384586 : do klmn1=1,klmn-1
1173 : 115384586 : dijhartree(iq0_dij+klmn1)=dijhartree(iq0_dij+klmn1)+ro*pawtab%eijkl(klmn1,klmn)
1174 : : end do
1175 : :
1176 : : !k>l
1177 [ + + ]: 125033827 : do klmn1=klmn+1,lmn2_size
1178 [ + + ]: 125033827 : if(eijkl_is_sym) then
1179 : 117467727 : dijhartree(iq0_dij+klmn1)=dijhartree(iq0_dij+klmn1)+ro*pawtab%eijkl(klmn,klmn1)
1180 : : else
1181 : 5483112 : dijhartree(iq0_dij+klmn1)=dijhartree(iq0_dij+klmn1)+ro*pawtab%eijkl(klmn1,klmn)
1182 : : endif
1183 : : end do
1184 : :
1185 : 2147299 : jrhoij=jrhoij+cplex_rhoij
1186 : : end do !End loop over rhoij
1187 : :
1188 : : end do !End loop over q phase
1189 : :
1190 : : end do !End loop over spin
1191 : :
1192 : 55239 : end subroutine pawdijhartree
1193 : : !!***
1194 : :
1195 : : !----------------------------------------------------------------------
1196 : :
1197 : : !!****f* m_pawdij/pawdijfock
1198 : : !! NAME
1199 : : !! pawdijfock
1200 : : !!
1201 : : !! FUNCTION
1202 : : !! Compute Fock exact-exchange contribution(s) to the PAW pseudopotential strength Dij
1203 : : !! (for one atom only)
1204 : : !!
1205 : : !! INPUTS
1206 : : !! hyb_mixing=hybrid mixing coefficient for the Fock contribution
1207 : : !! hyb_mixing_sr=hybrid mixing coefficient for the short-range Fock contribution
1208 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
1209 : : !! ndij= number of spin components dor Fdij
1210 : : !! pawrhoij <type(pawrhoij_type)>= paw rhoij occupancies (and related data) for current atom
1211 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data, for current atom
1212 : : !!
1213 : : !! OUTPUT
1214 : : !! dijfock_vv(qphase*lmn2_size,ndij)= D_ij^fock terms for valence-valence interactions
1215 : : !! dijfock_cv(qphase*lmn2_size,ndij)= D_ij^fock terms for core-valence interactions
1216 : : !! When a exp(-i.q.r) phase is included (qphase=2):
1217 : : !! dij(1:lmn2_size,:)
1218 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
1219 : : !! dij(lmn2_size+1:2*lmn2_size,:)
1220 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
1221 : : !!
1222 : : !! NOTES:
1223 : : !! WARNING: What follows has been tested only for cases where nsppol=1 and 2, nspden=1 and 2 with nspinor=1.
1224 : : !!
1225 : : !! SOURCE
1226 : :
1227 [ - + - + ]: 624 : subroutine pawdijfock(dijfock_vv,dijfock_cv,cplex_dij,qphase,hyb_mixing,hyb_mixing_sr,ndij,pawrhoij,pawtab)
1228 : :
1229 : : !Arguments ---------------------------------------------
1230 : : !scalars
1231 : : integer,intent(in) :: cplex_dij,ndij,qphase
1232 : : real(dp),intent(in) :: hyb_mixing,hyb_mixing_sr
1233 : : !arrays
1234 : : real(dp),intent(out) :: dijfock_vv(:,:),dijfock_cv(:,:)
1235 : : type(pawrhoij_type),intent(in) :: pawrhoij
1236 : : type(pawtab_type),intent(in),target :: pawtab
1237 : :
1238 : : !Local variables ---------------------------------------
1239 : : !scalars
1240 : : integer :: cplex_rhoij,iq,iq0_dij,iq0_rhoij,ispden,irhokl,jrhokl,ilmn_i,jlmn_j,ilmn_k,jlmn_l
1241 : : integer :: klmn_kl,klmn_ij,klmn_il,klmn_kj,klmn1,nsp,lmn2_size
1242 : : real(dp) :: ro,dij_up,dij_dn,dij_updn_r,dij_updn_i
1243 : : character(len=500) :: msg
1244 : : !arrays
1245 : 624 : real(dp),allocatable :: dijfock_vv_tmp(:,:)
1246 : 624 : real(dp),pointer :: eijkl(:,:)
1247 : :
1248 : : ! *************************************************************************
1249 : :
1250 : : !Useful data
1251 : 624 : lmn2_size=pawtab%lmn2_size
1252 : 624 : cplex_rhoij=pawrhoij%cplex_rhoij
1253 : :
1254 : : !Check data consistency
1255 [ - + ]: 624 : if (size(dijfock_vv,1)/=qphase*cplex_dij*lmn2_size.or.size(dijfock_vv,2)/=ndij) then
1256 : 0 : msg='invalid sizes for Dijfock_vv!'
1257 : 0 : LIBPAW_BUG(msg)
1258 : : end if
1259 [ + - - + ]: 624 : if (size(dijfock_cv,1)/=qphase*cplex_dij*lmn2_size.or.size(dijfock_cv,2)/=ndij) then
1260 : 0 : msg='invalid sizes for Dijfock_cv!'
1261 : 0 : LIBPAW_BUG(msg)
1262 : : end if
1263 [ - + ]: 624 : if (pawrhoij%qphase<qphase) then
1264 : 0 : msg='pawrhoij%qphase must be >=qphase!'
1265 : 0 : LIBPAW_BUG(msg)
1266 : : end if
1267 [ - + - - ]: 624 : if (ndij==4.and.cplex_dij==1) then
1268 : 0 : msg='When ndij=4, cplex_dij must be =2!'
1269 : 0 : LIBPAW_BUG(msg)
1270 : : end if
1271 : :
1272 [ + + - + ]: 624 : if (abs(hyb_mixing)>tol8 .and. abs(hyb_mixing_sr)>tol8) then
1273 : 0 : msg='invalid hybrid functional'
1274 : 0 : LIBPAW_BUG(msg)
1275 : : else
1276 [ + + ]: 624 : if (abs(hyb_mixing)>tol8) then
1277 : 470 : eijkl => pawtab%eijkl
1278 [ - + ]: 154 : else if (abs(hyb_mixing_sr)>tol8) then
1279 : 154 : eijkl => pawtab%eijkl_sr
1280 : : end if
1281 : : end if
1282 : :
1283 : : !Init memory
1284 [ + + + + : 47074 : dijfock_vv=zero ; dijfock_cv=zero
+ + + + ]
1285 : :
1286 : : ! ===== Valence-valence contribution =====
1287 : :
1288 [ - + ]: 624 : nsp=pawrhoij%nsppol;if (pawrhoij%nspden==4) nsp=4
1289 [ - + + - : 2496 : LIBPAW_ALLOCATE(dijfock_vv_tmp,(lmn2_size,nsp))
- + + - +
- + - - +
- + ]
1290 [ + + + + ]: 23537 : dijfock_vv_tmp=zero
1291 : :
1292 : : !Loop over phase exp(iqr) phase real/imaginary part
1293 [ + + ]: 1248 : do iq=1,qphase
1294 : : !First loop: we store the real part in dij(1 -> lmn2_size)
1295 : : !2nd loop: we store the imaginary part in dij(lmn2_size+1 -> 2*lmn2_size)
1296 [ - + ]: 624 : iq0_dij=merge(0,lmn2_size,iq==1) ; iq0_rhoij=cplex_rhoij*iq0_dij
1297 : :
1298 : : !Loop over spin components
1299 [ + + ]: 1394 : do ispden=1,nsp
1300 : :
1301 : : !Loop on the non-zero elements rho_kl
1302 : 770 : jrhokl=iq0_rhoij+1
1303 [ + + ]: 10146 : do irhokl=1,pawrhoij%nrhoijsel
1304 : 8752 : klmn_kl=pawrhoij%rhoijselect(irhokl)
1305 : 8752 : ilmn_k=pawtab%indklmn(7,klmn_kl)
1306 : 8752 : jlmn_l=pawtab%indklmn(8,klmn_kl)
1307 : :
1308 : 8752 : ro=pawrhoij%rhoijp(jrhokl,ispden)*pawtab%dltij(klmn_kl)
1309 : :
1310 : : !Contribution to the element (k,l) of dijfock
1311 : 8752 : dijfock_vv_tmp(klmn_kl,ispden)=dijfock_vv_tmp(klmn_kl,ispden)-ro*eijkl(klmn_kl,klmn_kl)
1312 : :
1313 : : !Contribution to the element (i,j) of dijfock with (i,j) < (k,l)
1314 : : ! We remind that i<j and k<l by construction
1315 [ + + ]: 141019 : do klmn_ij=1,klmn_kl-1
1316 : 132267 : ilmn_i=pawtab%indklmn(7,klmn_ij)
1317 : 132267 : jlmn_j=pawtab%indklmn(8,klmn_ij)
1318 : : !In this case, i < l
1319 : 132267 : klmn_il=jlmn_l*(jlmn_l-1)/2+ilmn_i
1320 : : !For (k,j), we compute index of (k,j) or index of (j,k)
1321 [ + + ]: 132267 : if (ilmn_k>jlmn_j) then
1322 : 62200 : klmn_kj=ilmn_k*(ilmn_k-1)/2+jlmn_j
1323 : : else
1324 : 70067 : klmn_kj=jlmn_j*(jlmn_j-1)/2+ilmn_k
1325 : : end if
1326 : 141019 : dijfock_vv_tmp(klmn_ij,ispden)=dijfock_vv_tmp(klmn_ij,ispden)-ro*eijkl(klmn_il,klmn_kj)
1327 : : end do
1328 : :
1329 : : !Contribution to the element (i,j) of dijfock with (i,j) > (k,l)
1330 : : ! We remind that i<j and k<l by construction
1331 [ + + ]: 166074 : do klmn_ij=klmn_kl+1,lmn2_size
1332 : 157322 : ilmn_i=pawtab%indklmn(7,klmn_ij)
1333 : 157322 : jlmn_j=pawtab%indklmn(8,klmn_ij)
1334 : : !In this case, k < j
1335 : 157322 : klmn_kj=jlmn_j*(jlmn_j-1)/2+ilmn_k
1336 : : !For (i,l), we compute index of (i,l) or index of (l,i)
1337 [ + + ]: 157322 : if (ilmn_i>jlmn_l) then
1338 : 68831 : klmn_il=ilmn_i*(ilmn_i-1)/2+jlmn_l
1339 : : else
1340 : 88491 : klmn_il=jlmn_l*(jlmn_l-1)/2+ilmn_i
1341 : : end if
1342 : 166074 : dijfock_vv_tmp(klmn_ij,ispden)=dijfock_vv_tmp(klmn_ij,ispden)-ro*eijkl(klmn_kj,klmn_il)
1343 : : end do
1344 : :
1345 : 9522 : jrhokl=jrhokl+cplex_rhoij
1346 : : end do !End loop over rhoij
1347 : :
1348 : : end do !ispden
1349 : :
1350 : : ! Regular case: copy spin component into Dij
1351 [ - + - - ]: 1248 : if (ndij/=4.or.nsp/=4) then
1352 [ + + ]: 1394 : do ispden=1,nsp
1353 : 770 : klmn1=iq0_dij+1
1354 [ + + ]: 23537 : do klmn_ij=1,lmn2_size
1355 : 22143 : dijfock_vv(klmn1,ispden)=dijfock_vv_tmp(klmn_ij,ispden)
1356 : 22913 : klmn1=klmn1+cplex_dij
1357 : : end do
1358 : : end do
1359 : : ! Antiferro case: copy up component into down one
1360 [ + + - + ]: 624 : if (ndij==2.and.nsp==1) then
1361 : 0 : klmn1=iq0_dij+1
1362 [ # # ]: 0 : do klmn_ij=1,lmn2_size
1363 : 0 : dijfock_vv(klmn1,2)=dijfock_vv_tmp(klmn_ij,1)
1364 : 0 : klmn1=klmn1+cplex_dij
1365 : : end do
1366 : : end if
1367 : : else
1368 : : !Non-collinear: from (rhoij,m_ij) to rhoij^(alpha,beta)
1369 : : !rhoij= (rhoij^11+rhoij^22)
1370 : : !mij_x= (rhoij^12+rhoij^21)
1371 : : !mij_y=i.(rhoij^12+rhoij^21)
1372 : : !mij_z= (rhoij^11-rhoij^22)
1373 : 0 : klmn1=iq0_dij+1
1374 [ # # ]: 0 : do klmn_ij=1,lmn2_size
1375 : 0 : dij_up=half*(dijfock_vv_tmp(klmn_ij,1)+dijfock_vv_tmp(klmn_ij,4))
1376 : 0 : dij_dn=half*(dijfock_vv_tmp(klmn_ij,1)-dijfock_vv_tmp(klmn_ij,4))
1377 : 0 : dij_updn_r= half*dijfock_vv_tmp(klmn_ij,2)
1378 : 0 : dij_updn_i=-half*dijfock_vv_tmp(klmn_ij,3)
1379 : 0 : dijfock_vv(klmn1 ,1)= dij_up
1380 : 0 : dijfock_vv(klmn1 ,2)= dij_dn
1381 : 0 : dijfock_vv(klmn1 ,3)= dij_updn_r
1382 : 0 : dijfock_vv(klmn1+1,3)= dij_updn_i
1383 : 0 : dijfock_vv(klmn1 ,4)= dij_updn_r
1384 : 0 : dijfock_vv(klmn1+1,4)=-dij_updn_i
1385 : 0 : klmn1=klmn1+cplex_dij
1386 : : end do
1387 : : end if
1388 : :
1389 : : end do ! qphase
1390 : :
1391 : : ! ===== Core-valence contribution =====
1392 : :
1393 [ + + ]: 1394 : do ispden=1,pawrhoij%nsppol
1394 [ + + ]: 2164 : do iq=1,qphase
1395 [ - + ]: 770 : iq0_dij=merge(0,cplex_dij*lmn2_size,iq==1)
1396 : 770 : klmn1=iq0_dij+1
1397 [ + + ]: 23683 : do klmn_ij=1,lmn2_size
1398 : 22143 : dijfock_cv(klmn1,ispden)=pawtab%ex_cvij(klmn_ij)
1399 : 22913 : klmn1=klmn1+cplex_dij
1400 : : end do
1401 : : end do
1402 : : end do
1403 : :
1404 : : !Antiferro case: copy up component into down one
1405 [ + + - + ]: 624 : if (ndij==2.and.pawrhoij%nsppol==1) then
1406 [ # # ]: 0 : dijfock_cv(:,2)=dijfock_cv(:,1)
1407 : : end if
1408 : :
1409 : : !Apply mixing factors
1410 [ + + ]: 624 : if (abs(hyb_mixing)>tol8) then
1411 [ + + + + ]: 17325 : dijfock_vv(:,:) = hyb_mixing*dijfock_vv(:,:)
1412 [ + - ]: 154 : else if (abs(hyb_mixing_sr)>tol8) then
1413 [ + + + + ]: 6212 : dijfock_vv(:,:) = hyb_mixing_sr*dijfock_vv(:,:)
1414 : : end if
1415 [ + + + + ]: 23537 : dijfock_cv(:,:) = (hyb_mixing+hyb_mixing_sr)*dijfock_cv(:,:)
1416 : :
1417 : : !Free temporary memory spaces
1418 [ - + ]: 624 : LIBPAW_DEALLOCATE(dijfock_vv_tmp)
1419 : :
1420 [ + - ]: 624 : end subroutine pawdijfock
1421 : : !!***
1422 : :
1423 : : !----------------------------------------------------------------------
1424 : :
1425 : : !!****f* m_pawdij/pawdijxc
1426 : : !! NAME
1427 : : !! pawdijxc
1428 : : !!
1429 : : !! FUNCTION
1430 : : !! Compute the eXchange-Correlation contribution to the PAW pseudopotential strength Dij,
1431 : : !! using densities and potential expressed on a (r,theta,phi) grid
1432 : : !! (for one atom only):
1433 : : !! D_ij^XC= < Phi_i|Vxc( n1+ nc[+nhat])| Phi_j>
1434 : : !! -<tPhi_i|Vxc(tn1+tnc[+nhat])|tPhi_j>
1435 : : !! -Intg_omega [ Vxc(tn1+tnc[+nhat])(r). Sum_L(Qij^L(r)). dr]
1436 : : !!
1437 : : !! INPUTS
1438 : : !! cplex_dij=2 if dij is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
1439 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
1440 : : !! ndij= number of spin components
1441 : : !! nspden=number of spin density components
1442 : : !! nsppol=number of independent spin WF components
1443 : : !! pawang <type(pawang_type)>=paw angular mesh and related data, for current atom
1444 : : !! pawrad <type(pawrad_type)>=paw radial mesh and related data, for current atom
1445 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data
1446 : : !! usekden=1 if kinetic energy density contribution has to be included (mGGA)
1447 : : !! usexcnhat= 1 if compensation density is included in Vxc, 0 otherwise
1448 : : !! vxc1(qphase*mesh_size,angl_size,nspden)=all-electron on-site XC potential for current atom
1449 : : !! given on a (r,theta,phi) grid
1450 : : !! vxct1(qphase*mesh_size,angl_size,nspden)=all-electron on-site XC potential for current atom
1451 : : !! given on a (r,theta,phi) grid
1452 : : !! [vxctau1(qphase*mesh_size,angl_size,nspden)]=1st deriv. of XC energy wrt to kinetic energy density
1453 : : !! (all electron) - metaGGA only
1454 : : !! [vxcttau1(qphase*mesh_size,angl_size,nspden)]=1st deriv. of XC energy wrt to kinetic energy density
1455 : : !! (pseudo) - metaGGA only
1456 : : !!
1457 : : !! OUTPUT
1458 : : !! dijxc(cplex_dij*qphase*lmn2_size,ndij)= D_ij^XC terms
1459 : : !! When Dij is complex (cplex_dij=2):
1460 : : !! dij(2*i-1,:) contains the real part, dij(2*i,:) contains the imaginary part
1461 : : !! When a exp(-i.q.r) phase is included (qphase=2):
1462 : : !! dij(1:cplex_dij*lmn2_size,:)
1463 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
1464 : : !! dij(cplex_dij*lmn2_size+1:2*cplex_dij*lmn2_size,:)
1465 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
1466 : : !!
1467 : : !! SOURCE
1468 : :
1469 [ - + ]: 2704 : subroutine pawdijxc(dijxc,cplex_dij,qphase,ndij,nspden,nsppol,&
1470 [ - + - + ]: 2704 : & pawang,pawrad,pawtab,vxc1,vxct1,usexcnhat,usekden,&
1471 [ + - + + : 2704 : & vxctau1,vxcttau1) ! optional
- + + - +
+ - + ]
1472 : :
1473 : : !Arguments ---------------------------------------------
1474 : : !scalars
1475 : : integer,intent(in) :: cplex_dij,ndij,nspden,nsppol,qphase,usekden,usexcnhat
1476 : : type(pawang_type),intent(in) :: pawang
1477 : : !arrays
1478 : : real(dp),intent(in) :: vxc1(:,:,:),vxct1(:,:,:)
1479 : : real(dp),intent(in),optional :: vxctau1(:,:,:),vxcttau1(:,:,:)
1480 : : real(dp),intent(out) :: dijxc(:,:)
1481 : : type(pawrad_type),intent(in) :: pawrad
1482 : : type(pawtab_type),intent(in) :: pawtab
1483 : :
1484 : : !Local variables ---------------------------------------
1485 : : !scalars
1486 : : integer :: angl_size,basis_size,idij,idijend
1487 : : integer :: ii,ij_size,ilm,ils,ils1,ilslm,ipts,ir,ir1,isel,ispden
1488 : : integer :: jlm,j0lm,klmn1,klmn2,klmn,klm,kln,l_size,lm0,lmax,lmin,lm_size,lmn2_size
1489 : : integer :: iln,jln,j0ln
1490 : : integer :: mesh_size,mm,nsploop
1491 : : real(dp) :: tmp,vi,vr,vxcijhat,vxcijhat_i,vxctauij
1492 : : character(len=500) :: msg
1493 : : !arrays
1494 : 2704 : real(dp),allocatable :: dijxc_idij(:),ff(:),gg(:)
1495 : 2704 : real(dp),allocatable :: vxcij1(:),vxcij2(:),vxctauij1(:),yylmr(:,:),yylmgr(:,:)
1496 : :
1497 : : ! *************************************************************************
1498 : :
1499 : : !Useful data
1500 : 2704 : lm_size=pawtab%lcut_size**2
1501 : 2704 : lmn2_size=pawtab%lmn2_size
1502 : 2704 : basis_size=pawtab%basis_size
1503 : 2704 : ij_size=pawtab%ij_size
1504 : 2704 : l_size=pawtab%l_size
1505 : 2704 : mesh_size=pawtab%mesh_size
1506 : 2704 : angl_size=pawang%angl_size
1507 : :
1508 : : !Check data consistency
1509 [ + - - + ]: 2704 : if (size(dijxc,1)/=cplex_dij*qphase*lmn2_size.or.size(dijxc,2)/=ndij) then
1510 : 0 : msg='invalid sizes for Dijxc !'
1511 : 0 : LIBPAW_BUG(msg)
1512 : : end if
1513 : : if (size(vxc1,1)/=qphase*mesh_size.or.size(vxct1,1)/=qphase*mesh_size.or.&
1514 : : & size(vxc1,2)/=angl_size.or.size(vxct1,2)/=angl_size.or.&
1515 [ + - + - : 2704 : & size(vxc1,3)/=nspden.or.size(vxct1,3)/=nspden) then
+ - + - +
- - + ]
1516 : 0 : msg='invalid sizes for vxc1 or vxct1 !'
1517 : 0 : LIBPAW_BUG(msg)
1518 : : end if
1519 : :
1520 : : !Check if MetaGGA is activated
1521 [ + + ]: 2704 : if (usekden==1) then
1522 [ - + ]: 428 : if (.not.present(vxctau1)) then
1523 : 0 : msg="vxctau1 needs to be present!"
1524 : 0 : LIBPAW_BUG(msg)
1525 [ + + - + ]: 1712 : else if (size(vxctau1)==0) then
1526 : 0 : msg="vxctau1 needs to be allocated!"
1527 : 0 : LIBPAW_BUG(msg)
1528 : : end if
1529 [ - + ]: 428 : if (.not.present(vxcttau1)) then
1530 : 0 : msg="vxcttau1 needs to be present!"
1531 : 0 : LIBPAW_BUG(msg)
1532 [ + + - + ]: 1712 : else if (size(vxcttau1)==0) then
1533 : 0 : msg="vxcttau1 needs to be allocated!"
1534 : 0 : LIBPAW_BUG(msg)
1535 : : end if
1536 : : end if
1537 : :
1538 : : !Precompute products Ylm*Ylpmp (and Grad(Ylm).Grad(Ylpmp) if mGGA)
1539 [ + + ]: 199471 : lmax=1+maxval(pawtab%indklmn(4,1:lmn2_size))
1540 [ + - - + : 10816 : LIBPAW_ALLOCATE(yylmr,(lmax**2*(lmax**2+1)/2,angl_size))
+ - - + +
- + - + -
- + - + ]
1541 [ - + + - : 10816 : LIBPAW_ALLOCATE(yylmgr,(lmax**2*(lmax**2+1)/2,angl_size*usekden))
+ + + - +
- + + - +
- + ]
1542 [ + + ]: 418744 : do ipts=1,angl_size
1543 [ + + ]: 5579232 : do jlm=1,lmax**2
1544 : 5160488 : j0lm=jlm*(jlm-1)/2
1545 [ + + ]: 52375288 : do ilm=1,jlm
1546 : 46798760 : klm=j0lm+ilm
1547 : 51959248 : yylmr(klm,ipts)=pawang%ylmr(ilm,ipts)*pawang%ylmr(jlm,ipts)
1548 : : end do
1549 : : end do
1550 : : end do
1551 [ + + ]: 2704 : if (usekden==1) then
1552 [ + + + + ]: 17049356 : yylmgr(:,:)=zero
1553 [ + + ]: 67196 : do ipts=1,angl_size
1554 [ + + ]: 1466828 : do jlm=1,lmax**2
1555 : 1399632 : j0lm=jlm*(jlm-1)/2
1556 [ + + ]: 18448560 : do ilm=1,jlm
1557 : 16982160 : klm=j0lm+ilm
1558 [ + + ]: 69328272 : do ii=1,3
1559 : : yylmgr(klm,ipts)=yylmgr(klm,ipts) &
1560 : 67928640 : & +pawang%ylmrgr(ii,ilm,ipts)*pawang%ylmrgr(ii,jlm,ipts)
1561 : : end do
1562 : : end do
1563 : : end do
1564 : : end do
1565 : : end if
1566 : :
1567 : : !Init memory
1568 [ + + + + ]: 547847 : dijxc=zero
1569 [ - + + - : 8112 : LIBPAW_ALLOCATE(dijxc_idij,(qphase*lmn2_size))
+ - + - -
+ - + ]
1570 [ - + + - : 8112 : LIBPAW_ALLOCATE(vxcij1,(qphase*ij_size))
+ - + - -
+ - + ]
1571 [ - + + - : 8112 : LIBPAW_ALLOCATE(vxcij2,(qphase*l_size))
+ - + - -
+ - + ]
1572 [ + + + - : 8112 : LIBPAW_ALLOCATE(vxctauij1,(qphase*ij_size*usekden))
+ - + + -
+ - + ]
1573 [ - + + - : 8112 : LIBPAW_ALLOCATE(ff,(mesh_size))
+ - + - -
+ - + ]
1574 [ - + + - : 5408 : LIBPAW_ALLOCATE(gg,(mesh_size))
- + - + ]
1575 [ + + + + : 63285 : vxcij1=zero;vxcij2=zero;vxctauij1=zero
+ + ]
1576 : :
1577 : : !----------------------------------------------------------
1578 : : !Loop over spin components
1579 : : !----------------------------------------------------------
1580 [ + + ]: 2704 : nsploop=nsppol;if (ndij==4) nsploop=4
1581 [ + + ]: 7631 : do idij=1,nsploop
1582 [ + + + + : 7631 : if (idij<=nsppol.or.(nspden==4.and.idij<=3)) then
+ + ]
1583 : :
1584 : 4486 : idijend=idij+idij/3
1585 [ + + ]: 9071 : do ispden=idij,idijend
1586 : :
1587 [ + + ]: 363505 : dijxc_idij=zero
1588 : :
1589 : : ! ----------------------------------------------------------
1590 : : ! Loop on angular mesh
1591 : : ! ----------------------------------------------------------
1592 [ + + ]: 708725 : do ipts=1,angl_size
1593 : :
1594 : : ! ===== Vxc_ij_1 (tmp) =====
1595 [ + + ]: 10233572 : vxcij1=zero
1596 [ + + ]: 704140 : if (qphase==1) then
1597 [ + + ]: 9471572 : do kln=1,ij_size
1598 : : ff(1:mesh_size)= &
1599 : : & vxc1(1:mesh_size,ipts,ispden)*pawtab%phiphj(1:mesh_size,kln) &
1600 [ + + ]: 10311627512 : & -vxct1(1:mesh_size,ipts,ispden)*pawtab%tphitphj(1:mesh_size,kln)
1601 : 9471572 : call simp_gen(vxcij1(kln),ff,pawrad)
1602 : : end do
1603 : : !if Meta GGA add 1/2*[<nabla_phi_i|vxctau1|nabla_phi_j>
1604 : : ! -<nabla_tphi_i|vxcttau1|nabla_tphi_j>]
1605 [ + + ]: 668860 : if (usekden==1) then
1606 [ + + ]: 433680 : do jln=1,basis_size
1607 : 366912 : j0ln=jln*(jln-1)/2
1608 [ + + ]: 1650480 : do iln=1,jln
1609 : 1216800 : kln=j0ln+iln
1610 : : ff(2:mesh_size)=(vxctau1(2:mesh_size,ipts,ispden)*pawtab%phiphj(2:mesh_size,kln) &
1611 : : & -vxcttau1(2:mesh_size,ipts,ispden)*pawtab%tphitphj(2:mesh_size,kln)) &
1612 [ + + ]: 1759452240 : & /pawrad%rad(2:mesh_size)**2
1613 : 1216800 : call pawrad_deducer0(ff,mesh_size,pawrad)
1614 : 1216800 : call simp_gen(vxctauij1(kln),ff,pawrad)
1615 : : ff(1:mesh_size)=vxctau1(1:mesh_size,ipts,ispden) &
1616 : : & *pawtab%nablaphi(1:mesh_size,iln)*pawtab%nablaphi(1:mesh_size,jln) &
1617 : : & -vxcttau1(1:mesh_size,ipts,ispden) &
1618 [ + + ]: 1760669040 : & *pawtab%tnablaphi(1:mesh_size,iln)*pawtab%tnablaphi(1:mesh_size,jln)
1619 : 1216800 : call simp_gen(vxctauij,ff,pawrad)
1620 : 1583712 : vxcij1(kln)=vxcij1(kln)+half*vxctauij
1621 : : end do
1622 : : end do
1623 : : end if
1624 : :
1625 : : else
1626 [ + + ]: 398640 : do kln=1,ij_size
1627 [ + + ]: 439242240 : do ir=1,mesh_size
1628 : 438878880 : ir1=2*ir
1629 : : ff(ir)= &
1630 : : & vxc1(ir1-1,ipts,ispden)*pawtab%phiphj(ir,kln) &
1631 : 438878880 : & -vxct1(ir1-1,ipts,ispden)*pawtab%tphitphj(ir,kln)
1632 : : gg(ir)= &
1633 : : & vxc1(ir1,ipts,ispden)*pawtab%phiphj(ir,kln) &
1634 : 439242240 : & -vxct1(ir1,ipts,ispden)*pawtab%tphitphj(ir,kln)
1635 : : end do
1636 : 363360 : call simp_gen(vxcij1(2*kln-1),ff,pawrad)
1637 : 398640 : call simp_gen(vxcij1(2*kln ),gg,pawrad)
1638 : : end do
1639 : : !if Meta GGA add 1/2*[<nabla_phi_i|vxctau1|nabla_phi_j>
1640 : : ! -<nabla_tphi_i|vxcttau|nabla_tphi_j>]
1641 [ - + ]: 35280 : if (usekden==1) then
1642 [ # # ]: 0 : do jln=1,basis_size
1643 : 0 : j0ln=jln*(jln-1)/2
1644 [ # # ]: 0 : do iln=1,jln
1645 : 0 : kln=j0ln+iln
1646 [ # # ]: 0 : do ir=2,mesh_size
1647 : 0 : ir1=2*ir
1648 : : ff(ir)=vxctau1(ir1-1,ipts,ispden)*pawtab%phiphj(ir,kln) &
1649 : 0 : & -vxcttau1(ir1-1,ipts,ispden)*pawtab%tphitphj(ir,kln)
1650 : : gg(ir)=vxctau1(ir1,ipts,ispden)*pawtab%phiphj(ir,kln) &
1651 : 0 : & -vxcttau1(ir1,ipts,ispden)*pawtab%tphitphj(ir,kln)
1652 : : end do
1653 : 0 : call pawrad_deducer0(ff,mesh_size,pawrad)
1654 : 0 : call pawrad_deducer0(gg,mesh_size,pawrad)
1655 : 0 : call simp_gen(vxctauij1(2*kln-1),ff,pawrad)
1656 : 0 : call simp_gen(vxctauij1(2*kln ),gg,pawrad)
1657 [ # # ]: 0 : do ir=1,mesh_size
1658 : 0 : ir1=2*ir
1659 : : ff(ir)=vxctau1(ir1-1,ipts,ispden) &
1660 : : & *pawtab%nablaphi(ir,iln)*pawtab%nablaphi(ir,jln) &
1661 : : & -vxcttau1(ir1-1,ipts,ispden) &
1662 : 0 : & *pawtab%tnablaphi(ir,iln)*pawtab%tnablaphi(ir,jln)
1663 : : gg(ir)=vxctau1(ir1,ipts,ispden) &
1664 : : & *pawtab%nablaphi(ir,iln)*pawtab%nablaphi(ir,jln) &
1665 : : & -vxcttau1(ir1,ipts,ispden) &
1666 : 0 : & *pawtab%tnablaphi(ir,iln)*pawtab%tnablaphi(ir,jln)
1667 : : end do
1668 : 0 : call simp_gen(vxctauij,ff,pawrad)
1669 : 0 : vxcij1(2*kln-1)=vxcij1(2*kln-1)+half*vxctauij
1670 : 0 : call simp_gen(vxctauij,gg,pawrad)
1671 : 0 : vxcij1(2*kln)=vxcij1(2*kln)+half*vxctauij
1672 : : end do
1673 : : end do
1674 : : end if
1675 : :
1676 : : end if
1677 : :
1678 : : ! ===== Vxc_ij_2 (tmp) =====
1679 [ + + ]: 3225760 : vxcij2=zero
1680 [ + + ]: 704140 : if (usexcnhat/=0) then
1681 [ + + ]: 51440 : if (qphase==1) then
1682 [ + + ]: 305760 : do ils=1,l_size
1683 : : ff(1:mesh_size)=vxct1(1:mesh_size,ipts,ispden) &
1684 : : & *pawtab%shapefunc(1:mesh_size,ils) &
1685 [ + + ]: 250684720 : & *pawrad%rad(1:mesh_size)**2
1686 : 305760 : call simp_gen(vxcij2(ils),ff,pawrad)
1687 : : end do
1688 : : else
1689 [ + + ]: 2880 : do ils=1,l_size
1690 [ + + ]: 1428000 : do ir=1,mesh_size
1691 : 1425600 : ir1=2*ir
1692 : 1425600 : tmp=pawtab%shapefunc(ir,ils)*pawrad%rad(ir)**2
1693 : 1425600 : ff(ir)=vxct1(ir1-1,ipts,ispden)*tmp
1694 : 1428000 : gg(ir)=vxct1(ir1 ,ipts,ispden)*tmp
1695 : : end do
1696 : 2400 : call simp_gen(vxcij2(2*ils-1),ff,pawrad)
1697 : 2880 : call simp_gen(vxcij2(2*ils ),gg,pawrad)
1698 : : end do
1699 : : end if
1700 : : end if
1701 : :
1702 : : ! ===== Integrate Vxc_ij_1 and Vxc_ij_2 over the angular mesh =====
1703 : : ! ===== and accumulate in total Vxc_ij =====
1704 [ + + ]: 708725 : if (qphase==1) then
1705 [ + + ]: 51513676 : do klmn=1,lmn2_size
1706 : 50844816 : klm=pawtab%indklmn(1,klmn);kln=pawtab%indklmn(2,klmn)
1707 : 50844816 : lmin=pawtab%indklmn(3,klmn);lmax=pawtab%indklmn(4,klmn)
1708 : : dijxc_idij(klmn)=dijxc_idij(klmn)+vxcij1(kln) &
1709 : 50844816 : & *pawang%angwgth(ipts)*yylmr(klm,ipts)*four_pi
1710 [ + + ]: 50844816 : if (usekden==1) then
1711 : : dijxc_idij(klmn)=dijxc_idij(klmn)+half*vxctauij1(kln) &
1712 : 9142848 : & *pawang%angwgth(ipts)*yylmgr(klm,ipts)*four_pi
1713 : : end if
1714 [ + + ]: 51513676 : if (usexcnhat/=0) then
1715 : 8714160 : vxcijhat=zero
1716 [ + - + + ]: 27161680 : do ils=lmin,lmax,2
1717 : 18447520 : lm0=ils**2+ils+1
1718 : 18447520 : vr=four_pi*pawang%angwgth(ipts)*vxcij2(ils+1)
1719 [ + + ]: 113284080 : do mm=-ils,ils
1720 : 86122400 : ilslm=lm0+mm;isel=pawang%gntselect(ilslm,klm)
1721 [ + + ]: 104569920 : if (isel>0) then
1722 : 18039840 : tmp=pawang%ylmr(ilslm,ipts)*pawtab%qijl(ilslm,klmn)
1723 : 18039840 : vxcijhat=vxcijhat+vr*tmp
1724 : : end if
1725 : : end do
1726 : : end do
1727 : 8714160 : dijxc_idij(klmn)=dijxc_idij(klmn)-vxcijhat
1728 : : end if
1729 : : end do ! Loop klmn
1730 : : else
1731 : : klmn1=1
1732 [ + + ]: 1434960 : do klmn=1,lmn2_size
1733 : 1399680 : klm=pawtab%indklmn(1,klmn);kln=pawtab%indklmn(2,klmn)
1734 : 1399680 : lmin=pawtab%indklmn(3,klmn);lmax=pawtab%indklmn(4,klmn)
1735 : 1399680 : tmp=pawang%angwgth(ipts)*yylmr(klm,ipts)*four_pi
1736 : 1399680 : dijxc_idij(klmn1 )=dijxc_idij(klmn1 )+vxcij1(2*kln-1)*tmp
1737 : 1399680 : dijxc_idij(klmn1+1)=dijxc_idij(klmn1+1)+vxcij1(2*kln )*tmp
1738 [ - + ]: 1399680 : if (usekden==1) then
1739 : 0 : tmp=pawang%angwgth(ipts)*yylmgr(klm,ipts)*four_pi
1740 : 0 : dijxc_idij(klmn1 )=dijxc_idij(klmn1 )+half*vxctauij1(2*kln-1)*tmp
1741 : 0 : dijxc_idij(klmn1+1)=dijxc_idij(klmn1+1)+half*vxctauij1(2*kln )*tmp
1742 : : end if
1743 [ + + ]: 1399680 : if (usexcnhat/=0) then
1744 : 82080 : vxcijhat=zero;vxcijhat_i=zero
1745 [ + - + + ]: 255840 : do ils=lmin,lmax,2
1746 : 173760 : lm0=ils**2+ils+1;ils1=2*(ils+1)
1747 : 173760 : vr=four_pi*pawang%angwgth(ipts)*vxcij2(ils1-1)
1748 : 173760 : vi=four_pi*pawang%angwgth(ipts)*vxcij2(ils1 )
1749 [ + + ]: 1067040 : do mm=-ils,ils
1750 : 811200 : ilslm=lm0+mm;isel=pawang%gntselect(ilslm,klm)
1751 [ + + ]: 984960 : if (isel>0) then
1752 : 169920 : tmp=pawang%ylmr(ilslm,ipts)*pawtab%qijl(ilslm,klmn)
1753 : 169920 : vxcijhat =vxcijhat +vr*tmp
1754 : 169920 : vxcijhat_i=vxcijhat_i+vi*tmp
1755 : : end if
1756 : : end do
1757 : : end do
1758 : 82080 : dijxc_idij(klmn1 )=dijxc_idij(klmn1 )-vxcijhat
1759 : 82080 : dijxc_idij(klmn1+1)=dijxc_idij(klmn1+1)-vxcijhat_i
1760 : : end if
1761 : 1434960 : klmn1=klmn1+qphase
1762 : : end do ! Loop klmn
1763 : : end if
1764 : :
1765 : : ! ----------------------------------------------------------
1766 : : ! End loop on angular points
1767 : : end do
1768 : :
1769 : : ! ----------------------------------------------------------
1770 : : ! Deduce some part of Dij according to symmetries
1771 : : ! ----------------------------------------------------------
1772 : :
1773 : : !if ispden=1 => real part of D^11_ij
1774 : : !if ispden=2 => real part of D^22_ij
1775 : : !if ispden=3 => real part of D^12_ij
1776 : : !if ispden=4 => imaginary part of D^12_ij
1777 : 4585 : klmn1=max(1,ispden-2);klmn2=1
1778 [ + + ]: 351481 : do klmn=1,lmn2_size
1779 : 346896 : dijxc(klmn1,idij)=dijxc_idij(klmn2)
1780 : 346896 : klmn1=klmn1+cplex_dij
1781 : 351481 : klmn2=klmn2+qphase
1782 : : end do
1783 [ + + ]: 9071 : if (qphase==2) then
1784 : : !Same storage with exp^(-i.q.r) phase
1785 : 244 : klmn1=max(1,ispden-2)+lmn2_size*cplex_dij;klmn2=2
1786 [ + + ]: 12268 : do klmn=1,lmn2_size
1787 : 12024 : dijxc(klmn1,idij)=dijxc_idij(klmn2)
1788 : 12024 : klmn1=klmn1+cplex_dij
1789 : 12268 : klmn2=klmn2+qphase
1790 : : end do
1791 : : endif
1792 : :
1793 : : end do !ispden
1794 : :
1795 : : !Non-collinear: D_ij(:,4)=D^21_ij=D^12_ij^*
1796 [ + + + - ]: 441 : else if (nspden==4.and.idij==4) then
1797 [ + + ]: 33957 : dijxc(:,idij)=dijxc(:,idij-1)
1798 [ + - ]: 99 : if (cplex_dij==2) then
1799 [ + - ]: 99 : do klmn=2,lmn2_size*cplex_dij,cplex_dij
1800 [ + + ]: 16929 : dijxc(klmn,idij)=-dijxc(klmn,idij)
1801 : : end do
1802 [ - + ]: 99 : if (qphase==2) then
1803 [ # # ]: 0 : do klmn=2+lmn2_size*cplex_dij,2*lmn2_size*cplex_dij,cplex_dij
1804 [ # # ]: 0 : dijxc(klmn,idij)=-dijxc(klmn,idij)
1805 : : end do
1806 : : end if
1807 : : end if
1808 : :
1809 : : !Antiferro: D_ij(:,2)=D^down_ij=D^up_ij
1810 [ + - + + ]: 342 : else if (nsppol==1.and.idij==2) then
1811 [ + + ]: 32082 : dijxc(:,idij)=dijxc(:,idij-1)
1812 : : end if
1813 : :
1814 : : !----------------------------------------------------------
1815 : : !End loop on spin density components
1816 : : end do
1817 : :
1818 : : !Free temporary memory spaces
1819 [ - + ]: 2704 : LIBPAW_DEALLOCATE(yylmr)
1820 [ - + ]: 2704 : LIBPAW_DEALLOCATE(yylmgr)
1821 [ - + ]: 2704 : LIBPAW_DEALLOCATE(dijxc_idij)
1822 [ - + ]: 2704 : LIBPAW_DEALLOCATE(vxcij1)
1823 [ - + ]: 2704 : LIBPAW_DEALLOCATE(vxcij2)
1824 [ - + ]: 2704 : LIBPAW_DEALLOCATE(vxctauij1)
1825 [ - + ]: 2704 : LIBPAW_DEALLOCATE(ff)
1826 [ - + ]: 2704 : LIBPAW_DEALLOCATE(gg)
1827 : :
1828 : 2704 : end subroutine pawdijxc
1829 : : !!***
1830 : :
1831 : : !----------------------------------------------------------------------
1832 : :
1833 : : !!****f* m_pawdij/pawdijxcm
1834 : : !! NAME
1835 : : !! pawdijxcm
1836 : : !!
1837 : : !! FUNCTION
1838 : : !! Compute the eXchange-Correlation contribution to the PAW pseudopotential strength Dij,
1839 : : !! using densities and potential expressed as (l,m) spherical moments
1840 : : !! (for one atom only):
1841 : : !! D_ij^XC= < Phi_i|Vxc( n1+ nc[+nhat])| Phi_j>
1842 : : !! -<tPhi_i|Vxc(tn1+tnc[+nhat])|tPhi_j>
1843 : : !! -Intg_omega [ Vxc(tn1+tnc[+nhat])(r). Sum_L(Qij^L(r)). dr]
1844 : : !!
1845 : : !! INPUTS
1846 : : !! cplex_dij=2 if dij is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
1847 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
1848 : : !! lmselect(lm_size)=select the non-zero LM-moments of on-site potentials
1849 : : !! ndij= number of spin components
1850 : : !! nspden=number of spin density components
1851 : : !! nsppol=number of independent spin WF components
1852 : : !! pawang <type(pawang_type)>=paw angular mesh and related data, for current atom
1853 : : !! pawrad <type(pawrad_type)>=paw radial mesh and related data, for current atom
1854 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data
1855 : : !! vxc1(qphase*mesh_size,lm_size,nspden)=all-electron on-site XC potential for current atom
1856 : : !! given on (l,m) spherical moments
1857 : : !! vxct1(qphase*mesh_size,lm_size,nspden)=all-electron on-site XC potential for current atom
1858 : : !! given on (l,m) spherical moments
1859 : : !! usexcnhat= 1 if compensation density is included in Vxc, 0 otherwise
1860 : : !!
1861 : : !! OUTPUT
1862 : : !! dijxc(cplex_dij*qphase*lmn2_size,ndij)= D_ij^XC terms
1863 : : !! When Dij is complex (cplex_dij=2):
1864 : : !! dij(2*i-1,:) contains the real part, dij(2*i,:) contains the imaginary part
1865 : : !! When a exp(-i.q.r) phase is included (qphase=2):
1866 : : !! dij(1:cplex_dij*lmn2_size,:)
1867 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
1868 : : !! dij(cplex_dij*lmn2_size+1:2*cplex_dij*lmn2_size,:)
1869 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
1870 : : !!
1871 : : !! SOURCE
1872 : :
1873 [ - + - + ]: 41798 : subroutine pawdijxcm(dijxc,cplex_dij,qphase,lmselect,ndij,nspden,nsppol,&
1874 [ - + - + ]: 41798 : & pawang,pawrad,pawtab,vxc1,vxct1,usexcnhat)
1875 : :
1876 : : !Arguments ---------------------------------------------
1877 : : !scalars
1878 : : integer,intent(in) :: cplex_dij,ndij,nspden,nsppol,qphase,usexcnhat
1879 : : type(pawang_type),intent(in) :: pawang
1880 : : !arrays
1881 : : logical :: lmselect(:)
1882 : : real(dp),intent(in) :: vxc1(:,:,:),vxct1(:,:,:)
1883 : : real(dp),intent(out) :: dijxc(:,:)
1884 : : type(pawrad_type),intent(in) :: pawrad
1885 : : type(pawtab_type),intent(in) :: pawtab
1886 : :
1887 : : !Local variables ---------------------------------------
1888 : : !scalars
1889 : : integer :: idij,idijend,ij_size,ir,ir1,isel,ispden,klm,klm1,klmn,klmn1,klmn2,kln
1890 : : integer :: lm_size,lmn2_size,ll,mesh_size,nsploop
1891 : : real(dp) :: tmp,vxcij2,vxcij2_i
1892 : : character(len=500) :: msg
1893 : : !arrays
1894 : 41798 : real(dp),allocatable :: dijxc_idij(:),ff(:),gg(:),vxcij1(:)
1895 : :
1896 : : ! *************************************************************************
1897 : :
1898 : : !Useful data
1899 : 41798 : lm_size=pawtab%lcut_size**2
1900 : 41798 : lmn2_size=pawtab%lmn2_size
1901 : 41798 : ij_size=pawtab%ij_size
1902 : 41798 : mesh_size=pawtab%mesh_size
1903 : :
1904 : : !Check data consistency
1905 [ + - - + ]: 41798 : if (size(dijxc,1)/=cplex_dij*qphase*lmn2_size.or.size(dijxc,2)/=ndij) then
1906 : 0 : msg='invalid sizes for Dijxc !'
1907 : 0 : LIBPAW_BUG(msg)
1908 : : end if
1909 [ - + ]: 41798 : if (size(lmselect)/=lm_size) then
1910 : 0 : msg='invalid size for lmselect !'
1911 : 0 : LIBPAW_BUG(msg)
1912 : : end if
1913 : : if (size(vxc1,1)/=qphase*mesh_size.or.size(vxct1,1)/=qphase*mesh_size.or.&
1914 : : & size(vxc1,2)/=lm_size.or.size(vxct1,2)/=lm_size.or.&
1915 [ + - + - : 41798 : & size(vxc1,3)/=nspden.or.size(vxct1,3)/=nspden) then
+ - + - +
- - + ]
1916 : 0 : msg='invalid sizes for vxc1 or vxct1 !'
1917 : 0 : LIBPAW_BUG(msg)
1918 : : end if
1919 : :
1920 : : !Init memory
1921 [ + + + + ]: 5040538 : dijxc=zero
1922 [ - + + - : 125394 : LIBPAW_ALLOCATE(dijxc_idij,(qphase*lmn2_size))
+ - + - -
+ - + ]
1923 [ - + + - : 125394 : LIBPAW_ALLOCATE(vxcij1,(qphase*ij_size))
+ - + - -
+ - + ]
1924 [ - + + - : 125394 : LIBPAW_ALLOCATE(ff,(mesh_size))
+ - + - -
+ - + ]
1925 [ - + + - : 83596 : LIBPAW_ALLOCATE(gg,(mesh_size))
- + - + ]
1926 : :
1927 : : !----------------------------------------------------------
1928 : : !Loop over spin components
1929 : : !----------------------------------------------------------
1930 [ + + ]: 41798 : nsploop=nsppol;if (ndij==4) nsploop=4
1931 [ + + ]: 95855 : do idij=1,nsploop
1932 [ + + + + : 95855 : if (idij<=nsppol.or.(nspden==4.and.idij<=3)) then
+ + ]
1933 : :
1934 : 48610 : idijend=idij+idij/3
1935 [ + + ]: 98545 : do ispden=idij,idijend
1936 : :
1937 [ + + ]: 3429368 : dijxc_idij=zero
1938 : :
1939 : : ! ----------------------------------------------------------
1940 : : ! Summing over (l,m) moments
1941 : : ! ----------------------------------------------------------
1942 [ + + ]: 665808 : do klm=1,lm_size
1943 [ + + ]: 665808 : if (lmselect(klm)) then
1944 : :
1945 : : ! ===== Vxc_ij_1 (tmp) =====
1946 [ + + ]: 7608599 : vxcij1=zero
1947 [ + + ]: 452062 : if (qphase==1) then
1948 [ + + ]: 7552235 : do kln=1,ij_size
1949 : : ff(1:mesh_size)= &
1950 : : & vxc1(1:mesh_size,klm,ispden)*pawtab%phiphj(1:mesh_size,kln) &
1951 [ + + ]: 6470113892 : & -vxct1(1:mesh_size,klm,ispden)*pawtab%tphitphj(1:mesh_size,kln)
1952 : 7552235 : call simp_gen(vxcij1(kln),ff,pawrad)
1953 : : end do
1954 : : else ! qphase==2
1955 [ + + ]: 29524 : do kln=1,ij_size
1956 [ + + ]: 13017400 : do ir=1,mesh_size
1957 : 12990560 : ir1=2*ir
1958 : : ff(ir)= &
1959 : : & vxc1(ir1-1,klm,ispden)*pawtab%phiphj(ir,kln) &
1960 : 12990560 : & -vxct1(ir1-1,klm,ispden)*pawtab%tphitphj(ir,kln)
1961 : : gg(ir)= &
1962 : : & vxc1(ir1,klm,ispden)*pawtab%phiphj(ir,kln) &
1963 : 13017400 : & -vxct1(ir1,klm,ispden)*pawtab%tphitphj(ir,kln)
1964 : : end do
1965 : 26840 : call simp_gen(vxcij1(2*kln-1),ff,pawrad)
1966 : 29524 : call simp_gen(vxcij1(2*kln ),gg,pawrad)
1967 : : end do
1968 : : end if
1969 : :
1970 : : ! ===== Vxc_ij_2 (tmp) =====
1971 : 452062 : vxcij2=zero;vxcij2_i=zero
1972 [ + + ]: 452062 : if (usexcnhat/=0) then
1973 : 233395 : ll=1+int(sqrt(dble(klm)-0.1_dp))
1974 [ + + ]: 233395 : if (qphase==1) then
1975 : : ff(1:mesh_size)=vxct1(1:mesh_size,klm,ispden) &
1976 : : & *pawtab%shapefunc(1:mesh_size,ll) &
1977 [ + + ]: 150598403 : & *pawrad%rad(1:mesh_size)**2
1978 : 230711 : call simp_gen(vxcij2,ff,pawrad)
1979 : : else ! qphase==2
1980 [ + + ]: 1301740 : do ir=1,mesh_size
1981 : 1299056 : ir1=2*ir
1982 : 1299056 : tmp=pawtab%shapefunc(ir,ll)*pawrad%rad(ir)**2
1983 : 1299056 : ff(ir)=vxct1(ir1-1,klm,ispden)*tmp
1984 : 1301740 : gg(ir)=vxct1(ir1 ,klm,ispden)*tmp
1985 : : end do
1986 : 2684 : call simp_gen(vxcij2 ,ff,pawrad)
1987 : 2684 : call simp_gen(vxcij2_i,gg,pawrad)
1988 : : end if
1989 : : end if
1990 : :
1991 : : ! ===== Accumulate over klm moments Vxc_ij_1 and Vxc_ij_2 =====
1992 : : ! ===== into total Vxc_ij =====
1993 [ + + ]: 452062 : if (qphase==1) then
1994 [ + + ]: 50578725 : do klmn=1,lmn2_size
1995 : 50129347 : klm1=pawtab%indklmn(1,klmn)
1996 : 50129347 : kln=pawtab%indklmn(2,klmn)
1997 : 50129347 : isel=pawang%gntselect(klm,klm1)
1998 [ + + ]: 50129347 : if (isel>0) &
1999 : 4675022 : & dijxc_idij(klmn)=dijxc_idij(klmn)+vxcij1(kln)*pawang%realgnt(isel)
2000 [ + + ]: 50129347 : if (usexcnhat/=0) &
2001 : 30935045 : dijxc_idij(klmn)=dijxc_idij(klmn)-pawtab%qijl(klm,klmn)*vxcij2
2002 : : end do ! Loop klmn
2003 : : else ! qphase==2
2004 : : klmn1=1
2005 [ + + ]: 99308 : do klmn=1,lmn2_size
2006 : 96624 : klm1=pawtab%indklmn(1,klmn)
2007 : 96624 : kln=pawtab%indklmn(2,klmn)
2008 : 96624 : isel=pawang%gntselect(klm,klm1)
2009 [ + + ]: 96624 : if (isel>0) then
2010 : : dijxc_idij(klmn1 )=dijxc_idij(klmn1) &
2011 : 15450 : & +vxcij1(2*kln-1)*pawang%realgnt(isel)
2012 : : dijxc_idij(klmn1+1)=dijxc_idij(klmn1+1) &
2013 : 15450 : & +vxcij1(2*kln )*pawang%realgnt(isel)
2014 : : end if
2015 [ + - ]: 96624 : if (usexcnhat/=0) then
2016 : : dijxc_idij(klmn1 )=dijxc_idij(klmn1) &
2017 : 96624 : & -pawtab%qijl(klm,klmn)*vxcij2
2018 : : dijxc_idij(klmn1+1)=dijxc_idij(klmn1+1) &
2019 : 96624 : & -pawtab%qijl(klm,klmn)*vxcij2_i
2020 : : end if
2021 : 99308 : klmn1=klmn1+qphase
2022 : : end do ! Loop klmn
2023 : : end if
2024 : :
2025 : : end if ! klm selection
2026 : : end do ! Loop klm
2027 : :
2028 : : ! ----------------------------------------------------------
2029 : : ! Deduce some part of Dij according to symmetries
2030 : : ! ----------------------------------------------------------
2031 : :
2032 : : !if ispden=1 => real part of D^11_ij
2033 : : !if ispden=2 => real part of D^22_ij
2034 : : !if ispden=3 => real part of D^12_ij
2035 : : !if ispden=4 => imaginary part of D^12_ij
2036 : 49935 : klmn1=max(1,ispden-2);klmn2=1
2037 [ + + ]: 3417416 : do klmn=1,lmn2_size
2038 : 3367481 : dijxc(klmn1,idij)=dijxc_idij(klmn2)
2039 : 3367481 : klmn1=klmn1+cplex_dij
2040 : 3417416 : klmn2=klmn2+qphase
2041 : : end do
2042 [ + + ]: 98545 : if (qphase==2) then
2043 : : !Same storage with exp^(-i.q.r) phase
2044 : 332 : klmn1=max(1,ispden-2)+lmn2_size*cplex_dij;klmn2=2
2045 [ + + ]: 12284 : do klmn=1,lmn2_size
2046 : 11952 : dijxc(klmn1,idij)=dijxc_idij(klmn2)
2047 : 11952 : klmn1=klmn1+cplex_dij
2048 : 12284 : klmn2=klmn2+qphase
2049 : : end do
2050 : : endif
2051 : :
2052 : : end do !ispden
2053 : :
2054 : : !Non-collinear: D_ij(:,4)=D^21_ij=D^12_ij^*
2055 [ + + + - ]: 5447 : else if (nspden==4.and.idij==4) then
2056 [ + + ]: 459821 : dijxc(:,idij)=dijxc(:,idij-1)
2057 [ + - ]: 1325 : if (cplex_dij==2) then
2058 [ - + ]: 1325 : do klmn=2,lmn2_size*cplex_dij,cplex_dij
2059 [ + + ]: 229248 : dijxc(klmn,idij)=-dijxc(klmn,idij)
2060 : : end do
2061 [ - + ]: 1325 : if (qphase==2) then
2062 [ # # ]: 0 : do klmn=2+lmn2_size*cplex_dij,2*lmn2_size*cplex_dij,cplex_dij
2063 [ # # ]: 0 : dijxc(klmn,idij)=-dijxc(klmn,idij)
2064 : : end do
2065 : : end if
2066 : : end if
2067 : :
2068 : : !Antiferro: D_ij(:,2)=D^down_ij=D^up_ij
2069 [ + - + + ]: 4122 : else if (nsppol==1.and.idij==2) then
2070 [ + + ]: 159910 : dijxc(:,idij)=dijxc(:,idij-1)
2071 : : end if
2072 : :
2073 : : !----------------------------------------------------------
2074 : : !End loop on spin density components
2075 : : end do
2076 : :
2077 : : !Free temporary memory spaces
2078 [ - + ]: 41798 : LIBPAW_DEALLOCATE(dijxc_idij)
2079 [ - + ]: 41798 : LIBPAW_DEALLOCATE(vxcij1)
2080 [ - + ]: 41798 : LIBPAW_DEALLOCATE(ff)
2081 [ - + ]: 41798 : LIBPAW_DEALLOCATE(gg)
2082 : :
2083 : 41798 : end subroutine pawdijxcm
2084 : : !!***
2085 : :
2086 : : !----------------------------------------------------------------------
2087 : :
2088 : : !!****f* m_pawdij/pawdijhat
2089 : : !! NAME
2090 : : !! pawdijhat
2091 : : !!
2092 : : !! FUNCTION
2093 : : !! Compute the "hat" contribution to the PAW pseudopotential strength Dij,
2094 : : !! i.e. the compensation charge contribution (for one atom only):
2095 : : !! D_ij^hat=Intg_R [ V(r). Sum_L(Qij^L(r)). dr]
2096 : : !!
2097 : : !! INPUTS
2098 : : !! cplex_dij=2 if dij is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
2099 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
2100 : : !! gprimd(3,3)=dimensional primitive translations for reciprocal space
2101 : : !! iatom=absolute index of current atom (between 1 and natom)
2102 : : !! natom=total number of atoms
2103 : : !! ndij= number of spin components
2104 : : !! ngrid=number of points of the real space grid (FFT, WVL, ...) treated by current proc
2105 : : !! ngridtot=total number of points of the real space grid (FFT, WVL, ...)
2106 : : !! For the FFT grid, this should be equal to ngfft1*ngfft2*ngfft3
2107 : : !! nspden=number of spin density components
2108 : : !! nsppol=number of independent spin WF components
2109 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
2110 : : !! pawfgrtab<type(pawfgrtab_type)>=atomic data given on fine rectangular grid for current atom
2111 : : !! pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data, for current atom
2112 : : !! Pot(qphase*ngrid,nspden)=potential on real space grid
2113 : : !! qphon(3)=(RF calculations only) - wavevector of the phonon
2114 : : !! ucvol=unit cell volume
2115 : : !! xred(3,my_natom)= reduced atomic coordinates
2116 : : !!
2117 : : !! OUTPUT
2118 : : !! dijhat(cplex_dij*qphase*lmn2_size,ndij)= D_ij^hat terms
2119 : : !! When Dij is complex (cplex_dij=2):
2120 : : !! dij(2*i-1,:) contains the real part, dij(2*i,:) contains the imaginary part
2121 : : !! When a exp(-i.q.r) phase is included (qphase=2):
2122 : : !! dij(1:cplex_dij*lmn2_size,:)
2123 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
2124 : : !! dij(cplex_dij*lmn2_size+1:2*cplex_dij*lmn2_size,:)
2125 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
2126 : : !!
2127 : : !! SOURCE
2128 : :
2129 [ - + ]: 44498 : subroutine pawdijhat(dijhat,cplex_dij,qphase,gprimd,iatom,&
2130 : : & natom,ndij,ngrid,ngridtot,nspden,nsppol,pawang,pawfgrtab,&
2131 : 44498 : & pawtab,Pot,qphon,ucvol,xred,&
2132 : : & mpi_comm_grid) ! Optional argument
2133 : :
2134 : : !Arguments ---------------------------------------------
2135 : : !scalars
2136 : : integer,intent(in) :: cplex_dij,iatom,natom,ndij
2137 : : integer,intent(in) :: ngrid,ngridtot,nspden,nsppol,qphase
2138 : : integer,intent(in),optional :: mpi_comm_grid
2139 : : real(dp),intent(in) :: ucvol
2140 : : type(pawang_type),intent(in) :: pawang
2141 : : type(pawfgrtab_type),intent(inout) :: pawfgrtab
2142 : : !arrays
2143 : : real(dp),intent(in) :: gprimd(3,3),Pot(qphase*ngrid,nspden),qphon(3),xred(3,natom)
2144 : : real(dp),intent(out) :: dijhat(:,:)
2145 : : type(pawtab_type),intent(in) :: pawtab
2146 : :
2147 : : !Local variables ---------------------------------------
2148 : : !scalars
2149 : : integer :: ic,idij,idijend,ier,ils,ilslm,ilslm1,isel,ispden,jc,klm,klmn,klmn1,klmn2
2150 : : integer :: lm0,lm_size,lmax,lmin,lmn2_size,mm,my_comm_grid,nfgd,nsploop,optgr0
2151 : : logical :: has_qphase,qne0
2152 : : real(dp) :: vi,vr
2153 : : character(len=500) :: msg
2154 : : !arrays
2155 : : real(dp) :: rdum1(1),rdum2(2)
2156 : 44498 : real(dp),allocatable :: dijhat_idij(:),prod(:)
2157 : :
2158 : : ! *************************************************************************
2159 : :
2160 : : !Useful data
2161 : 44498 : lm_size=pawtab%lcut_size**2
2162 : 44498 : lmn2_size=pawtab%lmn2_size
2163 : 44498 : nfgd=pawfgrtab%nfgd
2164 : 44498 : qne0=(qphon(1)**2+qphon(2)**2+qphon(3)**2>=1.d-15)
2165 [ + + - + ]: 44498 : has_qphase=(qne0.and.qphase==2)
2166 [ + - ]: 44498 : my_comm_grid=xmpi_comm_self;if (present(mpi_comm_grid)) my_comm_grid=mpi_comm_grid
2167 : :
2168 : : !Check data consistency
2169 [ + - - + ]: 44498 : if (size(dijhat,1)/=cplex_dij*qphase*lmn2_size.or.size(dijhat,2)/=ndij) then
2170 : 0 : msg='invalid sizes for Dijhat !'
2171 : 0 : LIBPAW_BUG(msg)
2172 : : end if
2173 : :
2174 : : !Eventually compute g_l(r).Y_lm(r) factors for the current atom (if not already done)
2175 [ + + ]: 44498 : if (pawfgrtab%gylm_allocated==0) then
2176 [ + - ]: 9 : if (allocated(pawfgrtab%gylm)) then
2177 : 9 : LIBPAW_DEALLOCATE(pawfgrtab%gylm)
2178 : : end if
2179 [ - + + - : 36 : LIBPAW_ALLOCATE(pawfgrtab%gylm,(nfgd,lm_size))
- + + - +
- + - - +
- + - + ]
2180 : 9 : pawfgrtab%gylm_allocated=2;optgr0=1
2181 : 9 : call pawgylm(pawfgrtab%gylm,rdum1,rdum2,lm_size,nfgd,optgr0,0,0,pawtab,pawfgrtab%rfgd)
2182 : : end if
2183 : :
2184 : : !Eventually compute exp(i.q.r) factors for the current atom (if not already done)
2185 [ + + - + ]: 44498 : if (has_qphase.and.pawfgrtab%expiqr_allocated==0) then
2186 [ # # ]: 0 : if (pawfgrtab%rfgd_allocated==0) then
2187 : 0 : msg='pawfgrtab()%rfgd array must be allocated !'
2188 : 0 : LIBPAW_BUG(msg)
2189 : : end if
2190 [ # # ]: 0 : if (allocated(pawfgrtab%expiqr)) then
2191 : 0 : LIBPAW_DEALLOCATE(pawfgrtab%expiqr)
2192 : : end if
2193 [ # # # # : 0 : LIBPAW_ALLOCATE(pawfgrtab%expiqr,(2,nfgd))
# # # # #
# # # #
# ]
2194 : 0 : call pawexpiqr(pawfgrtab%expiqr,gprimd,nfgd,qphon,pawfgrtab%rfgd,xred(:,iatom))
2195 : 0 : pawfgrtab%expiqr_allocated=2
2196 : : end if
2197 : :
2198 : : !Init memory
2199 [ + + + + ]: 5587963 : dijhat=zero
2200 [ - + + - : 133494 : LIBPAW_ALLOCATE(prod,(qphase*lm_size))
+ - + - -
+ - + ]
2201 [ - + + - : 133494 : LIBPAW_ALLOCATE(dijhat_idij,(qphase*lmn2_size))
+ - + - -
+ - + ]
2202 : :
2203 : : !----------------------------------------------------------
2204 : : !Loop over spin components
2205 : : !----------------------------------------------------------
2206 [ + + ]: 44498 : nsploop=nsppol;if (ndij==4) nsploop=4
2207 [ + + ]: 103478 : do idij=1,nsploop
2208 [ + + + + : 103478 : if (idij<=nsppol.or.(nspden==4.and.idij<=3)) then
+ + ]
2209 : :
2210 : 53092 : idijend=idij+idij/3
2211 [ + + ]: 107608 : do ispden=idij,idijend
2212 : :
2213 : : ! ------------------------------------------------------
2214 : : ! Compute Int[V(r).g_l(r).Y_lm(r)]
2215 : : ! ------------------------------------------------------
2216 : : ! Note for non-collinear magnetism:
2217 : : ! We compute Int[V^(alpha,beta)(r).g_l(r).Y_lm(r)]
2218 : : ! Remember: if nspden=4, V is stored as : V^11, V^22, V^12, i.V^21
2219 : :
2220 [ + + ]: 734434 : prod=zero
2221 : :
2222 : : ! ===== Standard case ============================
2223 [ + + ]: 54516 : if (.not.has_qphase) then
2224 [ - + ]: 53940 : if (qphase==1) then
2225 [ + + ]: 722722 : do ilslm=1,lm_size
2226 [ + + ]: 2312490362 : do ic=1,nfgd
2227 : 2311767640 : vr=Pot(pawfgrtab%ifftsph(ic),ispden)
2228 : 2312436422 : prod(ilslm)=prod(ilslm)+vr*pawfgrtab%gylm(ic,ilslm)
2229 : : end do
2230 : : end do
2231 : : else
2232 : : ilslm1=1
2233 [ # # ]: 0 : do ilslm=1,lm_size
2234 [ # # ]: 0 : do ic=1,nfgd
2235 : 0 : jc=2*pawfgrtab%ifftsph(ic)
2236 : 0 : vr=Pot(jc-1,ispden);vi=Pot(jc,ispden)
2237 : 0 : prod(ilslm1 )=prod(ilslm1 )+vr*pawfgrtab%gylm(ic,ilslm)
2238 : 0 : prod(ilslm1+1)=prod(ilslm1+1)+vi*pawfgrtab%gylm(ic,ilslm)
2239 : : end do
2240 : 0 : ilslm1=ilslm1+qphase
2241 : : end do
2242 : : end if
2243 : :
2244 : : ! ===== Including Exp(iqr) phase (DFPT only) =====
2245 : : else
2246 [ + - ]: 576 : if (qphase==1) then
2247 [ # # ]: 0 : do ilslm=1,lm_size
2248 [ # # ]: 0 : do ic=1,nfgd
2249 : 0 : vr=Pot(pawfgrtab%ifftsph(ic),ispden)
2250 : : prod(ilslm)=prod(ilslm)+vr*pawfgrtab%gylm(ic,ilslm)&
2251 : 0 : & *pawfgrtab%expiqr(1,ic)
2252 : : end do
2253 : : end do
2254 : : else
2255 : : ilslm1=1
2256 [ + + ]: 6144 : do ilslm=1,lm_size
2257 [ + + ]: 9280812 : do ic=1,nfgd
2258 : 9275244 : jc=2*pawfgrtab%ifftsph(ic)
2259 : 9275244 : vr=Pot(jc-1,ispden);vi=Pot(jc,ispden)
2260 : : prod(ilslm1 )=prod(ilslm1 )+pawfgrtab%gylm(ic,ilslm)&
2261 : 9275244 : & *(vr*pawfgrtab%expiqr(1,ic)-vi*pawfgrtab%expiqr(2,ic))
2262 : : prod(ilslm1+1)=prod(ilslm1+1)+pawfgrtab%gylm(ic,ilslm)&
2263 : 9280812 : & *(vr*pawfgrtab%expiqr(2,ic)+vi*pawfgrtab%expiqr(1,ic))
2264 : : end do
2265 : 6144 : ilslm1=ilslm1+qphase
2266 : : end do
2267 : : end if
2268 : : end if
2269 : :
2270 : : ! Scaling factor (unit volume)
2271 [ + + ]: 734434 : prod=prod*ucvol/dble(ngridtot)
2272 : :
2273 : : ! Reduction in case of parallelism
2274 [ + + ]: 54516 : if (xmpi_comm_size(my_comm_grid)>1) then
2275 : 1588 : call xmpi_sum(prod,my_comm_grid,ier)
2276 : : end if
2277 : :
2278 : : ! ----------------------------------------------------------
2279 : : ! Compute Sum_(i,j)_LM { q_ij^L Int[V(r).g_l(r).Y_lm(r)] }
2280 : : ! ----------------------------------------------------------
2281 : : ! Note for non-collinear magnetism:
2282 : : ! We compute Sum_(i,j)_LM { q_ij^L Int[V^(alpha,beta)(r).g_l(r).Y_lm(r)] }
2283 : :
2284 [ + + ]: 3792455 : dijhat_idij=zero
2285 : :
2286 [ + + ]: 54516 : if (qphase==1) then
2287 [ + + ]: 3743927 : do klmn=1,lmn2_size
2288 : 3689987 : klm =pawtab%indklmn(1,klmn)
2289 : 3689987 : lmin=pawtab%indklmn(3,klmn)
2290 : 3689987 : lmax=pawtab%indklmn(4,klmn)
2291 [ + - + + ]: 11053711 : do ils=lmin,lmax,2
2292 : 7309784 : lm0=ils**2+ils+1
2293 [ + + ]: 43215509 : do mm=-ils,ils
2294 : 32215738 : ilslm=lm0+mm;isel=pawang%gntselect(ilslm,klm)
2295 [ + + ]: 32215738 : if (isel>0) dijhat_idij(klmn)=dijhat_idij(klmn) &
2296 : 14381195 : & +prod(ilslm)*pawtab%qijl(ilslm,klmn)
2297 : : end do
2298 : : end do
2299 : : end do
2300 : : else
2301 [ + + ]: 24552 : do klmn=1,lmn2_size
2302 : 23976 : klmn1=2*klmn-1
2303 : 23976 : klm =pawtab%indklmn(1,klmn)
2304 : 23976 : lmin=pawtab%indklmn(3,klmn)
2305 : 23976 : lmax=pawtab%indklmn(4,klmn)
2306 [ + - + + ]: 64704 : do ils=lmin,lmax,2
2307 : 40152 : lm0=ils**2+ils+1
2308 [ + + ]: 195768 : do mm=-ils,ils
2309 : 131640 : ilslm=lm0+mm;ilslm1=2*ilslm;isel=pawang%gntselect(ilslm,klm)
2310 [ + + ]: 171792 : if (isel>0) then
2311 : 36648 : dijhat_idij(klmn1 )=dijhat_idij(klmn1 )+prod(ilslm1-1)*pawtab%qijl(ilslm,klmn)
2312 : 36648 : dijhat_idij(klmn1+1)=dijhat_idij(klmn1+1)+prod(ilslm1 )*pawtab%qijl(ilslm,klmn)
2313 : : end if
2314 : : end do
2315 : : end do
2316 : : end do
2317 : : end if
2318 : :
2319 : : ! ----------------------------------------------------------
2320 : : ! Deduce some part of Dij according to symmetries
2321 : : ! ----------------------------------------------------------
2322 : :
2323 : : !if ispden=1 => real part of D^11_ij
2324 : : !if ispden=2 => real part of D^22_ij
2325 : : !if ispden=3 => real part of D^12_ij
2326 : : !if ispden=4 => imaginary part of D^12_ij
2327 : 54516 : klmn1=max(1,ispden-2);klmn2=1
2328 [ + + ]: 3768479 : do klmn=1,lmn2_size
2329 : 3713963 : dijhat(klmn1,idij)=dijhat_idij(klmn2)
2330 : 3713963 : klmn1=klmn1+cplex_dij
2331 : 3768479 : klmn2=klmn2+qphase
2332 : : end do
2333 [ + + ]: 107608 : if (qphase==2) then
2334 : : !Same storage with exp^(-i.q.r) phase
2335 : 576 : klmn1=max(1,ispden-2)+lmn2_size*cplex_dij;klmn2=2
2336 [ + + ]: 24552 : do klmn=1,lmn2_size
2337 : 23976 : dijhat(klmn1,idij)=dijhat_idij(klmn2)
2338 : 23976 : klmn1=klmn1+cplex_dij
2339 : 24552 : klmn2=klmn2+qphase
2340 : : end do
2341 : : endif
2342 : :
2343 : : end do !ispden
2344 : :
2345 : : !Non-collinear: D_ij(:,4)=D^21_ij=D^12_ij^*
2346 [ + + + - ]: 5888 : else if (nspden==4.and.idij==4) then
2347 [ + + ]: 493778 : dijhat(:,idij)=dijhat(:,idij-1)
2348 [ + - ]: 1424 : if (cplex_dij==2) then
2349 [ + - ]: 1424 : do klmn=2,lmn2_size*cplex_dij,cplex_dij
2350 [ + + ]: 246177 : dijhat(klmn,idij)=-dijhat(klmn,idij)
2351 : : end do
2352 [ - + ]: 1424 : if (qphase==2) then
2353 [ # # ]: 0 : do klmn=2+lmn2_size*cplex_dij,2*lmn2_size*cplex_dij,cplex_dij
2354 [ # # ]: 0 : dijhat(klmn,idij)=-dijhat(klmn,idij)
2355 : : end do
2356 : : end if
2357 : : end if
2358 : :
2359 : : !Antiferro: D_ij(:,2)=D^down_ij=D^up_ij
2360 [ + - + + ]: 4464 : else if (nsppol==1.and.idij==2) then
2361 [ + + ]: 191992 : dijhat(:,idij)=dijhat(:,idij-1)
2362 : : end if
2363 : :
2364 : : !----------------------------------------------------------
2365 : : !End loop on spin density components
2366 : : end do
2367 : :
2368 : : !Free temporary memory spaces
2369 [ - + ]: 44498 : LIBPAW_DEALLOCATE(prod)
2370 [ - + ]: 44498 : LIBPAW_DEALLOCATE(dijhat_idij)
2371 [ + + ]: 44498 : if (pawfgrtab%gylm_allocated==2) then
2372 [ - + ]: 9 : LIBPAW_DEALLOCATE(pawfgrtab%gylm)
2373 [ - + ]: 9 : LIBPAW_ALLOCATE(pawfgrtab%gylm,(0,0))
2374 : 9 : pawfgrtab%gylm_allocated=0
2375 : : end if
2376 [ - + ]: 44498 : if (pawfgrtab%expiqr_allocated==2) then
2377 [ # # ]: 0 : LIBPAW_DEALLOCATE(pawfgrtab%expiqr)
2378 [ # # ]: 0 : LIBPAW_ALLOCATE(pawfgrtab%expiqr,(0,0))
2379 : 0 : pawfgrtab%expiqr_allocated=0
2380 : : end if
2381 : :
2382 : 44498 : end subroutine pawdijhat
2383 : : !!***
2384 : :
2385 : : !----------------------------------------------------------------------
2386 : :
2387 : : !!****f* m_pawdij/pawdijnd
2388 : : !! NAME
2389 : : !! pawdijnd
2390 : : !!
2391 : : !! FUNCTION
2392 : : !! Compute the nuclear dipole contribution to the PAW
2393 : : !! pseudopotential strength Dij
2394 : : !! (for one atom only)
2395 : : !!
2396 : : !! INPUTS
2397 : : !! cplex_dij=2 if dij is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
2398 : : !! ndij= number of spin components
2399 : : !! nucdipmom(3) nuclear magnetic dipole moment for current atom
2400 : : !! pawrad <type(pawrad_type)>=paw radial mesh and related data, for current atom
2401 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data, for current atom
2402 : : !!
2403 : : !! OUTPUT
2404 : : !! dijnd(cplex_dij*lmn2_size,ndij)= nuclear dipole moment Dij terms
2405 : : !! cplex_dij=2 must be 2
2406 : : !! dij(2*i-1,:) contains the real part,
2407 : : !! dij(2*i ,:) contains the imaginary part
2408 : : !!
2409 : : !! NOTES
2410 : : !! On-site contribution of a nuclear magnetic dipole moment at $R$. Hamiltonian is
2411 : : !! $H=(1/2m_e)(p - q_e A)^2 + V$ in SI units, and vector potential $A$ is
2412 : : !! $A=(\mu_0/4\pi) m\times (r-R)/|r-R|^3 = (\mu_0/4\pi) L_R\cdot m/|r-R|^3$ where
2413 : : !! $L_R$ is the on-site orbital angular momentum and $m$ is the nuclear magnetic
2414 : : !! dipole moment. Second order term in A is ignored. In atomic units the on-site term
2415 : : !! is \alpha^2 L_R\cdot m/|r-R|^3, where \alpha is the fine structure constant.
2416 : : !!
2417 : : !!
2418 : : !! SOURCE
2419 : :
2420 [ - + ]: 639 : subroutine pawdijnd(dijnd,cplex_dij,gprimd,iatom,natom,ndij,nspden,nucdipmom,&
2421 [ - + - + ]: 639 : & pawang,pawrad,pawtab,pawxcdev,qphase,vh1,vxc1,xred,znuc,zora)
2422 : :
2423 : : !Arguments ---------------------------------------------
2424 : : !scalars
2425 : : integer,intent(in) :: cplex_dij,iatom,natom,ndij,nspden,pawxcdev,qphase,zora
2426 : : real(dp),intent(in) :: znuc
2427 : : type(pawang_type),intent(in) :: pawang
2428 : : type(pawrad_type),intent(in) :: pawrad
2429 : : type(pawtab_type),target,intent(in) :: pawtab
2430 : : !arrays
2431 : : real(dp),intent(out) :: dijnd(:,:)
2432 : : real(dp),intent(in) :: gprimd(3,3),nucdipmom(3,natom)
2433 : : real(dp),intent(in) :: vh1(:,:,:),vxc1(:,:,:),xred(3,natom)
2434 : :
2435 : : !Local variables ---------------------------------------
2436 : : !scalars
2437 : : integer :: angl_size,idir,ii,ij_size,il,ilmn,im,imesh
2438 : : integer :: jatom,jl,jlmn,jm,klmn,kln,lm_size,lmn2_size ! klm,
2439 : : integer :: mesh_size
2440 : : real(dp) :: rc,rr,rt
2441 : : real(dp), parameter :: HalfFineStruct2=half/InvFineStruct**2
2442 : : complex(dp) :: cmatrixelement,lms
2443 : : logical :: usezora
2444 : : !arrays
2445 : 639 : integer,pointer :: indlmn(:,:),indklmn(:,:)
2446 : 639 : real(dp),allocatable :: ff(:),intgr3(:),v1(:),zk1(:)
2447 : : character(len=500) :: msg
2448 : : ! *************************************************************************
2449 : :
2450 : : !Useful data
2451 : 639 : angl_size=pawang%angl_size
2452 : 639 : indklmn => pawtab%indklmn
2453 : 639 : indlmn => pawtab%indlmn
2454 : 639 : mesh_size=pawtab%mesh_size
2455 : 639 : ij_size=pawtab%ij_size
2456 : 639 : lm_size=pawtab%lcut_size**2
2457 : 639 : lmn2_size=pawtab%lmn2_size
2458 : 639 : usezora=((zora.EQ.1).OR.(zora.EQ.3))
2459 : :
2460 : : !write(std_out,'(a,I4,L4)')'JWZ debug pawdijnd zora use_zora ', &
2461 : : ! & zora,usezora
2462 : :
2463 : : !Check data consistency
2464 : 639 : if (cplex_dij/=2) then
2465 : 0 : msg='cplex_dij must be 2 for nuclear dipole moments !'
2466 : 0 : LIBPAW_BUG(msg)
2467 : : end if
2468 [ + - - + ]: 639 : if (size(dijnd,1)/=cplex_dij*pawtab%lmn2_size.or.size(dijnd,2)/=ndij) then
2469 : 0 : msg='invalid sizes for Dijnd !'
2470 : 0 : LIBPAW_BUG(msg)
2471 : : end if
2472 : :
2473 [ - + + - : 1917 : LIBPAW_ALLOCATE(zk1,(mesh_size))
+ - + - -
+ - + ]
2474 [ + + ]: 639 : if(usezora) then
2475 [ + - + - : 118 : if (size(vh1,1)/=qphase*mesh_size.or.size(vh1,2)<1.or.size(vh1,3)<1) then
- + ]
2476 : 0 : msg='invalid sizes for vh1!'
2477 : 0 : LIBPAW_BUG(msg)
2478 : : end if
2479 : : if (size(vxc1,1)/=qphase*mesh_size.or.size(vxc1,3)/=nspden.or.&
2480 [ + - + - : 118 : & (size(vxc1,2)/=angl_size.and.pawxcdev==0).or.&
+ - - + -
- ]
2481 [ + - ]: 118 : & (size(vxc1,2)/=lm_size.and.pawxcdev/=0)) then
2482 : 0 : msg='invalid sizes for vxc1!'
2483 : 0 : LIBPAW_BUG(msg)
2484 : : end if
2485 : :
2486 [ - + + - : 236 : LIBPAW_ALLOCATE(v1,(mesh_size))
- + - + ]
2487 : 118 : call pawv1(mesh_size,nspden,pawang,pawxcdev,v1,vh1,vxc1)
2488 [ - + + + ]: 164504 : zk1 = one/(one - HalfFineStruct2*v1)
2489 [ - + ]: 118 : LIBPAW_DEALLOCATE(v1)
2490 : : !! replace v1 potential with -Z/r for distances < r_c, the
2491 : : !! classical electron radius. This is an accurate replacement
2492 : : !! with better analytic properties at r=0.
2493 : 118 : rc=two*HalfFineStruct2
2494 : 118 : rt=znuc*rc
2495 : :
2496 : : ! replace k at short range with Coulomb potential version
2497 [ + - ]: 3520 : do ii=1,mesh_size
2498 : 3520 : rr=pawrad%rad(ii)
2499 [ + + ]: 3520 : if (rr>rc) exit
2500 [ + + ]: 3520 : if (rr<tol8) then
2501 : 118 : zk1(ii)=zero
2502 : : else
2503 : 3284 : zk1(ii)=one/(one+rt/(two*rr))
2504 : : end if
2505 : : end do
2506 : : end if
2507 : :
2508 [ + + + + ]: 113789 : dijnd = zero
2509 : :
2510 : : !-------------------------------------------------------------------
2511 : : ! Computation of (<phi_i|phi_j>-<tphi_i|tphi_j>)/r^3 radial integral
2512 : : !-------------------------------------------------------------------
2513 : :
2514 [ - + + - : 1917 : LIBPAW_ALLOCATE(intgr3,(ij_size))
+ - + - -
+ - + ]
2515 : :
2516 [ - + + - : 1278 : LIBPAW_ALLOCATE(ff,(mesh_size))
- + - + ]
2517 [ + + ]: 7029 : do kln=1,ij_size
2518 [ + + ]: 8322240 : do imesh = 2, mesh_size
2519 : 8315850 : rr = pawrad%rad(imesh)
2520 : 8322240 : ff(imesh)=(pawtab%phiphj(imesh,kln)- pawtab%tphitphj(imesh,kln))/(rr**3)
2521 : : end do !imesh
2522 [ + + + + ]: 1647890 : if (usezora) ff(2:mesh_size)=ff(2:mesh_size)*zk1(2:mesh_size)
2523 : 6390 : call pawrad_deducer0(ff,mesh_size,pawrad)
2524 : 7029 : call simp_gen(intgr3(kln),ff,pawrad)
2525 : : end do
2526 [ - + ]: 639 : LIBPAW_DEALLOCATE(ff)
2527 : :
2528 : : !---------------------------
2529 : : ! accumulate matrix elements
2530 : : !---------------------------
2531 [ + + ]: 23643 : do klmn=1,lmn2_size
2532 : :
2533 : 23004 : ilmn=indklmn(7,klmn)
2534 : 23004 : jlmn=indklmn(8,klmn)
2535 : :
2536 : 23004 : il=indlmn(1,ilmn)
2537 : 23004 : jl=indlmn(1,jlmn)
2538 : :
2539 : 23004 : im=indlmn(2,ilmn)
2540 : 23004 : jm=indlmn(2,jlmn)
2541 : 23004 : kln=indklmn(2,klmn)
2542 : :
2543 : : ! Matrix elements of interest are <S_l'm'|L_i|S_lm>
2544 : : ! these are zero if l' /= l and also if l' == l == 0
2545 [ + + ]: 23004 : if ( il /= jl ) cycle
2546 [ + + ]: 15336 : if ( il == 0 ) cycle
2547 : :
2548 [ + + ]: 54315 : do idir = 1, 3
2549 : :
2550 : : ! this loop accumulates a dot product so if no dipole moment in direction idir, nothing to do
2551 [ + + ]: 40257 : if( ABS(nucdipmom(idir,iatom)) .LT. tol8 ) cycle
2552 : :
2553 : 13419 : call slxyzs(il,im,idir,jl,jm,lms)
2554 : :
2555 : 13419 : cmatrixelement = FineStructureConstant2*lms*nucdipmom(idir,iatom)*intgr3(kln)
2556 : 13419 : dijnd(2*klmn-1,1) = dijnd(2*klmn-1,1) + real(cmatrixelement)
2557 : 63261 : dijnd(2*klmn ,1) = dijnd(2*klmn ,1) + aimag(cmatrixelement)
2558 : :
2559 : : end do ! end loop over idir
2560 : :
2561 : : end do ! end loop over basis states
2562 : :
2563 [ - + ]: 639 : LIBPAW_DEALLOCATE(intgr3)
2564 : :
2565 : : ! loop over other atoms to compute A.A term. Note this is "on-site only" with
2566 : : ! phi*phij, no tphi*tphij, because this term is not present in the planewave
2567 : : ! getghc
2568 [ + + ]: 1716 : do jatom=1,natom
2569 [ + + ]: 1077 : if (jatom .EQ. iatom) cycle ! no self term
2570 [ + + + + : 1432 : if (.NOT. ANY(ABS(nucdipmom(:,jatom))>tol8)) cycle ! skip neighbors without dipoles
+ + ]
2571 : :
2572 : : call pawdijaa(dijnd,gprimd,iatom,jatom,mesh_size,natom,nucdipmom,&
2573 : 1716 : & pawang,pawrad,pawtab,usezora,xred,zk1)
2574 : :
2575 : : end do
2576 : :
2577 : : ! in case of ndij > 1, note that there is no spin-flip in this term
2578 : : ! so therefore down-down = up-up, and up-down and down-up terms are still zero
2579 [ + + + + ]: 23031 : if(ndij > 1) dijnd(:,2)=dijnd(:,1)
2580 : :
2581 [ + - ]: 639 : if(allocated(zk1)) then
2582 : 639 : LIBPAW_DEALLOCATE(zk1)
2583 : : end if
2584 : :
2585 [ - + ]: 639 : end subroutine pawdijnd
2586 : : !!***
2587 : :
2588 : : !----------------------------------------------------------------------
2589 : :
2590 : : !!****f* m_pawdij/pawdijaa
2591 : : !! NAME
2592 : : !! pawdijaa
2593 : : !!
2594 : : !! FUNCTION
2595 : : !! Compute the Dipole-Dipole contribution to the PAW
2596 : : !! pseudopotential strength Dij
2597 : : !! (for one atom only)
2598 : : !!
2599 : : !! INPUTS
2600 : : !!
2601 : : !! OUTPUT
2602 : : !!
2603 : : !! NOTES
2604 : : !!
2605 : : !! SOURCE
2606 : :
2607 : 480 : subroutine pawdijaa(dijnd,gprimd,iatom,jatom,mesh_size,natom,nucdipmom,&
2608 [ - + ]: 240 : & pawang,pawrad,pawtab,usezora,xred,zk1)
2609 : :
2610 : : !Arguments ---------------------------------------------
2611 : : !scalars
2612 : : integer,intent(in) :: iatom,jatom,mesh_size,natom
2613 : : logical,intent(in) :: usezora
2614 : : type(pawang_type),intent(in) :: pawang
2615 : : type(pawrad_type),intent(in) :: pawrad
2616 : : type(pawtab_type),target,intent(in) :: pawtab
2617 : : !arrays
2618 : : real(dp),intent(in) :: gprimd(3,3),nucdipmom(3,natom),xred(3,natom),zk1(mesh_size)
2619 : : real(dp),intent(inout) :: dijnd(:,:)
2620 : :
2621 : : !Local variables ---------------------------------------
2622 : : !scalars
2623 : : integer :: angmom,iaa,ignt,ignt23,ij_size,imesh,info
2624 : : integer :: klmn,klm,klm2,klm23,klm3,klm3a,klm3b,klm4,kln,l2,l3,l4
2625 : : integer :: m1dir,m2dir,m2,m3,m3a,m3b,m4,my_lmax,my_lsizemax,my_ngnt
2626 : : real(dp) :: aa1a,aa1b,aa2a,aa2b,dr,rr,aa1a_fac,aa1b_fac,aa2a_fac,aa2b_fac
2627 : : real(dp) :: m1m2,m12d
2628 : : real(dp), parameter :: c1=sqrt(four_pi/15.0d0)
2629 : : real(dp), parameter :: c2=sqrt(four_pi/5.0d0)
2630 : : real(dp), parameter :: c3=sqrt(four_pi)
2631 : : real(dp), parameter :: FineStruct4=one/InvFineStruct**4
2632 : : !arrays
2633 : : integer :: ipiv(3)
2634 : : integer,parameter :: s1map(3)=[1,-1,0]
2635 : 240 : integer,pointer :: indlmn(:,:),indklmn(:,:)
2636 : : integer,allocatable :: my_gntselect(:,:)
2637 : : real(dp) :: d2ij(3,3,9),rprimd(3,3),rvec(3,1),rvec_len(1),work(3)
2638 : 240 : real(dp),allocatable :: aaint(:,:,:),ff(:),my_realgnt(:),ylm_rvec(:,:)
2639 : :
2640 : : ! *************************************************************************
2641 : :
2642 : : !Useful data
2643 : 240 : indklmn => pawtab%indklmn
2644 : 240 : indlmn => pawtab%indlmn
2645 : 240 : ij_size=pawtab%ij_size
2646 [ + + ]: 960 : m1m2 = DOT_PRODUCT(nucdipmom(1:3,iatom),nucdipmom(1:3,jatom))
2647 : :
2648 : : ! spherical harmonic representation of \hat{r}\hat{r}
2649 : 240 : d2ij = zero
2650 : 240 : d2ij(1,2,5)=c1; d2ij(2,1,5)=c1 ! xy/r^2 = c1*S_{2,-2}
2651 : 240 : d2ij(2,3,6)=c1; d2ij(3,2,6)=c1 ! yz/r^2 = c1*S_{2,-1}
2652 : 240 : d2ij(1,3,8)=c1; d2ij(3,1,8)=c1 ! xz/r^2 = c1*S_{2,+1}
2653 : 240 : d2ij(3,3,1)=c3/three; d2ij(3,3,7)=two*c2/three ! zz/r^2 = c3/3 S_{00} + 2c2/3 S_{20}
2654 : 240 : d2ij(1,1,1)=c3/three; d2ij(1,1,7)=-c2/three; d2ij(1,1,9)=c1 ! xx/r^2 = c3/3 S_00-c2/3 S_20 + c1 S-{2,2}
2655 : 240 : d2ij(2,2,1)=c3/three; d2ij(2,2,7)=-c2/three; d2ij(2,2,9)=-c1 ! xx/r^2 = c3/3 S_00-c2/3 S_20 - c1 S-{2,2}
2656 : :
2657 : : ! need set of Gaunt integrals two larger than usual
2658 : 240 : my_lmax=pawang%l_max+2
2659 : 240 : my_lsizemax=2*my_lmax-1
2660 [ - + + - : 960 : LIBPAW_ALLOCATE(my_gntselect,((2*my_lmax-1)**2,my_lmax**2*(my_lmax**2+1)/2))
+ - - + +
- + - + -
- + - + ]
2661 [ - + + - : 720 : LIBPAW_ALLOCATE(my_realgnt,((2*my_lmax-1)**2*my_lmax**4))
+ - + - -
+ - + ]
2662 : 240 : call realgaunt(my_lmax,my_ngnt,my_gntselect,my_realgnt)
2663 : :
2664 : : ! obtain rprimd by inversion of gprimd
2665 : : ! have to use elaborate lapack calls because we are inside libpaw
2666 : 240 : rprimd=gprimd
2667 : 240 : call dgetrf(3,3,rprimd,3,ipiv,info)
2668 : 240 : call dgetri(3,rprimd,3,ipiv,work,3,info)
2669 : :
2670 : : ! rvec is R2-R1 where R2,R1 are the two atoms with dipoles
2671 [ + + + + : 3840 : rvec(1:3,1)=MATMUL(rprimd,(xred(:,jatom)-xred(:,iatom)))
+ + ]
2672 [ + + ]: 960 : rvec_len(1) = SQRT(DOT_PRODUCT(rvec(:,1),rvec(:,1)))
2673 : 240 : dr = rvec_len(1)
2674 : :
2675 : : ! generate Ylm's for rvec
2676 [ - + + - : 720 : LIBPAW_ALLOCATE(ylm_rvec,(my_lsizemax**2,1))
+ - + - -
+ - + ]
2677 : 240 : call initylmr(my_lsizemax,1,1,rvec_len,1,rvec,ylm_rvec)
2678 : :
2679 : : ! compute radial integrals
2680 [ - + + - : 1200 : LIBPAW_ALLOCATE(aaint,(ij_size,my_lsizemax,2))
- + + - +
- + - + -
- + - + ]
2681 [ - + + - : 720 : LIBPAW_ALLOCATE(ff,(mesh_size))
+ - + - -
+ - + ]
2682 : :
2683 [ + + ]: 720 : do iaa = 1, 2
2684 : : ! note here l2 = angmom + 1
2685 [ + + ]: 4080 : do l2 = 1, my_lsizemax
2686 : 3360 : angmom = l2 - 1
2687 [ + + ]: 37440 : do kln=1,ij_size
2688 [ + + ]: 41137600 : do imesh = 2, mesh_size
2689 : 41104000 : rr = pawrad%rad(imesh)
2690 : : ! integrand for r^(angmom-iaa)/dr^(angmom+1) * 1/(dr^2 - r^2)
2691 : : ff(imesh)=pawtab%phiphj(imesh,kln)*&
2692 : 41137600 : & rr**(angmom-iaa)/((dr*dr-rr*rr)*dr**(angmom+1))
2693 : : end do !imesh
2694 [ + + ]: 41137600 : ff(2:mesh_size) = four_pi*ff(2:mesh_size)
2695 [ + + + + ]: 15646400 : if (usezora) ff(2:mesh_size)=ff(2:mesh_size)*zk1(2:mesh_size)
2696 : 33600 : call pawrad_deducer0(ff,mesh_size,pawrad)
2697 : 36960 : call simp_gen(aaint(kln,l2,iaa),ff,pawrad)
2698 : : end do
2699 : : end do
2700 : : end do
2701 [ - + ]: 240 : LIBPAW_DEALLOCATE(ff)
2702 : :
2703 : : ! term Ia factor: 1/2 \alpha^4 m1\cdot\m2
2704 : 240 : aa1a_fac = half*FineStruct4*m1m2
2705 : : ! term Ib factor: -1/2 \alpha^4 (4\pi/3) m1\cdot\m2
2706 : 240 : aa1b_fac = -half*FineStruct4*four_pi*m1m2/three
2707 : : ! term IIa factor: -1/2 \alpha^4
2708 : 240 : aa2a_fac = -half*FineStruct4
2709 : : ! term IIb factor: 1/2 \alpha^4 (4\pi/3)
2710 : 240 : aa2b_fac = half*FineStruct4*four_pi/three
2711 : :
2712 [ + + ]: 8880 : do klmn=1,pawtab%lmn2_size
2713 : 8640 : klm=indklmn(2,klmn); kln=indklmn(2,klmn)
2714 : :
2715 : 8640 : aa1a=zero
2716 : 8640 : aa1b=zero
2717 : : ! Term Ia, Ib
2718 : : ! note l2 here really is the angular momentum
2719 [ + + ]: 27360 : do l2 = indklmn(3,klmn),indklmn(4,klmn)
2720 [ + + ]: 82080 : do m2=-l2,l2
2721 : 54720 : klm2=LMPACK(l2,m2)
2722 : 54720 : ignt=my_gntselect(klm2,klm)
2723 [ + + ]: 73440 : if (ignt > 0) then
2724 : : ! note that aaint second index is angmom + 1, so l2+1 here
2725 : 11280 : aa1a = aa1a + aa1a_fac*my_realgnt(ignt)*ylm_rvec(klm2,1)*aaint(kln,l2+1,1)
2726 : :
2727 [ + + ]: 38400 : do l4=abs(l2-1),l2+1
2728 [ + + ]: 158640 : do m4=-l4,l4
2729 : 120240 : klm4=LMPACK(l4,m4)
2730 : 120240 : l3=1
2731 [ + + ]: 508080 : do m3=-l3,l3
2732 : 360720 : klm3=LMPACK(l3,m3)
2733 : 360720 : klm23=MATPACK(klm2,klm3)
2734 : 360720 : ignt23=my_gntselect(klm4,klm23)
2735 [ + + ]: 480960 : if (ignt23 > 0) then
2736 : : aa1b = aa1b + aa1b_fac*aaint(kln,l4+1,2)*&
2737 : : & dr*ylm_rvec(klm4,1)*ylm_rvec(klm3,1)*&
2738 : 56880 : & my_realgnt(ignt)*my_realgnt(ignt23)
2739 : : end if ! ignt23
2740 : : end do ! m3
2741 : : end do ! m4
2742 : : end do ! l4
2743 : : end if ! ignt
2744 : : end do ! loop on mm
2745 : : end do ! loop on ll
2746 : :
2747 : : aa2a=0
2748 [ + + ]: 27360 : do l2 = indklmn(3,klmn),indklmn(4,klmn)
2749 [ + + ]: 82080 : do m2=-l2,l2
2750 : 54720 : klm2=LMPACK(l2,m2)
2751 : 54720 : ignt=my_gntselect(klm2,klm)
2752 [ + + ]: 73440 : if (ignt > 0) then
2753 [ + + ]: 51360 : do l4=abs(l2-2),l2+2
2754 [ + + ]: 251760 : do m4=-l4,l4
2755 : 200400 : klm4=LMPACK(l4,m4)
2756 [ + + ]: 841680 : do l3=0,2
2757 [ + + ]: 2605200 : do m3=-l3,l3
2758 : 1803600 : klm3=LMPACK(l3,m3)
2759 : 1803600 : klm23=MATPACK(klm2,klm3)
2760 : 1803600 : ignt23=my_gntselect(klm4,klm23)
2761 [ + + ]: 2404800 : if (ignt23 > 0) then
2762 [ + + ]: 669120 : do m1dir=1,3
2763 [ + + ]: 2174640 : do m2dir=1,3
2764 : 1505520 : m12d=nucdipmom(m1dir,iatom)*nucdipmom(m2dir,jatom)
2765 [ + + ]: 1505520 : if (abs(m12d)<tol8) cycle
2766 [ + + ]: 167280 : if (abs(d2ij(m1dir,m2dir,klm3))<tol8) cycle
2767 : : aa2a=aa2a+m12d*aa2a_fac*aaint(kln,l4+1,1)*&
2768 : : & d2ij(m1dir,m2dir,klm3)*ylm_rvec(klm4,1)*&
2769 : 2007360 : & my_realgnt(ignt)*my_realgnt(ignt23)
2770 : : end do ! m2dir
2771 : : end do ! m1dir
2772 : : end if ! ignt23
2773 : : end do ! m3
2774 : : end do ! l3
2775 : : end do ! m4
2776 : : end do ! l4
2777 : : end if ! ignt
2778 : : end do ! loop on mm
2779 : : end do ! loop on ll
2780 : :
2781 : : aa2b=0
2782 [ + + ]: 27360 : do l2 = indklmn(3,klmn),indklmn(4,klmn)
2783 [ + + ]: 82080 : do m2=-l2,l2
2784 : 54720 : klm2=LMPACK(l2,m2)
2785 : 54720 : ignt=my_gntselect(klm2,klm)
2786 [ + + ]: 73440 : if (ignt > 0) then
2787 [ + + ]: 38400 : do l4=abs(l2-1),l2+1
2788 [ + + ]: 158640 : do m4=-l4,l4
2789 : 120240 : klm4=LMPACK(l4,m4)
2790 [ + + ]: 508080 : do m1dir=1,3
2791 : 360720 : l3=1; m3a=s1map(m1dir)
2792 : 360720 : klm3a=LMPACK(l3,m3a)
2793 : 360720 : klm23=MATPACK(klm2,klm3a)
2794 : 360720 : ignt23=my_gntselect(klm4,klm23)
2795 [ + + ]: 480960 : if (ignt23 > 0) then
2796 [ + + ]: 227520 : do m2dir=1,3
2797 : 170640 : m12d=nucdipmom(m1dir,iatom)*nucdipmom(m2dir,jatom)
2798 [ + + ]: 170640 : if (abs(m12d)<tol8) cycle
2799 : 17040 : m3b=s1map(m2dir)
2800 : 17040 : klm3b=LMPACK(l3,m3b)
2801 : : aa2b=aa2b+m12d*aa2b_fac*aaint(kln,l4+1,2)*&
2802 : : dr*my_realgnt(ignt)*my_realgnt(ignt23)*&
2803 : 227520 : ylm_rvec(klm4,1)*ylm_rvec(klm3b,1)
2804 : : end do ! m2dir
2805 : : end if ! ignt23
2806 : : end do ! m1dir
2807 : : end do ! m4
2808 : : end do ! l4
2809 : : end if ! ignt
2810 : : end do ! loop on mm
2811 : : end do ! loop on ll
2812 : :
2813 : 8880 : dijnd(2*klmn-1,1) = dijnd(2*klmn-1,1) + aa1a + aa1b + aa2a + aa2b
2814 : :
2815 : : end do ! loop on klmn
2816 : :
2817 [ - + ]: 240 : LIBPAW_DEALLOCATE(my_gntselect)
2818 [ - + ]: 240 : LIBPAW_DEALLOCATE(my_realgnt)
2819 [ - + ]: 240 : LIBPAW_DEALLOCATE(aaint)
2820 [ - + ]: 240 : LIBPAW_DEALLOCATE(ylm_rvec)
2821 : :
2822 : 480 : end subroutine pawdijaa
2823 : : !!***
2824 : :
2825 : : !----------------------------------------------------------------------
2826 : :
2827 : :
2828 : : !!****f* m_pawdij/pawdijso
2829 : : !! NAME
2830 : : !! pawdijso
2831 : : !!
2832 : : !! FUNCTION
2833 : : !! Compute the spin-orbit contribution to the PAW
2834 : : !! pseudopotential strength Dij and also the nuclear dipole
2835 : : !! spin interactions.
2836 : : !! (for one atom only)
2837 : : !!
2838 : : !! INPUTS
2839 : : !! cplex_dij=2 if dij is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
2840 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
2841 : : !! ndij= number of spin components for Dij^SO
2842 : : !! nspden=number of spin density components
2843 : : !! paw_an <type(paw_an_type)>=paw arrays given on angular mesh, for current atom
2844 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
2845 : : !! pawrad <type(pawrad_type)>=paw radial mesh and related data, for current atom
2846 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data, for current atom
2847 : : !! pawxcdev=Choice of XC development (0=no dev. (use of angular mesh) ; 1 or 2=dev. on moments)
2848 : : !! spnorbscl=scaling factor for spin-orbit coupling
2849 : : !! vh1(qphase*mesh_size,v_size,nspden)=all-electron on-site Hartree potential for current atom
2850 : : !! only spherical moment is used
2851 : : !! vxc1(qphase*mesh_size,v_size,nspden)=all-electron on-site XC potential for current atom
2852 : : !! given on a (r,theta,phi) grid (v_size=angl_size)
2853 : : !! or on (l,m) spherical moments (v_size=lm_size)
2854 : : !! znuc=nuclear charge
2855 : : !! zora=use of zora terms
2856 : : !!
2857 : : !! OUTPUT
2858 : : !! dijso(cplex_dij*qphase*lmn2_size,ndij)= spin-orbit Dij terms
2859 : : !! Dij^SO is complex, so cplex_dij=2 must be 2:
2860 : : !! dij(2*i-1,:) contains the real part
2861 : : !! dij(2*i,:) contains the imaginary part
2862 : : !! Dij^SO is represented with 4 components:
2863 : : !! dijso(:,:,1) contains Dij_SO^up-up
2864 : : !! dijso(:,:,2) contains Dij_SO^dn-dn
2865 : : !! dijso(:,:,3) contains Dij_SO^up-dn
2866 : : !! dijso(:,:,4) contains Dij_SO^dn-up
2867 : : !! When a exp(-i.q.r) phase is included (qphase=2):
2868 : : !! dij(1:cplex_dij*lmn2_size,:)
2869 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
2870 : : !! dij(cplex_dij*lmn2_size+1:2*cplex_dij*lmn2_size,:)
2871 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
2872 : : !!
2873 : : !! SOURCE
2874 : :
2875 [ - + ]: 2250 : subroutine pawdijso(dijso,cplex_dij,qphase,ndij,nspden,pawang,pawrad,pawtab,&
2876 [ - + - + ]: 2250 : & pawxcdev,spnorbscl,vh1,vxc1,znuc,zora,&
2877 : : & nucdipmom,spinaxis)
2878 : :
2879 : : !Arguments ---------------------------------------------
2880 : : !scalars
2881 : : integer,intent(in) :: cplex_dij,ndij,nspden,pawxcdev,qphase,zora
2882 : : real(dp),intent(in) :: spnorbscl,znuc
2883 : : type(pawang_type),intent(in) :: pawang
2884 : : type(pawrad_type),intent(in) :: pawrad
2885 : : type(pawtab_type),target,intent(in) :: pawtab
2886 : : !arrays
2887 : : real(dp),intent(out) :: dijso(:,:)
2888 : : real(dp),intent(in) :: vh1(:,:,:),vxc1(:,:,:)
2889 : : real(dp),optional,intent(in) :: nucdipmom(3)
2890 : : real(dp),optional,intent(in) :: spinaxis(3)
2891 : : !Local variables ---------------------------------------
2892 : : !scalars
2893 : : integer :: angl_size,gs1,gs2,idij,ii,ij_size,ilm,jlm,ispden
2894 : : integer :: klm,klmn,klmn1,kln
2895 : : integer :: lm_size,lmn2_size,mdir,mesh_size,ngnt,sdir
2896 : : real(dp), parameter :: HalfFineStruct2=half/InvFineStruct**2
2897 : : real(dp) :: alpha,beta,fact,me1,me2,rc,rr,rt,sme,cb2,sb2
2898 : : logical :: has_nucdipmom,use_soc,use_sd,use_fc
2899 : : character(len=500) :: msg
2900 : : !arrays
2901 : 2250 : integer,pointer :: indklmn(:,:)
2902 : : real(dp) :: spinaxis_in(3)
2903 : 2250 : real(dp),allocatable :: dijnd_rad(:,:),dijso_rad(:),dkdr(:),dv1dr(:),dyadic(:,:,:,:)
2904 : 2250 : real(dp),allocatable :: v1(:),zk1(:),z_intgd(:),z_kernel(:)
2905 : : complex(dp) :: D(2,2),Drot(2,2),U(2,2),ep,em
2906 : :
2907 : : ! *************************************************************************
2908 : :
2909 : : !Useful data
2910 : 2250 : lm_size=pawtab%lcut_size**2
2911 : 2250 : lmn2_size=pawtab%lmn2_size
2912 : 2250 : ij_size=pawtab%ij_size
2913 : 2250 : angl_size=pawang%angl_size
2914 : 2250 : mesh_size=pawtab%mesh_size
2915 : 2250 : indklmn => pawtab%indklmn
2916 : :
2917 : 2250 : select case(zora)
2918 : : case(-3)
2919 : : use_soc=.TRUE.; use_sd=.FALSE.; use_fc=.TRUE.
2920 : : case(-2)
2921 : : use_soc=.TRUE.; use_sd=.TRUE.; use_fc=.FALSE.
2922 : : case(-1)
2923 : : use_soc=.TRUE.; use_sd=.FALSE.; use_fc=.FALSE.
2924 : : case(1)
2925 : : ! this case really shouldn't appear as zora 1 means kinetic only and
2926 : : ! no spin terms
2927 : : use_soc=.FALSE.; use_sd=.FALSE.; use_fc=.FALSE.
2928 : : case(2)
2929 : : use_soc=.TRUE.; use_sd=.TRUE.; use_fc=.TRUE.
2930 : : case(3)
2931 : : use_soc=.TRUE.; use_sd=.TRUE.; use_fc=.TRUE.
2932 : : ! the default case is a bit strange because of the legacy
2933 : : ! feature that, although SOC in just one of several ZORA terms,
2934 : : ! historically it was treated as "stand alone" by abinit.
2935 : : ! so, this routine can be triggered in abinit by "pawspnorb 1"
2936 : : ! without the use of the zora variable, so if we get to this point
2937 : : ! in the code with zora=0, we still have the legacy
2938 : : ! pawspnorb case to deal with
2939 : : case default
2940 : 2250 : use_soc=.TRUE.; use_sd=.FALSE.; use_fc=.FALSE.
2941 : : end select
2942 : :
2943 : : !write(std_out,'(a,3L4)')'JWZ debug pawdijso use_soc use_sd use_fc : ',&
2944 : : ! & use_soc,use_sd,use_fc
2945 : :
2946 : : !Check data consistency
2947 [ - + ]: 2250 : if (qphase/=1) then
2948 : 0 : msg='qphase=2 not yet available in pawdijso!'
2949 : 0 : LIBPAW_BUG(msg)
2950 : : end if
2951 [ - + ]: 2250 : if (cplex_dij/=2) then
2952 : 0 : msg='cplex_dij must be 2 for spin-orbit coupling!'
2953 : 0 : LIBPAW_BUG(msg)
2954 : : end if
2955 [ - + ]: 2250 : if (ndij/=4) then
2956 : 0 : msg='ndij must be 4 for spin-orbit coupling!'
2957 : 0 : LIBPAW_BUG(msg)
2958 : : end if
2959 [ - + ]: 2250 : if (pawang%use_ls_ylm==0) then
2960 : 0 : msg='pawang%use_ls_ylm should be /=0!'
2961 : 0 : LIBPAW_BUG(msg)
2962 : : end if
2963 [ + - - + ]: 2250 : if (size(dijso,1)/=cplex_dij*qphase*lmn2_size.or.size(dijso,2)/=ndij) then
2964 : 0 : msg='invalid sizes for DijSO!'
2965 : 0 : LIBPAW_BUG(msg)
2966 : : end if
2967 [ + - + - : 2250 : if (size(vh1,1)/=qphase*mesh_size.or.size(vh1,2)<1.or.size(vh1,3)<1) then
- + ]
2968 : 0 : msg='invalid sizes for vh1!'
2969 : 0 : LIBPAW_BUG(msg)
2970 : : end if
2971 : : if (size(vxc1,1)/=qphase*mesh_size.or.size(vxc1,3)/=nspden.or.&
2972 [ + - + + : 2250 : & (size(vxc1,2)/=angl_size.and.pawxcdev==0).or.&
+ - + + -
+ ]
2973 [ + - ]: 2250 : & (size(vxc1,2)/=lm_size.and.pawxcdev/=0)) then
2974 : 0 : msg='invalid sizes for vxc1!'
2975 : 0 : LIBPAW_BUG(msg)
2976 : : end if
2977 [ + - ]: 2250 : if (present(nucdipmom)) then
2978 [ + + + + ]: 8500 : has_nucdipmom = ANY(ABS(nucdipmom(:))>tol8)
2979 : : else
2980 : : has_nucdipmom=.FALSE.
2981 : : end if
2982 : :
2983 : : !------------------------------------------------------------------------
2984 : : !----------- Allocations and initializations
2985 : : !------------------------------------------------------------------------
2986 : :
2987 : : ! classical electron radius \alpha^2
2988 : 2250 : rc=two*HalfFineStruct2
2989 : :
2990 [ - + + - : 6750 : LIBPAW_ALLOCATE(v1,(mesh_size))
+ - + - -
+ - + ]
2991 : 2250 : call pawv1(mesh_size,nspden,pawang,pawxcdev,v1,vh1,vxc1)
2992 : :
2993 [ - + + - : 4500 : LIBPAW_ALLOCATE(dv1dr,(mesh_size))
- + - + ]
2994 : 2250 : call nderiv_gen(dv1dr,v1,pawrad)
2995 : :
2996 [ - + + - : 4500 : LIBPAW_ALLOCATE(zk1,(mesh_size))
- + - + ]
2997 [ - + + + ]: 2609101 : zk1 = one/(one - HalfFineStruct2*v1)
2998 [ - + ]: 2250 : LIBPAW_DEALLOCATE(v1)
2999 : :
3000 [ - + + - : 4500 : LIBPAW_ALLOCATE(dkdr,(mesh_size))
- + - + ]
3001 [ - + + + ]: 2609101 : dkdr = HalfFineStruct2*zk1*zk1*dv1dr
3002 [ - + ]: 2250 : LIBPAW_DEALLOCATE(dv1dr)
3003 : :
3004 : : !! replace v1 potential with -Z/r for distances < r_c, the
3005 : : !! classical electron radius. This is an accurate replacement
3006 : : !! with better analytic properties at r=0.
3007 : 2250 : rt=znuc*rc
3008 : : ! replace k and dk/dr at short range with Coulomb potential version
3009 [ + - ]: 55170 : do ii=1,mesh_size
3010 : 55170 : rr=pawrad%rad(ii)
3011 [ + + ]: 55170 : if (rr>rc) exit
3012 [ + + ]: 55170 : if (rr<tol8) then
3013 : 2250 : zk1(ii)=zero; dkdr(ii)=two/rt
3014 : : else
3015 : 50670 : zk1(ii)=one/(one+rt/(two*rr))
3016 : 50670 : dkdr(ii)=two*rt/(two*rr+rt)**2
3017 : : end if
3018 : : end do
3019 : :
3020 : : !------------------------------------------------------------------------
3021 : : !----- radial integrals
3022 : : !------------------------------------------------------------------------
3023 : :
3024 [ - + + - : 4500 : LIBPAW_ALLOCATE(z_kernel,(mesh_size))
- + - + ]
3025 [ - + + - : 4500 : LIBPAW_ALLOCATE(z_intgd,(mesh_size))
- + - + ]
3026 : :
3027 : : ! spin-orbit kernel
3028 [ + - ]: 2250 : if (use_soc) then
3029 [ - + + - : 6750 : LIBPAW_ALLOCATE(dijso_rad,(ij_size))
+ - + - -
+ - + ]
3030 [ + + ]: 2604601 : z_kernel(2:mesh_size) = dkdr(2:mesh_size)/pawrad%rad(2:mesh_size)
3031 : 2250 : call pawrad_deducer0(z_kernel,mesh_size,pawrad)
3032 [ + + ]: 36609 : do kln=1,ij_size
3033 [ + - - + : 37853507 : z_intgd = z_kernel*pawtab%phiphj(1:mesh_size,kln)
- - + + ]
3034 : 36609 : call simp_gen(dijso_rad(kln),z_intgd,pawrad)
3035 : : end do
3036 [ + + ]: 36609 : dijso_rad(:)=spnorbscl*dijso_rad(:)
3037 : : end if
3038 : :
3039 : : ! nuclear dipole kernels
3040 [ + + ]: 2250 : if (has_nucdipmom) then
3041 [ - + + - : 900 : LIBPAW_ALLOCATE(dijnd_rad,(2,ij_size))
+ - + - -
+ - + ]
3042 [ + + + + ]: 9300 : dijnd_rad(:,:)=zero
3043 : : ! -\alpha^2 K(r)/r^3
3044 [ + + ]: 377000 : z_kernel(2:mesh_size) = -rc*zk1(2:mesh_size)/pawrad%rad(2:mesh_size)**3
3045 : 300 : call pawrad_deducer0(z_kernel,mesh_size,pawrad)
3046 [ + + ]: 3300 : do kln=1,ij_size
3047 [ + - - + : 3776000 : z_intgd = z_kernel*pawtab%phiphj(1:mesh_size,kln)
- - + + ]
3048 : 3300 : call simp_gen(dijnd_rad(1,kln),z_intgd,pawrad)
3049 : : end do
3050 : : ! \alpha^2 K'(r)/r^2
3051 [ + + ]: 377000 : z_kernel(2:mesh_size) = rc*dkdr(2:mesh_size)/pawrad%rad(2:mesh_size)**2
3052 : 300 : call pawrad_deducer0(z_kernel,mesh_size,pawrad)
3053 [ + + ]: 3300 : do kln=1,ij_size
3054 [ + - - + : 3776000 : z_intgd = z_kernel*pawtab%phiphj(1:mesh_size,kln)
- - + + ]
3055 : 3300 : call simp_gen(dijnd_rad(2,kln),z_intgd,pawrad)
3056 : : end do
3057 : : end if ! nuclear dipole radial integrals
3058 : :
3059 [ - + ]: 2250 : LIBPAW_DEALLOCATE(z_kernel)
3060 [ - + ]: 2250 : LIBPAW_DEALLOCATE(z_intgd)
3061 [ - + ]: 2250 : LIBPAW_DEALLOCATE(zk1)
3062 [ - + ]: 2250 : LIBPAW_DEALLOCATE(dkdr)
3063 : :
3064 : : !------------------------------------------------------------------------
3065 : : !----- compute dyadics if necessary
3066 : : !------------------------------------------------------------------------
3067 [ + + ]: 2250 : if (has_nucdipmom) then
3068 : 300 : gs1=size(pawang%gntselect,1)
3069 : 300 : gs2=size(pawang%gntselect,2)
3070 : 300 : ngnt=size(pawang%realgnt)
3071 [ - + + - : 1200 : LIBPAW_ALLOCATE(dyadic,(3,3,gs2,2))
+ - + - +
- - + -
+ ]
3072 : : ! dyadic(:,:,:,1) : (1 - 3\hat{r}\hat{r})
3073 : : ! dyadic(:,:,:,2) : (1 - \hat{r}\hat{r})
3074 : : call make_dyadic(one,three,dyadic(1:3,1:3,1:gs2,1),pawang%gntselect,&
3075 : 300 : gs1,gs2,gs2,ngnt,pawang%realgnt)
3076 : : call make_dyadic(one,one,dyadic(1:3,1:3,1:gs2,2),pawang%gntselect,&
3077 : 300 : gs1,gs2,gs2,ngnt,pawang%realgnt)
3078 : : end if
3079 : :
3080 : : !------------------------------------------------------------------------
3081 : : !----- Loop over density components
3082 : : !------------------------------------------------------------------------
3083 [ + + + + ]: 1867786 : dijso=zero
3084 [ + - ]: 2250 : if (use_soc) then
3085 [ + + ]: 11250 : do idij=1,ndij
3086 : :
3087 : : ! ------------------------------------------------------------------------
3088 : : ! ----- Computation of Dij_so
3089 : : ! ------------------------------------------------------------------------
3090 : 9000 : klmn1=1
3091 [ + + ]: 11250 : if (mod(idij,2)==1) then
3092 : 4500 : ispden=(1+idij)/2
3093 [ + + ]: 468634 : do klmn=1,lmn2_size
3094 [ + + ]: 464134 : if (indklmn(3,klmn)==0) then ! il==jl
3095 : 225386 : klm=indklmn(1,klmn);kln=indklmn(2,klmn)
3096 : 225386 : ilm=indklmn(5,klmn);jlm=indklmn(6,klmn)
3097 [ + + ]: 225386 : fact=dijso_rad(kln);if (ilm>jlm) fact=-fact
3098 : 225386 : dijso(klmn1 ,idij)=fact*pawang%ls_ylm(1,klm,ispden)
3099 : 225386 : dijso(klmn1+1,idij)=fact*pawang%ls_ylm(2,klm,ispden)
3100 : : end if
3101 : 468634 : klmn1=klmn1+cplex_dij
3102 : : end do
3103 [ + + ]: 4500 : else if (idij==2) then
3104 [ + + ]: 234317 : do klmn=1,lmn2_size
3105 [ + + ]: 232067 : if (indklmn(3,klmn)==0) then ! il==jl
3106 : 112693 : dijso(klmn1 ,2)=-dijso(klmn1 ,1)
3107 : 112693 : dijso(klmn1+1,2)=-dijso(klmn1+1,1)
3108 : : end if
3109 : 234317 : klmn1=klmn1+cplex_dij
3110 : : end do
3111 [ + - ]: 2250 : else if (idij==4) then
3112 [ + + ]: 234317 : do klmn=1,lmn2_size
3113 [ + + ]: 232067 : if (indklmn(3,klmn)==0) then ! il==jl
3114 : 112693 : dijso(klmn1 ,4)=-dijso(klmn1 ,3)
3115 : 112693 : dijso(klmn1+1,4)= dijso(klmn1+1,3)
3116 : : end if
3117 : 234317 : klmn1=klmn1+cplex_dij
3118 : : end do
3119 : : end if
3120 : : end do ! ----- End loop over idij
3121 [ - + ]: 2250 : LIBPAW_DEALLOCATE(dijso_rad)
3122 : : end if ! end use_soc condition
3123 : :
3124 : : ! add nucdipmom terms if present
3125 [ + + ]: 2250 : if(has_nucdipmom) then
3126 : : klmn1=1
3127 [ + + ]: 11100 : do klmn=1,lmn2_size
3128 : 10800 : klm=indklmn(1,klmn); kln=indklmn(2,klmn)
3129 [ + + ]: 43200 : do mdir=1,3
3130 [ + + ]: 32400 : if (abs(nucdipmom(mdir))<tol8) cycle
3131 [ + + ]: 54000 : do sdir=1,3
3132 : 32400 : me1=zero;me2=zero
3133 [ + - ]: 32400 : if(use_sd) me1=nucdipmom(mdir)*dijnd_rad(1,kln)*dyadic(mdir,sdir,klm,1)
3134 [ + - ]: 32400 : if(use_fc) me2=nucdipmom(mdir)*dijnd_rad(2,kln)*dyadic(mdir,sdir,klm,2)
3135 : 32400 : sme = half*(me1+me2)
3136 : 32400 : select case(sdir)
3137 : : case(1) !Sx operator
3138 : 10800 : dijso(klmn1,3)=dijso(klmn1,3)+sme
3139 : 10800 : dijso(klmn1,4)=dijso(klmn1,4)+sme
3140 : : case(2) !Sy operator
3141 : 10800 : dijso(klmn1+1,3)=dijso(klmn1+1,3)-sme
3142 : 10800 : dijso(klmn1+1,4)=dijso(klmn1+1,4)+sme
3143 : : case(3) !Sz operator
3144 : 10800 : dijso(klmn1,1)=dijso(klmn1,1)+sme
3145 [ + + + ]: 32400 : dijso(klmn1,2)=dijso(klmn1,2)-sme
3146 : : end select
3147 : : end do ! loop on sdir
3148 : : end do ! loop on mdir
3149 : 11100 : klmn1=klmn1+cplex_dij
3150 : : end do !loop on klmn
3151 [ - + ]: 300 : LIBPAW_DEALLOCATE(dyadic)
3152 [ - + ]: 300 : LIBPAW_DEALLOCATE(dijnd_rad)
3153 : : end if
3154 : :
3155 [ + - ]: 2250 : spinaxis_in = [zero, zero, one]; if (present(spinaxis)) spinaxis_in = spinaxis
3156 : :
3157 [ + - ]: 2250 : if (ndij >= 4) then
3158 : :
3159 : 2250 : call geteuler(spinaxis_in,alpha,beta)
3160 : :
3161 [ + - - + ]: 2250 : if (.not.(abs(alpha) < tol8 .and. abs(beta) < tol8)) then
3162 : :
3163 : 0 : cb2 = cos(half*beta); sb2 = sin(half*beta)
3164 : 0 : em = exp(-j_dpc*half*alpha); ep = conjg(em)
3165 : 0 : U(1,1) = cb2 * em; U(1,2) = -sb2 * em
3166 : 0 : U(2,1) = sb2 * ep; U(2,2) = cb2 * ep
3167 : :
3168 : : ! spinaxis rotation assumes qphase=1
3169 : 0 : klmn1 = 1
3170 [ # # ]: 0 : do klmn = 1, lmn2_size
3171 : :
3172 : 0 : D(1,1) = cmplx(dijso(klmn1,1), dijso(klmn1+1,1), kind=dp)
3173 : 0 : D(2,2) = cmplx(dijso(klmn1,2), dijso(klmn1+1,2), kind=dp)
3174 : 0 : D(1,2) = cmplx(dijso(klmn1,3), dijso(klmn1+1,3), kind=dp)
3175 : 0 : D(2,1) = cmplx(dijso(klmn1,4), dijso(klmn1+1,4), kind=dp)
3176 : :
3177 [ # # # # : 0 : Drot(:,:) = matmul(conjg(transpose(U)), matmul(D(:,:), U))
# # # # #
# # # ]
3178 : :
3179 : 0 : dijso(klmn1,1) = real(Drot(1,1), kind=dp); dijso(klmn1+1,1) = aimag(Drot(1,1))
3180 : 0 : dijso(klmn1,2) = real(Drot(2,2), kind=dp); dijso(klmn1+1,2) = aimag(Drot(2,2))
3181 : 0 : dijso(klmn1,3) = real(Drot(1,2), kind=dp); dijso(klmn1+1,3) = aimag(Drot(1,2))
3182 : 0 : dijso(klmn1,4) = real(Drot(2,1), kind=dp); dijso(klmn1+1,4) = aimag(Drot(2,1))
3183 : :
3184 : 2250 : klmn1 = klmn1 + cplex_dij
3185 : : end do
3186 : : end if
3187 : : end if
3188 : :
3189 [ + - - + : 4500 : end subroutine pawdijso
- + - + ]
3190 : :
3191 : : !!***
3192 : :
3193 : : !----------------------------------------------------------------------
3194 : :
3195 : : !!****f* m_pawdij/pawdiju
3196 : : !! NAME
3197 : : !! pawdiju
3198 : : !!
3199 : : !! FUNCTION
3200 : : !! Compute the DFT+U contribution to the PAW pseudopotential strength Dij,
3201 : : !! (for one atom only):
3202 : : !! Dijpawu^{\sigma}_{mi,ni,mj,nj}=
3203 : : !! \sum_{m,m'} [vpawu^{\sigma}_{m,m'}*phiphjint_{ni,nj}^{m,m'}]=
3204 : : !! [vpawu^{\sigma}_{mi,mj}*phiphjint_{ni,nj}]
3205 : : !!
3206 : : !! INPUTS
3207 : : !! cplex_dij=2 if dij is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
3208 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
3209 : : !! ndij= number of spin components
3210 : : !! nsppol=number of independent spin WF components
3211 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data, for current atom
3212 : : !! vpawu(cplex_dij,lpawu*2+1,lpawu*2+1,ndij)=moments of DFT+U potential for current atom
3213 : : !! --- Optional arguments ---
3214 : : !! atvshift(natvshift,nsppol)=potential energy shift for lm channel & spin (current atom)
3215 : : !! fatvshift=factor that multiplies atvshift
3216 : : !! natvshift=number of atomic potential energy shifts (per atom)
3217 : : !!
3218 : : !! OUTPUT
3219 : : !! dijpawu(cplex_dij*qphase*lmn2_size,ndij)= D_ij^U terms
3220 : : !! When Dij is complex (cplex_dij=2):
3221 : : !! dij(2*i-1,:) contains the real part, dij(2*i,:) contains the imaginary part
3222 : : !! When a exp(-i.q.r) phase is included (qphase=2):
3223 : : !! dij(1:cplex_dij*lmn2_size,:)
3224 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
3225 : : !! dij(cplex_dij*lmn2_size+1:2*cplex_dij*lmn2_size,:)
3226 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
3227 : : !!
3228 : : !! SOURCE
3229 : :
3230 [ - + - + ]: 2694 : subroutine pawdiju(dijpawu,cplex_dij,qphase,ndij,nsppol,pawtab,vpawu,&
3231 [ + + + - : 2694 : & natvshift,atvshift,fatvshift) ! optional arguments
- + ]
3232 : :
3233 : : !Arguments ---------------------------------------------
3234 : : !scalars
3235 : : integer,intent(in) :: cplex_dij,ndij,nsppol,qphase
3236 : : integer,intent(in),optional :: natvshift
3237 : : real(dp),intent(in),optional :: fatvshift
3238 : : !arrays
3239 : : real(dp),intent(out) :: dijpawu(:,:)
3240 : : real(dp),intent(in) :: vpawu(:,:,:,:)
3241 : : real(dp),intent(in),optional :: atvshift(:,:)
3242 : : type(pawtab_type),intent(in) :: pawtab
3243 : :
3244 : : !Local variables ---------------------------------------
3245 : : !scalars
3246 : : integer :: icount,idij,idijeff,idijend,im1,im2,in1,in2,klmn,klmn1,lmax,lmin,lmn2_size
3247 : : integer :: lpawu,natvshift_,nsploop
3248 : : character(len=500) :: msg
3249 : : !arrays
3250 : 2694 : real(dp),allocatable :: coeffpawu(:),dijpawu_idij(:),dijsymU(:,:)
3251 : :
3252 : : ! *************************************************************************
3253 : :
3254 : : !Useful data
3255 : 2694 : lpawu=pawtab%lpawu
3256 : 2694 : lmn2_size=pawtab%lmn2_size
3257 [ + + ]: 2694 : natvshift_=0;if (present(natvshift)) natvshift_=natvshift
3258 : :
3259 : : !Check data consistency
3260 [ - + ]: 2694 : if (qphase/=1) then
3261 : 0 : msg='qphase=2 not available in pawdiju!'
3262 : 0 : LIBPAW_BUG(msg)
3263 : : end if
3264 [ + - - + ]: 2694 : if (size(dijpawu,1)/=cplex_dij*qphase*lmn2_size.or.size(dijpawu,2)/=ndij) then
3265 : 0 : msg='invalid sizes for dijpawu !'
3266 : 0 : LIBPAW_BUG(msg)
3267 : : end if
3268 : : if (size(vpawu,1)/=cplex_dij.or.size(vpawu,2)/=2*lpawu+1.or.&
3269 [ + - + - : 2694 : & size(vpawu,3)/=2*lpawu+1.or.size(vpawu,4)/=ndij) then
+ - - + ]
3270 : 0 : msg='invalid sizes for vpawu !'
3271 : 0 : LIBPAW_BUG(msg)
3272 : : end if
3273 [ + + ]: 2694 : if (natvshift_>0) then
3274 [ - + ]: 528 : if ((.not.present(atvshift)).or.(.not.present(fatvshift))) then
3275 : 0 : msg='when natvshift>0, atvshift and fatvshift arguments must be present !'
3276 : 0 : LIBPAW_BUG(msg)
3277 : : end if
3278 [ + - - + ]: 528 : if (size(atvshift,1)/=natvshift.or.size(atvshift,2)/=nsppol) then
3279 : 0 : msg='invalid sizes for atvshift !'
3280 : 0 : LIBPAW_BUG(msg)
3281 : : end if
3282 : : end if
3283 : :
3284 : : !Init memory
3285 [ + + + + ]: 1516668 : dijpawu=zero
3286 [ - + + - : 8082 : LIBPAW_ALLOCATE(dijpawu_idij,(cplex_dij*lmn2_size))
+ - + - -
+ - + ]
3287 [ - + + - : 8082 : LIBPAW_ALLOCATE(coeffpawu,(cplex_dij))
+ - + - -
+ - + ]
3288 [ + + ]: 2694 : if (ndij==4) then
3289 [ - + + - : 1899 : LIBPAW_ALLOCATE(dijsymU,(cplex_dij*lmn2_size,4))
+ - + - -
+ - + ]
3290 : : end if
3291 : :
3292 : : !Loop over spin components
3293 : : !----------------------------------------------------------
3294 [ + + ]: 2694 : nsploop=nsppol;if (ndij==4) nsploop=4
3295 [ + + ]: 8799 : do idij=1,nsploop
3296 [ + + + - : 6105 : if (idij<=nsppol.or.(ndij==4.and.idij<=3)) then
+ + ]
3297 : :
3298 : 5472 : idijend=idij+idij/3
3299 [ + + ]: 11577 : do idijeff=idij,idijend ! if ndij==4, idijeff is used to compute updn and dnup contributions
3300 : :
3301 [ + + ]: 1482470 : dijpawu_idij=zero
3302 : :
3303 : : ! Loop over (l,m,n) moments
3304 : : ! ----------------------------------------------------------
3305 : : klmn1=1
3306 [ + + ]: 1054166 : do klmn=1,lmn2_size
3307 : 1048061 : im1=pawtab%klmntomn(1,klmn)
3308 : 1048061 : im2=pawtab%klmntomn(2,klmn)
3309 : 1048061 : lmin=pawtab%indklmn(3,klmn)
3310 : 1048061 : lmax=pawtab%indklmn(4,klmn)
3311 : :
3312 : : ! Select l=lpawu
3313 [ + + + + ]: 1048061 : if (lmin==0.and.lmax==2*lpawu) then
3314 : :
3315 : : ! Check consistency
3316 : 276323 : in1=pawtab%klmntomn(3,klmn)
3317 : 276323 : in2=pawtab%klmntomn(4,klmn)
3318 : 276323 : icount=in1+(in2*(in2-1))/2
3319 [ - + ]: 276323 : if (pawtab%ij_proj<icount) then
3320 : 0 : msg='DFT+U: Problem while computing dijexxc !'
3321 : 0 : LIBPAW_BUG(msg)
3322 : : end if
3323 : :
3324 : : ! coeffpawu(:)=vpawu(:,im1,im2,idijeff) ! use real and imaginary part
3325 [ + + ]: 674666 : coeffpawu(:)=vpawu(:,im2,im1,idijeff) ! because of transposition in setnoccmmp (for the cplex_dij==2)
3326 : :
3327 [ + + + + ]: 276323 : if (natvshift_/=0.and.idij<3.and.im1==im2) then
3328 : 12464 : coeffpawu(1)=coeffpawu(1)+fatvshift*atvshift(im1,idij)
3329 : : end if
3330 [ + + ]: 276323 : if (cplex_dij==1) then !cplex_dij=nspinor=1
3331 : 154303 : dijpawu_idij(klmn1)=pawtab%phiphjint(icount)*coeffpawu(1)
3332 [ + - ]: 122020 : elseif (cplex_dij==2) then !cplex_dij=nspinor=2
3333 : 122020 : dijpawu_idij(klmn1 )=pawtab%phiphjint(icount)*coeffpawu(1)
3334 : 122020 : dijpawu_idij(klmn1+1)=pawtab%phiphjint(icount)*coeffpawu(2) ! spinor==2
3335 : : end if
3336 : :
3337 : : end if ! l selection
3338 : 1054166 : klmn1=klmn1+cplex_dij
3339 : : end do ! klmn
3340 : :
3341 [ + + ]: 1482470 : dijpawu(:,idij)=dijpawu_idij(:)
3342 [ + + + + ]: 868818 : if (ndij==4) dijsymU(:,idijeff)=dijpawu_idij(:)
3343 : :
3344 : : end do ! idijeff
3345 : :
3346 : : end if ! idij
3347 : :
3348 [ + + - + ]: 8799 : if (ndij==4.or.cplex_dij==2) then
3349 [ + + ]: 2532 : if (idij<=2) then
3350 : : dijpawu(:,idij)=dijpawu(:,idij)
3351 : : else
3352 [ + + ]: 429570 : dijpawu(:,idij)=dijsymU(:,idij)
3353 : : end if
3354 : : end if
3355 : :
3356 : : !End loop over spin components
3357 : : !----------------------------------------------------------
3358 : : end do
3359 : :
3360 : : !Free temporary memory spaces
3361 [ - + ]: 2694 : LIBPAW_DEALLOCATE(dijpawu_idij)
3362 [ - + ]: 2694 : LIBPAW_DEALLOCATE(coeffpawu)
3363 [ + + ]: 2694 : if (ndij==4) then
3364 [ - + ]: 633 : LIBPAW_DEALLOCATE(dijsymU)
3365 : : end if
3366 : :
3367 [ - + ]: 2694 : end subroutine pawdiju
3368 : : !!***
3369 : :
3370 : : !----------------------------------------------------------------------
3371 : :
3372 : : !!****f* m_pawdij/pawdiju_euijkl
3373 : : !! NAME
3374 : : !! pawdiju_euijkl
3375 : : !!
3376 : : !! FUNCTION
3377 : : !! Compute the DFT+U contribution to the PAW pseudopotential strength Dij (for one atom only).
3378 : : !! Alternative to pawdiju using the following property:
3379 : : !! D_ij^pawu^{\sigma}_{mi,ni,mj,nj}=\sum_{k,l} [rho^{\sigma}_kl*e^U_ijkl]
3380 : : !! The routine structure is similar to pawdijhartree.
3381 : : !!
3382 : : !! INPUTS
3383 : : !! cplex_dij=2 if dij is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
3384 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
3385 : : !! nspden=number of spin density components
3386 : : !! pawrhoij <type(pawrhoij_type)>= paw rhoij occupancies (and related data) for current atom
3387 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data, for current atom
3388 : : !!
3389 : : !! OUTPUT
3390 : : !! diju(cplex_dij*qphase*lmn2_size,ndij)= D_ij^U terms
3391 : : !! diju_im(cplex_dij*qphase*lmn2_size,ndij)= (see below)
3392 : : !! When Dij is complex (cplex_dij=2):
3393 : : !! dij(2*i-1,:) contains the real part, dij(2*i,:) contains the imaginary part
3394 : : !! When a exp(-i.q.r) phase is included (qphase=2):
3395 : : !! dij(1:cplex_dij*lmn2_size,:)
3396 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
3397 : : !! dij(cplex_dij*lmn2_size+1:2*cplex_dij*lmn2_size,:)
3398 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
3399 : : !!
3400 : : !! NOTES
3401 : : !! There are some subtleties :
3402 : : !! Contrary to eijkl, eu_ijkl is not invariant with respect to the permutation of i <--> j or k <--> l.
3403 : : !! Also, we have to deal with spin polarization.
3404 : : !! In the non-collinear magnetism case, the correct expression of Dij^st (s and t being spin indexes) is:
3405 : : !!
3406 : : !! D_kl^st = delta_st sum_ij rho_ij^ss eu_ijkl(1)
3407 : : !! + delta_st sum_ij rho_ij^-s-s eu_ijkl(2)
3408 : : !! + (1-delta_st) sum_ij rho_ij^st eu_ijkl(3)
3409 : : !!
3410 : : !! As only the lower triangular part of the Dij matrix is stored (i<=j), in practice we have:
3411 : : !!
3412 : : !! D_kl^st = delta_st sum_i<=j ( rho_ij^ss eu_ijkl(1) + (1-delta_ij) rho_ji^ss eu_jikl(1) )
3413 : : !! + delta_st sum_i<=j ( rho_ij^-s-s eu_ijkl(2) + (1-delta_ij) rho_ji^-s-s eu_jikl(2) )
3414 : : !! + (1-delta_st) sum_i<=j ( rho_ij^st eu_ijkl(3) + (1-delta_ij) rho_ji^st eu_jikl(3) )
3415 : : !!
3416 : : !! In the following, we will use that: (according to the rules in pawpuxinit.F90)
3417 : : !! (a) eu_ijkl + eu_jikl = eu_ijlk + eu_jilk (invariant when exchanging k <--> l)
3418 : : !! (b) eu_ijkl - eu_jikl = - eu_ijlk + eu_jilk (change of sign when exchanging k <--> l)
3419 : : !! and :
3420 : : !! (c) eu_iikl = eu_iilk (if i=j, invariant when exchanging k <--> l)
3421 : : !! (d) eu_ijkk = eu_jikk (if k=l, invariant when exchanging i <--> j)
3422 : : !!
3423 : : !! qphase=1 (ipert=0 or q=0):
3424 : : !! --------------------------
3425 : : !!
3426 : : !! --- Non-collinear case:
3427 : : !!
3428 : : !! We have:
3429 : : !! rho_ji^st = (rho_ij^ts)^*
3430 : : !! Re(rho_ji^st) = Re(rho_ij^ts)
3431 : : !! Im(rho_ji^st) = -Im(rho_ij^ts)
3432 : : !!
3433 : : !! As eu_ijkl is real one gets:
3434 : : !!
3435 : : !! Re(D_kl^st) = delta_st sum_i<=j Re(rho_ij^ss) ( eu_ijkl(1) + (1-delta_ij) eu_jikl(1) )
3436 : : !! + delta_st sum_i<=j Re(rho_ij^-s-s) ( eu_ijkl(2) + (1-delta_ij) eu_jikl(2) )
3437 : : !! + (1-delta_st) sum_i<=j ( Re(rho_ij^st) eu_ijkl(3) + (1-delta_ij) Re(rho_ij^ts) eu_jikl(3) )
3438 : : !!
3439 : : !! Im(D_kl^st) = delta_st sum_i<=j Im(rho_ij^ss) ( eu_ijkl(1) - (1-delta_ij) eu_jikl(1) )
3440 : : !! + delta_st sum_i<=j Im(rho_ij^-s-s) ( eu_ijkl(2) - (1-delta_ij) eu_jikl(2) )
3441 : : !! + (1-delta_st) sum_i<=j ( Im(rho_ij^st) eu_ijkl(3) - (1-delta_ij) Im(rho_ij^ts) eu_jikl(3) )
3442 : : !!
3443 : : !! --- Collinear case:
3444 : : !!
3445 : : !! Re(D_kl^s) = sum_i<=j Re(rho_ij^s) ( eu_ijkl(1) + (1-delta_ij) eu_jikl(1) )
3446 : : !! + sum_i<=j Re(rho_ij^-s) ( eu_ijkl(2) + (1-delta_ij) eu_jikl(2) )
3447 : : !!
3448 : : !! Im(D_kl^s) = sum_i<=j Im(rho_ij^s) ( eu_ijkl(1) - (1-delta_ij) eu_jikl(1) )
3449 : : !! + sum_i<=j Im(rho_ij^-s) ( eu_ijkl(2) - (1-delta_ij) eu_jikl(2) )
3450 : : !!
3451 : : !! Using (a) and (c) one gets:
3452 : : !! Re(D_kl^s) = Re(D_lk^s)
3453 : : !! Using (b) and (c) one gets:
3454 : : !! Im(D_kl^s) = -Im(D_lk^s)
3455 : : !!
3456 : : !! --- Without magnetism (rho_ij^up = rho_ij^down = 1/2 rho_ij^tot):
3457 : : !!
3458 : : !! Re(D_kl) = 1/2 sum_i<=j Re(rho_ij) ( eu_ijkl(1) + eu_ijkl(2) + (1-delta_ij) ( eu_jikl(1) + euijkl(2) ) )
3459 : : !!
3460 : : !! Im(D_kl) = 1/2 sum_i<=j Im(rho_ij) ( eu_ijkl(1) + eu_ijkl(2) - (1-delta_ij) ( eu_jikl(1) + euijkl(2) ) )
3461 : : !!
3462 : : !! qphase=2 (ipert>0 and q/=0) - no magnetism or collinear:
3463 : : !! -------------------------------------------------------
3464 : : !! We have:
3465 : : !! rho_ji = rhoA_ji + rhoB_ji
3466 : : !! where:
3467 : : !! rhoA_ji = rhoA_ij^*
3468 : : !! rhoB_ji = rhoB_ij
3469 : : !! So:
3470 : : !! D_kl = sum_i<=j ( rho_ij eu_ijkl + (1-delta_ij) (rhoA_ij^* + rhoB_ij) eu_jikl )
3471 : : !! As eu_ijkl is real:
3472 : : !! Re(D_kl) = sum_i<=j Re(rho_ij) ( eu_ijkl + (1-delta_ij) eu_jikl )
3473 : : !! Im(D_kl) = sum_i<=j Im(rhoB_ij) ( eu_ijkl + (1-delta_ij) eu_jikl )
3474 : : !! + sum_i<=j Im(rhoA_ij) ( eu_ijkl - (1-delta_ij) eu_jikl )
3475 : : !! We note:
3476 : : !! Im(D_kl^A) = sum_i<=j Im(rhoA_ij) ( eu_ijkl - (1-delta_ij) eu_jikl )
3477 : : !! Im(D_kl^B) = sum_i<=j Im(rhoB_ij) ( eu_ijkl + (1-delta_ij) eu_jikl )
3478 : : !! We still have:
3479 : : !! Re(D_kl) = Re(D_lk)
3480 : : !! but:
3481 : : !! Im(D_kl^A) = -Im(D_lk^A) ( using (b) and (c) )
3482 : : !! Im(D_kl^B) = Im(D_lk^B) ( using (a) and (c) )
3483 : : !!
3484 : : !! SOURCE
3485 : :
3486 [ - + ]: 472 : subroutine pawdiju_euijkl(diju,cplex_dij,qphase,ndij,pawrhoij,pawtab)
3487 : :
3488 : : !Arguments ---------------------------------------------
3489 : : !scalars
3490 : : integer,intent(in) :: cplex_dij,ndij,qphase
3491 : : !arrays
3492 : : real(dp),intent(out) :: diju(:,:)
3493 : : type(pawrhoij_type),intent(in) :: pawrhoij
3494 : : type(pawtab_type),intent(in) :: pawtab
3495 : :
3496 : : !Local variables ---------------------------------------
3497 : : !scalars
3498 : : integer :: cplex_rhoij,iq,iq0_dij,iq0_rhoij,ilmn,ilmnp,irhoij,j0lmnp,jlmn,jlmnp,jrhoij,select_euijkl
3499 : : integer :: klmn,klmnp,klmn1,lmn2_size,max_euijkl,min_euijkl,sig1,sig2,sig2p
3500 : : logical :: compute_im
3501 : : character(len=500) :: msg
3502 : : !arrays
3503 : 944 : real(dp) :: ro(2,ndij),euijkl_temp(3,2)
3504 : :
3505 : : ! *************************************************************************
3506 : :
3507 : : !Check data consistency
3508 : 472 : lmn2_size=pawrhoij%lmn2_size
3509 [ + - - + ]: 472 : if (size(diju,1)/=qphase*cplex_dij*lmn2_size.or.size(diju,2)/=ndij) then
3510 : 0 : msg='invalid sizes for diju!'
3511 : 0 : LIBPAW_BUG(msg)
3512 : : end if
3513 [ - + ]: 472 : if (pawrhoij%qphase<qphase) then
3514 : 0 : msg='pawrhoij%qphase must be >=qphase!'
3515 : 0 : LIBPAW_BUG(msg)
3516 : : end if
3517 [ - + ]: 472 : if (ndij/=pawrhoij%nspden) then
3518 : 0 : msg='pawrhoij%nspden must be equal to ndij!'
3519 : 0 : LIBPAW_BUG(msg)
3520 : : end if
3521 : :
3522 : : !Initialization
3523 [ + + + + ]: 247216 : diju=zero
3524 : 472 : cplex_rhoij=pawrhoij%cplex_rhoij
3525 : 472 : compute_im=(cplex_dij==2)
3526 : :
3527 : : !Loop over spin-components (Dij)
3528 [ + + ]: 1590 : do sig1=1,ndij
3529 : :
3530 [ + + ]: 1118 : if (sig1<=2) then
3531 : : min_euijkl = 1
3532 : : max_euijkl = 2
3533 : : else
3534 : 264 : min_euijkl = 3
3535 : 264 : max_euijkl = 3
3536 : : end if
3537 : :
3538 : : !Loop over phase exp(iqr) phase real/imaginary part
3539 [ + + ]: 2708 : do iq=1,qphase
3540 : : !First loop: we store the real part in dij(1 -> lmn2_size)
3541 : : !2nd loop: we store the imaginary part in dij(lmn2_size+1 -> 2*lmn2_size)
3542 [ - + ]: 1118 : iq0_dij=merge(0,cplex_dij*lmn2_size,iq==1)
3543 : 0 : iq0_rhoij=merge(0,cplex_rhoij*lmn2_size,iq==1)
3544 : :
3545 : : !Loop over rhoij elements
3546 : 1118 : jrhoij=iq0_rhoij+1
3547 [ + + ]: 108368 : do irhoij=1,pawrhoij%nrhoijsel
3548 : 106132 : klmn=pawrhoij%rhoijselect(irhoij)
3549 : 106132 : ilmn=pawtab%indklmn(7,klmn)
3550 : 106132 : jlmn=pawtab%indklmn(8,klmn)
3551 : :
3552 : : !Storage of rhoij in ro (with a change of representation if nspinor=2)
3553 [ + + ]: 106132 : if (ndij==1) then ! rho_up = rho_down = 1/2 rho_tot
3554 [ + + ]: 4356 : ro(1:cplex_rhoij,1)=half*pawrhoij%rhoijp(jrhoij:jrhoij+cplex_rhoij-1,1)
3555 [ + + ]: 103954 : else if (ndij==2) then
3556 [ + + ]: 76542 : do sig2=1,ndij
3557 [ + + ]: 127570 : ro(1:cplex_rhoij,sig2)=pawrhoij%rhoijp(jrhoij:jrhoij+cplex_rhoij-1,sig2)
3558 : : end do
3559 : : else ! ndij=4
3560 : : !up up = 1/2 ( tot + z )
3561 [ + + ]: 235320 : ro(1:cplex_rhoij,1)=half*(pawrhoij%rhoijp(jrhoij:jrhoij+cplex_rhoij-1,1)+pawrhoij%rhoijp(jrhoij:jrhoij+cplex_rhoij-1,4))
3562 : : !down down = 1/2 ( tot - z )
3563 [ + + ]: 235320 : ro(1:cplex_rhoij,2)=half*(pawrhoij%rhoijp(jrhoij:jrhoij+cplex_rhoij-1,1)-pawrhoij%rhoijp(jrhoij:jrhoij+cplex_rhoij-1,4))
3564 [ - + - - ]: 78440 : if (cplex_rhoij==1) ro(2,1:2) = zero
3565 : : !up down = 1/2 ( x - i y )
3566 : 78440 : ro(1,3)= half*pawrhoij%rhoijp(jrhoij,2)
3567 : 78440 : ro(2,3)=-half*pawrhoij%rhoijp(jrhoij,3)
3568 [ + - ]: 78440 : if (cplex_rhoij==2) then
3569 : 78440 : ro(1,3)=ro(1,3)+half*pawrhoij%rhoijp(jrhoij+1,3)
3570 : 78440 : ro(2,3)=ro(2,3)+half*pawrhoij%rhoijp(jrhoij+1,2)
3571 : : end if
3572 : : !down up = 1/2 ( x + i y )
3573 : 78440 : ro(1,4)=half*pawrhoij%rhoijp(jrhoij,2)
3574 : 78440 : ro(2,4)=half*pawrhoij%rhoijp(jrhoij,3)
3575 [ - + ]: 78440 : if (cplex_rhoij==2) then
3576 : 78440 : ro(1,4)=ro(1,4)-half*pawrhoij%rhoijp(jrhoij+1,3)
3577 : 78440 : ro(2,4)=ro(2,4)+half*pawrhoij%rhoijp(jrhoij+1,2)
3578 : : end if
3579 : : end if
3580 : :
3581 [ + + ]: 1886848 : do jlmnp=1,pawtab%lmn_size
3582 : 1780716 : j0lmnp=jlmnp*(jlmnp-1)/2
3583 [ + + ]: 17960860 : do ilmnp=1,jlmnp
3584 : 16074012 : klmnp=j0lmnp+ilmnp
3585 : 16074012 : klmn1=iq0_dij+cplex_dij*(klmnp-1)+1
3586 : :
3587 [ + + ]: 64296048 : euijkl_temp(:,1) = pawtab%euijkl(:,ilmn,jlmn,ilmnp,jlmnp)
3588 [ + + ]: 64296048 : euijkl_temp(:,2) = pawtab%euijkl(:,jlmn,ilmn,ilmnp,jlmnp)
3589 : :
3590 : : !Loop over spin-components (rhoij)
3591 [ + + ]: 43503172 : do select_euijkl=min_euijkl,max_euijkl
3592 [ + + ]: 25648444 : if (sig1<=2) then ! up/up and down/down Dij components
3593 [ + + ]: 19148864 : if (ndij==1) then
3594 : : sig2=1
3595 : : else
3596 [ + + ]: 18403988 : if (select_euijkl==1) then ! Diagonal part of the spin matrix
3597 : : sig2=sig1
3598 [ + - ]: 9201994 : else if (select_euijkl==2) then ! Non-diagonal part
3599 [ + + ]: 9201994 : if (sig1==1) sig2=2
3600 : 5345873 : if (sig1==2) sig2=1
3601 : : end if
3602 : : end if
3603 : : sig2p = sig2
3604 : : else ! select_euijkl = 3
3605 : 6499580 : sig2 = sig1
3606 [ + + ]: 6499580 : if (sig1==3) sig2p=4
3607 [ + - ]: 3249790 : if (sig1==4) sig2p=3
3608 : : end if
3609 : : !Re(D_kl) = sum_i<=j Re(rho_ij) ( eu_ijlk + (1-delta_ij) eu_jilk ) = Re(D_lk)
3610 : 25648444 : diju(klmn1,sig1)=diju(klmn1,sig1)+ro(1,sig2)*euijkl_temp(select_euijkl,1)
3611 [ + + ]: 25648444 : if (ilmn/=jlmn) then
3612 : 21466134 : diju(klmn1,sig1)=diju(klmn1,sig1)+ro(1,sig2p)*euijkl_temp(select_euijkl,2)
3613 : : end if
3614 : : !Im(D_kl) = sum_i<=j Im(rho_ij) ( eu_ijlk - (1-delta_ij) eu_jilk ) = -Im(D_lk)
3615 [ + + ]: 41722456 : if (compute_im) then
3616 : 19498740 : diju(klmn1+1,sig1)=diju(klmn1+1,sig1)+ro(2,sig2)*euijkl_temp(select_euijkl,1)
3617 [ + + ]: 19498740 : if (ilmn/=jlmn) then
3618 : 17278992 : diju(klmn1+1,sig1)=diju(klmn1+1,sig1)-ro(2,sig2p)*euijkl_temp(select_euijkl,2)
3619 : : end if
3620 : : end if
3621 : : end do
3622 : :
3623 : : end do
3624 : : end do ! k,l
3625 : :
3626 : 107250 : jrhoij=jrhoij+cplex_rhoij
3627 : : end do ! i,j
3628 : :
3629 : : end do ! q phase
3630 : :
3631 : : end do !sig1
3632 : :
3633 : 472 : end subroutine pawdiju_euijkl
3634 : : !!***
3635 : :
3636 : : !----------------------------------------------------------------------
3637 : :
3638 : : !!****f* m_pawdij/pawdijexxc
3639 : : !! NAME
3640 : : !! pawdijexxc
3641 : : !!
3642 : : !! FUNCTION
3643 : : !! Compute the local Exact-Exchange contribution to the PAW pseudopotential strength Dij,
3644 : : !! using a potential expressed as (l,m) spherical moments
3645 : : !! (for one atom only; only for correlated electrons):
3646 : : !! D_ij^EXXC= < Phi_i|alpha*(VFock(correlated)-Vxc(n1_correlated)|Phi_j>
3647 : : !!
3648 : : !! INPUTS
3649 : : !! cplex_dij=2 if dij is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
3650 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
3651 : : !! lmselect(lm_size)=select the non-zero LM-moments of on-site potentials
3652 : : !! ndij= number of spin components
3653 : : !! nsppol=number of independent spin WF components
3654 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
3655 : : !! pawrad <type(pawrad_type)>=paw radial mesh and related data, for current atom
3656 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data, for current atom
3657 : : !! vpawx(1,lmn2_size,ndij)=moments of exact exchange potential
3658 : : !! for current atom and for correlated electrons
3659 : : !! vxc_ex(qphase*mesh_size,lm_size,nspden)=all-electron on-site XC potential for current atom
3660 : : !! taken into account only valence correlated electrons
3661 : : !!
3662 : : !! OUTPUT
3663 : : !! dijexxc(cplex_dij*lmn2_size,ndij)= D_ij^Exact-Exchange terms
3664 : : !! When Dij is complex (cplex_dij=2):
3665 : : !! dij(2*i-1,:) contains the real part, dij(2*i,:) contains the imaginary part
3666 : : !! When a exp(-i.q.r) phase is included (qphase=2):
3667 : : !! dij(1:cplex_dij*lmn2_size,:)
3668 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
3669 : : !! dij(cplex_dij*lmn2_size+1:2*cplex_dij*lmn2_size,:)
3670 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
3671 : : !!
3672 : : !! SOURCE
3673 : :
3674 [ - + - + ]: 42 : subroutine pawdijexxc(dijexxc,cplex_dij,qphase,lmselect,ndij,nspden,nsppol,&
3675 [ - + - + ]: 42 : & pawang,pawrad,pawtab,vpawx,vxc_ex)
3676 : :
3677 : : !Arguments ---------------------------------------------
3678 : : !scalars
3679 : : integer,intent(in) :: cplex_dij,ndij,nspden,nsppol,qphase
3680 : : type(pawang_type),intent(in) :: pawang
3681 : : !arrays
3682 : : logical :: lmselect(:)
3683 : : real(dp),intent(in) :: vpawx(:,:,:),vxc_ex(:,:,:)
3684 : : real(dp),intent(out) :: dijexxc(:,:)
3685 : : type(pawrad_type),intent(in) :: pawrad
3686 : : type(pawtab_type),intent(in) :: pawtab
3687 : :
3688 : : !Local variables ---------------------------------------
3689 : : !scalars
3690 : : integer :: icount,idij,idijend,ij_size,iln,in1,in2,ir,ir1,isel,ispden,ivxc
3691 : : integer :: jln,j0ln,klm,klm1,klmn,klmn1,klmn2,kln,lexexch,ln_min,ln_max,lmax,lmin
3692 : : integer :: lm_size,lmn2_size,mesh_size,nsploop
3693 : : character(len=500) :: msg
3694 : : !arrays
3695 : 42 : real(dp),allocatable :: dijexxc_idij(:),ff(:),gg(:),vxcij1(:)
3696 : :
3697 : : ! *************************************************************************
3698 : :
3699 : : !Useful data
3700 : 42 : lm_size=pawtab%lcut_size**2
3701 : 42 : lmn2_size=pawtab%lmn2_size
3702 : 42 : ij_size=pawtab%ij_size
3703 : 42 : mesh_size=pawtab%mesh_size
3704 : 42 : lexexch=pawtab%lexexch
3705 : 42 : ln_min=pawtab%lnproju(1)
3706 : 42 : ln_max=pawtab%lnproju(pawtab%nproju)
3707 : :
3708 : : !Check data consistency
3709 [ - + ]: 42 : if (qphase==2) then
3710 : 0 : msg='pawdijexx not available for qphase=2!'
3711 : 0 : LIBPAW_BUG(msg)
3712 : : end if
3713 [ + - - + ]: 42 : if (size(dijexxc,1)/=cplex_dij*qphase*lmn2_size.or.size(dijexxc,2)/=ndij) then
3714 : 0 : msg='invalid sizes for dijexxc!'
3715 : 0 : LIBPAW_BUG(msg)
3716 : : end if
3717 [ - + ]: 42 : if (size(lmselect)/=lm_size) then
3718 : 0 : msg='invalid size for lmselect!'
3719 : 0 : LIBPAW_BUG(msg)
3720 : : end if
3721 [ + - + - : 42 : if (size(vxc_ex,1)/=qphase*mesh_size.or.size(vxc_ex,2)/=lm_size.or.&
- + ]
3722 : : & size(vxc_ex,3)/=nspden) then
3723 : 0 : msg='invalid sizes for vxc_ex!'
3724 : 0 : LIBPAW_BUG(msg)
3725 : : end if
3726 [ + - + - : 42 : if (size(vpawx,1)/=1.or.size(vpawx,2)/=lmn2_size.or.&
- + ]
3727 : : & size(vpawx,3)/=ndij) then
3728 : 0 : msg='invalid sizes for vpawx!'
3729 : 0 : LIBPAW_BUG(msg)
3730 : : end if
3731 : :
3732 : : !Init memory
3733 [ + + + + ]: 14490 : dijexxc=zero
3734 [ - + + - : 126 : LIBPAW_ALLOCATE(dijexxc_idij,(qphase*lmn2_size))
+ - + - -
+ - + ]
3735 [ - + + - : 126 : LIBPAW_ALLOCATE(vxcij1,(qphase*ij_size))
+ - + - -
+ - + ]
3736 [ - + + - : 126 : LIBPAW_ALLOCATE(ff,(mesh_size))
+ - + - -
+ - + ]
3737 [ - + + - : 84 : LIBPAW_ALLOCATE(gg,(mesh_size))
- + - + ]
3738 : :
3739 : : !----------------------------------------------------------
3740 : : !Loop over spin components
3741 : : !----------------------------------------------------------
3742 [ - + ]: 42 : nsploop=nsppol;if (ndij==4) nsploop=4
3743 [ + + ]: 84 : do idij=1,nsploop
3744 : :
3745 [ - + - - : 84 : if (idij<=nsppol.or.(ndij==4.and.idij<=3)) then
- - ]
3746 : :
3747 : 42 : idijend=idij+idij/3
3748 [ + + ]: 84 : do ispden=idij,idijend
3749 : :
3750 [ + + ]: 7224 : dijexxc_idij=zero
3751 : :
3752 : 42 : ivxc=ispden
3753 : : !Take into account nspden=1/nspinor=2 case
3754 [ + - - - ]: 42 : if (ndij/=nspden.and.ispden==2) ivxc=1
3755 [ - + - - ]: 42 : if (ndij/=nspden.and.ispden> 2) cycle
3756 : :
3757 : : ! ----------------------------------------------------------
3758 : : ! Summing over (l,m) moments
3759 : : ! ----------------------------------------------------------
3760 [ + + ]: 1092 : do klm=1,lm_size
3761 [ + + ]: 1092 : if (lmselect(klm)) then
3762 : :
3763 : : ! ===== Vxc_ij_1 (tmp) =====
3764 [ + + ]: 13420 : vxcij1=zero
3765 [ - + ]: 610 : if (qphase==1) then
3766 [ + + ]: 1830 : do jln=ln_min,ln_max
3767 : 1220 : j0ln=jln*(jln-1)/2
3768 [ + + ]: 3660 : do iln=ln_min,jln
3769 : 1830 : kln=j0ln+iln
3770 : : ff(1:mesh_size)= &
3771 [ + + ]: 1978230 : & vxc_ex(1:mesh_size,klm,ivxc)*pawtab%phiphj(1:mesh_size,kln)
3772 : 3050 : call simp_gen(vxcij1(kln),ff,pawrad)
3773 : : end do
3774 : : end do
3775 : : else
3776 [ # # ]: 0 : do jln=ln_min,ln_max
3777 : 0 : j0ln=jln*(jln-1)/2
3778 [ # # ]: 0 : do iln=ln_min,jln
3779 : 0 : kln=j0ln+iln
3780 [ # # ]: 0 : do ir=1,mesh_size
3781 : 0 : ir1=2*ir
3782 : : ff(ir)= &
3783 : 0 : & vxc_ex(ir1-1,klm,ivxc)*pawtab%phiphj(ir,kln)
3784 : : gg(ir)= &
3785 : 0 : & vxc_ex(ir1,klm,ivxc)*pawtab%phiphj(ir,kln)
3786 : : end do
3787 : 0 : call simp_gen(vxcij1(2*kln-1),ff,pawrad)
3788 : 0 : call simp_gen(vxcij1(2*kln ),gg,pawrad)
3789 : : end do
3790 : : end do
3791 : : end if
3792 : :
3793 : : ! ===== Accumulate Vxc_ij_1 over klm moments =====
3794 [ - + ]: 610 : if (qphase==1) then
3795 [ + + ]: 104920 : do klmn=1,lmn2_size
3796 : 104310 : lmin=pawtab%indklmn(3,klmn)
3797 : 104310 : lmax=pawtab%indklmn(4,klmn)
3798 [ + + + + ]: 104920 : if (lmin==0.and.lmax==2*lexexch) then
3799 : 33550 : klm1=pawtab%indklmn(1,klmn)
3800 : 33550 : kln=pawtab%indklmn(2,klmn)
3801 : 33550 : isel=pawang%gntselect(klm,klm1)
3802 [ + + ]: 33550 : if (isel>0) dijexxc_idij(klmn)=dijexxc_idij(klmn) &
3803 : 6350 : & +vxcij1(kln)*pawang%realgnt(isel)
3804 : : end if
3805 : : end do ! Loop klmn
3806 : : else ! qphase==2
3807 : : klmn1=1
3808 [ # # ]: 0 : do klmn=1,lmn2_size
3809 : 0 : lmin=pawtab%indklmn(3,klmn)
3810 : 0 : lmax=pawtab%indklmn(4,klmn)
3811 [ # # # # ]: 0 : if (lmin==0.and.lmax==2*lexexch) then
3812 : 0 : klm1=pawtab%indklmn(1,klmn)
3813 : 0 : kln=pawtab%indklmn(2,klmn)
3814 : 0 : isel=pawang%gntselect(klm,klm1)
3815 [ # # ]: 0 : if (isel>0) then
3816 : : dijexxc_idij(klmn1 )=dijexxc_idij(klmn1) &
3817 : 0 : & +vxcij1(2*kln-1)*pawang%realgnt(isel)
3818 : : dijexxc_idij(klmn1+1)=dijexxc_idij(klmn1+1) &
3819 : 0 : & +vxcij1(2*kln )*pawang%realgnt(isel)
3820 : : end if
3821 : : end if
3822 : 0 : klmn1=klmn1+qphase
3823 : : end do ! Loop klmn
3824 : : end if
3825 : :
3826 : : end if ! lmselect
3827 : : end do ! Loop klm
3828 : :
3829 : : ! Mix Hartree and GGA terms
3830 [ - + ]: 42 : if (qphase==1) then
3831 [ + + ]: 7224 : do klmn=1,lmn2_size
3832 : 7182 : lmin=pawtab%indklmn(3,klmn)
3833 : 7182 : lmax=pawtab%indklmn(4,klmn)
3834 [ + + + + ]: 7224 : if (lmin==0.and.lmax==2*lexexch) then
3835 : 2310 : in1=pawtab%klmntomn(3,klmn)
3836 : 2310 : in2=pawtab%klmntomn(4,klmn)
3837 : 2310 : icount=in1+(in2*(in2-1))/2
3838 [ - + ]: 2310 : if(pawtab%ij_proj<icount) then
3839 : 0 : msg='PAW local exact-exchange: Problem while computing dijexxc !'
3840 : 0 : LIBPAW_BUG(msg)
3841 : : end if
3842 : : dijexxc_idij(klmn)=pawtab%exchmix &
3843 : 2310 : & *(vpawx(1,klmn,idij)-dijexxc_idij(klmn))
3844 : : end if
3845 : : end do
3846 : : else ! qphase=2
3847 : : klmn1=1
3848 [ # # ]: 0 : do klmn=1,lmn2_size
3849 : 0 : lmin=pawtab%indklmn(3,klmn)
3850 : 0 : lmax=pawtab%indklmn(4,klmn)
3851 [ # # # # ]: 0 : if (lmin==0.and.lmax==2*lexexch) then
3852 : 0 : in1=pawtab%klmntomn(3,klmn)
3853 : 0 : in2=pawtab%klmntomn(4,klmn)
3854 : 0 : icount=in1+(in2*(in2-1))/2
3855 [ # # ]: 0 : if(pawtab%ij_proj<icount) then
3856 : 0 : msg='PAW local exact-exchange: Problem while computing dijexxc !'
3857 : 0 : LIBPAW_BUG(msg)
3858 : : end if
3859 : : dijexxc_idij(klmn1) =pawtab%exchmix &
3860 : 0 : & *(vpawx(1,klmn,idij)-dijexxc_idij(klmn1))
3861 : : dijexxc_idij(klmn1+1)=pawtab%exchmix &
3862 : 0 : & *(vpawx(1,klmn,idij)-dijexxc_idij(klmn1+1))
3863 : : end if
3864 : 0 : klmn1=klmn1+qphase
3865 : : end do ! Loop klmn
3866 : : end if
3867 : :
3868 : : ! ----------------------------------------------------------
3869 : : ! Deduce some part of Dij according to symmetries
3870 : : ! ----------------------------------------------------------
3871 : :
3872 : : !if ispden=1 => real part of D^11_ij
3873 : : !if ispden=2 => real part of D^22_ij
3874 : : !if ispden=3 => real part of D^12_ij
3875 : : !if ispden=4 => imaginary part of D^12_ij
3876 : 42 : klmn1=max(1,ispden-2);klmn2=1
3877 [ + + ]: 7224 : do klmn=1,lmn2_size
3878 : 7182 : dijexxc(klmn1,idij)=dijexxc_idij(klmn2)
3879 : 7182 : klmn1=klmn1+cplex_dij
3880 : 7224 : klmn2=klmn2+qphase
3881 : : end do
3882 [ - + ]: 84 : if (qphase==2) then
3883 : : !Same storage with exp^(-i.q.r) phase
3884 : 0 : klmn1=max(1,ispden-2)+lmn2_size*cplex_dij;klmn2=2
3885 [ # # ]: 0 : do klmn=1,lmn2_size
3886 : 0 : dijexxc(klmn1,idij)=dijexxc_idij(klmn2)
3887 : 0 : klmn1=klmn1+cplex_dij
3888 : 0 : klmn2=klmn2+qphase
3889 : : end do
3890 : : endif
3891 : :
3892 : : end do !ispden
3893 : :
3894 : : !Non-collinear: D_ij(:,4)=D^21_ij=D^12_ij^*
3895 [ # # # # ]: 0 : else if (nspden==4.and.idij==4) then
3896 [ # # ]: 0 : dijexxc(:,idij)=dijexxc(:,idij-1)
3897 [ # # ]: 0 : if (cplex_dij==2) then
3898 [ # # ]: 0 : do klmn=2,lmn2_size*cplex_dij,cplex_dij
3899 [ # # ]: 0 : dijexxc(klmn,idij)=-dijexxc(klmn,idij)
3900 : : end do
3901 [ # # ]: 0 : if (qphase==2) then
3902 [ # # ]: 0 : do klmn=2+lmn2_size*cplex_dij,2*lmn2_size*cplex_dij,cplex_dij
3903 [ # # ]: 0 : dijexxc(klmn,idij)=-dijexxc(klmn,idij)
3904 : : end do
3905 : : end if
3906 : : end if
3907 : :
3908 : : !Antiferro: D_ij(:,2)=D^down_ij=D^up_ij
3909 [ # # # # ]: 0 : else if (nsppol==1.and.idij==2) then
3910 [ # # ]: 0 : dijexxc(:,idij)=dijexxc(:,idij-1)
3911 : : end if
3912 : :
3913 : : !----------------------------------------------------------
3914 : : !End loop on spin density components
3915 : : end do
3916 : :
3917 : : !Free temporary memory spaces
3918 [ - + ]: 42 : LIBPAW_DEALLOCATE(dijexxc_idij)
3919 [ - + ]: 42 : LIBPAW_DEALLOCATE(vxcij1)
3920 [ - + ]: 42 : LIBPAW_DEALLOCATE(ff)
3921 [ - + ]: 42 : LIBPAW_DEALLOCATE(gg)
3922 : :
3923 : 42 : end subroutine pawdijexxc
3924 : : !!***
3925 : :
3926 : : !----------------------------------------------------------------------
3927 : :
3928 : : !!****f* m_pawdij/pawdijfr
3929 : : !!
3930 : : !! NAME
3931 : : !! pawdijfr
3932 : : !!
3933 : : !! FUNCTION
3934 : : !! PAW, Response Function only:
3935 : : !! Compute frozen part of psp strength Dij due to 1st-order compensation density
3936 : : !! and first order local potential:
3937 : : !! Dijfr =Int_R^3{vtrial*Sum_LM[Q_ij_q^LM^(1)] + Vloc^(1)*Sum_LM[Q_ij_q^LM]}
3938 : : !! Depends on q wave vector but not on first-order wave-function.
3939 : : !!
3940 : : !! INPUTS
3941 : : !! gprimd(3,3)=dimensional primitive translations for reciprocal space
3942 : : !! idir=direction of atomic displacement (in case of phonons perturb.)
3943 : : !! ipert=index of perturbation
3944 : : !! mpi_atmtab(:)=--optional-- indexes of the atoms treated by current proc
3945 : : !! comm_atom=--optional-- MPI communicator over atoms
3946 : : !! mpi_comm_grid=--optional-- MPI communicator over real space grid components
3947 : : !! my_natom=number of atoms treated by current processor
3948 : : !! natom=total number of atoms in cell
3949 : : !! nfft=(effective) number of FFT grid points (for this processor)
3950 : : !! nspden=number of spin-density components
3951 : : !! nsppol=number of independent spin WF components
3952 : : !! ntypat=number of types of atoms
3953 : : !! option=0: computes full frozen part of Dij
3954 : : !! 1: computes frozen part of Dij without contribution from Vpsp1
3955 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
3956 : : !! pawfgrtab(my_natom) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid
3957 : : !! pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
3958 : : !! pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
3959 : : !! qphase=2 if dij contains a exp(-i.q.r) phase (as in the q<>0 RF case), 1 if not
3960 : : !! qphon(3)=wavevector of the phonon
3961 : : !! rprimd(3,3)=dimensional primitive translations for real space
3962 : : !! ucvol=unit cell volume (bohr^3)
3963 : : !! vpsp1(qphase*nfft)= first-order change of local potential
3964 : : !! vtrial(nfft,nspden)= total GS potential
3965 : : !! vxc(nfft,nspden)=XC potential
3966 : : !! xred(3,my_natom)= reduced atomic coordinates
3967 : : !!
3968 : : !! OUTPUT
3969 : : !! paw_ij1(iatom)%dijfr(cplex_dij*qphase*lmn2_size,nspden)=
3970 : : !! frozen contribution to psp strength Dij
3971 : : !! =Int_R^3{vtrial*Sum_LM[Q_ij_q^LM^(1)] + Vloc^(1)*Sum_LM[Q_ij_q^LM]}
3972 : : !! When Dij is complex (cplex_dij=2):
3973 : : !! dij(2*i-1,:) contains the real part, dij(2*i,:) contains the imaginary part
3974 : : !! When a exp(-i.q.r) phase is included (qphase=2):
3975 : : !! dij(1:cplex_dij*lmn2_size,:)
3976 : : !! contains the real part of the phase, i.e. D_ij*cos(q.r)
3977 : : !! dij(cplex_dij*lmn2_size+1:2*cplex_dij*lmn2_size,:)
3978 : : !! contains the imaginary part of the phase, i.e. D_ij*sin(q.r)
3979 : : !!
3980 : : !! SOURCE
3981 : :
3982 : 4005 : subroutine pawdijfr(gprimd,idir,ipert,my_natom,natom,nfft,ngfft,nspden,nsppol,ntypat,&
3983 : 4005 : & option,paw_ij1,pawang,pawfgrtab,pawrad,pawtab,qphase,qphon,rprimd,ucvol,&
3984 : 4005 : & vpsp1,vtrial,vxc,xred,&
3985 [ + - + + : 4005 : & mpi_atmtab,comm_atom,mpi_comm_grid) ! optional arguments (parallelism)
- + ]
3986 : :
3987 : : !Arguments ------------------------------------
3988 : : !scalars
3989 : : integer,intent(in) :: idir,ipert,my_natom,natom,nfft,nspden,nsppol,ntypat,option,qphase
3990 : : integer,optional,intent(in) :: comm_atom,mpi_comm_grid
3991 : : real(dp),intent(in) :: ucvol
3992 : : type(pawang_type),intent(in) :: pawang
3993 : : !arrays
3994 : : integer,intent(in) :: ngfft(18)
3995 : : integer,optional,target,intent(in) :: mpi_atmtab(:)
3996 : : real(dp),intent(in) :: gprimd(3,3),qphon(3),rprimd(3,3)
3997 : : real(dp),intent(in) :: vpsp1(qphase*nfft),vtrial(nfft,nspden),vxc(nfft,nspden)
3998 : : real(dp),intent(in) :: xred(3,natom)
3999 : : type(paw_ij_type),intent(inout) :: paw_ij1(my_natom)
4000 : : type(pawfgrtab_type),intent(inout) :: pawfgrtab(my_natom)
4001 : : type(pawrad_type),intent(in) :: pawrad(ntypat)
4002 : : type(pawtab_type),intent(in) :: pawtab(ntypat)
4003 : :
4004 : : !Local variables-------------------------------
4005 : : !scalars
4006 : : integer :: cplex_dij,cplex_nspden,cplex_p1,iatom,iatom_tot,ic,idij,idijend,ier,ils,ilslm,isel
4007 : : integer :: ispden,istr,itypat,jc,klm,klmn,klmn1,klmn2,kln,lm_size,lmn2_size,lm0,lmax,lmin,mesh_size
4008 : : integer :: mm,my_comm_atom,my_comm_grid,mu,mua,mub,ndij,nfftot,nfgd,nsploop
4009 : : integer :: optgr0,optgr1,optgr2,usexcnhat
4010 : : logical :: has_qphase,my_atmtab_allocated,need_dijfr_1,need_dijfr_2,need_dijfr_3,need_dijfr_4
4011 : : logical :: paral_atom,qne0,testdij1,testdij2,testdij3
4012 : : real(dp) :: c1,fact,intg,rg1
4013 : : character(len=500) :: msg
4014 : : !arrays
4015 : : integer,parameter :: m_index(3)=(/1,-1,0/)
4016 : 4005 : integer,pointer :: my_atmtab(:)
4017 : : integer,parameter :: alpha(9)=(/1,2,3,3,3,2,2,1,1/),beta(9)=(/1,2,3,2,1,1,3,3,2/)
4018 : : real(dp) :: contrib(2)
4019 : 4005 : real(dp),allocatable :: ff(:),intv(:,:),intv1(:,:),intv2(:,:),intvloc(:,:),intv_tmp(:,:)
4020 : 4005 : real(dp),allocatable :: rg(:),vloc(:,:)
4021 : :
4022 : : ! *************************************************************************
4023 : :
4024 : : !Nothing to be done for DDK
4025 [ + + ]: 3864 : if (ipert==natom+1.or.ipert==natom+10) return
4026 : :
4027 : : !Set up parallelism over atoms
4028 [ + - + + ]: 3844 : paral_atom=(present(comm_atom).and.(my_natom/=natom))
4029 [ + + ]: 3844 : nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab
4030 [ + - ]: 3844 : my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom
4031 [ - + ]: 3844 : my_comm_grid=xmpi_comm_self;if (present(mpi_comm_grid)) my_comm_grid=mpi_comm_grid
4032 : 3844 : call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,my_natom_ref=my_natom)
4033 : :
4034 : : !Compatibility tests
4035 : 3844 : qne0=(qphon(1)**2+qphon(2)**2+qphon(3)**2>=1.d-15)
4036 [ + + ]: 3844 : if (my_natom>0) then
4037 [ + + - + ]: 3802 : if (qne0.and.qphase==1) then
4038 : 0 : msg='qphase must be 2 when q<>0!'
4039 : 0 : LIBPAW_BUG(msg)
4040 : : end if
4041 [ - + ]: 3802 : if (paw_ij1(1)%qphase/=qphase) then
4042 : 0 : msg='paw_ij1()%qphase and qphase must be equal !'
4043 : 0 : LIBPAW_BUG(msg)
4044 : : end if
4045 [ - + ]: 3802 : if (paw_ij1(1)%has_dijfr==0) then
4046 : 0 : msg='pawdij1()%dijfr must be allocated !'
4047 : 0 : LIBPAW_BUG(msg)
4048 : : end if
4049 [ + + + + : 3802 : testdij1=(ipert<=natom.and.option==0.and.pawfgrtab(1)%gylm_allocated==0)
+ - ]
4050 [ + + - + ]: 3802 : testdij2=(ipert<=natom.and.pawfgrtab(1)%gylmgr_allocated==0)
4051 [ # # # # ]: 0 : testdij3=(testdij2.and.qne0.and.pawfgrtab(1)%expiqr_allocated==0)
4052 [ + - - + : 3802 : if ((testdij1.or.testdij2.or.testdij3).and.pawfgrtab(1)%rfgd_allocated==0) then
- - ]
4053 : 0 : msg='pawfgrtab()%rfgd array must be allocated !'
4054 : 0 : LIBPAW_BUG(msg)
4055 : : end if
4056 : : end if
4057 : :
4058 : : !Get correct index of strain perturbation
4059 [ + + ]: 3844 : if (ipert==natom+3) istr = idir
4060 [ + + ]: 3844 : if (ipert==natom+4) istr = idir + 3
4061 : :
4062 : : !Some inits
4063 [ + + ]: 11355 : usexcnhat=maxval(pawtab(1:ntypat)%usexcnhat)
4064 : 3844 : nfftot=ngfft(1)*ngfft(2)*ngfft(3)
4065 : 3844 : fact=ucvol/dble(nfftot)
4066 [ - + ]: 3844 : cplex_nspden=merge(1,2,nspden/=4)
4067 : :
4068 : : !Loops over atoms
4069 [ + + ]: 11927 : do iatom=1,my_natom
4070 [ + + ]: 8083 : iatom_tot=iatom;if (paral_atom) iatom_tot=my_atmtab(iatom)
4071 : :
4072 : : ! Select which part of Dijfr to compute
4073 [ + + - + ]: 8083 : need_dijfr_1=(ipert==iatom_tot.and.paw_ij1(iatom)%has_dijfr==1)
4074 [ + + + - : 8083 : need_dijfr_2=(ipert<=natom.and.paw_ij1(iatom)%has_dijfr==1.and.(option==0))
+ + ]
4075 [ + + + + : 8083 : need_dijfr_3=((ipert==natom+2.or.ipert==natom+11).and.paw_ij1(iatom)%has_dijfr==1)
- + ]
4076 [ + + + + : 8083 : need_dijfr_4=((ipert==natom+3.or.ipert==natom+4).and.paw_ij1(iatom)%has_dijfr==1)
- + ]
4077 : :
4078 [ + + + + ]: 8083 : if ((.not.need_dijfr_1).and.(.not.need_dijfr_2).and.(.not.need_dijfr_3).and.(.not.need_dijfr_4)) then
4079 [ + - ]: 73 : if (paw_ij1(iatom)%has_dijfr>0) then
4080 [ + + + + ]: 2774 : paw_ij1(iatom)%dijfr=zero ; paw_ij1(iatom)%has_dijfr=2
4081 : : end if
4082 : : cycle
4083 : : end if
4084 : :
4085 : : ! Some atom-dependent quantities
4086 : 8010 : itypat=pawfgrtab(iatom)%itypat
4087 : 8010 : lm_size=pawtab(itypat)%lcut_size**2
4088 : 8010 : lmn2_size=pawtab(itypat)%lmn2_size
4089 : 8010 : cplex_dij=paw_ij1(iatom)%cplex_dij
4090 : 8010 : ndij=paw_ij1(iatom)%ndij
4091 : :
4092 : : ! Eventually compute g_l(r).Y_lm(r) factors for the current atom (if not already done)
4093 : 8010 : nfgd=0
4094 [ + + + + ]: 8010 : if (need_dijfr_1.or.need_dijfr_2.or.need_dijfr_4) then
4095 : 6478 : nfgd=pawfgrtab(iatom)%nfgd
4096 [ + + + - : 6478 : if (((need_dijfr_2.or.need_dijfr_4).and.(pawfgrtab(iatom)%gylm_allocated==0)).or.&
+ + - + ]
4097 : : & ((need_dijfr_1).and.(pawfgrtab(iatom)%gylmgr_allocated==0))) then
4098 : 0 : optgr0=0;optgr1=0;optgr2=0
4099 [ # # # # ]: 0 : if ((need_dijfr_2.or. need_dijfr_4).and.(pawfgrtab(iatom)%gylm_allocated==0)) then
4100 [ # # ]: 0 : if (allocated(pawfgrtab(iatom)%gylm)) then
4101 : 0 : LIBPAW_DEALLOCATE(pawfgrtab(iatom)%gylm)
4102 : : end if
4103 [ # # # # : 0 : LIBPAW_ALLOCATE(pawfgrtab(iatom)%gylm,(nfgd,lm_size))
# # # # #
# # # # #
# # # # ]
4104 : 0 : pawfgrtab(iatom)%gylm_allocated=2;optgr0=1
4105 : : end if
4106 [ # # # # ]: 0 : if ((need_dijfr_1.or.need_dijfr_4).and.(pawfgrtab(iatom)%gylmgr_allocated==0)) then
4107 [ # # ]: 0 : if (allocated(pawfgrtab(iatom)%gylmgr)) then
4108 : 0 : LIBPAW_DEALLOCATE(pawfgrtab(iatom)%gylmgr)
4109 : : end if
4110 [ # # # # : 0 : LIBPAW_ALLOCATE(pawfgrtab(iatom)%gylmgr,(3,nfgd,lm_size))
# # # # #
# # # # #
# # # # ]
4111 : 0 : pawfgrtab(iatom)%gylmgr_allocated=2;optgr1=1
4112 : : end if
4113 [ # # ]: 0 : if (optgr0+optgr1+optgr2>0) then
4114 : : call pawgylm(pawfgrtab(iatom)%gylm,pawfgrtab(iatom)%gylmgr,pawfgrtab(iatom)%gylmgr2,&
4115 : 0 : & lm_size,nfgd,optgr0,optgr1,optgr2,pawtab(itypat),pawfgrtab(iatom)%rfgd)
4116 : : end if
4117 : : end if
4118 : : end if
4119 : :
4120 : : ! Eventually compute exp(-i.q.r) factors for the current atom (if not already done)
4121 [ + + - + ]: 8010 : has_qphase=(qne0.and.qphase==2)
4122 [ + + ]: 8010 : if (need_dijfr_2) then
4123 [ + + - + ]: 5011 : if (has_qphase.and.(pawfgrtab(iatom)%expiqr_allocated==0)) then
4124 [ # # ]: 0 : if (allocated(pawfgrtab(iatom)%expiqr)) then
4125 : 0 : LIBPAW_DEALLOCATE(pawfgrtab(iatom)%expiqr)
4126 : : end if
4127 [ # # # # : 0 : LIBPAW_ALLOCATE(pawfgrtab(iatom)%expiqr,(2,nfgd))
# # # # #
# # # #
# ]
4128 : : call pawexpiqr(pawfgrtab(iatom)%expiqr,gprimd,nfgd,qphon,&
4129 : 0 : & pawfgrtab(iatom)%rfgd,xred(:,iatom_tot))
4130 : 0 : pawfgrtab(iatom)%expiqr_allocated=2
4131 : : end if
4132 : 5011 : has_qphase=(pawfgrtab(iatom)%expiqr_allocated/=0)
4133 : : end if
4134 : :
4135 : : ! Loop over spin components
4136 [ - + ]: 8010 : nsploop=nsppol;if (ndij==4) nsploop=4
4137 [ + + ]: 16962 : do idij=1,nsploop
4138 [ - + - - : 16962 : if (idij<=nsppol.or.(nspden==4.and.idij<=3)) then
- - ]
4139 : :
4140 : 8952 : idijend=idij+idij/3
4141 [ + + ]: 17904 : do ispden=idij,idijend
4142 : :
4143 [ - + + - : 35808 : LIBPAW_ALLOCATE(intv,(qphase*cplex_nspden,lm_size))
- + + - +
- + - - +
- + - + ]
4144 [ + + + + ]: 179904 : intv(:,:) = zero
4145 : :
4146 : : ! ============ Phonons ====================================
4147 [ + + ]: 8952 : if (ipert<=natom) then
4148 : :
4149 [ + - ]: 5466 : if (need_dijfr_1.or.need_dijfr_2) then
4150 : :
4151 [ - + + - : 21864 : LIBPAW_ALLOCATE(intv1,(cplex_nspden,lm_size))
- + + - +
- + - - +
- + ]
4152 [ - + + - : 21864 : LIBPAW_ALLOCATE(intv2,(qphase,lm_size))
- + + - +
- + - - +
- + ]
4153 [ + + + + : 215802 : intv1(:,:)=zero ; intv2(:,:)=zero
+ + + + ]
4154 : :
4155 : : ! First part: Int_R^3{vtrial*Sum_LM[Q_ij_q^LM^(1)]}
4156 [ + + ]: 5466 : if (need_dijfr_1) then
4157 : :
4158 : : ! ----- Retrieve potential Vlocal (subtle if nspden=4 ;-)
4159 [ - + + - : 6528 : LIBPAW_ALLOCATE(vloc,(cplex_nspden,nfgd))
- + + - +
- + - - +
- + ]
4160 [ + - ]: 1632 : if (nspden/=4) then
4161 [ + + ]: 1632 : if (usexcnhat==0) then
4162 [ + + ]: 715057 : do ic=1,nfgd
4163 : 714380 : jc=pawfgrtab(iatom)%ifftsph(ic)
4164 : 715057 : vloc(1,ic)=vtrial(jc,ispden)-vxc(jc,ispden)
4165 : : end do
4166 : : else
4167 [ + + ]: 1538169 : do ic=1,nfgd
4168 : 1538169 : vloc(1,ic)=vtrial(pawfgrtab(iatom)%ifftsph(ic),ispden)
4169 : : end do
4170 : : end if
4171 : : else ! nspden==4
4172 [ # # ]: 0 : if (ispden<=2) then
4173 [ # # ]: 0 : if (usexcnhat==0) then
4174 [ # # ]: 0 : do ic=1,nfgd
4175 : 0 : jc=pawfgrtab(iatom)%ifftsph(ic)
4176 : 0 : vloc(1,ic)=vtrial(jc,ispden)-vxc(jc,ispden)
4177 : 0 : vloc(2,ic)=zero
4178 : : end do
4179 : : else
4180 [ # # ]: 0 : do ic=1,nfgd
4181 : 0 : jc=pawfgrtab(iatom)%ifftsph(ic)
4182 : 0 : vloc(1,ic)=vtrial(jc,ispden)
4183 : 0 : vloc(2,ic)=zero
4184 : : end do
4185 : : end if
4186 [ # # ]: 0 : else if (ispden==3) then
4187 [ # # ]: 0 : if (usexcnhat==0) then
4188 [ # # # # ]: 0 : vloc(:,:)=zero
4189 : : else
4190 [ # # ]: 0 : do ic=1,nfgd
4191 : 0 : jc=pawfgrtab(iatom)%ifftsph(ic)
4192 : 0 : vloc(1,ic)=vtrial(jc,3)
4193 : 0 : vloc(2,ic)=vtrial(jc,4)
4194 : : end do
4195 : : end if
4196 : : else ! ispden=4
4197 [ # # ]: 0 : vloc(2,1:nfgd)=-vloc(2,1:nfgd)
4198 : : end if
4199 : : end if
4200 : :
4201 : : ! ----- Compute Integral [ Vtrial(r).(g_l(r).Y_lm(r))^(1) dr ]
4202 [ - + + - : 3264 : LIBPAW_ALLOCATE(intv_tmp,(cplex_nspden,3))
- + - + ]
4203 [ + + ]: 17424 : do ilslm=1,lm_size
4204 [ + + + + ]: 110544 : intv_tmp=zero
4205 [ + + ]: 33216474 : do ic=1,nfgd
4206 [ + + ]: 132818520 : do mu=1,3
4207 : : ! Minus sign because dg(r-R)/dR = -dg(r-R)/dr
4208 [ + + ]: 199204092 : contrib(1:cplex_nspden)=-vloc(1:cplex_nspden,ic)*pawfgrtab(iatom)%gylmgr(mu,ic,ilslm)
4209 [ + + ]: 232404774 : intv_tmp(1:cplex_nspden,mu)=intv_tmp(1:cplex_nspden,mu)+contrib(1:cplex_nspden)
4210 : : end do
4211 : : end do
4212 : : ! Convert from cartesian to reduced coordinates
4213 : : intv1(1:cplex_nspden,ilslm)=intv1(1:cplex_nspden,ilslm) &
4214 : : & +(rprimd(1,idir)*intv_tmp(1:cplex_nspden,1) &
4215 : : & +rprimd(2,idir)*intv_tmp(1:cplex_nspden,2) &
4216 [ + + ]: 33216 : & +rprimd(3,idir)*intv_tmp(1:cplex_nspden,3))
4217 : : end do
4218 [ - + ]: 1632 : LIBPAW_DEALLOCATE(vloc)
4219 [ - + ]: 1632 : LIBPAW_DEALLOCATE(intv_tmp)
4220 : : end if ! need_dijfr_1
4221 : :
4222 : : ! 2nd part: Int_R^3{Vloc^(1)*Sum_LM[Q_ij_q^LM]}
4223 [ + + ]: 5466 : if (need_dijfr_2) then
4224 : :
4225 [ + + ]: 5439 : if (ispden==1) then
4226 : :
4227 : : ! ----- Retrieve potential Vloc^(1)
4228 [ - + + - : 20044 : LIBPAW_ALLOCATE(vloc,(qphase,nfgd))
- + + - +
- + - - +
- + ]
4229 [ + + ]: 5011 : if (qphase==1) then
4230 [ + + ]: 5362176 : do ic=1,nfgd
4231 : 5357465 : jc=qphase*pawfgrtab(iatom)%ifftsph(ic)
4232 : 5362176 : vloc(1,ic)=vpsp1(jc)
4233 : : end do
4234 : : else
4235 [ + + ]: 481812 : do ic=1,nfgd
4236 : 481512 : jc=2*pawfgrtab(iatom)%ifftsph(ic)-1
4237 : 481512 : vloc(1,ic)=vpsp1(jc )
4238 : 481812 : vloc(2,ic)=vpsp1(jc+1)
4239 : : end do
4240 : : end if
4241 : :
4242 : : ! ----- Compute Integral [ Vloc^(1)(r).g_l(r).Y_lm(r) ]
4243 [ - + + - : 15033 : LIBPAW_ALLOCATE(intvloc,(qphase,lm_size))
- + + - -
+ - + -
+ ]
4244 [ + + + + ]: 101365 : intvloc=zero
4245 [ + + ]: 5011 : if (has_qphase) then
4246 [ - + ]: 300 : if (qphase==1) then
4247 [ # # ]: 0 : do ilslm=1,lm_size
4248 [ # # ]: 0 : do ic=1,nfgd
4249 : 0 : contrib(1)=vloc(1,ic)*pawfgrtab(iatom)%gylm(ic,ilslm)
4250 : 0 : intvloc(1,ilslm)=intvloc(1,ilslm)+contrib(1)*pawfgrtab(iatom)%expiqr(1,ic)
4251 : : end do
4252 : : end do
4253 : : else
4254 [ + + ]: 3192 : do ilslm=1,lm_size
4255 [ + + ]: 4944672 : do ic=1,nfgd
4256 [ + + ]: 14824440 : contrib(1:2)=vloc(1:2,ic)*pawfgrtab(iatom)%gylm(ic,ilslm)
4257 : : intvloc(1,ilslm)=intvloc(1,ilslm)+contrib(1)*pawfgrtab(iatom)%expiqr(1,ic) &
4258 : 4941480 : & -contrib(2)*pawfgrtab(iatom)%expiqr(2,ic)
4259 : : intvloc(2,ilslm)=intvloc(2,ilslm)+contrib(1)*pawfgrtab(iatom)%expiqr(2,ic) &
4260 : 4944372 : & +contrib(2)*pawfgrtab(iatom)%expiqr(1,ic)
4261 : : end do
4262 : : end do
4263 : : end if
4264 : : else ! no phase
4265 [ + + ]: 48550 : do ilslm=1,lm_size
4266 [ + + ]: 71706919 : do ic=1,nfgd
4267 : : #if defined FC_NVHPC
4268 : : if (my_natom == -1) write(std_out, *)"NVHPC raises an internal compiler error that is fixed by this print statement."
4269 : : #endif
4270 [ + + ]: 143316738 : contrib(1:qphase)=vloc(1:qphase,ic)*pawfgrtab(iatom)%gylm(ic,ilslm)
4271 [ + + ]: 143360577 : intvloc(1:qphase,ilslm)=intvloc(1:qphase,ilslm)+contrib(1:qphase)
4272 : : end do
4273 : : end do
4274 : : end if
4275 [ - + ]: 5011 : LIBPAW_DEALLOCATE(vloc)
4276 : : end if ! ispden=1
4277 : :
4278 : : !Add to previous contribution
4279 [ - + ]: 5439 : if (ispden<=min(nspden,2)) then
4280 [ + + + + ]: 111717 : intv2(1:qphase,1:lm_size)=intv2(1:qphase,1:lm_size)+intvloc(1:qphase,1:lm_size)
4281 [ + + ]: 5439 : if (ispden==min(nspden,2)) then
4282 [ - + ]: 5011 : LIBPAW_DEALLOCATE(intvloc)
4283 : : end if
4284 : : end if
4285 : : end if ! need_dijfr_2
4286 : :
4287 : : ! Sum contributions and apply ucvol/nfft factor on integral
4288 [ + + + + ]: 109038 : intv(1:cplex_nspden,1:lm_size)=intv1(1:cplex_nspden,1:lm_size)
4289 [ + + ]: 57252 : intv(1,1:lm_size)=intv(1,1:lm_size)+intv2(1,1:lm_size)
4290 [ + + + + ]: 8658 : if (qphase==2) intv(cplex_nspden+1,1:lm_size)=intv(cplex_nspden+1,1:lm_size)+intv2(2,1:lm_size)
4291 [ + + + + ]: 112230 : intv(:,:)=fact*intv(:,:)
4292 [ - + ]: 5466 : LIBPAW_DEALLOCATE(intv1)
4293 [ - + ]: 5466 : LIBPAW_DEALLOCATE(intv2)
4294 : :
4295 : : ! --- Reduction in case of parallelization ---
4296 : 5466 : call xmpi_sum(intv,my_comm_grid,ier)
4297 : :
4298 [ + + ]: 232062 : paw_ij1(iatom)%dijfr(:,ispden)=zero
4299 : :
4300 : : ! ---- Loop over (i,j) components
4301 : 5466 : klmn1=1;klmn2=1+lmn2_size*cplex_dij ; cplex_p1=cplex_nspden+1
4302 [ + + ]: 217590 : do klmn=1,lmn2_size
4303 : 212124 : klm =pawtab(itypat)%indklmn(1,klmn)
4304 : 212124 : lmin=pawtab(itypat)%indklmn(3,klmn)
4305 : 212124 : lmax=pawtab(itypat)%indklmn(4,klmn)
4306 [ - + + + ]: 556686 : do ils=lmin,lmax,2
4307 : 344562 : lm0=ils**2+ils+1
4308 [ + + ]: 1620660 : do mm=-ils,ils
4309 : 1063974 : ilslm=lm0+mm;isel=pawang%gntselect(ilslm,klm)
4310 [ + + ]: 1408536 : if (isel>0) then
4311 : : !The following works only because cplex_nspden<=cplex_dij
4312 : : paw_ij1(iatom)%dijfr(klmn1,ispden)=paw_ij1(iatom)%dijfr(klmn1,ispden) &
4313 : 311646 : & +pawtab(itypat)%qijl(ilslm,klmn)*intv(1,ilslm)
4314 [ - + ]: 311646 : if (cplex_nspden==2) then
4315 : : paw_ij1(iatom)%dijfr(klmn1+1,ispden)=paw_ij1(iatom)%dijfr(klmn1+1,ispden) &
4316 : 0 : & +pawtab(itypat)%qijl(ilslm,klmn)*intv(2,ilslm)
4317 : : end if
4318 [ + + ]: 311646 : if (qphase==2) then
4319 : : paw_ij1(iatom)%dijfr(klmn2,ispden)=paw_ij1(iatom)%dijfr(klmn2,ispden) &
4320 : 23184 : & +pawtab(itypat)%qijl(ilslm,klmn)*intv(cplex_p1,ilslm)
4321 [ - + ]: 23184 : if (cplex_nspden==2) then
4322 : : paw_ij1(iatom)%dijfr(klmn2+1,ispden)=paw_ij1(iatom)%dijfr(klmn2+1,ispden) &
4323 : 0 : & +pawtab(itypat)%qijl(ilslm,klmn)*intv(4,ilslm)
4324 : : end if
4325 : : end if
4326 : : !Previous version
4327 : : ! dplex_nsp=cplex_nspden-1
4328 : : ! paw_ij1(iatom)%dijfr(klmn1:klmn1+dplex_nsp,ispden)= &
4329 : : ! & paw_ij1(iatom)%dijfr(klmn1:klmn1+dplex_nsp,ispden) &
4330 : : ! & +pawtab(itypat)%qijl(ilslm,klmn)*intv(1:cplex_nspden,ilslm)
4331 : : ! if (qphase==2) then
4332 : : ! paw_ij1(iatom)%dijfr(klmn2:klmn2+dplex_nsp,ispden)= &
4333 : : ! & paw_ij1(iatom)%dijfr(klmn2:klmn2+dplex_nsp,ispden) &
4334 : : ! & +pawtab(itypat)%qijl(ilslm,klmn)*intv(1+cplex_nspden:2*cplex_nspden,ilslm)
4335 : : ! end if
4336 : : end if
4337 : : end do
4338 : : end do
4339 : 217590 : klmn1=klmn1+cplex_dij;klmn2=klmn2+cplex_dij
4340 : : end do
4341 : :
4342 : : ! Dijfr is marked as computed
4343 : 10932 : paw_ij1(iatom)%has_dijfr=2
4344 : :
4345 : : end if
4346 : :
4347 : : ! ============ Electric field perturbation =======================
4348 [ + + + + ]: 3486 : else if (ipert==natom+2.or.ipert==natom+11) then
4349 : :
4350 [ + - ]: 1974 : if (need_dijfr_3) then
4351 : :
4352 : : ! The following factor arises in expanding the angular dependence of the dipole
4353 : : ! vector in terms of real spherical harmonics. The real spherical harmonics are as
4354 : : ! in the routine initylmr.F90;
4355 : : ! see http://www.unioviedo.es/qcg/art/Theochem419-19-ov-BF97-rotation-matrices.pdf
4356 : 1974 : c1 = sqrt(four_pi/three)
4357 : 1974 : mesh_size=pawtab(itypat)%mesh_size
4358 : :
4359 [ + + ]: 1974 : if (ispden==1) then
4360 : :
4361 [ - + + - : 4596 : LIBPAW_ALLOCATE(ff,(mesh_size))
+ - + - -
+ - + -
+ ]
4362 [ - + ]: 1532 : LIBPAW_ALLOCATE(rg,(3))
4363 : :
4364 : : ! loop over basis state pairs for this atom
4365 : 1532 : klmn1=1
4366 [ + + ]: 62594 : do klmn = 1, paw_ij1(iatom)%lmn2_size
4367 : 61062 : klm =pawtab(itypat)%indklmn(1,klmn)
4368 : 61062 : kln =pawtab(itypat)%indklmn(2,klmn)
4369 : 61062 : lmin=pawtab(itypat)%indklmn(3,klmn)
4370 : 61062 : lmax=pawtab(itypat)%indklmn(4,klmn)
4371 : :
4372 : : ! Select only l=1, because the dipole is a vector operator
4373 [ + + ]: 61062 : if (lmin==1) then
4374 : 20769 : lm0=3 ! (l^2+l+1) for l=1
4375 : :
4376 : : ! Computation of <phi_i|r|phi_j>- <tphi_i|r|tphi_j>
4377 : : ! the dipole vector has radial dependence r
4378 : : ff(1:mesh_size)=(pawtab(itypat)%phiphj(1:mesh_size,kln)&
4379 : : & -pawtab(itypat)%tphitphj(1:mesh_size,kln))&
4380 [ + + ]: 18787425 : & *pawrad(itypat)%rad(1:mesh_size)
4381 : : ! call pawrad_deducer0(ff,mesh_size,pawrad(itypat))
4382 : 20769 : call simp_gen(intg,ff,pawrad(itypat))
4383 : :
4384 : : ! Compute <S_li_mi|r-R|S_lj_mj>: use a real Gaunt expression (with selection rule)
4385 [ + + ]: 83076 : rg(1:3)=zero
4386 [ + + ]: 83076 : do ic=1,3
4387 : 62307 : isel=pawang%gntselect(lm0+m_index(ic),klm)
4388 [ + + ]: 83076 : if (isel>0) rg(ic)=pawang%realgnt(isel)
4389 : : end do
4390 : :
4391 : : ! Translate from cartesian to reduced coordinates (in idir direction)
4392 : 20769 : rg1=gprimd(1,idir)*rg(1)+gprimd(2,idir)*rg(2)+gprimd(3,idir)*rg(3)
4393 : :
4394 : : ! Build sqrt(4pi/3).<S_li_mi|r-R|S_lj_mj>.(<phi_i|r-R|phi_j>- <tphi_i|r-R|tphi_j>
4395 : 20769 : paw_ij1(iatom)%dijfr(klmn1,ispden)=c1*rg1*intg
4396 [ - + ]: 20769 : if (cplex_dij==2) paw_ij1(iatom)%dijfr(klmn1+1,ispden)=zero
4397 : :
4398 : : else
4399 : 40293 : paw_ij1(iatom)%dijfr(klmn1,ispden)=zero
4400 : : end if ! end gaunt constraint
4401 : :
4402 : 62594 : klmn1=klmn1+cplex_dij
4403 : : end do ! end loop over lmn2_size pairs of basis states
4404 [ - + ]: 1532 : LIBPAW_DEALLOCATE(ff)
4405 [ - + ]: 1532 : LIBPAW_DEALLOCATE(rg)
4406 : :
4407 : : ! Dijfr is spin-independent for electric field case
4408 [ + - ]: 442 : else if (ispden==2) then
4409 [ + + ]: 16354 : paw_ij1(iatom)%dijfr(:,ispden)=paw_ij1(iatom)%dijfr(:,1)
4410 : : else
4411 [ # # ]: 0 : paw_ij1(iatom)%dijfr(:,ispden)=zero
4412 : : end if
4413 : :
4414 : : ! Dijfr is marked as computed
4415 : 1974 : paw_ij1(iatom)%has_dijfr=2
4416 : : end if
4417 : :
4418 : : ! ============ Elastic tensor ===============================
4419 [ + + - + ]: 1512 : else if (ipert==natom+3.or.ipert==natom+4) then
4420 : :
4421 : : ! ----- Retrieve potential Vlocal (subtle if nspden=4 ;-)
4422 [ - + + - : 6048 : LIBPAW_ALLOCATE(vloc,(cplex_nspden,nfgd))
- + + - +
- + - - +
- + ]
4423 [ + - ]: 1512 : if (nspden/=4) then
4424 [ + + ]: 1512 : if (usexcnhat==0) then
4425 [ + + ]: 501426 : do ic=1,nfgd
4426 : 501012 : jc=pawfgrtab(iatom)%ifftsph(ic)
4427 : 501426 : vloc(1,ic)=vtrial(jc,ispden)-vxc(jc,ispden)
4428 : : end do
4429 : : else
4430 [ + + ]: 886812 : do ic=1,nfgd
4431 : 886812 : vloc(1,ic)=vtrial(pawfgrtab(iatom)%ifftsph(ic),ispden)
4432 : : end do
4433 : : end if
4434 : : else ! nspden/=4
4435 [ # # ]: 0 : if (ispden<=2) then
4436 [ # # ]: 0 : if (usexcnhat==0) then
4437 [ # # ]: 0 : do ic=1,nfgd
4438 : 0 : jc=pawfgrtab(iatom)%ifftsph(ic)
4439 : 0 : vloc(1,ic)=vtrial(jc,ispden)-vxc(jc,ispden)
4440 : 0 : vloc(2,ic)=zero
4441 : : end do
4442 : : else
4443 [ # # ]: 0 : do ic=1,nfgd
4444 : 0 : jc=pawfgrtab(iatom)%ifftsph(ic)
4445 : 0 : vloc(1,ic)=vtrial(jc,ispden)
4446 : 0 : vloc(2,ic)=zero
4447 : : end do
4448 : : end if
4449 [ # # ]: 0 : else if (ispden==3) then
4450 [ # # ]: 0 : if (usexcnhat==0) then
4451 [ # # # # ]: 0 : vloc(:,:)=zero
4452 : : else
4453 [ # # ]: 0 : do ic=1,nfgd
4454 : 0 : jc=pawfgrtab(iatom)%ifftsph(ic)
4455 : 0 : vloc(1,ic)=vtrial(jc,3)
4456 : 0 : vloc(2,ic)=vtrial(jc,4)
4457 : : end do
4458 : : end if
4459 : : else ! ispden=4
4460 [ # # ]: 0 : vloc(2,1:nfgd)=-vloc(2,1:nfgd)
4461 : : end if
4462 : : end if
4463 : :
4464 : : ! option = 0 Insulator case
4465 [ + + ]: 1512 : if(option==0)then
4466 [ + + ]: 13656 : do ilslm=1,lm_size
4467 [ + + ]: 13044834 : do ic=1,nfgd
4468 : 13031178 : jc=pawfgrtab(iatom)%ifftsph(ic)
4469 [ + + ]: 26062356 : contrib(1:cplex_nspden) = zero
4470 : :
4471 : : ! Int_R^3{vtrial*Sum_LM[Q_ij_q^LM^(1)]}
4472 : 13031178 : mua=alpha(istr);mub=beta(istr)
4473 : : contrib(1:cplex_nspden)=contrib(1:cplex_nspden)+half*vloc(1:cplex_nspden,ic)&
4474 : : & *(pawfgrtab(iatom)%gylmgr(mua,ic,ilslm)*pawfgrtab(iatom)%rfgd(mub,ic)&
4475 [ + + ]: 26062356 : & + pawfgrtab(iatom)%gylmgr(mub,ic,ilslm)*pawfgrtab(iatom)%rfgd(mua,ic))
4476 : :
4477 : : ! Int_R^3{Vloc^(1)*Sum_LM[Q_ij_q^LM]}
4478 : 13031178 : contrib(1)=contrib(1)+vpsp1(jc)*pawfgrtab(iatom)%gylm(ic,ilslm)
4479 : :
4480 : : ! delta_{alphabeta}Int_R^3{Vloc*Sum_LM[Q_ij_q^LM]}
4481 [ + + ]: 13031178 : if(istr<=3)then
4482 : : contrib(1:cplex_nspden)=contrib(1:cplex_nspden) &
4483 [ + + ]: 13031178 : & +vloc(1:cplex_nspden,ic)*pawfgrtab(iatom)%gylm(ic,ilslm)
4484 : : end if
4485 : :
4486 [ + + ]: 26074656 : intv(1:cplex_nspden,ilslm)=intv(1:cplex_nspden,ilslm)+contrib(1:cplex_nspden)
4487 : : end do
4488 : : end do
4489 : :
4490 : : ! option = 1 Metal case (without Vpsp1)
4491 [ + - ]: 156 : else if (option==1)then
4492 [ + + ]: 1560 : do ilslm=1,lm_size
4493 [ + + ]: 1297668 : do ic=1,nfgd
4494 : 1296108 : jc=pawfgrtab(iatom)%ifftsph(ic)
4495 : 1296108 : contrib(1) = zero
4496 : :
4497 : : ! Int_R^3{vtrial*Sum_LM[Q_ij_q^LM^(1)]}
4498 : 1296108 : mua=alpha(istr);mub=beta(istr)
4499 : : contrib(1:cplex_nspden)=contrib(1:cplex_nspden)+half*vloc(1:cplex_nspden,ic)&
4500 : : & *(pawfgrtab(iatom)%gylmgr(mua,ic,ilslm)*pawfgrtab(iatom)%rfgd(mub,ic)&
4501 [ + + ]: 2592216 : & + pawfgrtab(iatom)%gylmgr(mub,ic,ilslm)*pawfgrtab(iatom)%rfgd(mua,ic))
4502 : :
4503 : : ! delta_{alphabeta}Int_R^3{Vtrial*Sum_LM[Q_ij_q^LM]}
4504 [ + + ]: 1296108 : if(istr<=3)then
4505 : : contrib(1:cplex_nspden)=contrib(1:cplex_nspden) &
4506 [ + + ]: 1296108 : & +vloc(1:cplex_nspden,ic)*pawfgrtab(iatom)%gylm(ic,ilslm)
4507 : : end if
4508 : :
4509 [ + + ]: 2593620 : intv(1:cplex_nspden,ilslm)=intv(1:cplex_nspden,ilslm)+contrib(1:cplex_nspden)
4510 : : end do
4511 : : end do
4512 : : end if
4513 [ - + ]: 1512 : LIBPAW_DEALLOCATE(vloc)
4514 : :
4515 : : ! Apply ucvol/nfft factor on integral
4516 [ + + + + ]: 28920 : intv(:,:)=fact*intv(:,:)
4517 : :
4518 : : ! --- Reduction in case of parallelization ---
4519 : 1512 : call xmpi_sum(intv,my_comm_grid,ier)
4520 : :
4521 [ + + ]: 57780 : paw_ij1(iatom)%dijfr(:,ispden)=zero
4522 : :
4523 : : ! ---- Loop over (i,j) components
4524 : : klmn1=1
4525 [ + + ]: 57780 : do klmn=1,lmn2_size
4526 : 56268 : klm =pawtab(itypat)%indklmn(1,klmn)
4527 : 56268 : lmin=pawtab(itypat)%indklmn(3,klmn)
4528 : 56268 : lmax=pawtab(itypat)%indklmn(4,klmn)
4529 [ - + + + ]: 146412 : do ils=lmin,lmax,2
4530 : 90144 : lm0=ils**2+ils+1
4531 [ + + ]: 414720 : do mm=-ils,ils
4532 : 268308 : ilslm=lm0+mm;isel=pawang%gntselect(ilslm,klm)
4533 [ + + ]: 358452 : if (isel>0) then
4534 : : !The following works only because cplex_nspden<=cplex_dij
4535 : : paw_ij1(iatom)%dijfr(klmn1,ispden)=paw_ij1(iatom)%dijfr(klmn1,ispden) &
4536 : 80928 : & +pawtab(itypat)%qijl(ilslm,klmn)*intv(1,ilslm)
4537 [ - + ]: 80928 : if (cplex_nspden==2) then
4538 : : paw_ij1(iatom)%dijfr(klmn1+1,ispden)=paw_ij1(iatom)%dijfr(klmn1+1,ispden) &
4539 : 0 : & +pawtab(itypat)%qijl(ilslm,klmn)*intv(2,ilslm)
4540 : : end if
4541 : : !Previous version
4542 : : ! dplex_nsp=cplex_nspden-1
4543 : : ! paw_ij1(iatom)%dijfr(klmn1:klmn1+dplex_nsp,ispden)= &
4544 : : !& paw_ij1(iatom)%dijfr(klmn1:klmn1+dplex_nsp,ispden) &
4545 : : !& +pawtab(itypat)%qijl(ilslm,klmn)*intv(1:cplex_nspden,ilslm)
4546 : : end if
4547 : : end do
4548 : : end do
4549 : 57780 : klmn1=klmn1+cplex_dij
4550 : : end do
4551 : :
4552 : : ! Dijfr is marked as computed
4553 : 3024 : paw_ij1(iatom)%has_dijfr=2
4554 : :
4555 : : end if ! ipert
4556 : :
4557 [ - + ]: 17904 : LIBPAW_DEALLOCATE(intv)
4558 : :
4559 : : !----------------------------------------------------------
4560 : : ! End loops over spin components
4561 : : end do ! ispden
4562 : :
4563 : : ! ----------------------------------------------------------
4564 : : ! Deduce some part of Dij according to symmetries
4565 : : ! ----------------------------------------------------------
4566 : :
4567 : : !Non-collinear: D_ij(:,4)=D^21_ij=D^12_ij^*
4568 [ # # # # ]: 0 : else if (nspden==4.and.idij==4) then
4569 [ # # ]: 0 : paw_ij1(iatom)%dijfr(:,idij)=paw_ij1(iatom)%dijfr(:,idij-1)
4570 [ # # ]: 0 : if (cplex_dij==2) then
4571 [ # # ]: 0 : do klmn=2,lmn2_size*cplex_dij,cplex_dij
4572 [ # # ]: 0 : paw_ij1(iatom)%dijfr(klmn,idij)=-paw_ij1(iatom)%dijfr(klmn,idij)
4573 : : end do
4574 [ # # ]: 0 : if (qphase==2) then
4575 [ # # ]: 0 : do klmn=2+lmn2_size*cplex_dij,2*lmn2_size*cplex_dij,cplex_dij
4576 [ # # ]: 0 : paw_ij1(iatom)%dijfr(klmn,idij)=-paw_ij1(iatom)%dijfr(klmn,idij)
4577 : : end do
4578 : : end if
4579 : : end if
4580 : :
4581 : : !Antiferro: D_ij(:,2)=D^down_ij=D^up_ij
4582 [ # # # # ]: 0 : else if (nsppol==1.and.idij==2) then
4583 [ # # ]: 0 : paw_ij1(iatom)%dijfr(:,idij)=paw_ij1(iatom)%dijfr(:,idij-1)
4584 : : end if
4585 : :
4586 : : ! End loop on Dij components
4587 : : end do ! idij
4588 : :
4589 : : !----------------------------------------------------------
4590 : :
4591 : : ! Eventually free temporary space for g_l(r).Y_lm(r) gradients and exp(-i.q.r)
4592 [ + + ]: 11854 : if (need_dijfr_1.or.need_dijfr_2) then
4593 [ - + ]: 5038 : if (pawfgrtab(iatom)%gylm_allocated==2) then
4594 [ # # ]: 0 : LIBPAW_DEALLOCATE(pawfgrtab(iatom)%gylm)
4595 [ # # ]: 0 : LIBPAW_ALLOCATE(pawfgrtab(iatom)%gylm,(0,0))
4596 : 0 : pawfgrtab(iatom)%gylm_allocated=0
4597 : : end if
4598 [ - + ]: 5038 : if (pawfgrtab(iatom)%gylmgr_allocated==2) then
4599 [ # # ]: 0 : LIBPAW_DEALLOCATE(pawfgrtab(iatom)%gylmgr)
4600 [ # # ]: 0 : LIBPAW_ALLOCATE(pawfgrtab(iatom)%gylmgr,(0,0,0))
4601 : 0 : pawfgrtab(iatom)%gylmgr_allocated=0
4602 : : end if
4603 [ + - ]: 5038 : if (pawfgrtab(iatom)%expiqr_allocated==2) then
4604 [ # # ]: 0 : LIBPAW_DEALLOCATE(pawfgrtab(iatom)%expiqr)
4605 [ # # ]: 0 : LIBPAW_ALLOCATE(pawfgrtab(iatom)%expiqr,(0,0))
4606 : 0 : pawfgrtab(iatom)%expiqr_allocated=0
4607 : : end if
4608 : : end if
4609 : :
4610 : : ! End loop on atoms
4611 : : end do
4612 : :
4613 : : !Destroy atom table used for parallelism
4614 : 3844 : call free_my_atmtab(my_atmtab,my_atmtab_allocated)
4615 : :
4616 [ + + - + : 7869 : end subroutine pawdijfr
- + - + ]
4617 : : !!***
4618 : :
4619 : : !----------------------------------------------------------------------
4620 : :
4621 : : !!****f* m_pawdij/pawpupot
4622 : : !! NAME
4623 : : !! pawpupot
4624 : : !!
4625 : : !! FUNCTION
4626 : : !! Compute the PAW DFT+U on-site potential
4627 : : !!
4628 : : !! INPUTS
4629 : : !! cplex_dij=2 if DFT+U pot. is COMPLEX (as in the spin-orbit case), 1 if dij is REAL
4630 : : !! ndij=number of spin components for Dij
4631 : : !! pawprtvol=control print volume and debugging output for PAW
4632 : : !! noccmmp(cplex_dij,2*lpawu+1,2*lpawu+1,ndij)=density matrix in the augm. region
4633 : : !! nocctot(ndij)=number of electrons in the correlated subspace
4634 : : !! pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data:
4635 : : !! %usepawu, %upawu, %jpau
4636 : : !! %vee(2*lpawu+1*4)=screened coulomb matrix
4637 : : !!
4638 : : !! OUTPUT
4639 : : !! vpawu(cplex_dij,lpawu*2+1,lpawu*2+1,ndij)=lda+u potential
4640 : : !! (see eg PRB 52, 5467 (1995) [[cite:Liechenstein1995]])
4641 : : !! When vpawu is complex (cplex_dij=2):
4642 : : !! vpawu(2*i-1,:) contains the real part
4643 : : !! vpawu(2*i,:) contains the imaginary part
4644 : : !!
4645 : : !! SOURCE
4646 : :
4647 [ - + ]: 2547 : subroutine pawpupot(cplex_dij,ndij,noccmmp,nocctot,&
4648 [ - + - + ]: 2547 : & pawprtvol,pawtab,vpawu)
4649 : :
4650 : : !Arguments ---------------------------------------------
4651 : : !scalars
4652 : : integer,intent(in) :: cplex_dij,ndij,pawprtvol
4653 : : type(pawtab_type),intent(in) :: pawtab
4654 : : !arrays
4655 : : real(dp),intent(in) :: noccmmp(:,:,:,:),nocctot(:)
4656 : : real(dp),intent(out) :: vpawu(:,:,:,:)
4657 : :
4658 : : !Local variables ---------------------------------------
4659 : : !scalars
4660 : : !Option for interaction energy in case of non-collinear magnetism:
4661 : : ! 1: E_int=-J/4.N.(N-2) (better)
4662 : : ! 2: E_int=-J/2.(Nup.(Nup-1)+Ndn.(Ndn-1)) (Nup and Ndn are ill-defined)
4663 : : ! integer,parameter :: option_interaction=3
4664 : :
4665 : : integer :: iplex,ispden,jspden,lpawu,m1,m11,m2,m21,m3,m31,m4,m41,nspden_eff
4666 : : real(dp) :: mnorm,mx,my,mz,n_sig,n_msig,n_tot,VUKStemp,n_sigs,n_msigs
4667 : : real(dp),save :: VUKS
4668 : : character(len=500) :: msg
4669 : : !arrays
4670 : : real(dp),parameter :: factcg(3:4)=(/one,-one/)
4671 : 5094 : real(dp) :: n34_msig(cplex_dij),n34_sig(cplex_dij)
4672 : : !real(dp) :: n43_sig(cplex_dij)
4673 : :
4674 : : ! *****************************************************
4675 : :
4676 : : !Useful data
4677 : 2547 : lpawu=pawtab%lpawu
4678 : :
4679 : : !Check data consistency
4680 [ - + ]: 2547 : if(pawtab%usepawu<0) then
4681 : 0 : msg = "usepawu<0 not allowed!"
4682 : 0 : LIBPAW_BUG(msg)
4683 : : end if
4684 [ + + + + : 2547 : if(ndij==4.and.pawtab%option_interaction_pawu==3.and.pawtab%usepawu>=10) then
- + ]
4685 : 0 : msg = "Option_interaction==3 is not compatible with usepawu>=10 in pawpupot"
4686 : 0 : LIBPAW_ERROR(msg)
4687 : : end if
4688 : : if (size(vpawu,1)/=cplex_dij.or.size(vpawu,2)/=2*lpawu+1.or.&
4689 [ + - + - : 2547 : & size(vpawu,3)/=2*lpawu+1.or.size(vpawu,4)/=ndij) then
+ - - + ]
4690 : 0 : write (msg,'(a,4I5, a,4I5)') ' invalid sizes for vpawu !',cplex_dij,2*lpawu+1,2*lpawu+1,ndij, &
4691 : 0 : & ' /= ', size(vpawu,1), size(vpawu,2), size(vpawu,3), size(vpawu,4)
4692 : 0 : LIBPAW_BUG(msg)
4693 : : end if
4694 : : if (size(noccmmp,1)/=cplex_dij.or.size(noccmmp,2)/=2*lpawu+1.or.&
4695 [ + - + - : 2547 : & size(noccmmp,3)/=2*lpawu+1.or.size(noccmmp,4)/=ndij) then
+ - - + ]
4696 : 0 : write (msg,'(a,4I5, a,4I5)') ' invalid sizes for noccmmp !',cplex_dij,2*lpawu+1,2*lpawu+1,ndij, &
4697 : 0 : & ' /= ', size(noccmmp,1), size(noccmmp,2), size(noccmmp,3), size(noccmmp,4)
4698 : 0 : LIBPAW_BUG(msg)
4699 : : end if
4700 [ - + ]: 2547 : if (size(nocctot,1)/=ndij) then
4701 : 0 : msg='invalid size for nocctot !'
4702 : 0 : LIBPAW_BUG(msg)
4703 : : end if
4704 : :
4705 : : !=====================================================
4706 : : !Compute DFT+U Potential on the basis of projectors
4707 : : !cf PRB 52 5467 (1995) [[cite:Liechenstein1995]]
4708 : : !-----------------------------------------------------
4709 : :
4710 [ + + + + : 418567 : vpawu=zero ; nspden_eff=ndij
+ + + + ]
4711 [ + + ]: 8666 : do ispden=1,nspden_eff
4712 : :
4713 [ + + ]: 6119 : if (ispden<=2) then ! cases ndij=4, ispden=1,2 or ndij<4
4714 : 4855 : jspden=min(nspden_eff,2)-ispden+1 ! (ispden,ndij)=(1,4)=>jspden=2
4715 : :
4716 [ + + ]: 4855 : if (nspden_eff<=2) then
4717 : 3591 : n_sig =nocctot(ispden)
4718 : 3591 : n_msig=nocctot(jspden)
4719 : 3591 : n_tot =n_sig+n_msig
4720 : : else
4721 : 1264 : n_tot=nocctot(1)
4722 : 1264 : mx=nocctot(2)
4723 : 1264 : my=nocctot(3)
4724 : 1264 : mz=nocctot(4)
4725 : 1264 : mnorm=sqrt(mx*mx+my*my+mz*mz)
4726 [ + + ]: 1264 : if (ispden==1) then
4727 : : ! n_sig =half*(n_tot+mnorm)
4728 : : ! n_msig=half*(n_tot-mnorm)
4729 : 632 : n_sig =half*(n_tot+sign(mnorm,mz))
4730 : 632 : n_msig=half*(n_tot-sign(mnorm,mz))
4731 : : else
4732 : : ! n_sig =half*(n_tot-mnorm)
4733 : : ! n_msig=half*(n_tot+mnorm)
4734 : 632 : n_sig =half*(n_tot-sign(mnorm,mz))
4735 : 632 : n_msig=half*(n_tot+sign(mnorm,mz))
4736 : : end if
4737 : : end if
4738 : :
4739 : 4855 : n_sigs =n_sig/(float(2*lpawu+1))
4740 : 4855 : n_msigs =n_msig/(float(2*lpawu+1))
4741 [ + + ]: 29026 : do m1=-lpawu,lpawu
4742 : 24171 : m11=m1+lpawu+1
4743 [ + + ]: 147882 : do m2=-lpawu,lpawu
4744 : 123711 : m21=m2+lpawu+1
4745 [ + + ]: 797181 : do m3=-lpawu,lpawu
4746 : 649299 : m31=m3+lpawu+1
4747 [ + + ]: 4266969 : do m4=-lpawu,lpawu
4748 : 3493959 : m41=m4+lpawu+1
4749 [ + + ]: 7879874 : n34_sig(:) =noccmmp(:,m31,m41,ispden) ! spin sigma
4750 [ + + ]: 7879874 : n34_msig(:)=noccmmp(:,m31,m41,jspden) ! opposite spin (-sigma)
4751 [ + + - + ]: 3493959 : if(m31==m41.and.pawtab%usepawu==3) then
4752 : 0 : n34_sig(1)= n34_sig(1) - n_sigs
4753 : 0 : n34_msig(1)= n34_msig(1) - n_msigs
4754 : : end if
4755 [ + + ]: 8529173 : do iplex=1,cplex_dij
4756 : : vpawu(iplex,m11,m21,ispden)=vpawu(iplex,m11,m21,ispden) &
4757 : : & +n34_msig(iplex)*pawtab%vee(m11,m31,m21,m41) &
4758 : 7879874 : & +n34_sig(iplex)*(pawtab%vee(m11,m31,m21,m41)-pawtab%vee(m11,m31,m41,m21))
4759 : : end do
4760 : : ! if(abs(pawprtvol)>=3.and.m11==1.and.m21==1) then
4761 : : ! write(msg,'(a,i4,i4,2e20.10)') "m31,m41,vu=",m31,m41,&
4762 : : ! & vpawu(:,m11,m21,ispden)
4763 : : ! call wrtout(std_out,msg,'COLL')
4764 : : ! write(msg,'(a,4e20.10)') "vee",pawtab%vee(m11,m31,m21,m41),&
4765 : : ! & pawtab%vee(m11,m31,m41,m21)
4766 : : ! call wrtout(std_out,msg,'COLL')
4767 : : ! write(msg,'(a,4e20.10)') "n34_msig,n34_sig",n34_msig(1),n34_sig(1)
4768 : : ! call wrtout(std_out,msg,'COLL')
4769 : : ! end if
4770 : : end do
4771 : : end do
4772 : : ! if(abs(pawprtvol)>=3) then
4773 : : ! if(m11/=m21) then
4774 : : ! write(msg,'(a,i4,i4,2e20.10)') "vu=",m11,m21,vpawu(:,m11,m21,ispden)
4775 : : ! call wrtout(std_out,msg,'COLL')
4776 : : ! write(msg,'(a,2e20.10)') "vupred=",-pawtab%upawu*noccmmp(:,m21,m11,ispden)
4777 : : ! call wrtout(std_out,msg,'COLL')
4778 : : ! end if
4779 : : ! end if
4780 : : end do ! m2
4781 [ + + ]: 24171 : if(abs(pawprtvol)>=3) then
4782 : : write(msg,'(a,i3,14f11.5)') &
4783 [ + - + + ]: 65642 : & "vpawu ",m11, (vpawu(:,m11,m21,ispden),m21=1,2*lpawu+1)
4784 : 10469 : call wrtout(std_out, msg,'COLL')
4785 : : write(msg,'(a,i3,14f11.5)') &
4786 [ + - + + ]: 65642 : & "noccmmp ",m11, (noccmmp(:,m11,m21,ispden),m21=1,2*lpawu+1)
4787 : 10469 : call wrtout(std_out, msg,'COLL')
4788 : : end if
4789 : :
4790 : : ! Full localized limit
4791 [ + + ]: 24171 : if(pawtab%usepawu==1.or.pawtab%usepawu==4) then ! not activated if usepawu=10 !!
4792 : : ! Here we compute vpawu=vpawu-v_dc
4793 : 23526 : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)-pawtab%upawu*(n_tot-half)
4794 [ + + - + ]: 23526 : if (ndij/=4.or.pawtab%option_interaction_pawu==2) then
4795 [ + + ]: 17094 : if(pawtab%usepawu/=4) then
4796 : 15469 : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)+pawtab%jpawu*(n_sig-half)
4797 : : else
4798 : 1625 : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)+half*pawtab%jpawu*(n_tot-one)
4799 : : endif
4800 [ + + + + ]: 6432 : else if (ndij==4.and.(pawtab%usepawu==4.or.pawtab%option_interaction_pawu==1)) then
4801 : 2600 : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)+half*pawtab%jpawu*(n_tot-one)
4802 [ + - ]: 3832 : else if (ndij==4.and.pawtab%option_interaction_pawu==3) then
4803 : : ! Here vdc^{alpha,beta}=\vect{m}.\vect{sigma}^{\beta,\alpha}
4804 : 3832 : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)+half*pawtab%jpawu*(n_tot-one)
4805 [ + + ]: 3832 : if (ispden==1) then
4806 : 1916 : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)+half*pawtab%jpawu*mz
4807 : : else
4808 : 1916 : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)-half*pawtab%jpawu*mz
4809 : : end if
4810 : : end if
4811 : :
4812 : : ! Around mean field
4813 [ + + ]: 645 : else if(pawtab%usepawu==2) then
4814 : : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)-n_msig*pawtab%upawu &
4815 : : & -n_sig*(pawtab%upawu-pawtab%jpawu) &
4816 : 625 : & *(dble(2*lpawu)/dble(2*lpawu+1))
4817 : : end if
4818 : :
4819 : : ! if (abs(pawprtvol)>=3) then
4820 : : ! write(msg,'(a,i4,i4,2x,e20.10)') "vudiag= ",m11,m11,vpawu(1,m11,m11,ispden)
4821 : : ! call wrtout(std_out, msg,'COLL')
4822 : : ! write(msg,'(a,2e20.10)') "vudiagpred= ",pawtab%upawu*(half-noccmmp(:,m11,m11,ispden))
4823 : : ! call wrtout(std_out, msg,'COLL')
4824 : : ! end if
4825 [ + + ]: 29026 : if(abs(pawprtvol)>=3) then
4826 : 10469 : write(msg,*) "nocctot",nocctot
4827 : 10469 : call wrtout(std_out, msg,'COLL')
4828 : : write(msg,'(a,i3,14f11.5)') &
4829 [ + - + + ]: 65642 : & "vpawu 2",m11, (vpawu(:,m11,m21,ispden),m21=1,2*lpawu+1)
4830 : 10469 : call wrtout(std_out, msg,'COLL')
4831 : : write(msg,'(a,i3,14f11.5)') &
4832 [ + - + + ]: 65642 : & "noccmmp2",m11, (noccmmp(:,m11,m21,ispden),m21=1,2*lpawu+1)
4833 : 10469 : call wrtout(std_out, msg,'COLL')
4834 : : end if
4835 : : end do ! m1
4836 : :
4837 : : end if ! ispden<=2
4838 : :
4839 : : ! Non-collinear magnetism: add non-diagonal term; see (Eq 6) in PRB 72, 024458 (2005) [[cite:Shurikov2005]]
4840 : : ! BA Here, we compute the transpose --- with respect to spin indices --- of
4841 : : ! BA equation (6) of this reference, because of differences in notations,
4842 : : ! BA namely Eband=\sum rhoij^{alpha,beta}*Dij(beta,alpha) contrary to PRB 72, 024458 (2005) [[cite:Shurikov2005]]
4843 [ + + ]: 6119 : if (ispden>=3) then
4844 : 1264 : mx=nocctot(2)
4845 : 1264 : my=nocctot(3)
4846 [ + + ]: 7696 : do m1=-lpawu,lpawu
4847 : 6432 : m11=m1+lpawu+1
4848 [ + + ]: 39376 : do m2=-lpawu,lpawu
4849 : 32944 : m21=m2+lpawu+1
4850 [ + + ]: 209584 : do m3=-lpawu,lpawu
4851 : 170208 : m31=m3+lpawu+1
4852 [ + + ]: 1092608 : do m4=-lpawu,lpawu
4853 : 889456 : m41=m4+lpawu+1
4854 : : ! n43_sig(:) =noccmmp(:,m41,m31,ispden)
4855 : : ! vpawu(1,m11,m21,ispden)=vpawu(1,m11,m21,ispden)-n43_sig(1)*pawtab%vee(m11,m31,m41,m21)
4856 : : ! vpawu(2,m11,m21,ispden)=vpawu(2,m11,m21,ispden)+n43_sig(2)*pawtab%vee(m11,m31,m41,m21)
4857 [ + + ]: 2668368 : n34_sig(:) =noccmmp(:,m31,m41,ispden)
4858 : 889456 : vpawu(1,m11,m21,ispden)=vpawu(1,m11,m21,ispden)-n34_sig(1)*pawtab%vee(m11,m31,m41,m21)
4859 : 1059664 : vpawu(2,m11,m21,ispden)=vpawu(2,m11,m21,ispden)-n34_sig(2)*pawtab%vee(m11,m31,m41,m21)
4860 : : end do
4861 : : end do
4862 : : end do
4863 [ + + + + ]: 7696 : if(pawtab%usepawu==1.and.pawtab%option_interaction_pawu==3) then ! not activated if usepawu=10 !!
4864 : 3832 : vpawu(1,m11,m11,ispden)=vpawu(1,m11,m11,ispden)+half*pawtab%jpawu*mx
4865 [ + + ]: 3832 : if(ispden==3) then
4866 : 1916 : vpawu(2,m11,m11,ispden)=vpawu(2,m11,m11,ispden)-half*pawtab%jpawu*my
4867 : : else
4868 : 1916 : vpawu(2,m11,m11,ispden)=vpawu(2,m11,m11,ispden)+half*pawtab%jpawu*my
4869 : : end if
4870 : : end if
4871 : : end do
4872 : : end if
4873 : :
4874 [ + + ]: 6119 : if(abs(pawprtvol)>=3) then
4875 : 3245 : write(std_out,*) "vpawu, ispden",ispden
4876 [ + + ]: 19986 : do m11=1,2*lpawu+1
4877 : : write(msg,'(12(1x,9(1x,"(",f10.7,",",f10.7,")")))') &
4878 [ + - + + ]: 104058 : & (vpawu(1:cplex_dij,m11,m21,ispden),m21=1,2*lpawu+1)
4879 : 19986 : call wrtout(std_out,msg,'COLL')
4880 : : end do
4881 : : end if
4882 : :
4883 : : ! Printing for test
4884 [ + + ]: 8666 : if (abs(pawprtvol)>=3) then
4885 [ + + ]: 3245 : if (ispden==1) VUKS=zero
4886 : 3245 : VUKStemp=zero
4887 [ + + ]: 19986 : do m1=-lpawu,lpawu
4888 : 16741 : m11=m1+lpawu+1
4889 [ + + ]: 107303 : do m2=-lpawu,lpawu
4890 : 87317 : m21=m2+lpawu+1
4891 : 87317 : VUKStemp=VUKStemp+vpawu(1,m11,m21,ispden)*noccmmp(1,m11,m21,ispden)
4892 [ + + ]: 87317 : if (cplex_dij == 2) then
4893 : 64288 : VUKStemp=VUKStemp-vpawu(2,m11,m21,ispden)*noccmmp(2,m11,m21,ispden)
4894 : : end if
4895 : 87317 : write(msg,'(a,2e20.10,2e20.10)') "m1,m2,vpawu,noccmmp= ", &
4896 : 174634 : & vpawu(:,m11,m21,ispden),noccmmp(:,m11,m21,ispden)
4897 : 104058 : call wrtout(std_out, msg,'COLL')
4898 : : end do
4899 : : end do
4900 : 3245 : VUKS=VUKS+VUKStemp
4901 : 3245 : write(msg,*) "pawpupot: VUKStemp= ",ispden,VUKStemp
4902 : 3245 : call wrtout(std_out, msg,'COLL')
4903 [ + + ]: 3245 : if (ispden==nspden_eff) then
4904 : 1126 : write(msg,*) "pawpupot: VUKS= ",ispden,VUKS
4905 : 1126 : call wrtout(std_out, msg,'COLL')
4906 : : end if
4907 : : end if
4908 : :
4909 : : end do ! Loop on ispden
4910 : :
4911 : 2547 : end subroutine pawpupot
4912 : : !!***
4913 : :
4914 : : !----------------------------------------------------------------------
4915 : :
4916 : : !!****f* m_pawdij/pawxpot
4917 : : !! NAME
4918 : : !! pawxpot
4919 : : !!
4920 : : !! FUNCTION
4921 : : !! Compute the PAW Local Exact-Exchange on-site potential
4922 : : !!
4923 : : !! INPUTS
4924 : : !! ndij=number of spin components for Dij
4925 : : !! pawprtvol=control print volume and debugging output for PAW
4926 : : !! paw_ij <type(paw_ij_type)>=paw arrays given on (i,j) channels
4927 : : !! pawtab <type(pawtab_type)>=paw tabulated starting data:
4928 : : !! pawrhoij <type(pawrhoij_type)>= paw rhoij occupancies and related data
4929 : : !!
4930 : : !! OUTPUT
4931 : : !! paw_ij%vpawx(pawtab%lexexch*2+1,pawtab%lexexch*2+1)=local exact-exchange potential
4932 : : !!
4933 : : !! SOURCE
4934 : :
4935 [ - + ]: 42 : subroutine pawxpot(ndij,pawprtvol,pawrhoij,pawtab,vpawx)
4936 : :
4937 : : !Arguments ---------------------------------------------
4938 : : !scalars
4939 : : integer,intent(in) :: ndij,pawprtvol
4940 : : type(pawrhoij_type),intent(in) :: pawrhoij
4941 : : type(pawtab_type),intent(in) :: pawtab
4942 : : real(dp),intent(out) :: vpawx(:,:,:)
4943 : :
4944 : : !Local variables ---------------------------------------
4945 : : !scalars
4946 : : integer :: cplex_rhoij,irhoij,irhoij1,ispden,jrhoij,jrhoij1,klmn,klmn1,lexexch,ll,lmn2_size
4947 : : integer :: m11,m21,m31,m41,n1,n2,n3,n4,nk,nn1,nn2,nspden_eff
4948 : : real(dp) :: tot
4949 : : character(len=500) :: msg
4950 : : !arrays
4951 : : integer :: indn(3,3)
4952 : : real(dp) :: factnk(6)
4953 : :
4954 : : ! *****************************************************
4955 : :
4956 : : !Useful data
4957 : 42 : lexexch=pawtab%lexexch
4958 : 42 : cplex_rhoij=pawrhoij%cplex_rhoij
4959 : 42 : lmn2_size=pawtab%lmn2_size
4960 : : if (pawtab%nproju==1) nk=1
4961 : 42 : if (pawtab%nproju==2) nk=6
4962 : 42 : factnk(1)=one;factnk(2)=one;factnk(3)=one
4963 : 42 : factnk(4)=two;factnk(5)=two;factnk(6)=two
4964 : 42 : indn(1,1)=1;indn(1,2)=4;indn(1,3)=5
4965 : 42 : indn(2,1)=4;indn(2,2)=2;indn(2,3)=6
4966 : 42 : indn(3,1)=5;indn(3,2)=6;indn(3,3)=3
4967 : :
4968 : : !Check data consistency
4969 [ + - + - : 42 : if (size(vpawx,1)/=1.or.size(vpawx,2)/=lmn2_size.or.&
- + ]
4970 : : & size(vpawx,3)/=ndij) then
4971 : 0 : msg='invalid sizes for vpawx !'
4972 : 0 : LIBPAW_BUG(msg)
4973 : : end if
4974 [ - + ]: 42 : if (pawrhoij%qphase==2) then
4975 : 0 : msg='pawxpot not compatible with qphase=2 (DFPT)!'
4976 : 0 : LIBPAW_BUG(msg)
4977 : : end if
4978 : :
4979 : : !=====================================================
4980 : : !Compute local exact exchange Potential
4981 : : !on the basis of projectors.
4982 : : !-----------------------------------------------------
4983 : :
4984 [ + + + + : 28854 : vpawx=zero ; nspden_eff=ndij
+ + ]
4985 [ + + ]: 126 : do ispden=1,nspden_eff
4986 : 84 : jrhoij=1
4987 [ + + ]: 6790 : do irhoij=1,pawrhoij%nrhoijsel
4988 : 6664 : klmn=pawrhoij%rhoijselect(irhoij)
4989 [ + + + + ]: 6664 : if(pawtab%indklmn(3,klmn)==0.and.pawtab%indklmn(4,klmn)==2*lexexch) then
4990 : 3780 : m11=pawtab%klmntomn(1,klmn);m21=pawtab%klmntomn(2,klmn)
4991 : 3780 : n1=pawtab%klmntomn(3,klmn);n2=pawtab%klmntomn(4,klmn)
4992 : 3780 : nn1=(n1*n2)/2+1
4993 : 3780 : jrhoij1=1
4994 [ + + ]: 315980 : do irhoij1=1,pawrhoij%nrhoijsel
4995 : 312200 : klmn1=pawrhoij%rhoijselect(irhoij1)
4996 [ + + + + ]: 312200 : if(pawtab%indklmn(3,klmn1)==0.and.pawtab%indklmn(4,klmn1)==2*lexexch) then
4997 : 176820 : m31=pawtab%klmntomn(1,klmn1);m41=pawtab%klmntomn(2,klmn1)
4998 : 176820 : n3=pawtab%klmntomn(3,klmn1);n4=pawtab%klmntomn(4,klmn1)
4999 : 176820 : nn2=(n3*n4)/2+1
5000 [ + + ]: 707280 : do ll=1,lexexch+1
5001 : : vpawx(1,klmn,ispden)=vpawx(1,klmn,ispden)&
5002 : : & -pawtab%vex(m11,m31,m41,m21,ll)*pawtab%dltij(klmn1) &
5003 : 707280 : & *pawtab%fk(indn(nn1,nn2),ll)*pawrhoij%rhoijp(jrhoij1,ispden)
5004 : : end do
5005 : :
5006 : : end if
5007 : 315980 : jrhoij1=jrhoij1+cplex_rhoij
5008 : : end do !irhoij1
5009 : : end if
5010 : 6748 : jrhoij=jrhoij+cplex_rhoij
5011 : : end do !irhoij
5012 : : end do !ispden
5013 : :
5014 : : !Test
5015 [ - + ]: 42 : if (abs(pawprtvol)>=2) then
5016 : 0 : tot=zero
5017 [ # # ]: 0 : do ispden=1,pawrhoij%nspden
5018 : 0 : jrhoij=1
5019 [ # # ]: 0 : do irhoij=1,pawrhoij%nrhoijsel
5020 : 0 : klmn=pawrhoij%rhoijselect(irhoij)
5021 : 0 : tot=tot+vpawx(1,klmn,ispden)*pawrhoij%rhoijp(jrhoij,ispden)*pawtab%dltij(klmn)
5022 : 0 : jrhoij=jrhoij+cplex_rhoij
5023 : : end do
5024 : : end do
5025 : 0 : write(msg, '(a,es22.15)' )" Vpawx: tot=",tot*half
5026 : 0 : call wrtout(std_out,msg,'COLL')
5027 : : end if
5028 : :
5029 : 42 : end subroutine pawxpot
5030 : : !!***
5031 : :
5032 : : !----------------------------------------------------------------------
5033 : :
5034 : : !!****f* m_pawdij/symdij
5035 : : !! NAME
5036 : : !! symdij
5037 : : !!
5038 : : !! FUNCTION
5039 : : !! Symmetrize PAW non-local strengths Dij
5040 : : !! Symmetrize total Dij or one part of it
5041 : : !!
5042 : : !! INPUTS
5043 : : !! gprimd(3,3)=dimensional primitive translations for reciprocal space(bohr^-1).
5044 : : !! indsym(4,nsym,natom)=indirect indexing array for atom labels
5045 : : !! ipert=index of perturbation if pawrhoij is a pertubed rhoij
5046 : : !! no meaning for ground-state calculations (should be 0)
5047 : : !! [mpi_atmtab(:)]=--optional-- indexes of the atoms treated by current proc
5048 : : !! [comm_atom]=--optional-- MPI communicator over atoms
5049 : : !! my_natom=number of atoms treated by current processor
5050 : : !! natom=number of atoms in cell
5051 : : !! nsym=number of symmetry elements in space group
5052 : : !! ntypat=number of types of atoms in unit cell.
5053 : : !! option_dij=choose which part of Dij has to be symmetrized (which paw_ij(:)%dijxxx):
5054 : : !! 0: total dij (dij)
5055 : : !! 1: dij due to compensation charge (dijhat)
5056 : : !! 2: dij due to +U (dijU)
5057 : : !! 3: dij XC (dijxc)
5058 : : !! 4: dij XC due to compensation charge (dijxc_hat)
5059 : : !! 5: dij XC valence only (dijxc_val)
5060 : : !! 6: dij spin-orbit (dijso)
5061 : : !! 7: dij exact exchange (dijexxc)
5062 : : !! 8: dij, RF frozen part (dijfr)
5063 : : !! 9: dij due to nuclear dipoles
5064 : : !! 10: dij Hartree
5065 : : !! 11: dij Fock
5066 : : !! paw_ij(natom)%cplex_dij=1 if dij are REAL, 2 if they are COMPLEX
5067 : : !! paw_ij(natom)%qphase=2 if exp^(-i.q.r) phase from RF at q<>0, 1 otherwise
5068 : : !! paw_ij(natom)%lmn_size=number of (l,m,n) elements for the paw basis
5069 : : !! paw_ij(natom)%nspden=number of spin-density components
5070 : : !! paw_ij(natom)%nsppol=number of independent spin-density components
5071 : : !! paw_ij(natom)%dij(lmn2_size,nspden)=non-symmetrized paw dij quantities
5072 : : !! pawang <type(pawang_type)>=angular mesh discretization and related data
5073 : : !! pawprtvol=control print volume and debugging output for PAW
5074 : : !! pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
5075 : : !! [qphon(3)]=--optional-- (RF calculations only) - wavevector of the phonon
5076 : : !! rprimd(3,3)=real space primitive translations.
5077 : : !! symafm(nsym)=(anti)ferromagnetic part of symmetry operations
5078 : : !! symrec(3,3,nsym)=symmetries of group in terms of operations on
5079 : : !! reciprocal space primitive translations
5080 : : !!
5081 : : !! SIDE EFFECTS
5082 : : !! paw_ij(natom)%dij???(cplex_dij*lmn2_size,nspden)=symmetrized dij quantities as output
5083 : : !!
5084 : : !! SOURCE
5085 : :
5086 : 42218 : subroutine symdij(gprimd,indsym,ipert,my_natom,natom,nsym,ntypat,option_dij,&
5087 : 42218 : & paw_ij,pawang,pawprtvol,pawtab,rprimd,symafm,symrec, &
5088 [ + + + + : 21109 : & mpi_atmtab,comm_atom,qphon) ! optional arguments (parallelism)
- + ]
5089 : :
5090 : : !Arguments ---------------------------------------------
5091 : : !scalars
5092 : : integer,intent(in) :: ipert,my_natom,natom,nsym,ntypat,option_dij,pawprtvol
5093 : : integer,optional,intent(in) :: comm_atom
5094 : : type(pawang_type),intent(in) :: pawang
5095 : : !arrays
5096 : : integer,intent(in) :: indsym(4,nsym,natom),symafm(nsym),symrec(3,3,nsym)
5097 : : integer,optional,target,intent(in) :: mpi_atmtab(:)
5098 : : real(dp),intent(in) :: gprimd(3,3),rprimd(3,3)
5099 : : real(dp),intent(in),optional :: qphon(3)
5100 : : type(paw_ij_type),intent(inout) :: paw_ij(my_natom)
5101 : : type(pawtab_type),target,intent(in) :: pawtab(ntypat)
5102 : :
5103 : : !Local variables ---------------------------------------
5104 : : !scalars
5105 : : integer :: at_indx,cplex_dij,iafm,iatom,iatom_tot,ii
5106 : : integer :: il,il0,ilmn,iln,iln0,ilpm,indexi,indexii,indexj,indexjj,indexjj0,indexk,indexkc,indexkc_q
5107 : : integer :: iplex,iq,irot,ispden,itypat,j0lmn,jl,jl0,jlmn,jln,jln0,jlpm,jspden
5108 : : integer :: klmn,klmnc,kspden,lmn_size,lmn2_size,mi,mj,my_comm_atom,my_cplex_dij,my_ndij,my_qphase
5109 : : integer :: mu,natinc,ndij0,ndij1,nu,qphase,sz1,sz2
5110 : : logical,parameter :: afm_noncoll=.true. ! TRUE if antiferro symmetries are used with non-collinear magnetism
5111 : : logical :: antiferro,has_qphase,my_atmtab_allocated,noncoll,paral_atom,use_afm
5112 : : !DEBUG_ALTERNATE_ALGO
5113 : : !Set to TRUE to choose an alternate algorithm (with another representation)
5114 : : !to symmetrize Dij within non-collinear magnetism or spin-orbit
5115 : : logical,parameter :: lsymnew=.false.
5116 : : !DEBUG_ALTERNATE_ALGO
5117 : : real(dp) :: arg,factafm,zarot2
5118 : : real(dp) :: det
5119 : : character(len=6) :: pertstrg,wrt_mode
5120 : : character(len=500) :: msg
5121 : : !arrays
5122 : : integer :: nsym_used(2)
5123 : 21109 : integer, pointer :: indlmn(:,:)
5124 : 21109 : integer,pointer :: my_atmtab(:)
5125 : 21109 : integer,allocatable :: symrec_det(:)
5126 : : real(dp) :: dijc(2),fact(2),factsym(2),phase(2)
5127 : : real(dp) :: rotdij(2,2,2),rotmag(2,3,2),sumdij(2,2,2),summag(2,3,2)
5128 : 21109 : real(dp),allocatable :: dijnew(:,:,:),dijtmp(:,:),symrec_cart(:,:,:)
5129 : 21109 : type(coeff2_type),target, allocatable :: my_tmp_dij(:)
5130 : 21109 : type(coeff2_type),pointer :: tmp_dij(:)
5131 : :
5132 : : !DEBUG_ALTERNATE_ALGO
5133 : : !integer :: i1,i2,i3,i4,symrel_conv(3,3)
5134 : : !real(dp) :: spinrot(4)
5135 : : !real(dp),allocatable :: dijtemp(:,:),sumrhoso(:,:)
5136 : : !complex(dp) :: dijt(2,2),dijt2(2,2),Rspinrot(2,2)
5137 : : !DEBUG_ALTERNATE_ALGO
5138 : : ! *********************************************************************
5139 : :
5140 : : !Tests consistency of options
5141 : 21109 : if (my_natom>0) then
5142 : : if ((option_dij==1.and.paw_ij(1)%has_dijhat==0).or.&
5143 : : & (option_dij==2.and.paw_ij(1)%has_dijU==0).or.&
5144 : : & (option_dij==3.and.paw_ij(1)%has_dijxc==0).or.&
5145 : : & (option_dij==4.and.paw_ij(1)%has_dijxc_hat==0).or.&
5146 : : & (option_dij==5.and.paw_ij(1)%has_dijxc_val==0).or.&
5147 : : & (option_dij==6.and.paw_ij(1)%has_dijso==0).or.&
5148 : : & (option_dij==7.and.paw_ij(1)%has_dijexxc==0).or.&
5149 : : & (option_dij==8.and.paw_ij(1)%has_dijfr==0).or.&
5150 : : & (option_dij==9.and.paw_ij(1)%has_dijnd==0).or.&
5151 [ + + + - : 19345 : & (option_dij==10.and.paw_ij(1)%has_dijhartree==0).or.&
- + - - +
+ + - + +
+ - + + +
- - + - -
- + - - -
+ - - - +
- - + + +
- - + -
- ]
5152 : : & (option_dij==11.and.paw_ij(1)%has_dijfock==0)) then
5153 : 0 : msg='Incompatibilty between option_dij and allocation of Dij!'
5154 : 0 : LIBPAW_BUG(msg)
5155 : : end if
5156 : : end if
5157 : :
5158 : : !Set up parallelism over atoms
5159 [ + + + + ]: 21109 : paral_atom=(present(comm_atom).and.(my_natom/=natom))
5160 [ + + ]: 21109 : nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab
5161 [ + + ]: 21109 : my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom
5162 : 21109 : call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,my_natom_ref=my_natom)
5163 : :
5164 : : !Determine sizes of dij array according to options
5165 : 21109 : my_qphase=1;my_cplex_dij=1;my_ndij=1
5166 [ + + ]: 21109 : if (my_natom>0) then
5167 : 19345 : my_qphase=paw_ij(1)%qphase
5168 : 19345 : my_cplex_dij=paw_ij(1)%cplex_dij
5169 : 19345 : my_ndij=paw_ij(1)%ndij
5170 [ + + ]: 19345 : if (option_dij==4.or.option_dij==5.or.option_dij==9) my_qphase=1
5171 [ + + ]: 19345 : if (option_dij==10) my_cplex_dij=1
5172 [ + + ]: 19345 : if (option_dij==10) my_ndij=1
5173 : : end if
5174 : :
5175 : : !Antiferro case ?
5176 [ + + + + : 21109 : antiferro=.false.;if (my_natom>0) antiferro=(paw_ij(1)%nspden==2.and.paw_ij(1)%nsppol==1.and.my_ndij/=4)
- + ]
5177 : : ! Non-collinear case
5178 [ + + ]: 21109 : noncoll=.false.;if (my_natom>0) noncoll=(my_ndij==4)
5179 [ + + ]: 21109 : if (my_natom>0) then
5180 [ + + - + ]: 19345 : if (noncoll.and.paw_ij(1)%cplex_dij/=2) then
5181 : 0 : msg='cplex_dij must be 2 with ndij=4!'
5182 : 0 : LIBPAW_BUG(msg)
5183 : : end if
5184 : : end if
5185 : : !Do we use antiferro symmetries ?
5186 : 21109 : use_afm=((antiferro).or.(noncoll.and.afm_noncoll))
5187 : :
5188 : : !Do we have a phase due to q-vector?
5189 : 21109 : has_qphase=.false.
5190 [ + + ]: 21109 : if (my_natom>0) then
5191 : 19345 : has_qphase=(paw_ij(1)%qphase==2)
5192 [ + + ]: 19345 : if (present(qphon)) then
5193 [ + + + + : 14247 : if (any(abs(qphon(1:3))>tol8).and.(.not.has_qphase)) then
- + ]
5194 : 0 : msg='Should have qphase=2 for a non-zero q!'
5195 : 0 : LIBPAW_BUG(msg)
5196 : : end if
5197 : : end if
5198 : : !DEBUG_ALTERNATE_ALGO
5199 : : ! if(lsymnew.and.has_qphase) then
5200 : : ! msg='symdij: alternate algo not available for phonons at q<>0!'
5201 : : ! LIBPAW_BUG(msg)
5202 : : ! end if
5203 : : !DEBUG_ALTERNATE_ALGO
5204 : : end if
5205 : :
5206 : : !Printing of unsymetrized Dij
5207 [ + + + + : 21109 : if (abs(pawprtvol)>=1.and.option_dij==0.and.ipert/=natom+1.and.ipert/=natom+10) then
+ - + - ]
5208 [ + + ]: 1620 : wrt_mode='COLL';if (paral_atom) wrt_mode='PERS'
5209 [ - + ]: 1620 : pertstrg="DIJ";if (ipert>0) pertstrg="DIJ(1)"
5210 [ + + + + ]: 1620 : natinc=1;if(my_natom>1.and.pawprtvol>=0) natinc=my_natom-1
5211 : 1620 : write(msg, '(7a)') ch10," PAW TEST:",ch10,&
5212 : 3240 : & ' ========= Values of ',trim(pertstrg),' before symetrization =========',ch10
5213 : 1620 : call wrtout(std_out,msg,wrt_mode)
5214 [ - + + + ]: 3677 : do iatom=1,my_natom,natinc
5215 [ + + ]: 2057 : iatom_tot=iatom; if (paral_atom) iatom_tot=my_atmtab(iatom)
5216 : : call pawdij_print_dij(paw_ij(iatom)%dij,paw_ij(iatom)%cplex_dij,paw_ij(iatom)%qphase,&
5217 : 3677 : & iatom_tot,natom,paw_ij(iatom)%nspden,opt_prtvol=pawprtvol,mode_paral=wrt_mode)
5218 : : end do
5219 : 1620 : call wrtout(std_out,"",wrt_mode)
5220 : : end if
5221 : :
5222 : : !Symmetrization occurs only when nsym>1
5223 [ + + + - : 21109 : if (nsym>1.and.ipert/=natom+1.and.ipert/=natom+10) then
+ - ]
5224 : :
5225 [ - + ]: 11504 : if (pawang%nsym==0) then
5226 : 0 : msg='pawang%zarot must be allocated!'
5227 : 0 : LIBPAW_BUG(msg)
5228 : : end if
5229 : :
5230 : : ! Have to make a temporary copy of dij
5231 [ + + + - : 61260 : LIBPAW_DATATYPE_ALLOCATE(my_tmp_dij,(my_natom))
+ - + + -
+ - + +
+ ]
5232 [ + + ]: 11504 : if (my_natom>0) then
5233 [ + + ]: 37738 : do iatom=1,my_natom
5234 : 26748 : lmn2_size=paw_ij(iatom)%lmn2_size
5235 : 26748 : sz1=my_qphase*my_cplex_dij*lmn2_size;sz2=my_ndij
5236 [ - + + - : 106992 : LIBPAW_ALLOCATE(my_tmp_dij(iatom)%value,(sz1,sz2))
- + + - +
- + - - +
- + - + ]
5237 [ - + + - : 80244 : LIBPAW_ALLOCATE(dijtmp,(sz1,sz2))
- + + - -
+ - + ]
5238 [ + + - + : 26748 : if (option_dij==0) then
+ + - - -
- + - - ]
5239 [ + + + + ]: 4590693 : dijtmp(:,:)=paw_ij(iatom)%dij(:,:)
5240 : : else if (option_dij==1) then
5241 [ + + + + ]: 2095 : dijtmp(:,:)=paw_ij(iatom)%dijhat(:,:)
5242 : : else if (option_dij==2) then
5243 [ # # # # ]: 0 : dijtmp(:,:)=paw_ij(iatom)%dijU(:,:)
5244 : : else if (option_dij==3) then
5245 [ + + + + ]: 2095 : dijtmp(:,:)=paw_ij(iatom)%dijxc(:,:)
5246 : : else if (option_dij==4) then
5247 [ + + + + ]: 2095 : dijtmp(:,:)=paw_ij(iatom)%dijxc_hat(:,:)
5248 : : else if (option_dij==5) then
5249 [ + + + + ]: 2095 : dijtmp(:,:)=paw_ij(iatom)%dijxc_val(:,:)
5250 : : else if (option_dij==6) then
5251 [ # # # # ]: 0 : dijtmp(:,:)=paw_ij(iatom)%dijso(:,:)
5252 : : else if (option_dij==7) then
5253 [ # # # # ]: 0 : dijtmp(:,:)=paw_ij(iatom)%dijexxc(:,:)
5254 : : else if (option_dij==8) then
5255 [ # # # # ]: 0 : dijtmp(:,:)=paw_ij(iatom)%dijfr(:,:)
5256 : : else if (option_dij==9) then
5257 [ # # # # ]: 0 : dijtmp(:,:)=paw_ij(iatom)%dijnd(:,:)
5258 : : else if (option_dij==10) then
5259 [ + + ]: 3890 : dijtmp(:,1)=paw_ij(iatom)%dijhartree(:)
5260 : : else if (option_dij==11) then
5261 [ # # # # ]: 0 : dijtmp(:,:)=paw_ij(iatom)%dijfock(:,:)
5262 : : end if
5263 : : !Has to translate Dij^{alpha,beta} into (Dij, Dij magnetic field) format
5264 [ + + ]: 26748 : if (my_ndij==4) then
5265 [ + + ]: 564717 : my_tmp_dij(iatom)%value(:,1)=dijtmp(:,1)+dijtmp(:,2)
5266 [ + + ]: 564717 : my_tmp_dij(iatom)%value(:,2)=dijtmp(:,3)+dijtmp(:,4)
5267 [ + + ]: 564717 : my_tmp_dij(iatom)%value(:,4)=dijtmp(:,1)-dijtmp(:,2)
5268 [ + + ]: 283249 : do klmn=1,paw_ij(iatom)%lmn2_size
5269 : 281468 : my_tmp_dij(iatom)%value(2*klmn-1,3)=-dijtmp(2*klmn ,3)+dijtmp(2*klmn ,4)
5270 : 283249 : my_tmp_dij(iatom)%value(2*klmn ,3)= dijtmp(2*klmn-1,3)-dijtmp(2*klmn-1,4)
5271 : : end do
5272 : : !DEBUG_ALTERNATE_ALGO
5273 : : ! if(lsymnew) my_tmp_dij(iatom)%value(:,:)=dijtmp(:,:)
5274 : : !DEBUG_ALTERNATE_ALGO
5275 : : else
5276 [ + + + + ]: 2342382 : my_tmp_dij(iatom)%value(:,:)=dijtmp(:,:)
5277 : : end if
5278 [ - + ]: 37738 : LIBPAW_DEALLOCATE(dijtmp)
5279 : : end do
5280 : : end if
5281 : :
5282 : : ! Parallelism: gather all Dij
5283 [ + + ]: 11504 : if (paral_atom) then
5284 [ - + + - : 19800 : LIBPAW_DATATYPE_ALLOCATE(tmp_dij,(natom))
+ - + - -
+ - + +
+ ]
5285 : 3264 : call pawdij_gather(my_tmp_dij,tmp_dij,my_comm_atom,my_atmtab)
5286 [ + + ]: 6596 : do iatom=1,my_natom
5287 [ - + ]: 6596 : LIBPAW_DEALLOCATE(my_tmp_dij(iatom)%value)
5288 : : end do
5289 [ + - + + : 6596 : LIBPAW_DATATYPE_DEALLOCATE(my_tmp_dij)
- + - + ]
5290 : : else
5291 : 8240 : tmp_dij=>my_tmp_dij
5292 : : end if
5293 : :
5294 [ + + ]: 11504 : if (noncoll) then
5295 [ - + + - : 3843 : LIBPAW_ALLOCATE(symrec_cart,(3,3,nsym))
+ - - + -
+ ]
5296 [ - + + - : 3843 : LIBPAW_ALLOCATE(symrec_det,(nsym))
+ - - + -
+ ]
5297 [ + + ]: 10245 : do irot=1,nsym
5298 : 8964 : symrec_cart(:,:,irot)=symdij_symcart(gprimd,rprimd,symrec(:,:,irot))
5299 : : ! compute the sign of the determinant of the symmetries
5300 : : ! to be able to apply only the proper part of the symmetries to the magn. components
5301 : : ! (magnetization == pseudo-vector)
5302 : : det = symrec_cart(1,1,irot)*symrec_cart(2,2,irot)*symrec_cart(3,3,irot)+&
5303 : : & symrec_cart(2,1,irot)*symrec_cart(3,2,irot)*symrec_cart(1,3,irot)+&
5304 : : & symrec_cart(1,2,irot)*symrec_cart(2,3,irot)*symrec_cart(3,1,irot) - &
5305 : : & (symrec_cart(3,1,irot)*symrec_cart(2,2,irot)*symrec_cart(1,3,irot)+&
5306 : : & symrec_cart(2,1,irot)*symrec_cart(1,2,irot)*symrec_cart(3,3,irot)+&
5307 : 8964 : & symrec_cart(3,2,irot)*symrec_cart(2,3,irot)*symrec_cart(1,1,irot))
5308 : 10245 : symrec_det(irot) = nint(det) ! should return 1 or -1
5309 : : end do
5310 : : !DEBUG_ALTERNATE_ALGO
5311 : : ! if(lsymnew) then
5312 : : ! LIBPAW_ALLOCATE(sumrhoso,(my_cplex_dij,4))
5313 : : ! end if
5314 : : !DEBUG_ALTERNATE_ALGO
5315 : : end if
5316 : :
5317 : 11504 : ndij1=1
5318 [ + + ]: 11504 : if (antiferro) ndij1=2
5319 [ + + ]: 11504 : if (noncoll) ndij1=4
5320 : 11504 : ndij1=min(ndij1,my_ndij)
5321 : 11504 : ndij0=ndij1-1
5322 [ - + + - : 57520 : LIBPAW_ALLOCATE(dijnew,(my_cplex_dij,ndij1,my_qphase))
- + + - -
+ + - + -
+ - - + -
+ ]
5323 : :
5324 : : ! Loops over atoms and spin components
5325 [ + + ]: 38252 : do iatom=1,my_natom
5326 [ + + ]: 26748 : iatom_tot=iatom;if (paral_atom) iatom_tot=my_atmtab(iatom)
5327 : 26748 : itypat=paw_ij(iatom)%itypat
5328 : 26748 : lmn_size=paw_ij(iatom)%lmn_size
5329 : 26748 : lmn2_size=paw_ij(iatom)%lmn2_size
5330 : 26748 : cplex_dij=min(paw_ij(iatom)%cplex_dij,my_cplex_dij)
5331 : 26748 : qphase=min(paw_ij(iatom)%qphase,my_qphase)
5332 : 26748 : indlmn => pawtab(itypat)%indlmn
5333 : :
5334 : : !DEBUG_ALTERNATE_ALGO
5335 : : ! if (noncoll.and.lsymnew) then
5336 : : ! LIBPAW_ALLOCATE(dijtemp,(cplex_dij,my_ndij))
5337 : : ! end if
5338 : : !DEBUG_ALTERNATE_ALGO
5339 : :
5340 [ + + ]: 69080 : do ispden=1,paw_ij(iatom)%nsppol
5341 : 30828 : jspden=min(3-ispden,paw_ij(iatom)%nsppol)
5342 : :
5343 : : ! Loops over (il,im) and (jl,jm)
5344 : 30828 : jl0=-1;jln0=-1;indexj=1
5345 [ + + ]: 400078 : do jlmn=1,lmn_size
5346 : 342502 : jl=indlmn(1,jlmn)
5347 : 342502 : jlpm=1+jl+indlmn(2,jlmn)
5348 : 342502 : jln=indlmn(5,jlmn)
5349 [ + + ]: 342502 : if (jln/=jln0) indexj=indexj+2*jl0+1
5350 : 342502 : j0lmn=jlmn*(jlmn-1)/2
5351 : 342502 : il0=-1;iln0=-1;indexi=1
5352 [ + + ]: 2825400 : do ilmn=1,jlmn
5353 : 2482898 : il=indlmn(1,ilmn)
5354 : 2482898 : ilpm=1+il+indlmn(2,ilmn)
5355 : 2482898 : iln=indlmn(5,ilmn)
5356 [ + + ]: 2482898 : if (iln/=iln0) indexi=indexi+2*il0+1
5357 : 2482898 : klmn=j0lmn+ilmn;klmnc=cplex_dij*(klmn-1)
5358 : :
5359 : 2482898 : nsym_used(:)=0
5360 : :
5361 : 2482898 : rotdij(:,:,:)=zero
5362 [ + + ]: 2482898 : if (noncoll) rotmag(:,:,:)=zero
5363 : : !DEBUG_ALTERNATE_ALGO
5364 : : ! if (noncoll.and.lsymnew) sumrhoso(:,:)=zero
5365 : : !DEBUG_ALTERNATE_ALGO
5366 : :
5367 : : ! Loop over symmetries
5368 [ + + ]: 86345770 : do irot=1,nsym
5369 : : !DEBUG_ALTERNATE_ALGO
5370 : : ! if(lsymnew) then
5371 : : ! call mati3inv(symrec(:,:,irot),symrel_conv)
5372 : : ! call getspinrot(rprimd,spinrot,symrel_conv)
5373 : : ! Rspinrot(1,1)=cmplx(spinrot(1),-spinrot(4))
5374 : : ! Rspinrot(1,2)=cmplx(-spinrot(3),-spinrot(2))
5375 : : ! Rspinrot(2,1)=cmplx(spinrot(3),-spinrot(2))
5376 : : ! Rspinrot(2,2)=cmplx(spinrot(1),spinrot(4))
5377 : : ! end if
5378 : : !DEBUG_ALTERNATE_ALGO
5379 [ + + + + ]: 83862872 : if ((symafm(irot)/=1).and.(.not.use_afm)) cycle
5380 [ + + ]: 81399560 : kspden=ispden;if (symafm(irot)==-1) kspden=jspden
5381 [ + + + + ]: 81399560 : iafm=1;if ((antiferro).and.(symafm(irot)==-1)) iafm=2
5382 : 81399560 : factafm=dble(symafm(irot))
5383 : :
5384 : 81399560 : nsym_used(iafm)=nsym_used(iafm)+1
5385 : 81399560 : at_indx=indsym(4,irot,iatom_tot)
5386 : :
5387 [ + + ]: 81399560 : if (has_qphase) then
5388 : : arg=two_pi*(qphon(1)*indsym(1,irot,iatom)+qphon(2)*indsym(2,irot,iatom) &
5389 : 14904 : & +qphon(3)*indsym(3,irot,iatom))
5390 : 14904 : phase(1)=cos(arg);phase(2)=sin(arg)
5391 : : end if
5392 : :
5393 : 81399560 : sumdij(:,:,:)=zero
5394 [ + + ]: 81399560 : if (noncoll) summag(:,:,:)=zero
5395 : :
5396 : : ! Accumulate values over (mi,mj) and symmetries
5397 [ + + ]: 432836340 : do mj=1,2*jl+1
5398 : 351436780 : indexjj=indexj+mj;indexjj0=indexjj*(indexjj-1)/2
5399 [ + + ]: 1609392396 : do mi=1,2*il+1
5400 : 1176556056 : indexii=indexi+mi
5401 [ + + ]: 3529668168 : factsym(:)=one
5402 [ + + ]: 1176556056 : if (indexii<=indexjj) then
5403 : 1029242376 : indexk=indexjj0+indexii
5404 : 1029242376 : factsym(2)=one
5405 : : else
5406 : 147313680 : indexk=indexii*(indexii-1)/2+indexjj
5407 : 147313680 : factsym(2)=-one
5408 : : end if
5409 : 1176556056 : indexkc=cplex_dij*(indexk-1)
5410 : 1176556056 : indexkc_q=indexkc+cplex_dij*lmn2_size
5411 : :
5412 : : !DEBUG_ALTERNATE_ALGO
5413 : : ! if (noncoll.and.lsymnew) then
5414 : : ! do iplex=1,cplex_dij
5415 : : ! if(factafm>zero) then
5416 : : ! dijtemp(iplex,1)=factsym(iplex)*tmp_dij(at_indx)%value(indexkc+iplex,1)
5417 : : ! dijtemp(iplex,2)=factsym(iplex)*tmp_dij(at_indx)%value(indexkc+iplex,2)
5418 : : ! else
5419 : : ! dijtemp(iplex,1)=factsym(iplex)*tmp_dij(at_indx)%value(indexkc+iplex,2)
5420 : : ! dijtemp(iplex,2)=factsym(iplex)*tmp_dij(at_indx)%value(indexkc+iplex,1)
5421 : : ! end if
5422 : : ! if(factsym(2)<zero) then ! to be changed if symafm
5423 : : ! dijtemp(iplex,3)=factafm*factsym(iplex)*tmp_dij(at_indx)%value(indexkc+iplex,4)
5424 : : ! dijtemp(iplex,4)=factafm*factsym(iplex)*tmp_dij(at_indx)%value(indexkc+iplex,3)
5425 : : ! else
5426 : : ! dijtemp(iplex,3)=factafm*factsym(iplex)*tmp_dij(at_indx)%value(indexkc+iplex,3)
5427 : : ! dijtemp(iplex,4)=factafm*factsym(iplex)*tmp_dij(at_indx)%value(indexkc+iplex,4)
5428 : : ! end if
5429 : : ! end do
5430 : : ! end if
5431 : : !DEBUG_ALTERNATE_ALGO
5432 : :
5433 : : ! Be careful: use here R_rel^-1 in term of spherical harmonics
5434 : : ! which is tR_rec in term of spherical harmonics
5435 : : ! so, use transpose[zarot].... however, we use here zarot (??)
5436 : 1176556056 : zarot2=pawang%zarot(mi,ilpm,il+1,irot)*pawang%zarot(mj,jlpm,jl+1,irot)
5437 : : ! zarot2=pawang%zarot(ilpm,mi,il+1,irot)*pawang%zarot(jlpm,mj,jl+1,irot)
5438 : :
5439 : : if((.not.noncoll).or.(.not.lsymnew)) then
5440 : 1176556056 : fact(1)=factsym(1);fact(2)=factsym(2)*factafm !????? What? MT
5441 : : sumdij(1:cplex_dij,iafm,1)=sumdij(1:cplex_dij,iafm,1) &
5442 : : & +fact(1:cplex_dij)*zarot2 &
5443 [ + + ]: 2390649328 : & *tmp_dij(at_indx)%value(indexkc+1:indexkc+cplex_dij,kspden)
5444 [ + + ]: 1176556056 : if (qphase==2) &
5445 : : & sumdij(1:cplex_dij,iafm,2)=sumdij(1:cplex_dij,iafm,2) &
5446 : : & +fact(1:cplex_dij)*zarot2 &
5447 [ + + ]: 261744 : & *tmp_dij(at_indx)%value(indexkc_q+1:indexkc_q+cplex_dij,kspden)
5448 : : end if
5449 : :
5450 [ + + ]: 1527992836 : if (noncoll.and.(.not.lsymnew)) then
5451 : 37477024 : fact(1)=factsym(1)*factafm;fact(2)=factsym(2)
5452 [ + + ]: 149908096 : do mu=1,3
5453 : : summag(1:cplex_dij,mu,1)=summag(1:cplex_dij,mu,1) &
5454 : : & +fact(1:cplex_dij)*zarot2 &
5455 [ + + ]: 374770240 : & *tmp_dij(at_indx)%value(indexkc+1:indexkc+cplex_dij,1+mu)
5456 : : end do
5457 [ - + ]: 37477024 : if (qphase==2) then
5458 [ # # ]: 0 : do mu=1,3
5459 : : summag(1:cplex_dij,mu,2)=summag(1:cplex_dij,mu,2) &
5460 : : & +fact(1:cplex_dij)*zarot2 &
5461 [ # # ]: 0 : & *tmp_dij(at_indx)%value(indexkc_q+1:indexkc_q+cplex_dij,1+mu)
5462 : : end do
5463 : : end if
5464 : : end if
5465 : : !DEBUG_ALTERNATE_ALGO
5466 : : ! if (noncoll.and.(lsymnew)) then
5467 : : ! dijt(1,1)=cmplx(dijtemp(1,1),dijtemp(2,1))
5468 : : ! dijt(2,2)=cmplx(dijtemp(1,2),dijtemp(2,2))
5469 : : ! dijt(1,2)=cmplx(dijtemp(1,3),dijtemp(2,3))
5470 : : ! dijt(2,1)=cmplx(dijtemp(1,4),dijtemp(2,4))
5471 : : ! dijt2(:,:)=czero
5472 : : ! do i1=1,2
5473 : : ! do i4=1,2
5474 : : ! do i2=1,2
5475 : : ! do i3=1,2
5476 : : ! dijt2(i1,i4)=dijt2(i1,i4)+Rspinrot(i1,i2)*dijt(i2,i3)*conjg(Rspinrot(i4,i3))
5477 : : ! end do
5478 : : ! end do
5479 : : ! end do
5480 : : ! end do
5481 : : ! do mu=1,4
5482 : : ! if(mu==1) then
5483 : : ! i1=1;i4=1
5484 : : ! else if(mu==2) then
5485 : : ! i1=2;i4=2
5486 : : ! else if(mu==3) then
5487 : : ! i1=1;i4=2
5488 : : ! else if(mu==4) then
5489 : : ! i1=2;i4=1
5490 : : ! end if
5491 : : ! sumrhoso(1,mu)=sumrhoso(1,mu)+zarot2*real(dijt2(i1,i4))
5492 : : ! sumrhoso(2,mu)=sumrhoso(2,mu)+zarot2*imag(dijt2(i1,i4))
5493 : : ! end do
5494 : : ! end if
5495 : : end do ! mi
5496 : : end do ! mj
5497 : : !DEBUG_ALTERNATE_ALGO
5498 : :
5499 : : ! Apply phase for phonons
5500 [ + + ]: 81399560 : if (has_qphase) then
5501 : : !Remember, Dij is stored as follows:
5502 : : ! Dij= [Dij(2klmn-1)+i.Dij(2klmn)]
5503 : : ! +i.[Dij(lnm2_size+2klmn-1)+i.Dij(lmn2_size+2klmn)]
5504 : : if((.not.noncoll).or.(.not.lsymnew)) then
5505 [ + + ]: 29808 : do iplex=1,cplex_dij
5506 : 14904 : dijc(1)=sumdij(iplex,iafm,1)
5507 : 14904 : dijc(2)=sumdij(iplex,iafm,2)
5508 : 14904 : sumdij(iplex,iafm,1)=phase(1)*dijc(1)-phase(2)*dijc(2)
5509 : 29808 : sumdij(iplex,iafm,2)=phase(1)*dijc(2)+phase(2)*dijc(1)
5510 : : end do
5511 : : end if
5512 [ - + ]: 14904 : if (noncoll.and.(.not.lsymnew)) then
5513 [ # # ]: 0 : do iplex=1,cplex_dij
5514 [ # # ]: 0 : do mu=1,3
5515 : 0 : dijc(1)=summag(iplex,mu,1)
5516 : 0 : dijc(2)=summag(iplex,mu,2)
5517 : 0 : summag(iplex,mu,1)=phase(1)*dijc(1)-phase(2)*dijc(2)
5518 : 0 : summag(iplex,mu,2)=phase(1)*dijc(2)+phase(2)*dijc(1)
5519 : : end do
5520 : : end do
5521 : : end if
5522 : : !DEBUG_ALTERNATE_ALGO
5523 : : ! if (noncoll.and.(lsymnew) then
5524 : : ! do mu=1,4
5525 : : ! sumrhoso(1,mu)=phase(1)*sumrhoso(1,mu)-phase(2)*sumrhoso(2,mu)
5526 : : ! sumrhoso(2,mu)=phase(1)*sumrhoso(2,mu)+phase(2)*sumrhoso(1,mu)
5527 : : ! end do
5528 : : ! end do
5529 : : ! end if
5530 : : !DEBUG_ALTERNATE_ALGO
5531 : : end if
5532 : :
5533 : : ! Add contribution of this rotation
5534 [ + + ]: 162814024 : do iq=1,qphase
5535 : : rotdij(1:cplex_dij,iafm,iq)=rotdij(1:cplex_dij,iafm,iq) &
5536 [ + + ]: 246332840 : & +sumdij(1:cplex_dij,iafm,iq)
5537 : : end do
5538 [ + + ]: 83882458 : if (noncoll.and.(.not.lsymnew)) then
5539 : : ! If non-collinear case, rotate Dij magnetization
5540 : : ! Should use symrel^1 but use transpose[symrec] instead
5541 [ + + ]: 4189696 : do iq=1,qphase
5542 [ + + ]: 10474240 : do nu=1,3
5543 [ + + ]: 27233024 : do mu=1,3
5544 : : !We need the transpose ?
5545 : : rotmag(1:cplex_dij,mu,iq)=rotmag(1:cplex_dij,mu,iq) &
5546 [ + + ]: 62845440 : & +symrec_det(irot)*symrec_cart(mu,nu,irot)*summag(1:cplex_dij,nu,iq)
5547 : : end do
5548 : : end do
5549 : : end do
5550 : : end if
5551 : :
5552 : : end do ! End loop over symmetries
5553 : :
5554 : : if((.not.noncoll).or.(.not.lsymnew)) then
5555 : : ! Store new value of dij
5556 [ + + ]: 4973248 : do iq=1,qphase
5557 [ + + ]: 7747442 : do iplex=1,cplex_dij
5558 : 2774194 : dijnew(iplex,1,iq)=rotdij(iplex,1,iq)/nsym_used(1)
5559 [ + + ]: 5264544 : if (abs(dijnew(iplex,1,iq))<=tol10) dijnew(iplex,1,iq)=zero
5560 : : end do
5561 : : end do
5562 : :
5563 : : ! Antiferromagnetic case: has to fill up "down" component of dij
5564 [ + + + - ]: 2482898 : if (antiferro.and.nsym_used(2)>0) then
5565 [ + + ]: 152900 : do iq=1,qphase
5566 [ + + ]: 229350 : do iplex=1,cplex_dij
5567 : 76450 : dijnew(iplex,2,iq)=rotdij(iplex,2,iq)/nsym_used(2)
5568 [ + + ]: 152900 : if (abs(dijnew(iplex,2,iq))<=tol10) dijnew(iplex,2,iq)=zero
5569 : : end do
5570 : : end do
5571 : : end if
5572 : : !DEBUG_ALTERNATE_ALGO
5573 : : ! else if (noncoll.and.(lsymnew)) then
5574 : : ! do mu=1,4
5575 : : ! do iplex=1,cplex_dij
5576 : : ! dijnew(iplex,mu,1)=sumrhoso(iplex,mu)/nsym_used(1)
5577 : : ! if (abs(dijnew(iplex,mu,1))<=tol10) dijnew(iplex,mu,1)=zero
5578 : : ! end do
5579 : : ! end do
5580 : : !DEBUG_ALTERNATE_ALGO
5581 : : end if
5582 : :
5583 : : ! Non-collinear case: store new values of Dij magnetization
5584 [ + + ]: 2482898 : if (noncoll.and.(.not.lsymnew)) then
5585 : : ! Select on-zero elements
5586 [ + + ]: 562936 : do iq=1,qphase
5587 [ + + ]: 1407340 : do mu=1,3
5588 [ + + ]: 2814680 : do iplex=1,cplex_dij
5589 : 1688808 : rotmag(iplex,mu,iq)=rotmag(iplex,mu,iq)/nsym_used(1)
5590 [ + + ]: 2533212 : if (abs(rotmag(iplex,mu,iq))<=tol10) rotmag(iplex,mu,iq)=zero
5591 : : end do
5592 : : end do
5593 : : end do
5594 : : ! Transfer back to Dij^{alpha,beta}
5595 : : if(.not.lsymnew) then
5596 : : !Remember: cplex_dij is 2 in that case
5597 [ + + ]: 562936 : do iq=1,qphase
5598 : 281468 : dijnew(1,1,iq)=half*(dijnew(1,1,iq)+rotmag(1,3,iq))
5599 : 281468 : dijnew(2,1,iq)=half*(dijnew(2,1,iq)+rotmag(2,3,iq))
5600 : 281468 : dijnew(1,2,iq)= dijnew(1,1,iq)-rotmag(1,3,iq)
5601 : 281468 : dijnew(2,2,iq)= dijnew(2,1,iq)-rotmag(2,3,iq)
5602 : 281468 : dijnew(1,3,iq)=half*(rotmag(1,1,iq)+rotmag(2,2,iq))
5603 : 281468 : dijnew(2,3,iq)=half*(rotmag(2,1,iq)-rotmag(1,2,iq))
5604 : 281468 : dijnew(1,4,iq)=half*(rotmag(1,1,iq)-rotmag(2,2,iq))
5605 : 562936 : dijnew(2,4,iq)=half*(rotmag(2,1,iq)+rotmag(1,2,iq))
5606 : : end do
5607 : : end if
5608 : : end if
5609 : : ! Transfer new value of Dij in suitable pointer
5610 : : ii=klmnc
5611 [ + + ]: 4973248 : do iq=1,qphase
5612 [ + + - + : 2490350 : if (option_dij==0) then
+ + - - -
- + - - ]
5613 [ + + + + ]: 10405240 : paw_ij(iatom)%dij(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5614 : : else if (option_dij==1) then
5615 [ + + + + ]: 6075 : paw_ij(iatom)%dijhat(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5616 : : else if (option_dij==2) then
5617 [ # # # # ]: 0 : paw_ij(iatom)%dijU(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5618 : : else if (option_dij==3) then
5619 [ + + + + ]: 6075 : paw_ij(iatom)%dijxc(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5620 : : else if (option_dij==4) then
5621 [ + + + + ]: 6075 : paw_ij(iatom)%dijxc_hat(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5622 : : else if (option_dij==5) then
5623 [ + + + + ]: 6075 : paw_ij(iatom)%dijxc_val(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5624 : : else if (option_dij==6) then
5625 [ # # # # ]: 0 : paw_ij(iatom)%dijso(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5626 : : else if (option_dij==7) then
5627 [ # # # # ]: 0 : paw_ij(iatom)%dijexxc(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5628 : : else if (option_dij==8) then
5629 [ # # # # ]: 0 : paw_ij(iatom)%dijfr(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5630 : : else if (option_dij==9) then
5631 [ # # # # ]: 0 : paw_ij(iatom)%dijnd(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5632 : : else if (option_dij==10) then
5633 [ + + ]: 7644 : paw_ij(iatom)%dijhartree(ii+1:ii+cplex_dij)=dijnew(1:cplex_dij,1,iq)
5634 : : else if (option_dij==11) then
5635 [ # # # # ]: 0 : paw_ij(iatom)%dijfock(ii+1:ii+cplex_dij,ispden:ispden+ndij0)=dijnew(1:cplex_dij,1:ndij1,iq)
5636 : : end if
5637 : 4973248 : ii=ii+lmn2_size*cplex_dij
5638 : : end do
5639 : :
5640 : 2825400 : il0=il;iln0=iln ! End loops over (il,im) and (jl,jm)
5641 : : end do
5642 : 373330 : jl0=jl;jln0=jln
5643 : : end do
5644 : :
5645 : : end do ! ispden
5646 : :
5647 : : !DEBUG_ALTERNATE_ALGO
5648 : : ! if (noncoll.and.lsymnew) then
5649 : : ! LIBPAW_DEALLOCATE(dijtemp)
5650 : : ! end if
5651 : : !DEBUG_ALTERNATE_ALGO
5652 : :
5653 : : end do ! iatom
5654 : :
5655 [ - + ]: 11504 : LIBPAW_DEALLOCATE(dijnew)
5656 [ + + ]: 11504 : if (noncoll) then
5657 [ - + ]: 1281 : LIBPAW_DEALLOCATE(symrec_cart)
5658 [ - + ]: 1281 : LIBPAW_DEALLOCATE(symrec_det)
5659 : : !DEBUG_ALTERNATE_ALGO
5660 : : ! if (lsymnew) then
5661 : : ! LIBPAW_DEALLOCATE(sumrhoso)
5662 : : ! end if
5663 : : !DEBUG_ALTERNATE_ALGO
5664 : : end if
5665 : :
5666 [ + + ]: 11504 : if (paral_atom) then
5667 [ + + ]: 13272 : do iatom=1,natom
5668 [ - + ]: 13272 : LIBPAW_DEALLOCATE(tmp_dij(iatom)%value)
5669 : : end do
5670 [ - + ]: 3264 : LIBPAW_DATATYPE_DEALLOCATE(tmp_dij)
5671 : : else
5672 [ + + ]: 31656 : do iatom=1,my_natom
5673 [ - + ]: 31656 : LIBPAW_DEALLOCATE(my_tmp_dij(iatom)%value)
5674 : : end do
5675 [ + - + + : 31656 : LIBPAW_DATATYPE_DEALLOCATE(my_tmp_dij)
- + - + ]
5676 : : end if
5677 : :
5678 [ + + + + ]: 9605 : else if (ipert/=natom+1.and.ipert/=natom+10) then ! nsym>1
5679 : :
5680 : : ! *********************************************************************
5681 : : ! If nsym==1, only cut small components of dij
5682 : :
5683 [ - + ]: 8714 : if (antiferro) then
5684 : 0 : msg='In the antiferromagnetic case, nsym cannot be 1'
5685 : 0 : LIBPAW_BUG(msg)
5686 : : end if
5687 : :
5688 [ + + ]: 26641 : do iatom=1,my_natom
5689 [ + + ]: 49627 : do ispden=1,my_ndij
5690 : 22986 : qphase=paw_ij(iatom)%qphase
5691 : 22986 : cplex_dij=paw_ij(iatom)%cplex_dij
5692 : 22986 : lmn2_size=paw_ij(iatom)%lmn2_size
5693 [ + - - - : 40913 : if (option_dij==0) then
- - - - -
- - - ]
5694 [ + + ]: 977670 : do klmn=1,lmn2_size*cplex_dij*qphase
5695 [ + + ]: 977670 : if (abs(paw_ij(iatom)%dij(klmn,ispden))<=tol10) paw_ij(iatom)%dij(klmn,ispden)=zero
5696 : : end do
5697 : : else if (option_dij==1) then
5698 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij*qphase
5699 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijhat(klmn,ispden))<=tol10) paw_ij(iatom)%dijhat(klmn,ispden)=zero
5700 : : end do
5701 : : else if (option_dij==2) then
5702 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij*qphase
5703 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijU(klmn,ispden))<=tol10) paw_ij(iatom)%dijU(klmn,ispden)=zero
5704 : : end do
5705 : : else if (option_dij==3) then
5706 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij*qphase
5707 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijxc(klmn,ispden))<=tol10) paw_ij(iatom)%dijxc(klmn,ispden)=zero
5708 : : end do
5709 : : else if (option_dij==4) then
5710 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij
5711 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijxc_hat(klmn,ispden))<=tol10) paw_ij(iatom)%dijxc_hat(klmn,ispden)=zero
5712 : : end do
5713 : : else if (option_dij==5) then
5714 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij
5715 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijxc_val(klmn,ispden))<=tol10) paw_ij(iatom)%dijxc_val(klmn,ispden)=zero
5716 : : end do
5717 : : else if (option_dij==6) then
5718 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij*qphase
5719 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijso(klmn,ispden))<=tol10) paw_ij(iatom)%dijso(klmn,ispden)=zero
5720 : : end do
5721 : : else if (option_dij==7) then
5722 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij*qphase
5723 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijexxc(klmn,ispden))<=tol10) paw_ij(iatom)%dijexxc(klmn,ispden)=zero
5724 : : end do
5725 : : else if (option_dij==8) then
5726 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij*qphase
5727 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijfr(klmn,ispden))<=tol10) paw_ij(iatom)%dijfr(klmn,ispden)=zero
5728 : : end do
5729 : : else if (option_dij==9) then
5730 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij
5731 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijnd(klmn,ispden))<=tol10) paw_ij(iatom)%dijnd(klmn,ispden)=zero
5732 : : end do
5733 [ # # ]: 0 : else if (option_dij==10.and.ispden==1) then
5734 [ # # ]: 0 : do klmn=1,lmn2_size*qphase
5735 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijhartree(klmn))<=tol10) paw_ij(iatom)%dijhartree(klmn)=zero
5736 : : end do
5737 [ # # ]: 0 : else if (option_dij==11) then
5738 [ # # ]: 0 : do klmn=1,lmn2_size*cplex_dij*qphase
5739 [ # # ]: 0 : if (abs(paw_ij(iatom)%dijfock(klmn,ispden))<=tol10) paw_ij(iatom)%dijfock(klmn,ispden)=zero
5740 : : end do
5741 : : end if
5742 : : end do
5743 : : end do
5744 : :
5745 : : end if ! nsym>1
5746 : :
5747 : : !*********************************************************************
5748 : : !Printing of Dij
5749 : :
5750 [ + + + + : 21109 : if (abs(pawprtvol)>=1.and.option_dij==0.and.ipert/=natom+1.and.ipert/=natom+10) then
+ - + - ]
5751 [ + + ]: 1620 : wrt_mode='COLL';if (paral_atom) wrt_mode='PERS'
5752 [ - + ]: 1620 : pertstrg="DIJ";if (ipert>0) pertstrg="DIJ(1)"
5753 [ + + + + ]: 1620 : natinc=1;if(my_natom>1.and.pawprtvol>=0) natinc=my_natom-1
5754 : 1620 : write(msg, '(7a)') ch10," PAW TEST:",ch10,&
5755 : 3240 : & ' ========= Values of ',trim(pertstrg),' after symetrization =========',ch10
5756 : 1620 : call wrtout(std_out,msg,wrt_mode)
5757 [ - + + + ]: 3677 : do iatom=1,my_natom,natinc
5758 [ + + ]: 2057 : iatom_tot=iatom; if (paral_atom) iatom_tot=my_atmtab(iatom)
5759 : : call pawdij_print_dij(paw_ij(iatom)%dij,paw_ij(iatom)%cplex_dij,paw_ij(iatom)%qphase,&
5760 : 3677 : & iatom_tot,natom,paw_ij(iatom)%nspden,opt_prtvol=pawprtvol,mode_paral=wrt_mode)
5761 : : end do
5762 : 1620 : call wrtout(std_out,"",wrt_mode)
5763 : : end if
5764 : :
5765 : : !Destroy atom table used for parallelism
5766 [ + + - + : 42218 : call free_my_atmtab(my_atmtab,my_atmtab_allocated)
- + - + -
- - - ]
5767 : :
5768 : : !*********************************************************************
5769 : : !Small function: convert a symmetry operation
5770 : : !from reduced coordinates (integers) to cartesian coordinates (reals)
5771 : : contains
5772 [ - + ]: 8964 : function symdij_symcart(aprim,bprim,symred)
5773 : :
5774 : : real(dp) :: symdij_symcart(3,3)
5775 : : integer,intent(in) :: symred(3,3)
5776 : : real(dp),intent(in) :: aprim(3,3),bprim(3,3)
5777 : : integer :: ii,jj,kk
5778 : : real(dp) :: tmp(3,3)
5779 [ + + + + ]: 116532 : symdij_symcart=zero;tmp=zero
5780 [ + + ]: 35856 : do kk=1,3
5781 [ + + ]: 116532 : do jj=1,3
5782 [ + + ]: 349596 : do ii=1,3
5783 : 322704 : tmp(ii,jj)=tmp(ii,jj)+bprim(ii,kk)*dble(symred(jj,kk))
5784 : : end do
5785 : : end do
5786 : : end do
5787 [ + + ]: 35856 : do kk=1,3
5788 [ + + ]: 116532 : do jj=1,3
5789 [ + + ]: 349596 : do ii=1,3
5790 : 322704 : symdij_symcart(ii,jj)=symdij_symcart(ii,jj)+aprim(ii,kk)*tmp(jj,kk)
5791 : : end do
5792 : : end do
5793 : : end do
5794 : : end function symdij_symcart
5795 : :
5796 : : end subroutine symdij
5797 : : !!***
5798 : :
5799 : : !----------------------------------------------------------------------
5800 : :
5801 : : !!****f* m_pawdij/symdij_all
5802 : : !! NAME
5803 : : !! symdij_all
5804 : : !!
5805 : : !! FUNCTION
5806 : : !! Symmetrize all contributions to PAW non-local strengths Dij
5807 : : !!
5808 : : !! INPUTS
5809 : : !! gprimd(3,3)=dimensional primitive translations for reciprocal space(bohr^-1).
5810 : : !! indsym(4,nsym,natom)=indirect indexing array for atom labels
5811 : : !! ipert=index of perturbation if pawrhoij is a pertubed rhoij
5812 : : !! no meaning for ground-state calculations (should be 0)
5813 : : !! mpi_atmtab(:)=--optional-- indexes of the atoms treated by current proc
5814 : : !! comm_atom=--optional-- MPI communicator over atoms
5815 : : !! my_natom=number of atoms treated by current processor
5816 : : !! natom=number of atoms in cell
5817 : : !! nsym=number of symmetry elements in space group
5818 : : !! ntypat=number of types of atoms in unit cell.
5819 : : !! paw_ij(natom)%cplex_dij=1 if dij are REAL, 2 if they are COMPLEX
5820 : : !! paw_ij(natom)%qphase=2 if exp^(-i.q.r) phase from RF at q<>0, 1 otherwise
5821 : : !! paw_ij(natom)%lmn_size=number of (l,m,n) elements for the paw basis
5822 : : !! paw_ij(natom)%nspden=number of spin-density components
5823 : : !! paw_ij(natom)%nsppol=number of independent spin-density components
5824 : : !! paw_ij(natom)%dij(lmn2_size,nspden)=non-symmetrized paw dij quantities
5825 : : !! pawang <type(pawang_type)>=angular mesh discretization and related data
5826 : : !! pawprtvol=control print volume and debugging output for PAW
5827 : : !! pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
5828 : : !! rprimd(3,3)=real space primitive translations.
5829 : : !! symafm(nsym)=(anti)ferromagnetic part of symmetry operations
5830 : : !! symrec(3,3,nsym)=symmetries of group in terms of operations on
5831 : : !! reciprocal space primitive translations
5832 : : !!
5833 : : !! SIDE EFFECTS
5834 : : !! paw_ij(natom)%dij???(cplex_dij*qphase*lmn2_size,nspden)=symmetrized dij quantities as output
5835 : : !!
5836 : : !! SOURCE
5837 : :
5838 : 26 : subroutine symdij_all(gprimd,indsym,ipert,my_natom,natom,nsym,ntypat,&
5839 : 26 : & paw_ij,pawang,pawprtvol,pawtab,rprimd,symafm,symrec,&
5840 [ - + - - : 13 : & mpi_atmtab,comm_atom) ! optional arguments (parallelism)
- - ]
5841 : :
5842 : : !Arguments ---------------------------------------------
5843 : : !scalars
5844 : : integer,intent(in) :: ipert,my_natom,natom,nsym,ntypat,pawprtvol
5845 : : integer,optional,intent(in) :: comm_atom
5846 : : type(pawang_type),intent(in) :: pawang
5847 : : !arrays
5848 : : integer,intent(in) :: indsym(4,nsym,natom),symafm(nsym),symrec(3,3,nsym)
5849 : : integer,optional,target,intent(in) :: mpi_atmtab(:)
5850 : : real(dp),intent(in) :: gprimd(3,3),rprimd(3,3)
5851 : : type(paw_ij_type),intent(inout) :: paw_ij(my_natom)
5852 : : type(pawtab_type),intent(in) :: pawtab(ntypat)
5853 : :
5854 : : !Local variables ---------------------------------------
5855 : : !scalars
5856 : : integer,parameter :: MAX_NOPTS=12
5857 : : integer :: ii,option_dij,my_comm_atom,nopt
5858 : : logical :: my_atmtab_allocated,paral_atom
5859 : : character(len=500) :: msg
5860 : : !arrays
5861 : : integer :: options(MAX_NOPTS)
5862 : 13 : integer,pointer :: my_atmtab(:)
5863 : :
5864 : : ! *********************************************************************
5865 : :
5866 : 13 : nopt = 0
5867 [ + - - + : 13 : if (ANY(paw_ij(:)%has_dij==2)) then
+ - ]
5868 : 13 : nopt = nopt + 1
5869 : 13 : options(nopt) = 0
5870 : : end if
5871 : :
5872 [ + + + + : 46 : if (ANY(paw_ij(:)%has_dijhat==2)) then
+ + ]
5873 : 7 : nopt = nopt + 1
5874 : 7 : options(nopt) = 1
5875 : : end if
5876 : :
5877 [ + + + - : 81 : if (ANY(paw_ij(:)%has_dijU==2)) then
- + ]
5878 : 0 : nopt = nopt + 1
5879 : 0 : options(nopt) = 2
5880 : : end if
5881 : :
5882 [ + + + + : 46 : if (ANY(paw_ij(:)%has_dijxc==2)) then
+ + ]
5883 : 7 : nopt = nopt + 1
5884 : 7 : options(nopt) = 3
5885 : : end if
5886 : :
5887 [ + + + + : 46 : if (ANY(paw_ij(:)%has_dijxc_hat==2)) then
+ + ]
5888 : 7 : nopt = nopt + 1
5889 : 7 : options(nopt) = 4
5890 : : end if
5891 : :
5892 [ + + + + : 46 : if (ANY(paw_ij(:)%has_dijxc_val==2)) then
+ + ]
5893 : 7 : nopt = nopt + 1
5894 : 7 : options(nopt) = 5
5895 : : end if
5896 : :
5897 [ + + + - : 81 : if (ANY(paw_ij(:)%has_dijso==2)) then
- + ]
5898 : 0 : nopt = nopt + 1
5899 : 0 : options(nopt) = 6
5900 : : end if
5901 : :
5902 [ + + + - : 81 : if (ANY(paw_ij(:)%has_dijexxc==2)) then
- + ]
5903 : 0 : nopt = nopt + 1
5904 : 0 : options(nopt) = 7
5905 : : end if
5906 : :
5907 [ + + + - : 81 : if (ANY(paw_ij(:)%has_dijfr==2)) then
- + ]
5908 : 0 : nopt = nopt + 1
5909 : 0 : options(nopt) = 8
5910 : : end if
5911 : :
5912 [ + + + - : 81 : if (ANY(paw_ij(:)%has_dijnd==2)) then
- + ]
5913 : 0 : nopt = nopt + 1
5914 : 0 : options(nopt) = 9
5915 : : end if
5916 : :
5917 [ + - - + : 13 : if (ANY(paw_ij(:)%has_dijhartree==2)) then
+ - ]
5918 : 13 : nopt = nopt + 1
5919 : 13 : options(nopt) = 10
5920 : : end if
5921 : :
5922 [ + + + - : 81 : if (ANY(paw_ij(:)%has_dijfock==2)) then
- + ]
5923 : 0 : nopt = nopt + 1
5924 : 0 : options(nopt) = 11
5925 : : end if
5926 : :
5927 [ + + + - : 81 : if (ANY(paw_ij(:)%has_exexch_pot==2)) then
- + ]
5928 : 0 : nopt = nopt + 1
5929 : 0 : options(nopt) = 10
5930 : 0 : msg='symetrization of dij_exexch not coded!'
5931 : 0 : LIBPAW_ERROR(msg)
5932 : : end if
5933 : :
5934 : : !Set up parallelism over atoms
5935 : 13 : paral_atom=(present(comm_atom))
5936 [ - + ]: 13 : nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab
5937 [ - + ]: 13 : my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom
5938 : 13 : call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,my_natom_ref=my_natom)
5939 : :
5940 [ + + ]: 67 : do ii=1,nopt
5941 : 54 : option_dij = options(ii)
5942 [ - + ]: 67 : if (paral_atom) then
5943 : : call symdij(gprimd,indsym,ipert,my_natom,natom,nsym,ntypat,option_dij,&
5944 : : & paw_ij,pawang,pawprtvol,pawtab,rprimd,symafm,symrec,&
5945 : 0 : & comm_atom=my_comm_atom,mpi_atmtab=my_atmtab)
5946 : : else
5947 : : call symdij(gprimd,indsym,ipert,my_natom,natom,nsym,ntypat,option_dij,&
5948 : 54 : & paw_ij,pawang,pawprtvol,pawtab,rprimd,symafm,symrec)
5949 : : end if
5950 : : end do
5951 : :
5952 : : !Destroy atom table used for parallelism
5953 : 13 : call free_my_atmtab(my_atmtab,my_atmtab_allocated)
5954 : :
5955 : 13 : end subroutine symdij_all
5956 : : !!***
5957 : :
5958 : : !----------------------------------------------------------------------
5959 : :
5960 : : !!****f* m_pawdij/pawdij_gather
5961 : : !! NAME
5962 : : !! pawdij_gather
5963 : : !!
5964 : : !! FUNCTION
5965 : : !! Performs a ALLGATHER operation (over atomic sites) on Dij data
5966 : : !! stored as a 1D array of Dij arrays.
5967 : : !!
5968 : : !! INPUTS
5969 : : !! dij_in = coeff2d_type array containing the input Dij
5970 : : !! comm_atom= MPI communicator over atoms
5971 : : !! mpi_atmtab(:)=indexes of the atoms treated by current proc
5972 : : !!
5973 : : !! OUTPUT
5974 : : !! dij_out = coeff2d_type array containing the gathered Dij
5975 : : !!
5976 : : !! SOURCE
5977 : :
5978 [ - + - + : 26544 : subroutine pawdij_gather(dij_in,dij_out,comm_atom,mpi_atmtab)
- + + + -
+ + + +
- ]
5979 : :
5980 : : !Arguments ------------------------------------
5981 : : !scalars
5982 : : integer,intent(in) :: comm_atom
5983 : : !arrays
5984 : : integer,intent(in) :: mpi_atmtab(:)
5985 : : type(coeff2_type),intent(in) :: dij_in(:)
5986 : : type(coeff2_type),intent(out) :: dij_out(:)
5987 : :
5988 : : !Local variables-------------------------------
5989 : : !scalars
5990 : : integer :: buf_dp_size,buf_dp_size_all,buf_int_size,buf_int_size_all
5991 : : integer :: dij_size,dij_size_out,ierr,ii,i2,indx_dp,indx_int,ival,n1,n2,nproc
5992 : : !arrays
5993 : : integer :: bufsz(2)
5994 : 3264 : integer, allocatable :: buf_int(:),buf_int_all(:)
5995 : 3264 : integer, allocatable :: count_dp(:),count_int(:),count_tot(:),displ_dp(:),displ_int(:)
5996 : 3264 : integer, allocatable :: dimdij(:,:)
5997 : 3264 : real(dp),allocatable :: buf_dp(:),buf_dp_all(:)
5998 : :
5999 : : ! *************************************************************************
6000 : :
6001 : 3264 : nproc=xmpi_comm_size(comm_atom)
6002 : 3264 : dij_size=size(dij_in,dim=1)
6003 : :
6004 : 3264 : buf_dp_size=0
6005 [ + + + - : 9792 : LIBPAW_ALLOCATE(dimdij,(dij_size,2))
+ - + + -
+ - + ]
6006 [ + + ]: 6596 : do ii=1,dij_size
6007 : 3332 : dimdij(ii,1)=size(dij_in(ii)%value,dim=1)
6008 : 3332 : dimdij(ii,2)=size(dij_in(ii)%value,dim=2)
6009 : 6596 : buf_dp_size=buf_dp_size+dimdij(ii,1)*dimdij(ii,2)
6010 : : end do
6011 : :
6012 : : !If only one proc, perform a single copy
6013 [ - + ]: 3264 : if (nproc==1) then
6014 [ # # ]: 0 : do ii=1,dij_size
6015 : 0 : ival=mpi_atmtab(ii)
6016 [ # # ]: 0 : if (allocated(dij_out(ival)%value)) then
6017 : 0 : LIBPAW_DEALLOCATE(dij_out(ival)%value)
6018 : : end if
6019 [ # # # # : 0 : LIBPAW_ALLOCATE(dij_out(ival)%value,(n1,n2))
# # # # #
# # # # #
# # # # ]
6020 [ # # # # : 0 : dij_out(ii)%value=dij_in(ival)%value
# # # # #
# # # # #
# # ]
6021 : : end do
6022 [ # # ]: 0 : LIBPAW_DEALLOCATE(dimdij)
6023 : 0 : return
6024 : : end if
6025 : :
6026 : : !Fill in integer buffer
6027 : 3264 : buf_int_size=3*dij_size
6028 [ + + + - : 9792 : LIBPAW_ALLOCATE(buf_int,(buf_int_size))
+ - + + -
+ - + ]
6029 : 3264 : indx_int=1
6030 [ + + ]: 6596 : do ii=1,dij_size
6031 : 3332 : buf_int(indx_int )=dimdij(ii,1)
6032 : 3332 : buf_int(indx_int+1)=dimdij(ii,2)
6033 : 3332 : buf_int(indx_int+2)=mpi_atmtab(ii)
6034 : 6596 : indx_int=indx_int+3
6035 : : end do
6036 : :
6037 : : !Fill in real buffer
6038 [ + + + - : 9792 : LIBPAW_ALLOCATE(buf_dp,(buf_dp_size))
+ - + + -
+ - + ]
6039 : 3264 : indx_dp=1
6040 [ + + ]: 6596 : do ii=1,dij_size
6041 : 3332 : n1=dimdij(ii,1); n2=dimdij(ii,2)
6042 [ + + ]: 10534 : do i2=1,n2
6043 [ + + ]: 378126 : buf_dp(indx_dp:indx_dp+n1-1)=dij_in(ii)%value(1:n1,i2)
6044 : 7270 : indx_dp=indx_dp+n1
6045 : : end do
6046 : : end do
6047 : :
6048 : : !Communicate (1 gather for integers, 1 gather for reals)
6049 [ - + + - : 9792 : LIBPAW_ALLOCATE(count_int,(nproc))
+ - + - -
+ - + ]
6050 [ - + + - : 6528 : LIBPAW_ALLOCATE(displ_int,(nproc))
- + - + ]
6051 [ - + + - : 6528 : LIBPAW_ALLOCATE(count_dp ,(nproc))
- + - + ]
6052 [ - + + - : 6528 : LIBPAW_ALLOCATE(displ_dp ,(nproc))
- + - + ]
6053 [ + - - + : 9792 : LIBPAW_ALLOCATE(count_tot,(2*nproc))
+ - + - +
- - + -
+ ]
6054 : 3264 : bufsz(1)=buf_int_size; bufsz(2)=buf_dp_size
6055 : 3264 : call xmpi_allgather(bufsz,2,count_tot,comm_atom,ierr)
6056 [ + + ]: 13680 : do ii=1,nproc
6057 : 10416 : count_int(ii)=count_tot(2*ii-1)
6058 : 13680 : count_dp (ii)=count_tot(2*ii)
6059 : : end do
6060 : 3264 : displ_int(1)=0;displ_dp(1)=0
6061 [ + + ]: 10416 : do ii=2,nproc
6062 : 7152 : displ_int(ii)=displ_int(ii-1)+count_int(ii-1)
6063 : 10416 : displ_dp (ii)=displ_dp (ii-1)+count_dp (ii-1)
6064 : : end do
6065 [ + + ]: 13680 : buf_int_size_all=sum(count_int)
6066 [ + + ]: 13680 : buf_dp_size_all =sum(count_dp)
6067 [ - + ]: 3264 : LIBPAW_DEALLOCATE(count_tot)
6068 [ - + + - : 9792 : LIBPAW_ALLOCATE(buf_int_all,(buf_int_size_all))
+ - + - -
+ - + ]
6069 [ - + + - : 9792 : LIBPAW_ALLOCATE(buf_dp_all ,(buf_dp_size_all))
+ - + - -
+ - + ]
6070 : 3264 : call xmpi_allgatherv(buf_int,buf_int_size,buf_int_all,count_int,displ_int,comm_atom,ierr)
6071 : 3264 : call xmpi_allgatherv(buf_dp ,buf_dp_size ,buf_dp_all ,count_dp ,displ_dp ,comm_atom,ierr)
6072 [ - + ]: 3264 : LIBPAW_DEALLOCATE(count_int)
6073 : 3264 : LIBPAW_DEALLOCATE(displ_int)
6074 [ - + ]: 3264 : LIBPAW_DEALLOCATE(count_dp)
6075 : 3264 : LIBPAW_DEALLOCATE(displ_dp)
6076 : :
6077 : : !Retrieve gathered data
6078 : 3264 : dij_size_out=buf_int_size_all/3
6079 : 3264 : indx_int=1;indx_dp=1
6080 [ + + ]: 13272 : do ii=1,dij_size_out
6081 : 10008 : n1=buf_int_all(indx_int)
6082 : 10008 : n2=buf_int_all(indx_int+1)
6083 : 10008 : ival=buf_int_all(indx_int+2)
6084 : 10008 : indx_int=indx_int+3
6085 [ - + ]: 10008 : if (allocated(dij_out(ival)%value)) then
6086 : 0 : LIBPAW_DEALLOCATE(dij_out(ival)%value)
6087 : : end if
6088 [ - + + - : 40032 : LIBPAW_ALLOCATE(dij_out(ival)%value,(n1,n2))
- + + - +
- + - - +
- + - + ]
6089 [ + + ]: 25136 : do i2=1,n2
6090 [ + + ]: 1179288 : dij_out(ival)%value(1:n1,i2)=buf_dp_all(indx_dp:indx_dp+n1-1)
6091 : 21872 : indx_dp=indx_dp+n1
6092 : : end do
6093 : : end do
6094 : :
6095 [ - + ]: 3264 : LIBPAW_DEALLOCATE(buf_dp_all)
6096 [ - + ]: 3264 : LIBPAW_DEALLOCATE(buf_int_all)
6097 [ - + ]: 3264 : LIBPAW_DEALLOCATE(buf_int)
6098 [ - + ]: 3264 : LIBPAW_DEALLOCATE(buf_dp)
6099 [ - + ]: 3264 : LIBPAW_DEALLOCATE(dimdij)
6100 : :
6101 [ - + - + : 6528 : end subroutine pawdij_gather
- + - + -
+ - + - +
- + - + ]
6102 : : !!***
6103 : :
6104 : : !----------------------------------------------------------------------
6105 : :
6106 : : !!****f* m_pawdij/pawdij_print_ij
6107 : : !! NAME
6108 : : !! pawdij_print_dij
6109 : : !!
6110 : : !! FUNCTION
6111 : : !! Print out the content of a Dij matrix (total Dij) in a suitable format
6112 : : !!
6113 : : !! INPUTS
6114 : : !! dij(cplex_dij*qphase*lmn2_size,ndij)= input matrix to be printed
6115 : : !! cplex_dij=1 if Dij is real, 2 if Dij is complex
6116 : : !! qphase=1 if Dij contains no RF phase, 2 if it contains a exp(-iqr) RF phase
6117 : : !! iatom=current atom
6118 : : !! natom=total number of atoms in the system
6119 : : !! nspden=number of spin density components
6120 : : !! [Ha_or_eV]= 1: output in hartrees, 2: output in eV
6121 : : !! [opt_prtvol]= >=0 if up to 12 components of _ij matrix have to be printed
6122 : : !! <0 if all components of ij_ matrix have to be printed (optional)
6123 : : !! [mode_paral]= parallel printing mode (optional, default='COLL')
6124 : : !! [test_value]=(real number) if positive, print a warning when the magnitude of Dij is greater (optional)
6125 : : !! [title_msg]=message to print as title (optional)
6126 : : !! [unit]=the unit number for output (optional)
6127 : : !!
6128 : : !! OUTPUT
6129 : : !! (Only writing)
6130 : : !!
6131 : : !! SOURCE
6132 : :
6133 [ - + ]: 8626 : subroutine pawdij_print_dij(dij,cplex_dij,qphase,iatom,natom,nspden,&
6134 : : & test_value,title_msg,unit,Ha_or_eV,opt_prtvol,mode_paral) ! Optional arguments
6135 : :
6136 : : !Arguments ------------------------------------
6137 : : !scalars
6138 : : integer,intent(in) :: cplex_dij,iatom,natom,nspden,qphase
6139 : : integer,optional,intent(in) :: Ha_or_eV,opt_prtvol,unit
6140 : : real(dp),intent(in),optional :: test_value
6141 : : character(len=4),optional,intent(in) :: mode_paral
6142 : : character(len=100),optional,intent(in) :: title_msg
6143 : : !arrays
6144 : : real(dp),intent(in),target :: dij(:,:)
6145 : :
6146 : : !Local variables-------------------------------
6147 : : character(len=7),parameter :: dspin(6)=(/"up ","down ","up-up ","dwn-dwn","up-dwn ","dwn-up "/)
6148 : : integer :: idij,idij_sym,kk,lmn_size,lmn2_size,my_idij,my_idij_sym
6149 : : integer :: my_prtvol,my_unt,my_Ha_or_eV,ndij,tmp_cplex_dij
6150 : : real(dp) :: my_test_value,test_value_eff
6151 : : character(len=4) :: my_mode
6152 : : character(len=2000) :: msg
6153 : : !arrays
6154 : : integer :: idum(0)
6155 : 8626 : real(dp),allocatable,target :: dij1(:),dij2(:)
6156 : 8626 : real(dp),pointer :: dij2p(:),dij2p_(:)
6157 : :
6158 : : ! *************************************************************************
6159 : :
6160 : : !Optional arguments
6161 : 4512 : my_unt =std_out ; if (PRESENT(unit )) my_unt =unit
6162 [ + + ]: 8626 : my_mode ='COLL' ; if (PRESENT(mode_paral)) my_mode =mode_paral
6163 [ + - ]: 8626 : my_prtvol=1 ; if (PRESENT(opt_prtvol)) my_prtvol=opt_prtvol
6164 [ + + ]: 8626 : my_test_value=-one; if (PRESENT(test_value)) my_test_value=test_value
6165 [ + + ]: 8626 : my_Ha_or_eV=1 ; if (PRESENT(Ha_or_eV)) my_Ha_or_eV=Ha_or_eV
6166 : :
6167 : : !Title
6168 [ - + ]: 8626 : if (present(title_msg)) then
6169 [ # # ]: 0 : if (trim(title_msg)/='') then
6170 : 0 : write(msg, '(2a)') ch10,trim(title_msg)
6171 : 0 : call wrtout(my_unt,msg,my_mode)
6172 : : end if
6173 : : end if
6174 : :
6175 : : !Inits
6176 : 8626 : ndij=size(dij,2)
6177 : 8626 : lmn2_size=size(dij,1)/(cplex_dij*qphase)
6178 : 8626 : lmn_size=int(dsqrt(two*dble(lmn2_size)))
6179 [ - + ]: 8626 : if (qphase==2) then
6180 [ # # # # : 0 : LIBPAW_ALLOCATE(dij1,(2*lmn2_size))
# # # # #
# # # #
# ]
6181 [ # # # # : 0 : LIBPAW_ALLOCATE(dij2,(2*lmn2_size))
# # # # ]
6182 : : end if
6183 : :
6184 : : ! === Loop over Dij components ===
6185 [ + + ]: 24926 : do idij=1,ndij
6186 : :
6187 [ + + ]: 16300 : idij_sym=idij;if (ndij==4.and.idij>2) idij_sym=7-idij
6188 : :
6189 : : !Subtitle
6190 [ + + + + : 16300 : if (natom>1.or.nspden>1.or.ndij==4) then
+ + ]
6191 [ + + + + ]: 15516 : if (nspden==1.and.ndij/=4) write(msg,'(a,i3)') ' Atom #',iatom
6192 [ + + ]: 15516 : if (nspden==2) write(msg,'(a,i3,a,i1)')' Atom #',iatom,' - Spin component ',idij
6193 [ + + + - ]: 15516 : if (ndij==4) write(msg,'(a,i3,2a)') ' Atom #',iatom,' - Component ',trim(dspin(idij+2*(ndij/4)))
6194 : 15516 : call wrtout(my_unt,msg,my_mode)
6195 : : end if
6196 : :
6197 : : !Select upper and lower triangular parts
6198 : 16300 : my_idij=min(size(dij,2),idij)
6199 : 16300 : my_idij_sym=min(size(dij,2),idij_sym)
6200 [ + - ]: 16300 : if (qphase==1) then
6201 : 16300 : tmp_cplex_dij=cplex_dij
6202 : 16300 : dij2p => dij(1:cplex_dij*lmn2_size:1,my_idij)
6203 : 16300 : dij2p_ => dij(1:cplex_dij*lmn2_size:1,my_idij_sym)
6204 : : else
6205 : 0 : tmp_cplex_dij=2
6206 [ # # ]: 0 : if (cplex_dij==1) then
6207 [ # # ]: 0 : do kk=1,lmn2_size
6208 : 0 : dij1(2*kk-1)= dij(kk,my_idij)
6209 : 0 : dij1(2*kk )= dij(kk+lmn2_size,my_idij)
6210 : 0 : dij2(2*kk-1)= dij(kk,my_idij_sym)
6211 : 0 : dij2(2*kk )=-dij(kk+lmn2_size,my_idij_sym)
6212 : : end do
6213 : : else
6214 [ # # ]: 0 : do kk=1,lmn2_size
6215 : 0 : dij1(2*kk-1)= dij(2*kk-1,my_idij)-dij(2*kk +2*lmn2_size,my_idij)
6216 : 0 : dij1(2*kk )= dij(2*kk ,my_idij)+dij(2*kk-1+2*lmn2_size,my_idij)
6217 : 0 : dij2(2*kk-1)= dij(2*kk-1,my_idij_sym)+dij(2*kk +2*lmn2_size,my_idij_sym)
6218 : 0 : dij2(2*kk )= dij(2*kk ,my_idij_sym)-dij(2*kk-1+2*lmn2_size,my_idij_sym)
6219 : : end do
6220 : : end if
6221 : 0 : dij2p => dij1 ; dij2p_ => dij2
6222 : : end if
6223 : :
6224 : : !Printing
6225 [ + + + + ]: 16300 : test_value_eff=-one;if(my_test_value>zero.and.idij==1) test_value_eff=my_test_value
6226 : : call pawio_print_ij(my_unt,dij2p,lmn2_size,tmp_cplex_dij,lmn_size,-1,idum,0,&
6227 : : & my_prtvol,idum,test_value_eff,my_Ha_or_eV,&
6228 [ - + - + ]: 24926 : & opt_sym=2,asym_ij=dij2p_,mode_paral=my_mode,force_print=.true.)
6229 : :
6230 : : end do !idij
6231 : :
6232 [ - + ]: 8626 : if (qphase==2) then
6233 [ # # ]: 0 : LIBPAW_DEALLOCATE(dij1)
6234 [ # # ]: 0 : LIBPAW_DEALLOCATE(dij2)
6235 : : end if
6236 : :
6237 [ + + - + : 17252 : end subroutine pawdij_print_dij
- + ]
6238 : : !!***
6239 : :
6240 : : !----------------------------------------------------------------------
6241 : :
6242 : : !!****f* m_pawdij/pawv1
6243 : : !! NAME
6244 : : !! pawv1
6245 : : !!
6246 : : !! FUNCTION
6247 : : !! On-site all-electron potential V1
6248 : : !!
6249 : : !! INPUTS
6250 : : !! mesh_size=radial mesh size
6251 : : !! nspden=number of spin density components
6252 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
6253 : : !! pawrad <type(pawrad_type)>=paw radial mesh and related data, for current atom
6254 : : !! pawxcdev=Choice of XC development (0=no dev. (use of angular mesh) ; 1 or 2=dev. on moments)
6255 : : !! vh1(qphase*mesh_size,v_size,nspden)=all-electron on-site Hartree potential for current atom
6256 : : !! only spherical moment is used
6257 : : !! vxc1(qphase*mesh_size,v_size,nspden)=all-electron on-site XC potential for current atom
6258 : : !! given on a (r,theta,phi) grid (v_size=angl_size)
6259 : : !! or on (l,m) spherical moments (v_size=lm_size)
6260 : : !!
6261 : : !! OUTPUT
6262 : : !! v1(mesh_size)=V1 on-site potential
6263 : : !!
6264 : : !! SOURCE
6265 : :
6266 [ - + - + ]: 2368 : subroutine pawv1(mesh_size,nspden,pawang,pawxcdev,v1,vh1,vxc1)
6267 : :
6268 : : !Arguments ---------------------------------------------
6269 : : !scalars
6270 : : integer,intent(in) :: mesh_size,nspden,pawxcdev
6271 : : type(pawang_type),intent(in) :: pawang
6272 : : !arrays
6273 : : real(dp),intent(in) :: vh1(:,:,:),vxc1(:,:,:)
6274 : : real(dp),intent(out) :: v1(mesh_size)
6275 : : !Local variables ---------------------------------------
6276 : : !scalars
6277 : : integer :: angl_size,ipts
6278 : : real(dp) :: fact
6279 : : !arrays
6280 : :
6281 : : ! *************************************************************************
6282 : :
6283 : 2368 : angl_size=pawang%angl_size
6284 : :
6285 : 2368 : fact=one/sqrt(four_pi) ! Y_00
6286 [ + + ]: 2368 : if (pawxcdev/=0) then
6287 [ + + ]: 2243 : if (nspden==1) then
6288 [ + + ]: 1899519 : v1(1:mesh_size)=vxc1(1:mesh_size,1,1)
6289 : : else
6290 [ + + ]: 730241 : v1(1:mesh_size)=half*(vxc1(1:mesh_size,1,1)+vxc1(1:mesh_size,1,2))
6291 : : end if
6292 : : else
6293 [ + + ]: 141477 : v1(1:mesh_size)=zero
6294 [ + + ]: 125 : if (nspden==1) then
6295 [ + + ]: 4082 : do ipts=1,angl_size
6296 : : v1(1:mesh_size)=v1(1:mesh_size) &
6297 [ + + ]: 5639894 : & +vxc1(1:mesh_size,ipts,1)*pawang%angwgth(ipts)
6298 : : end do
6299 : : else
6300 [ + + ]: 15543 : do ipts=1,angl_size
6301 : : v1(1:mesh_size)=v1(1:mesh_size) &
6302 : : & +half*(vxc1(1:mesh_size,ipts,1)+vxc1(1:mesh_size,ipts,2)) &
6303 [ + + ]: 16430643 : & *pawang%angwgth(ipts)
6304 : : end do
6305 : : end if
6306 [ + + ]: 141477 : v1(1:mesh_size)=sqrt(four_pi)*v1(1:mesh_size)
6307 : : end if
6308 [ + + ]: 2771237 : v1(1:mesh_size)=fact*(v1(1:mesh_size)+vh1(1:mesh_size,1,1))
6309 : :
6310 : 2368 : end subroutine pawv1
6311 : :
6312 : : !!***
6313 : :
6314 : :
6315 : : END MODULE m_pawdij
6316 : : !!***
|