TABLE OF CONTENTS


ABINIT/m_odamix [ Modules ]

[ Top ] [ Modules ]

NAME

  m_odamix

FUNCTION

COPYRIGHT

  Copyright (C) 1998-2024 ABINIT group (FJ, MT)
  This file is distributed under the terms of the
  GNU General Public License, see ~abinit/COPYING
  or http://www.gnu.org/copyleft/gpl.txt .

SOURCE

16 #if defined HAVE_CONFIG_H
17 #include "config.h"
18 #endif
19 
20 #include "abi_common.h"
21 
22 module m_odamix
23 
24  use defs_basis
25  use m_abicore
26  use m_errors
27  use m_xmpi
28  use m_xcdata
29  use m_dtset
30 
31 
32  use defs_datatypes, only : pseudopotential_type
33  use defs_abitypes,  only : MPI_type
34  use m_time,       only : timab
35  use m_geometry,   only : metric
36  use m_cgtools,    only : dotprod_vn
37  use m_pawang,     only : pawang_type
38  use m_pawrad,     only : pawrad_type
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
42  use m_pawfgrtab,  only : pawfgrtab_type
43  use m_pawrhoij,   only : pawrhoij_type,pawrhoij_filter
44  use m_paw_nhat,   only : pawmknhat
45  use m_paw_denpot, only : pawdenpot
46  use m_energies,   only : energies_type
47  use m_spacepar,   only : hartre
48  use m_rhotoxc,    only : rhotoxc
49  use m_fft,        only : fourdp
50  use m_xc_tb09,    only : xc_tb09_update_c
51 
52  implicit none
53 
54  private

ABINIT/odamix [ Functions ]

[ Top ] [ Functions ]

NAME

 odamix

FUNCTION

 This routine is called to compute the total energy and various parts of it.
 The routine computes -if requested- the forces.

INPUTS

  [add_tfw]=flag controling the addition of Weiszacker gradient correction to Thomas-Fermi kin energy
  dtset <type(dataset_type)>=all input variables in this dataset
 berryopt  =  4/14: electric field is on -> add the contribution of the
                      -ebar_i p_i - Omega/(8*pi) (g^{-1})_ij ebar_i ebar_j  terms to the total energy
   = 6/16, or 7/17: electric displacement field is on  -> add the contribution of the
                      Omega/(8*pi) (g^{-1})_ij ebar_i ebar_j  terms to the total energy
   | berryopt  = 5: magnetic field is on -> add the contribution of the
   |                - \Omega B.M term to the total energy
   |          /= 5: magnetic field is off
   | bfield     = cartesian coordinates of the magnetic field in atomic units
   | dfield     = cartesian coordinates of the electric displacement field in atomic units (berryopt==6/7)
   | efield     = cartesian coordinates of the electric field in atomic units  (berryopt==4)
   | red_dfield = reduced the electric displacement field  (berryopt==16/17)
   | red_efieldbar = reduced the electric field (ebar)  (berryopt==14)
   | iatfix(3,natom)=1 for frozen atom along some direction, 0 for unfrozen
   | ionmov=governs the movement of atoms (see help file)
   | natom=number of atoms in cell.
   | nconeq=number of atomic constraint equations
   | nspden=number of spin-density components
   | nsym=number of symmetry elements in space group
   | occopt=option for occupancies
   | prtvol=integer controlling volume of printed output
   | tsmear=smearing energy or temperature (if metal)
   | wtatcon(3,natom,nconeq)=weights for atomic constraints
   | xclevel= XC functional level
  gprimd(3,3)=dimensional reciprocal space primitive translations
  gsqcut=cutoff on (k+G)^2 (bohr^-2)
  mpi_enreg=information about MPI parallelization
  my_natom=number of atoms treated by current processor
  nfft=(effective) number of FFT grid points (for this processor)
  ngfft(18)=contain all needed information about 3D FFT, see ~abinit/doc/variables/vargs.htm#ngfft
  nkxc=second dimension of the array kxc, see rhotoxc.f for a description
  ntypat=number of types of atoms in unit cell.
  nvresid(nfft,nspden)=potential or density residual
  n3xccc=dimension of the xccc3d array (0 or nfft).
  optres=0 if residual array (nvresid) contains the potential residual
        =1 if residual array (nvresid) contains the density residual
  paw_ij(my_natom) <type(paw_ij_type)>=paw arrays given on (i,j) channels
  paw_an(my_natom) <type(paw_an_type)>=paw arrays given on angular mesh
  pawang <type(pawang_type)>=paw angular mesh and related data
  pawfgrtab(my_natom) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid
  pawrad
  pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
  psps <type(pseudopotential_type)>=variables related to pseudopotentials
  rhog(2,nfft)=array for Fourier transform of electron density
  rhor(nfft,nspden)=array for electron density in electrons/bohr**3
  rprimd(3,3)=dimensional primitive translations in real space (bohr)
  [taur(nfftf,nspden*dtset%usekden)]=array for kinetic energy density
  ucvol = unit cell volume (Bohr**3)
  usepaw= 0 for non paw calculation; =1 for paw calculation
  vhartr(nfft)=array for holding Hartree potential
  vpsp(nfft)=array for holding local psp
  vxc(nfft,nspden)=array for holding XC potential
  xred(3,natom)=reduced dimensionless atomic coordinates

OUTPUT

  deltae=change in total energy
         between the previous and present SCF cycle
  etotal=total energy (hartree)

SIDE EFFECTS

 Input/Output:
  elast=previous value of the energy,
        needed to compute deltae, then updated.
  energies <type(energies_type)>=all part of total energy.
   | entropy(IN)=entropy due to the occupation number smearing (if metal)
   | e_localpsp(IN)=local psp energy (hartree)
   | e_eigenvalues(IN)=Sum of the eigenvalues - Band energy (Hartree)
   | e_chempot(IN)=energy from spatially varying chemical potential (hartree)
   | e_ewald(IN)=Ewald energy (hartree)
   | e_vdw_dftd(IN)=VdW DFT-D energy
   | e_hartree(IN)=Hartree part of total energy (hartree units)
   | e_corepsp(IN)=psp core-core energy
   | e_kinetic(IN)=kinetic energy part of total energy.
   | e_nucdip(IN)=energy of nuclear dipole array
   | e_nlpsp_vfock(IN)=nonlocal psp + potential Fock ACE part of total energy.
   | e_xc(IN)=exchange-correlation energy (hartree)
   | e_xcdc(IN)=exchange-correlation double-counting energy (hartree)
   | e_paw(IN)=PAW spherical part energy
   | e_pawdc(IN)=PAW spherical part double-counting energy
   | e_elecfield(OUT)=the term of the energy functional that depends explicitely
   |                  on the electric field:  enefield = -ucvol*E*P
   | e_magfield(OUT)=the term of the energy functional that depends explicitely
   |                  on the magnetic field:  enmagfield = -ucvol*B*M
   | e_entropy(OUT)=entropy energy due to the occupation number smearing (if metal)
   |                this value is %entropy * dtset%tsmear (hartree).
  kxc(nfft,nkxc)=exchange-correlation kernel, needed only if nkxc>0
  [vxctau(nfftf,dtset%nspden,4*dtset%usekden)]=derivative of XC energy density with respect to
      kinetic energy density (metaGGA cases) (optional output)
  ===== if psps%usepaw==1
   pawrhoij(my_natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data
    (gradients of rhoij for each atom with respect to atomic positions are computed here)

NOTES

  In case of PAW calculations:
    All computations are done on the fine FFT grid.
    All variables (nfft,ngfft,mgfft) refer to this fine FFT grid.
    All arrays (densities/potentials...) are computed on this fine FFT grid.
  ! Developpers have to be careful when introducing others arrays:
      they have to be stored on the fine FFT grid.
  In case of norm-conserving calculations the FFT grid is the usual FFT grid.

SOURCE

176 subroutine odamix(deltae,dtset,elast,energies,etotal,&
177 &          gprimd,gsqcut,kxc,mpi_enreg,my_natom,nfft,ngfft,nhat,&
178 &          nkxc,ntypat,nvresid,n3xccc,optres,paw_ij,&
179 &          paw_an,pawang,pawfgrtab,pawrad,pawrhoij,pawtab,&
180 &          red_ptot,psps,rhog,rhor,rprimd,strsxc,ucvol,usepaw,&
181 &          usexcnhat,vhartr,vpsp,vtrial,vxc,vxcavg,xccc3d,xred,&
182 &          taur,vxctau,add_tfw) ! optional arguments
183 
184 !Arguments ------------------------------------
185 !scalars
186  integer,intent(in) :: my_natom,n3xccc,nfft,nkxc,ntypat,optres
187  integer,intent(in) :: usepaw,usexcnhat
188  logical,intent(in),optional :: add_tfw
189  real(dp),intent(in) :: gsqcut,ucvol
190  real(dp),intent(inout) :: elast
191  real(dp),intent(out) :: deltae,etotal,vxcavg
192  type(MPI_type),intent(in) :: mpi_enreg
193  type(dataset_type),intent(in) :: dtset
194  type(energies_type),intent(inout) :: energies
195  type(pawang_type),intent(in) :: pawang
196  type(pseudopotential_type),intent(in) :: psps
197 !arrays
198  integer,intent(in) :: ngfft(18)
199  logical :: add_tfw_
200  real(dp),intent(in) :: gprimd(3,3)
201  real(dp),intent(in) :: red_ptot(3),rprimd(3,3),vpsp(nfft),xred(3,dtset%natom)
202  real(dp),intent(in),optional :: taur(nfft,dtset%nspden*dtset%usekden)
203  real(dp),intent(inout) :: kxc(nfft,nkxc),nhat(nfft,dtset%nspden*usepaw)
204  real(dp),intent(inout) :: nvresid(nfft,dtset%nspden),rhog(2,nfft)
205  real(dp),intent(inout) :: rhor(nfft,dtset%nspden),vhartr(nfft)
206  real(dp),intent(inout) :: vtrial(nfft,dtset%nspden),vxc(nfft,dtset%nspden)
207  real(dp),intent(inout) :: xccc3d(n3xccc)
208  real(dp),intent(out) :: strsxc(6)
209  real(dp),intent(inout),optional :: vxctau(nfft,dtset%nspden,4*dtset%usekden)
210  type(paw_an_type),intent(inout) :: paw_an(my_natom)
211  type(paw_ij_type),intent(inout) :: paw_ij(my_natom)
212  type(pawfgrtab_type),intent(inout) :: pawfgrtab(my_natom)
213  type(pawrad_type),intent(in) :: pawrad(ntypat)
214  type(pawrhoij_type),intent(inout) :: pawrhoij(my_natom)
215  type(pawtab_type),intent(in) :: pawtab(ntypat)
216 
217 !Local variables-------------------------------
218 !scalars
219  integer :: cplex,iatom,ider,idir,ierr,ifft,ipert,irhoij,ispden,itypat,izero,iir,jjr,kkr
220  integer :: jrhoij,klmn,klmn1,kmix,nfftot,nhatgrdim,nzlmopt,nk3xc,option,optxc
221  logical :: nmxc,with_vxctau
222  real(dp) :: alphaopt,compch_fft,compch_sph,doti,e1t10,e_ksnm1,e_xcdc_vxctau
223  real(dp) :: eenth,fp0,gammp1,ro_dlt,ucvol_local
224  character(len=500) :: message
225  type(xcdata_type) :: xcdata
226 !arrays
227  real(dp) :: A(3,3),A1(3,3),A_new(3,3),efield_new(3)
228  real(dp) :: gmet(3,3),gprimdlc(3,3),qpt(3),rmet(3,3),tsec(2)
229  real(dp),allocatable :: nhatgr(:,:,:),rhoijtmp(:,:)
230 
231 ! *********************************************************************
232 
233 !DEBUG
234 !write(std_out,*)' odamix : enter'
235 !ENDDEBUG
236 
237  call timab(80,1,tsec)
238 
239 !Check that usekden is not 0 if want to use vxctau
240  with_vxctau = (present(vxctau).and.present(taur).and.(dtset%usekden/=0))
241 
242 !To be adjusted for the call to rhotoxc
243  add_tfw_=.false.;if (present(add_tfw)) add_tfw_=add_tfw
244  nk3xc=1;nmxc=(dtset%usepaw==1.and.mod(abs(dtset%usepawu),10)==4)
245 
246 !faire un test sur optres=1, usewvl=0, nspden=1,nhatgrdim
247  if(optres/=1)then
248    write(message,'(a,i0,a)')' optres=',optres,', not allowed in oda => stop '
249    ABI_ERROR(message)
250  end if
251 
252  if(dtset%usewvl/=0)then
253    write(message,'(a,i0,a)')' usewvl=',dtset%usewvl,', not allowed in oda => stop '
254    ABI_ERROR(message)
255  end if
256 
257  if(dtset%nspden/=1)then
258    write(message,'(a,i0,a)')'  nspden=',dtset%nspden,', not allowed in oda => stop '
259    ABI_ERROR(message)
260  end if
261 
262  if (my_natom>0) then
263    if(paw_ij(1)%has_dijhat==0)then
264      message = ' dijhat variable must be allocated in odamix ! '
265      ABI_ERROR(message)
266    end if
267    if(paw_ij(1)%cplex_dij==2.or.paw_ij(1)%qphase==2)then
268      message = ' complex dij not allowed in odamix! '
269      ABI_ERROR(message)
270    end if
271  end if
272 
273 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
274 !!!!!!!!!! calculation of f'(0)= Eband_new-EH_old-E_xcdc_old-Ek_old-E_loc_old-E_nonloc_old
275 !!!!!!!!!! save previous energy E(rho_tild_n)
276 
277  fp0=energies%e_eigenvalues-energies%h0-two*energies%e_hartree-energies%e_xcdc
278  if (usepaw==1) then
279    do iatom=1,my_natom
280      ABI_CHECK(pawrhoij(iatom)%qphase==1,'ODA mixing not allowed with a Q phase in PAW objects!')
281      itypat=pawrhoij(iatom)%itypat
282      do ispden=1,pawrhoij(iatom)%nspden
283        jrhoij=1
284        do irhoij=1,pawrhoij(iatom)%nrhoijsel
285          klmn=pawrhoij(iatom)%rhoijselect(irhoij)
286          ro_dlt=pawrhoij(iatom)%rhoijp(jrhoij,ispden)*pawtab(itypat)%dltij(klmn)
287          e1t10=e1t10+ro_dlt*(paw_ij(iatom)%dij(klmn,ispden)-paw_ij(iatom)%dijhat(klmn,ispden))
288          jrhoij=jrhoij+pawrhoij(iatom)%cplex_rhoij
289        end do
290        klmn1=1
291        do klmn=1,pawrhoij(iatom)%lmn2_size
292          ro_dlt=-pawrhoij(iatom)%rhoijres(klmn1,ispden)*pawtab(itypat)%dltij(klmn)
293          e1t10=e1t10+ro_dlt*(paw_ij(iatom)%dij(klmn,ispden)-paw_ij(iatom)%dijhat(klmn,ispden))
294          klmn1=klmn1+pawrhoij(iatom)%cplex_rhoij
295        end do
296      end do
297      if (paw_ij(iatom)%ndij>=2.and.pawrhoij(iatom)%nspden==1) then
298        jrhoij=1
299        do irhoij=1,pawrhoij(iatom)%nrhoijsel
300          klmn=pawrhoij(iatom)%rhoijselect(irhoij)
301          ro_dlt=pawrhoij(iatom)%rhoijp(jrhoij,1)*pawtab(itypat)%dltij(klmn)
302          e1t10=e1t10+ro_dlt*(paw_ij(iatom)%dij(klmn,2)-paw_ij(iatom)%dijhat(klmn,2))
303          jrhoij=jrhoij+pawrhoij(iatom)%cplex_rhoij
304        end do
305        klmn1=1
306        do klmn=1,pawrhoij(iatom)%lmn2_size
307          ro_dlt=-pawrhoij(iatom)%rhoijres(klmn1,1)*pawtab(itypat)%dltij(klmn)
308          e1t10=e1t10+ro_dlt*(paw_ij(iatom)%dij(klmn,2)-paw_ij(iatom)%dijhat(klmn,2))
309          klmn1=klmn1+pawrhoij(iatom)%cplex_rhoij
310        end do
311        e1t10=half*e1t10
312      end if
313    end do
314    if (mpi_enreg%nproc_atom>1) then
315      call xmpi_sum(e1t10,mpi_enreg%comm_atom,ierr)
316    end if
317    fp0=fp0-e1t10
318  end if
319  e_ksnm1=etotal
320 
321 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
322 !!!!! Calculation of quantities that do not depend on rho_n+1
323 
324 !PAW: eventually recompute compensation density (and gradients)
325  nhatgrdim=0
326  if (usepaw==1) then
327    ider=-1;if (dtset%xclevel==2.or.usexcnhat==0) ider=0
328    if (dtset%xclevel==2.and.usexcnhat==1) ider=ider+2
329    if (ider>0) then
330      nhatgrdim=1
331      ABI_MALLOC(nhatgr,(nfft,dtset%nspden,3))
332    end if
333    if (ider>=0) then
334      ider=0;izero=0;cplex=1;ipert=0;idir=0;qpt(:)=zero
335      call pawmknhat(compch_fft,cplex,ider,idir,ipert,izero,gprimd,my_natom,dtset%natom,&
336      nfft,ngfft,nhatgrdim,dtset%nspden,ntypat,pawang,pawfgrtab,&
337 &     nhatgr,nhat,pawrhoij,pawrhoij,pawtab,qpt,rprimd,ucvol,dtset%usewvl,xred,&
338 &     comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab,&
339 &     comm_fft=mpi_enreg%comm_fft,paral_kgb=dtset%paral_kgb,me_g0=mpi_enreg%me_g0,&
340 &     distribfft=mpi_enreg%distribfft,mpi_comm_wvl=mpi_enreg%comm_wvl)
341    end if
342  end if
343 
344 !------Compute Hartree and xc potentials----------------------------------
345  nfftot=PRODUCT(ngfft(1:3))
346 
347  call hartre(1,gsqcut,dtset%icutcoul,usepaw,mpi_enreg,nfft,ngfft,&
348              &dtset%nkpt,dtset%rcut,rhog,rprimd,dtset%vcutgeo,vhartr)
349 
350  call xcdata_init(xcdata,dtset=dtset)
351 
352 !If we use the XC Tran-Blaha 2009 (modified BJ) functional, update the c value
353  if (dtset%xc_tb09_c>99._dp) then
354    call xc_tb09_update_c(dtset%intxc,dtset%ixc,mpi_enreg,dtset%natom, &
355 &    nfft,ngfft,nhat,usepaw,nhatgr,nhatgrdim,dtset%nspden,dtset%ntypat,n3xccc, &
356 &    pawang,pawrad,pawrhoij,pawtab,dtset%pawxcdev,rhor,rprimd,usepaw, &
357 &    xccc3d,dtset%xc_denpos,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab, &
358 &    computation_type='all')
359  end if
360 
361 !Compute xc potential (separate up and down if spin-polarized)
362  optxc=1
363  call rhotoxc(energies%e_xc,kxc,mpi_enreg,nfft,ngfft,&
364 & nhat,usepaw,nhatgr,nhatgrdim,nkxc,nk3xc,nmxc,n3xccc,optxc,rhor,rprimd,strsxc,&
365 & usexcnhat,vxc,vxcavg,xccc3d,xcdata,taur=taur,vhartr=vhartr,vxctau=vxctau,add_tfw=add_tfw_)
366 
367 !------Compute parts of total energy depending on potentials--------
368 
369  ucvol_local=ucvol
370 
371 !Compute Hartree energy energies%e_hartree
372  call dotprod_vn(1,rhor,energies%e_hartree,doti,nfft,nfftot,1,1,vhartr,ucvol_local,&
373 & mpi_comm_sphgrid=mpi_enreg%comm_fft)
374  energies%e_hartree=half*energies%e_hartree
375 
376 
377 !Compute local psp energy energies%e_localpsp
378  call dotprod_vn(1,rhor,energies%e_localpsp,doti,nfft,nfftot,1,1,vpsp,ucvol_local,&
379 & mpi_comm_sphgrid=mpi_enreg%comm_fft)
380 
381 !Compute double-counting XC energy energies%e_xcdc
382  call dotprod_vn(1,rhor,energies%e_xcdc,doti,nfft,nfftot,dtset%nspden,1,vxc,ucvol_local,&
383 & mpi_comm_sphgrid=mpi_enreg%comm_fft)
384  if (with_vxctau) then
385    call dotprod_vn(1,taur,e_xcdc_vxctau,doti,nfft,nfftot,dtset%nspden,1,&
386 &   vxctau(:,:,1),ucvol_local,mpi_comm_sphgrid=mpi_enreg%comm_fft)
387    energies%e_xcdc=energies%e_xcdc+e_xcdc_vxctau
388  end if
389 
390  if (usepaw/=0) then
391    nzlmopt=dtset%pawnzlm; option=2
392    do iatom=1,my_natom
393      itypat=paw_ij(iatom)%itypat
394      ABI_MALLOC(paw_ij(iatom)%dijhartree,(pawtab(itypat)%lmn2_size))
395      paw_ij(iatom)%has_dijhartree=1
396    end do
397    call pawdenpot(compch_sph,energies%e_paw,energies%e_pawdc,0,dtset%ixc,my_natom,dtset%natom,dtset%nspden,ntypat,&
398 &   dtset%nucdipmom,nzlmopt,option,paw_an,paw_an,paw_ij,pawang,dtset%pawprtvol,pawrad,pawrhoij,dtset%pawspnorb,&
399 &   pawtab,dtset%pawxcdev,dtset%spnorbscl,dtset%xclevel,dtset%xc_denpos,dtset%xc_taupos,ucvol,psps%znuclpsp,&
400 &   comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
401    do iatom=1,my_natom
402      ABI_FREE(paw_ij(iatom)%dijhartree)
403      paw_ij(iatom)%has_dijhartree=0
404    end do
405  end if
406 
407 !When the finite-temperature VG broadening scheme is used,
408 !the total entropy contribution "tsmear*entropy" has a meaning,
409 !and gather the two last terms of Eq.8 of the VG paper
410 !Warning : might have to be changed for fixed moment calculations
411  if(dtset%occopt>=3 .and. dtset%occopt<=8) then
412    energies%e_entropy = - dtset%tsmear * energies%entropy
413  else
414    energies%e_entropy = zero
415  end if
416 !Turn it into an electric enthalpy,refer to Eq.(33) of Suppl. of Nat. Phys. paper (5,304,2009) [[cite:Stengel2009]]
417 ! the missing volume is added here
418  energies%e_elecfield = zero
419  if (dtset%berryopt == 4 .or. dtset%berryopt == 14 ) then             !!HONG
420 
421    energies%e_elecfield = -dot_product(dtset%red_efieldbar,red_ptot)
422 
423    call metric(gmet,gprimdlc,-1,rmet,rprimd,ucvol_local)
424    eenth = zero
425    do iir=1,3
426      do jjr=1,3
427        eenth= eenth+gmet(iir,jjr)*dtset%red_efieldbar(iir)*dtset%red_efieldbar(jjr)         !! HONG g^{-1})_ij ebar_i ebar_j
428      end do
429    end do
430    eenth=-1_dp*(ucvol_local/(8.0d0*pi))*eenth
431    energies%e_elecfield = energies%e_elecfield + eenth
432 
433  end if
434 
435  energies%e_magfield = zero
436 !if (dtset%berryopt == 5) then
437 !emag = dot_product(mag_cart,dtset%bfield)
438 !energies%e_magfield = emag
439 !end if
440 
441 !HONG  Turn it into an internal enthalpy, refer to Eq.(36) of Suppl. of Nat. Phys. paper (5,304,2009) [[cite:Stengel2009]],
442 !but a little different: U=E_ks + (vol/8*pi) *  g^{-1})_ij ebar_i ebar_j
443  if (dtset%berryopt == 6 .or. dtset%berryopt == 16 )  then
444    energies%e_elecfield=zero
445    call metric(gmet,gprimdlc,-1,rmet,rprimd,ucvol_local)
446    do iir=1,3
447      do jjr=1,3
448        energies%e_elecfield = energies%e_elecfield + gmet(iir,jjr)*dtset%red_efieldbar(iir)*dtset%red_efieldbar(jjr)     !! HONG g^{-1})_ij ebar_i ebar_j
449      end do
450    end do
451    energies%e_elecfield = ucvol_local/(8.0d0*pi)*energies%e_elecfield
452  end if
453 
454 !HONG  calculate internal energy and electric enthalpy for mixed BC case.
455  if ( dtset%berryopt == 17 ) then
456    energies%e_elecfield = zero
457    call metric(gmet,gprimdlc,-1,rmet,rprimd,ucvol_local)
458    A(:,:)=(4*pi/ucvol_local)*rmet(:,:)
459    A1(:,:)=A(:,:)
460    A_new(:,:)=A(:,:)
461    efield_new(:)=dtset%red_efield(:)
462    eenth = zero
463 
464    do kkr=1,3
465      if (dtset%jfielddir(kkr)==1) then    ! fixed ebar direction
466 
467 !      step 1 add -ebar*p
468        eenth=eenth - dtset%red_efieldbar(kkr)*red_ptot(kkr)
469 
470 !      step 2  chang to e_new (change e to ebar)
471        efield_new(kkr)=dtset%red_efieldbar(kkr)
472 
473 !      step 3  chang matrix A to  A1
474 
475        do iir=1,3
476          do jjr=1,3
477            if (iir==kkr .and. jjr==kkr) A1(iir,jjr)=-1.0/A(kkr,kkr)
478            if ((iir==kkr .and. jjr/=kkr) .or.  (iir/=kkr .and.  jjr==kkr)) &
479 &           A1(iir,jjr)=-1.0*A(iir,jjr)/A(kkr,kkr)
480            if (iir/=kkr .and. jjr/=kkr) A1(iir,jjr)=A(iir,jjr)-A(iir,kkr)*A(kkr,jjr)/A(kkr,kkr)
481          end do
482        end do
483 
484        A(:,:)=A1(:,:)
485        A_new(:,:)=A1(:,:)
486      end if
487 
488    end do  ! end fo kkr
489 
490 
491    do iir=1,3
492      do jjr=1,3
493        eenth= eenth+(1/2.0)*A_new(iir,jjr)*efield_new(iir)*efield_new(jjr)
494      end do
495    end do
496 
497    energies%e_elecfield=energies%e_elecfield+eenth
498 
499  end if   ! berryopt==17
500 
501  etotal = energies%e_kinetic+ energies%e_hartree + energies%e_xc + &
502 & energies%e_localpsp + energies%e_nlpsp_vfock - energies%e_fock0 + energies%e_corepsp + &
503 & energies%e_entropy + energies%e_elecfield + energies%e_magfield + &
504 & energies%e_nucdip
505 !etotal = energies%e_eigenvalues - energies%e_hartree + energies%e_xc - &
506 !& energies%e_xcdc + energies%e_corepsp + &
507 !& energies%e_entropy + energies%e_elecfield
508  etotal = etotal + energies%e_ewald + energies%e_chempot + energies%e_vdw_dftd
509  if (usepaw==1) then
510    etotal = etotal + energies%e_paw
511  end if
512 
513 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
514 !!!!!!!!!!!!!! now, compute mixed densities
515 
516  gammp1=etotal-e_ksnm1-fp0
517  if (fp0>0.d0) then
518    write(std_out,*) "fp0 est positif"
519 !  stop
520  end if
521  write(std_out,*) "fp0 ",fp0
522  alphaopt=-fp0/two/gammp1
523 
524  if (alphaopt>one.or.alphaopt<0.d0) alphaopt=one
525  if (abs(energies%h0)<=tol10) alphaopt=one
526  write(std_out,*) " alphaopt",alphaopt
527 
528  energies%h0=(one-alphaopt)*energies%h0 + alphaopt*(energies%e_kinetic+energies%e_localpsp)
529  energies%h0=energies%h0 + alphaopt*energies%e_nlpsp_vfock
530 
531  rhor= rhor+(alphaopt-one)*nvresid
532  call fourdp(1,rhog,rhor(:,1),-1,mpi_enreg,nfft,1,ngfft,0)
533 
534  if (usepaw==1) then
535    if (my_natom>0) then
536      ABI_MALLOC(rhoijtmp,(pawrhoij(1)%cplex_rhoij*pawrhoij(1)%lmn2_size,pawrhoij(1)%nspden))
537    end if
538    do iatom=1,my_natom
539      rhoijtmp=zero
540      if (pawrhoij(iatom)%cplex_rhoij==1) then
541        if (pawrhoij(iatom)%lmnmix_sz<pawrhoij(iatom)%lmn2_size) then
542          do ispden=1,pawrhoij(iatom)%nspden
543            do irhoij=1,pawrhoij(iatom)%nrhoijsel
544              klmn=pawrhoij(iatom)%rhoijselect(irhoij)
545              rhoijtmp(klmn,ispden)=pawrhoij(iatom)%rhoijp(irhoij,ispden)
546            end do
547          end do
548        end if
549        do ispden=1,pawrhoij(iatom)%nspden
550          do kmix=1,pawrhoij(iatom)%lmnmix_sz
551            klmn=pawrhoij(iatom)%kpawmix(kmix)
552            rhoijtmp(klmn,ispden)=rhoijtmp(klmn,ispden)+(alphaopt-one)*pawrhoij(iatom)%rhoijres(klmn,ispden)
553          end do
554        end do
555      else
556        if (pawrhoij(iatom)%lmnmix_sz<pawrhoij(iatom)%lmn2_size) then
557          jrhoij=1
558          do ispden=1,pawrhoij(iatom)%nspden
559            do irhoij=1,pawrhoij(iatom)%nrhoijsel
560              klmn=2*pawrhoij(iatom)%rhoijselect(irhoij)-1
561              rhoijtmp(klmn:klmn+1,ispden)=pawrhoij(iatom)%rhoijp(jrhoij:jrhoij+1,ispden)
562              jrhoij=jrhoij+2
563            end do
564          end do
565        end if
566        do ispden=1,pawrhoij(iatom)%nspden
567          do kmix=1,pawrhoij(iatom)%lmnmix_sz
568            klmn=2*pawrhoij(iatom)%kpawmix(kmix)-1
569            rhoijtmp(klmn:klmn+1,ispden)=rhoijtmp(klmn:klmn+1,ispden) &
570 &           +(alphaopt-one)*pawrhoij(iatom)%rhoijres(klmn:klmn+1,ispden)
571          end do
572        end do
573      end if
574      call pawrhoij_filter(pawrhoij(iatom)%rhoijp,pawrhoij(iatom)%rhoijselect,pawrhoij(iatom)%nrhoijsel,&
575 &                         pawrhoij(iatom)%cplex_rhoij,pawrhoij(iatom)%qphase,pawrhoij(iatom)%lmn2_size,&
576 &                         pawrhoij(iatom)%nspden,rhoij_input=rhoijtmp)
577    end do ! iatom
578    if (allocated(rhoijtmp)) then
579      ABI_FREE(rhoijtmp)
580    end if
581  end if ! usepaw
582 
583 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
584 !!!!! Calcul des quantites qui dependent de rho_tilde_n+1 (rho apres mixing)
585 
586  if (usepaw==1) then
587    if (ider>=0) then
588      izero=0;cplex=1;ipert=0;idir=0;qpt(:)=zero
589      call pawmknhat(compch_fft,cplex,ider,idir,ipert,izero,gprimd,my_natom,dtset%natom,&
590 &     nfft,ngfft,nhatgrdim,dtset%nspden,ntypat,pawang,pawfgrtab,nhatgr,&
591 &     nhat,pawrhoij,pawrhoij,pawtab,qpt,rprimd,ucvol,dtset%usewvl,xred,&
592 &     comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab,&
593 &     comm_fft=mpi_enreg%comm_fft,paral_kgb=dtset%paral_kgb,me_g0=mpi_enreg%me_g0,&
594 &     distribfft=mpi_enreg%distribfft,mpi_comm_wvl=mpi_enreg%comm_wvl)
595    end if
596  end if
597 
598 !------Compute Hartree and xc potentials----------------------------------
599 
600  call hartre(1,gsqcut,dtset%icutcoul,usepaw,mpi_enreg,nfft,ngfft,&
601              &dtset%nkpt,dtset%rcut,rhog,rprimd,dtset%vcutgeo,vhartr)
602 
603 !If we use the XC Tran-Blaha 2009 (modified BJ) functional, update the c value
604  if (dtset%xc_tb09_c>99._dp) then
605    call xc_tb09_update_c(dtset%intxc,dtset%ixc,mpi_enreg,dtset%natom, &
606 &    nfft,ngfft,nhat,usepaw,nhatgr,nhatgrdim,dtset%nspden,dtset%ntypat,n3xccc, &
607 &    pawang,pawrad,pawrhoij,pawtab,dtset%pawxcdev,rhor,rprimd,usepaw, &
608 &    xccc3d,dtset%xc_denpos,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab, &
609 &    computation_type='all')
610  end if
611 
612 !Compute xc potential (separate up and down if spin-polarized)
613  optxc=1;if (nkxc>0) optxc=2
614  call rhotoxc(energies%e_xc,kxc,mpi_enreg,nfft,ngfft,&
615 & nhat,usepaw,nhatgr,nhatgrdim,nkxc,nk3xc,nmxc,n3xccc,optxc,rhor,rprimd,strsxc,&
616 & usexcnhat,vxc,vxcavg,xccc3d,xcdata,taur=taur,vhartr=vhartr,vxctau=vxctau,add_tfw=add_tfw_)
617 
618  if (nhatgrdim>0)  then
619    ABI_FREE(nhatgr)
620  end if
621 
622 !------Compute parts of total energy depending on potentials--------
623 
624  ucvol_local = ucvol
625 
626 !Compute Hartree energy energies%e_hartree
627  call dotprod_vn(1,rhor,energies%e_hartree,doti,nfft,nfftot,1,1,vhartr,ucvol_local,&
628 & mpi_comm_sphgrid=mpi_enreg%comm_fft)
629  energies%e_hartree=half*energies%e_hartree
630 
631 !Compute double-counting XC energy energies%e_xcdc
632  call dotprod_vn(1,rhor,energies%e_xcdc,doti,nfft,nfftot,dtset%nspden,1,vxc,ucvol_local,&
633 & mpi_comm_sphgrid=mpi_enreg%comm_fft)
634 
635  etotal=energies%h0+energies%e_hartree+energies%e_xc+energies%e_corepsp + &
636 & energies%e_entropy + energies%e_elecfield + energies%e_magfield
637  etotal = etotal + energies%e_ewald + energies%e_chempot + energies%e_vdw_dftd
638  if (usepaw==1) then
639    do iatom=1,my_natom
640      itypat=paw_ij(iatom)%itypat
641      ABI_MALLOC(paw_ij(iatom)%dijhartree,(pawtab(itypat)%lmn2_size))
642      paw_ij(iatom)%has_dijhartree=1
643    end do
644    call pawdenpot(compch_sph,energies%e_paw,energies%e_pawdc,0,dtset%ixc,my_natom,dtset%natom, &
645 &   dtset%nspden,ntypat,dtset%nucdipmom,nzlmopt,option,paw_an,paw_an,paw_ij,pawang, &
646 &   dtset%pawprtvol,pawrad,pawrhoij,dtset%pawspnorb,pawtab,dtset%pawxcdev,dtset%spnorbscl,&
647 &   dtset%xclevel,dtset%xc_denpos,dtset%xc_taupos,ucvol,psps%znuclpsp,&
648 &   comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
649    do iatom=1,my_natom
650      ABI_FREE(paw_ij(iatom)%dijhartree)
651      paw_ij(iatom)%has_dijhartree=0
652    end do
653    etotal=etotal+energies%e_paw
654  end if
655 !Compute energy residual
656  deltae=etotal-elast
657  elast=etotal
658 
659  do ispden=1,min(dtset%nspden,2)
660 !$OMP PARALLEL DO PRIVATE(ifft) SHARED(ispden,nfft,vhartr,vpsp,vxc)
661    do ifft=1,nfft
662      vtrial(ifft,ispden)=vhartr(ifft)+vpsp(ifft)+vxc(ifft,ispden)
663    end do
664  end do
665  if(dtset%nspden==4) vtrial(:,3:4)=vxc(:,3:4)
666 
667  call timab(80,2,tsec)
668 
669 !DEBUG
670 !write(std_out,*) 'eeig-ehart+enxc-enxcdc+eew+eii+eent+enefield+epawdc',eeig,ehart,enxc,enxcdc,eew,eii,eent,enefield,epawdc
671 !ENDEBUG
672 
673 end subroutine odamix