LCOV - code coverage report
Current view: top level - src/80_tdep - m_tdep_phdos.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 97.3 % 376 366
Test Date: 2026-11-09 20:57:54 Functions: 100.0 % 3 3
Branches: 70.9 % 436 309

             Branch data     Line data    Source code
       1                 :             : 
       2                 :             : #if defined HAVE_CONFIG_H
       3                 :             : #include "config.h"
       4                 :             : #endif
       5                 :             : 
       6                 :             : #include "abi_common.h"
       7                 :             : 
       8                 :             : module m_tdep_phdos
       9                 :             : 
      10                 :             :   use defs_basis
      11                 :             : !FB  use m_nctk
      12                 :             :   use m_errors
      13                 :             :   use m_abicore
      14                 :             :   use m_phonons
      15                 :             :   use m_xmpi
      16                 :             :   use m_io_tools
      17                 :             :   use m_ifc,              only : ifc_type
      18                 :             :   use m_crystal,          only : crystal_t
      19                 :             :   use m_ddb,              only : ddb_type
      20                 :             :   use m_tdep_phi2,        only : Eigen_type, tdep_write_yaml, tdep_write_dij, tdep_calc_dij
      21                 :             :   use m_tdep_model,       only : tdep_init_phi2, tdep_destroy_phi2, Phi2_type
      22                 :             :   use m_tdep_qpt,         only : Qpoints_type
      23                 :             :   use m_tdep_dataset,     only : atdep_dataset_type, MPI_enreg_type
      24                 :             :   use m_tdep_latt,        only : Lattice_type
      25                 :             :   use m_tdep_sym,         only : Symmetries_type
      26                 :             :   use m_tdep_shell,       only : Shell_type
      27                 :             :   use m_tdep_abitypes,    only : Qbz_type, tdep_ifc2phi2, tdep_read_ifc, tdep_write_ifc, &
      28                 :             : &                                tdep_write_ddb,tdep_init_ifc
      29                 :             : 
      30                 :             :   implicit none
      31                 :             : 
      32                 :             :   public :: tdep_calc_phdos
      33                 :             :   public :: tdep_calc_thermo
      34                 :             :   public :: tdep_calc_elastic
      35                 :             : 
      36                 :             : contains
      37                 :             : 
      38                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      39   [ -  +  -  +  :         616 : subroutine tdep_calc_phdos(Crystal,DDB,Eigen2nd_MP,Eigen2nd_path,Ifc,Invar,Lattice,MPIdata,natom,&
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  +  +  
                   +  + ]
      40                 :          44 : &                          natom_unitcell,Phi2,PHdos,Qbz,Qpt,Rlatt_scaled,Shell2at,Sym)
      41                 :             : 
      42                 :             :   integer, intent(in) :: natom,natom_unitcell
      43                 :             :   double precision, intent(in) :: Rlatt_scaled(3,natom_unitcell,natom)
      44                 :             :   type(atdep_dataset_type),intent(in) :: Invar
      45                 :             :   type(phdos_t),intent(out) :: PHdos
      46                 :             :   type(Phi2_type),intent(in) :: Phi2
      47                 :             :   type(ifc_type),intent(inout) :: Ifc
      48                 :             :   type(Lattice_type),intent(in) :: Lattice
      49                 :             :   type(Symmetries_type),intent(in) :: Sym
      50                 :             :   type(crystal_t),intent(inout) :: Crystal
      51                 :             :   type(ddb_type),intent(in) :: DDB  ! To be removed
      52                 :          44 :   type(Phi2_type) :: Phi2_tmp  ! To be removed
      53                 :             :   type(Qbz_type),intent(in) :: Qbz
      54                 :             :   type(Qpoints_type),intent(in) :: Qpt
      55                 :             :   type(MPI_enreg_type), intent(in) :: MPIdata
      56                 :             :   type(Shell_type),intent(in) :: Shell2at
      57                 :             :   type(Eigen_type),intent(inout) :: Eigen2nd_path
      58                 :             :   type(Eigen_type),intent(inout) :: Eigen2nd_MP
      59                 :             : 
      60                 :             :   integer :: prtdos,iqpt,iq_ibz,iomega,iatom
      61                 :             :   integer :: dos_ngqpt(3)
      62                 :             :   integer :: count_wminmax(2)
      63                 :             :   character (len=fnlen):: phdos_fname
      64                 :             :   double precision :: dossmear,integ,domega
      65                 :             :   double precision :: dos_qshift(3)
      66                 :          44 :   double precision, allocatable :: displ(:,:)
      67                 :             :   character(len=500) :: message
      68                 :             :   real(dp) :: wminmax(2)
      69   [ +  +  +  +  :         264 :   type(ifc_type) :: Ifc_tmp
                   -  + ]
      70                 :             : 
      71                 :             : !FB  double precision, allocatable :: omega (:)
      72                 :             : !FB  double complex, allocatable :: eigenV(:,:)
      73                 :             : 
      74                 :          44 :   write(Invar%stdout,*)' '
      75                 :          44 :   write(Invar%stdout,*) '#############################################################################'
      76                 :          44 :   write(Invar%stdout,*) '############## Compute the phonon spectrum, the DOS, ########################'
      77                 :          44 :   write(Invar%stdout,*) '##############  the dynamical matrix and write them  ########################'
      78                 :          44 :   write(Invar%stdout,*) '#############################################################################'
      79                 :             : 
      80                 :          44 :   write(Invar%stdout,'(a)')' '
      81                 :          44 :   write(Invar%stdout,'(a)') ' #############################################################################'
      82                 :          44 :   write(Invar%stdout,'(a)') ' ################### vibrational Density OF States (vDOS) ####################'
      83                 :          44 :   write(Invar%stdout,'(a)') ' #############################################################################'
      84                 :          44 :   write(Invar%stdout,'(a)') ' See the vdos.dat and TDEP_PHDOS* files'
      85                 :             : 
      86                 :             : ! ----------------------------------------------------
      87                 :             : ! GA To be moved outside of this routine vvvvvvvvvvvvv
      88                 :             : 
      89                 :             : ! Write Ifc%atmfrc in the ifc_out.dat file
      90         [ +  - ]:          44 :  if (MPIdata%iam_master) then
      91                 :          44 :    call tdep_write_ifc(Crystal,Ifc,Invar,Invar%natom_unitcell,0)
      92                 :             :  end if
      93                 :             : 
      94                 :             : ! For test purpose : read the previous IFC from ifc_out.dat and write it in ifc_check.dat
      95                 :             : ! =======================================================================================
      96         [ +  + ]:          44 :   if (Invar%readifc.eq.2) then
      97                 :             : 
      98                 :             :     ! Copy Phi2 to Phi2_tmp
      99                 :           2 :     call tdep_init_phi2(Phi2_tmp,Invar%loto,natom)
     100   [ +  -  +  -  :      253144 :     Phi2_tmp%SR =Phi2%SR
          -  +  -  -  -  
          -  -  -  +  +  
                   +  + ]
     101         [ -  + ]:           2 :     if (Invar%loto) then
     102   [ #  #  #  #  :           0 :       Phi2_tmp%Tot=Phi2%Tot
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     103   [ #  #  #  #  :           0 :       Phi2_tmp%LR =Phi2%LR
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     104                 :             :     end if
     105                 :             : 
     106                 :             :     ! Copy Phi2_tmp to Ifc_tmp%atmfrc
     107                 :           2 :     call tdep_init_ifc(Crystal,DDB,Ifc_tmp,Invar,Lattice,MPIdata,Phi2_tmp,Rlatt_scaled,Shell2at,Sym)
     108                 :             : 
     109         [ +  - ]:           2 :     if (MPIdata%iam_master) then
     110                 :             : 
     111                 :             : !     Read IFC from ifc_out.dat (readifc=2)
     112                 :           2 :       call tdep_read_ifc(Ifc_tmp,Invar,natom_unitcell)
     113                 :             : 
     114                 :             : !     Copy Ifc_tmp%atmfrc to Phi2_tmp
     115                 :           2 :       call tdep_ifc2phi2(Ifc_tmp%dipdip,Ifc_tmp,Invar,Lattice,natom_unitcell,1,Phi2_tmp,Rlatt_scaled,Shell2at,Sym)
     116                 :             : 
     117                 :             : !     Copy Phi2_tmp to Ifc_tmp%atmfrc
     118                 :           2 :       call tdep_ifc2phi2(Ifc_tmp%dipdip,Ifc_tmp,Invar,Lattice,natom_unitcell,0,Phi2_tmp,Rlatt_scaled,Shell2at,Sym)
     119                 :             : 
     120                 :             : !     Write IFC in ifc_check.dat (for check)
     121                 :           2 :       call tdep_write_ifc(Crystal,Ifc_tmp,Invar,natom_unitcell,1)
     122                 :             : 
     123                 :             : !     Write the Phi2-tmp.dat file
     124         [ -  + ]:           2 :       if (Invar%debug) then
     125                 :           0 :         write(Invar%stdout,'(a)') ' See the Phi2-tmp.dat file corresponding to the ifc_out.dat/Phi2 file'
     126                 :           0 :         open(unit=55,file=trim(Invar%output_prefix)//'_Phi2-tmp.dat')
     127         [ #  # ]:           0 :         do iatom=1,3*natom
     128                 :           0 :           write(55,'(10000(f10.6,1x))') Phi2_tmp%SR(iatom,:)
     129                 :             :         end do
     130                 :           0 :         close(55)
     131                 :             :       end if
     132                 :             :     end if
     133                 :           2 :     call Ifc_tmp%free()
     134                 :           2 :     call tdep_destroy_phi2(Phi2_tmp)
     135                 :             :   end if
     136                 :             : 
     137                 :             : ! GA To be moved outside of this routine ^^^^^^^^^^^^^
     138                 :             : ! ----------------------------------------------------
     139                 :             : 
     140                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     141                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ON THE FINE GRID !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     142                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     143                 :             : ! Compute the DOS
     144                 :             : ! ===============
     145                 :          44 :   prtdos=1 !Gaussian
     146                 :             : !  prtdos=2 !Tetra
     147                 :          44 :   dossmear=4.5d-6
     148                 :             : !  dossmear=4.5d-5
     149         [ +  + ]:         176 :   dos_qshift(:)=0.5d0
     150         [ +  + ]:         176 :   dos_ngqpt(:)=Invar%ngqpt2(:)
     151                 :          44 :   write(Invar%stdout,'(a)') ' Compute the vDOS'
     152                 :             :   ! Only 1 shift in q-mesh
     153                 :          44 :   wminmax = zero
     154                 :          44 :   do
     155                 :             :     call PHdos%init(Crystal,Ifc,prtdos,Invar%dosdeltae,dossmear,dos_ngqpt,1,dos_qshift, &
     156                 :          88 :       "freq_displ", wminmax, count_wminmax, XMPI_WORLD,prtout=.false.)
     157   [ +  +  +  +  :         220 :      if (all(count_wminmax == 0)) exit
                   +  + ]
     158                 :          44 :      wminmax(1) = wminmax(1) - abs(wminmax(1)) * 0.05
     159                 :          44 :      wminmax(2) = wminmax(2) + abs(wminmax(2)) * 0.05
     160                 :          44 :      call phdos%free()
     161                 :          44 :      write(message, "(a, 2f8.5)")"Initial frequency mesh not large enough. Recomputing PHDOS with wmin, wmax: ",wminmax
     162                 :          44 :      call wrtout(std_out, message)
     163                 :             :   end do
     164                 :          44 :   write(Invar%stdout,'(a)') ' ------- achieved'
     165                 :          44 :   write(Invar%stdout,'(a)') ' (Please, pay attention to convergency wrt the BZ mesh : the ngqpt2 input variable)'
     166                 :             : 
     167                 :             : ! Print the DOS
     168                 :             : ! =============
     169         [ +  - ]:          44 :   phdos_fname = trim(Invar%output_prefix)//"_PHDOS"
     170         [ +  - ]:          44 :   if (MPIdata%iam_master) call phdos%print(phdos_fname)
     171                 :          44 :   domega=(Invar%dosdeltae*Ha_meV)
     172                 :          44 :   integ=0.d0
     173         [ +  + ]:       80267 :   do iomega=1,PHdos%nomega
     174                 :       80267 :     integ=integ + domega*PHdos%phdos(iomega)
     175                 :             :   end do
     176         [ +  + ]:       80267 :   PHdos%phdos(:)=PHdos%phdos(:)/integ
     177         [ +  - ]:          44 :   if (MPIdata%iam_master) then
     178                 :          44 :     open(unit=56,file=trim(Invar%output_prefix)//'_vdos.dat')
     179         [ +  + ]:       80267 :     do iomega=1,PHdos%nomega
     180         [ +  + ]:       80223 :       if (Invar%enunit.eq.0) write(56,'(2(f18.6,1x))') PHdos%omega(iomega)*Ha_eV*1000,PHdos%phdos(iomega)
     181         [ +  + ]:       80223 :       if (Invar%enunit.eq.1) write(56,'(2(f18.6,1x))') PHdos%omega(iomega)*Ha_cmm1   ,PHdos%phdos(iomega)
     182         [ +  + ]:       80223 :       if (Invar%enunit.eq.2) write(56,'(2(f18.6,1x))') PHdos%omega(iomega)*1000      ,PHdos%phdos(iomega)
     183         [ +  + ]:       80267 :       if (Invar%enunit.eq.3) write(56,'(2(f18.6,1x))') PHdos%omega(iomega)*Ha_THz    ,PHdos%phdos(iomega)
     184                 :             :     end do
     185                 :          44 :     close(56)
     186                 :             :   end if
     187                 :             : 
     188                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     189                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ON THE PATH GRID !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     190                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     191                 :             : ! Compute the spectrum and the dynamical matrix
     192                 :             : ! =============================================
     193                 :             : ! Compute the frequencies (1)
     194                 :             : ! =======================
     195                 :             : !FB  Eigen2nd_path%eigenval=zero ; Eigen2nd_path%eigenvec=zero ; Eigen2nd_path%dynmat=zero
     196                 :             : !FB  ABI_MALLOC(dij   ,(3*Invar%natom_unitcell,3*Invar%natom_unitcell))
     197                 :             : !FB  ABI_MALLOC(eigenV,(3*Invar%natom_unitcell,3*Invar%natom_unitcell))
     198                 :             : !FB  ABI_MALLOC(omega,(3*Invar%natom_unitcell))
     199                 :             : !FB  do iqpt=1,Qpt%nqpt
     200                 :             : !FB    omega=zero ; eigenV=zero ; dij=zero
     201                 :             : !FB    call tdep_calc_dij(dij,eigenV,iqpt,Invar,omega,Phi2%Tot,Qpt%qpt_cart(:,iqpt),Rlatt_cart)
     202                 :             : !FB    Eigen2nd_path%eigenval(:,iqpt)= omega(:)
     203                 :             : !FB    do iatom=1,Invar%natom_unitcell
     204                 :             : !FB      do ii=1,3
     205                 :             : !FB        do jatom=1,Invar%natom_unitcell
     206                 :             : !FB          do jj=1,3
     207                 :             : !FB            Eigen2nd_path%eigenvec(1,ii,iatom,jj,jatom,iqpt)= real(eigenV(ii+3*(iatom-1),jj+3*(jatom-1)))
     208                 :             : !FB            Eigen2nd_path%eigenvec(2,ii,iatom,jj,jatom,iqpt)=aimag(eigenV(ii+3*(iatom-1),jj+3*(jatom-1)))
     209                 :             : !FB            Eigen2nd_path%dynmat(1,ii,iatom,jj,jatom,iqpt)  = real(dij(ii+3*(iatom-1),jj+3*(jatom-1)))
     210                 :             : !FB            Eigen2nd_path%dynmat(2,ii,iatom,jj,jatom,iqpt)  =aimag(dij(ii+3*(iatom-1),jj+3*(jatom-1)))
     211                 :             : !FB          end do
     212                 :             : !FB        end do
     213                 :             : !FB      end do
     214                 :             : !FB    end do
     215                 :             : !FB  end do
     216                 :             : !FB  ABI_FREE(dij)
     217                 :             : !FB  ABI_FREE(eigenV)
     218                 :             : !FB  ABI_FREE(omega)
     219                 :             : !FB! Write the Dij, eigenvalues and eigenvectors (in ASCII)
     220                 :             : !FB! ======================================================
     221                 :             : !FB  if (MPIdata%iam_master) then
     222                 :             : !FB    open(unit=51,file=trim(Invar%output_prefix)//'eigenvectors-path-1.dat')
     223                 :             : !FB    open(unit=52,file=trim(Invar%output_prefix)//'dij-path-1.dat')
     224                 :             : !FB    open(unit=53,file=trim(Invar%output_prefix)//'omega-path-1.dat')
     225                 :             : !FB    if (Invar%enunit.eq.0) write(53,'(a)') '# Phonon frequencies in meV'
     226                 :             : !FB    if (Invar%enunit.eq.1) write(53,'(a)') '# Phonon frequencies in cm-1'
     227                 :             : !FB    if (Invar%enunit.eq.2) write(53,'(a)') '# Phonon frequencies in mHa'
     228                 :             : !FB    if (Invar%enunit.eq.3) write(53,'(a)') '# Phonon frequencies in THz'
     229                 :             : !FB    do iqpt=1,Qpt%nqpt
     230                 :             : !FB      call tdep_write_dij(Eigen2nd_path,iqpt,Invar,Qpt%qpt_red(:,iqpt))
     231                 :             : !FB    end do
     232                 :             : !FB    close(51)
     233                 :             : !FB    close(52)
     234                 :             : !FB    close(53)
     235                 :             : !FB  end if
     236                 :             : 
     237                 :             : ! Compute the frequencies (2)
     238                 :             : ! =======================
     239   [ +  -  -  +  :     3642042 :   ABI_MALLOC(displ,(2*3*natom_unitcell*3*natom_unitcell,Qpt%nqpt)); displ(:,:)=zero
          +  -  -  +  +  
          -  +  -  +  -  
          -  +  -  +  +  
                +  +  + ]
     240   [ +  +  +  +  :    12694465 :   Eigen2nd_path%eigenval=zero ; Eigen2nd_path%eigenvec=zero ; Eigen2nd_path%dynmat=zero
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
             +  +  +  + ]
     241         [ +  + ]:       22632 :   do iqpt=1,Qpt%nqpt
     242                 :             :     call Ifc%fourq(Crystal,Qpt%qpt_red(:,iqpt),Eigen2nd_path%eigenval(:,iqpt),displ(:,iqpt),&
     243                 :             : &                  out_eigvec=Eigen2nd_path%eigenvec(:,:,:,:,:,iqpt),&
     244                 :       22632 : &                  out_d2cart=Eigen2nd_path%dynmat  (:,:,:,:,:,iqpt))
     245                 :             :   end do
     246         [ -  + ]:          44 :   ABI_FREE(displ)
     247                 :             : ! Write the Dij, eigenvalues and eigenvectors (in ASCII and YAML)
     248                 :             : ! ======================================================
     249         [ +  - ]:          44 :   if (MPIdata%iam_master) then
     250                 :             : !FB    open(unit=51,file=trim(Invar%output_prefix)//'eigenvectors-path-2.dat')
     251                 :             : !FB    open(unit=52,file=trim(Invar%output_prefix)//'dij-path-2.dat')
     252                 :             : !FB    open(unit=53,file=trim(Invar%output_prefix)//'omega-path-2.dat')
     253                 :          44 :     open(unit=51,file=trim(Invar%output_prefix)//'_eigenvectors.dat')
     254                 :          44 :     open(unit=52,file=trim(Invar%output_prefix)//'_dij.dat')
     255                 :          44 :     open(unit=53,file=trim(Invar%output_prefix)//'_omega.dat')
     256         [ +  + ]:          44 :     if (Invar%enunit.eq.0) write(53,'(a)') '# Phonon frequencies in meV'
     257         [ +  + ]:          44 :     if (Invar%enunit.eq.1) write(53,'(a)') '# Phonon frequencies in cm-1'
     258         [ +  + ]:          44 :     if (Invar%enunit.eq.2) write(53,'(a)') '# Phonon frequencies in mHa'
     259         [ +  + ]:          44 :     if (Invar%enunit.eq.3) write(53,'(a)') '# Phonon frequencies in THz'
     260         [ +  + ]:       22632 :     do iqpt=1,Qpt%nqpt
     261                 :       22632 :       call tdep_write_dij(Eigen2nd_path,iqpt,Invar,Qpt%qpt_red(:,iqpt))
     262                 :             :     end do
     263                 :          44 :     close(51)
     264                 :          44 :     close(52)
     265                 :          44 :     close(53)
     266                 :          44 :     call tdep_write_yaml(Eigen2nd_path,Qpt,Invar%output_prefix)
     267                 :             :   end if
     268                 :             : 
     269                 :             : !FB!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     270                 :             : !FB!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ON THE MP GRID !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     271                 :             : !FB!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     272                 :             : !FB! Compute the spectrum and the dynamical matrix
     273                 :             : !FB! =============================================
     274                 :             : !FB  if (Qbz%nqbz.ne.Qbz%nqibz) then
     275                 :             : !FB    write(Invar%stdlog,*) 'DIFFERENCES BETWEEN NQBZ \& NQIBZ :',Qbz%nqbz,Qbz%nqibz
     276                 :             : !FB  end if
     277                 :             : !FB! Compute the frequencies(1)
     278                 :             : !FB! =======================
     279                 :             : !FB  Eigen2nd_MP%eigenval=zero ; Eigen2nd_MP%eigenvec=zero ; Eigen2nd_MP%dynmat=zero
     280                 :             : !FB  ABI_MALLOC(dij   ,(3*Invar%natom_unitcell,3*Invar%natom_unitcell))
     281                 :             : !FB  ABI_MALLOC(eigenV,(3*Invar%natom_unitcell,3*Invar%natom_unitcell))
     282                 :             : !FB  ABI_MALLOC(omega,(3*Invar%natom_unitcell))
     283                 :             : !FB  do iq_ibz=1,Qbz%nqibz
     284                 :             : !FB    omega=zero ; eigenV=zero ; dij=zero
     285                 :             : !FB    call tdep_calc_dij(dij,eigenV,iq_ibz,Invar,omega,Phi2,Qbz%qibz_cart(:,iq_ibz),Rlatt_cart)
     286                 :             : !FB    Eigen2nd_MP%eigenval(:,iq_ibz)= omega(:)
     287                 :             : !FB    do iatom=1,Invar%natom_unitcell
     288                 :             : !FB      do ii=1,3
     289                 :             : !FB        do jatom=1,Invar%natom_unitcell
     290                 :             : !FB          do jj=1,3
     291                 :             : !FB            Eigen2nd_MP%eigenvec(1,ii,iatom,jj,jatom,iq_ibz)= real(eigenV(ii+3*(iatom-1),jj+3*(jatom-1)))
     292                 :             : !FB            Eigen2nd_MP%eigenvec(2,ii,iatom,jj,jatom,iq_ibz)=aimag(eigenV(ii+3*(iatom-1),jj+3*(jatom-1)))
     293                 :             : !FB            Eigen2nd_MP%dynmat(1,ii,iatom,jj,jatom,iq_ibz)  = real(dij(ii+3*(iatom-1),jj+3*(jatom-1)))
     294                 :             : !FB            Eigen2nd_MP%dynmat(2,ii,iatom,jj,jatom,iq_ibz)  =aimag(dij(ii+3*(iatom-1),jj+3*(jatom-1)))
     295                 :             : !FB          end do
     296                 :             : !FB        end do
     297                 :             : !FB      end do
     298                 :             : !FB    end do
     299                 :             : !FB  end do
     300                 :             : !FB  ABI_FREE(dij)
     301                 :             : !FB  ABI_FREE(eigenV)
     302                 :             : !FB  ABI_FREE(omega)
     303                 :             : !FB  if (MPIdata%iam_master) then
     304                 :             : !FB    open(unit=51,file=trim(Invar%output_prefix)//'eigenvectors-MP-1.dat')
     305                 :             : !FB    open(unit=52,file=trim(Invar%output_prefix)//'dij-MP-1.dat')
     306                 :             : !FB    open(unit=53,file=trim(Invar%output_prefix)//'omega-MP-1.dat')
     307                 :             : !FB    if (Invar%enunit.eq.0) write(53,'(a)') '# Phonon frequencies in meV'
     308                 :             : !FB    if (Invar%enunit.eq.1) write(53,'(a)') '# Phonon frequencies in cm-1'
     309                 :             : !FB    if (Invar%enunit.eq.2) write(53,'(a)') '# Phonon frequencies in mHa'
     310                 :             : !FB    if (Invar%enunit.eq.3) write(53,'(a)') '# Phonon frequencies in THz'
     311                 :             : !FB    do iq_ibz=1,Qbz%nqibz
     312                 :             : !FB      call tdep_write_dij(Eigen2nd_MP,iq_ibz,Invar,Qbz%qibz(:,iq_ibz))
     313                 :             : !FB    end do
     314                 :             : !FB    close(51)
     315                 :             : !FB    close(52)
     316                 :             : !FB    close(53)
     317                 :             : !FB  end if
     318                 :             : !FB
     319                 :             : ! Compute the frequencies (2)
     320                 :             : ! =======================
     321   [ -  +  +  -  :     2109608 :   ABI_MALLOC(displ,(2*3*natom_unitcell*3*natom_unitcell,Qbz%nqibz)); displ(:,:)=zero
          -  +  +  -  +  
          -  +  -  -  +  
          -  +  +  +  +  
                      + ]
     322   [ +  +  +  +  :    14478780 :   Eigen2nd_MP%eigenval=zero ; Eigen2nd_MP%eigenvec=zero ; Eigen2nd_MP%dynmat=zero
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
             +  +  +  + ]
     323         [ +  + ]:        7076 :   do iq_ibz=1,Qbz%nqibz
     324                 :             :     call Ifc%fourq(Crystal,Qbz%qibz(:,iq_ibz),Eigen2nd_MP%eigenval(:,iq_ibz),displ(:,iq_ibz),&
     325                 :             : &                  out_eigvec=Eigen2nd_MP%eigenvec(:,:,:,:,:,iq_ibz),&
     326                 :        7076 : &                  out_d2cart=Eigen2nd_MP%dynmat  (:,:,:,:,:,iq_ibz))
     327                 :             :   end do
     328         [ -  + ]:          44 :   ABI_FREE(displ)
     329                 :             : !FB  if (MPIdata%iam_master) then
     330                 :             : !FB    open(unit=51,file=trim(Invar%output_prefix)//'eigenvectors-MP-2.dat')
     331                 :             : !FB    open(unit=52,file=trim(Invar%output_prefix)//'dij-MP-2.dat')
     332                 :             : !FB    open(unit=53,file=trim(Invar%output_prefix)//'omega-MP-2.dat')
     333                 :             : !FB    if (Invar%enunit.eq.0) write(53,'(a)') '# Phonon frequencies in meV'
     334                 :             : !FB    if (Invar%enunit.eq.1) write(53,'(a)') '# Phonon frequencies in cm-1'
     335                 :             : !FB    if (Invar%enunit.eq.2) write(53,'(a)') '# Phonon frequencies in mHa'
     336                 :             : !FB    if (Invar%enunit.eq.3) write(53,'(a)') '# Phonon frequencies in THz'
     337                 :             : !FB    do iq_ibz=1,Qbz%nqibz
     338                 :             : !FB      call tdep_write_dij(Eigen2nd_MP,iq_ibz,Invar,Qbz%qibz(:,iq_ibz))
     339                 :             : !FB    end do
     340                 :             : !FB    close(51)
     341                 :             : !FB    close(52)
     342                 :             : !FB    close(53)
     343                 :             : !FB  end if
     344                 :             : 
     345   [ -  +  -  +  :          44 : end subroutine tdep_calc_phdos
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
                      + ]
     346                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     347                 :             : 
     348                 :          44 : subroutine tdep_calc_thermo(Invar,Lattice,MPIdata,PHdos,U0)
     349                 :             : 
     350                 :             :   double precision, intent(in) :: U0
     351                 :             :   type(atdep_dataset_type),intent(in) :: Invar
     352                 :             :   type(Lattice_type), intent(inout) :: Lattice
     353                 :             :   type(MPI_enreg_type), intent(in) :: MPIdata
     354                 :             :   type(phdos_t),intent(in) :: PHdos
     355                 :             : 
     356                 :             :   integer :: iomega,itemp,iatom,itypat
     357                 :             :   double precision :: k_B,wovert,heatcapa,entropy,internalE,freeE,expm2x,ln2shx,cothx,xx
     358                 :             :   double precision :: Ftot,domega,MSD,Omega_m2,mass_amu,vdos
     359                 :             : 
     360                 :          44 :   write(Invar%stdout,'(a)')' '
     361                 :          44 :   write(Invar%stdout,'(a)') ' #############################################################################'
     362                 :          44 :   write(Invar%stdout,'(a)') ' ################# Thermodynamic quantities: Free energy,...##################'
     363                 :          44 :   write(Invar%stdout,'(a)') ' #############################################################################'
     364                 :          44 :   write(Invar%stdout,'(a)') ' See the thermo.dat file'
     365                 :             : 
     366                 :             : ! The heat capacity, entropy, internal and free energies (direct calculation)
     367                 :             : ! ===========================================================================
     368                 :          44 :   mass_amu=zero
     369         [ +  + ]:         150 :   do iatom=1,Invar%natom_unitcell
     370                 :         106 :     itypat=Invar%typat_unitcell(iatom)
     371                 :         150 :     mass_amu=mass_amu+Invar%amu(itypat)
     372                 :             :   end do
     373                 :          44 :   mass_amu=mass_amu*amu_emass/real(Invar%natom_unitcell)
     374                 :             : 
     375                 :             : ! k_B is Boltzmann constant in eV/K
     376                 :          44 :   k_B=kb_HaK*Ha_eV
     377                 :          44 :   domega=(Invar%dosdeltae*Ha_meV)
     378                 :          44 :   wovert=1.d0/(2*Invar%temperature*k_B)
     379                 :          44 :   heatcapa=0.d0 ; entropy=0.d0 ; internalE=0.d0 ; freeE=0.d0 ; MSD=0.d0 ; Omega_m2=0.d0 ; vdos=0.d0
     380         [ +  + ]:       80267 :   do iomega=1,PHdos%nomega
     381                 :       80223 :     xx=PHdos%omega(iomega)*Ha_eV
     382         [ +  + ]:       80223 :     if (xx.lt.tol8) cycle
     383                 :       80015 :     expm2x=exp(-2.d0*wovert*xx)
     384                 :       80015 :     ln2shx=wovert*xx+log(1.d0-expm2x)
     385                 :       80015 :     cothx=(1.d0+expm2x)/(1.d0-expm2x)
     386                 :       80015 :     heatcapa =heatcapa  + (wovert*xx/sinh(wovert*xx))**2*PHdos%phdos(iomega)*domega
     387                 :       80015 :     internalE=internalE + (wovert*xx)*cothx*PHdos%phdos(iomega)*domega
     388                 :       80015 :     entropy  =entropy   + ((wovert*xx)*cothx-ln2shx)*PHdos%phdos(iomega)*domega
     389                 :       80015 :     freeE    =freeE     + log(2*sinh(wovert*xx))*PHdos%phdos(iomega)*domega
     390                 :       80015 :     MSD      =MSD       + (cothx/PHdos%omega(iomega))*PHdos%phdos(iomega)*domega
     391                 :       80015 :     Omega_m2 =Omega_m2  + (1.d0/PHdos%omega(iomega))**2*PHdos%phdos(iomega)*domega
     392                 :       80267 :     vdos     =vdos      + PHdos%phdos(iomega)*domega
     393                 :             :   end do
     394                 :          44 :   heatcapa=heatcapa*3
     395                 :          44 :   entropy=entropy*3
     396                 :          44 :   internalE=internalE*3*k_B*Invar%temperature
     397                 :          44 :   freeE=freeE*3*k_B*Invar%temperature
     398                 :          44 :   MSD=MSD*3.d0/mass_amu/2.d0
     399                 :          44 :   Omega_m2=Omega_m2*3.d0
     400                 :          44 :   Ftot=U0*Ha_eV+freeE
     401                 :          44 :   Lattice%HeatCapa_V=heatcapa
     402         [ -  + ]:          44 :   if (.not.MPIdata%iam_master) return
     403                 :             : ! End of the calculation --> RETURN
     404                 :             : ! =================================
     405                 :             : 
     406                 :          44 :   open(unit=20,file=trim(Invar%output_prefix)//'_thermo.dat')
     407                 :          44 :   write(20,'(a)')'============= Direct results (without any inter/extrapolation) =================='
     408                 :          44 :   write(20,'(1x,a,f10.3)')'For present temperature (in Kelvin): T= ',Invar%temperature
     409                 :          44 :   write(20,'(1x,a,f12.3)')'  The cold contribution (in eV/atom): U_0 =',U0*Ha_eV
     410                 :          44 :   write(20,'(1x,a,f10.3)')'  The specific heat (in k_b/atom): C_v=',heatcapa
     411                 :          44 :   write(20,'(1x,a,f10.3)')'  The vibrational entropy (in k_b/atom): S_vib =',entropy
     412                 :          44 :   write(20,'(1x,a,f10.3)')'  The internal energy (in eV/atom): U_vib =',internalE
     413                 :          44 :   write(20,'(1x,a,f10.3)')'  The vibrational contribution (in eV/atom): F_vib = U_vib -T.S_vib =',freeE
     414                 :          44 :   write(20,'(1x,a,f12.3)')'  The harmonic free energy (in eV/atom) -->  F_tot^HA = U_0 + F_vib =',Ftot
     415                 :          44 :   write(20,'(1x,a)')'  Useful quantities for melting :'
     416                 :          44 :   write(20,'(1x,a,f10.3)')'     The mean square displacement (in a.u.): sqrt(<u^2>) =',(MSD)**0.5
     417                 :          44 :   write(20,'(1x,a,f10.3)')'     The <Omega^(-2)> factor (in THz^(-2)) =',Omega_m2/(Ha_THz)**2
     418                 :          44 :   write(20,'(1x,a,f10.3)')'     The Wigner-Seitz radius (in a.u.) : d_at =',(6*Lattice%ucvol/pi/real(Invar%natom_unitcell))**(1./3.)
     419                 :          44 :   write(20,'(1x,a,f10.3)')'     The average mass / proton-electron mass ratio (in a.u.) =', mass_amu/amu_emass
     420                 :          44 :   write(20,'(1x,a,f10.3)')'     The Lindemann constant : sqrt(<u^2>)/d_at =',(MSD)**0.5/&
     421                 :          88 : &                               (6*Lattice%ucvol/pi/real(Invar%natom_unitcell))**(1./3.)
     422                 :          44 :   write(20,'(1x,a,f10.3)')'     The integral of vDOS =',vdos
     423                 :          44 :   write(20,'(a)')' '
     424                 :             : 
     425                 :             : ! The free energy (extrapolation)
     426                 :             : ! ===============================
     427                 :          44 :   write(20,'(a)')'============= Harmonic Approximation (HA) =================='
     428                 :          44 :   write(20,'(1x,a)')'  Note that the following results come from an EXTRAPOLATION:'
     429                 :          44 :   write(20,'(1x,a,i5,a)')'    1/ F_vib^HA(T) is computed for each T using vDOS(T=',int(Invar%temperature),')'
     430                 :          44 :   write(20,'(1x,a)')'    2/ F_tot^HA(T) = F_vib^HA(T) + U_0'
     431                 :             :   write(20,'(a)')'   T         F_vib^HA(T)   F_tot^HA(T)           C_v(T)  '&
     432                 :          44 : &   //'       S_vib(T)        U_vib(T)        MSD(T)'
     433         [ +  + ]:        4444 :   do itemp=1,100
     434                 :        4400 :     wovert=1.d0/(2*real(itemp)*100*k_B)
     435                 :        4400 :     freeE=0.d0
     436                 :        4400 :     heatcapa=0.d0
     437                 :        4400 :     entropy=0.d0
     438                 :        4400 :     internalE=0.d0
     439                 :        4400 :     MSD=0.d0
     440         [ +  + ]:     8026700 :     do iomega=1,PHdos%nomega
     441                 :     8022300 :       xx=PHdos%omega(iomega)*Ha_eV
     442         [ +  + ]:     8022300 :       if (xx.lt.tol8) cycle
     443                 :     8001500 :       expm2x=exp(-2.d0*wovert*xx)
     444                 :     8001500 :       ln2shx=wovert*xx+log(1.d0-expm2x)
     445                 :     8001500 :       cothx=(1.d0+expm2x)/(1.d0-expm2x)
     446                 :     8001500 :       heatcapa =heatcapa  + (wovert*xx/sinh(wovert*xx))**2*PHdos%phdos(iomega)*domega
     447                 :     8001500 :       internalE=internalE + (wovert*xx)*cothx*PHdos%phdos(iomega)*domega
     448                 :     8001500 :       entropy  =entropy   + ((wovert*xx)*cothx-ln2shx)*PHdos%phdos(iomega)*domega
     449                 :     8001500 :       freeE    =freeE     + log(2*sinh(wovert*xx))*PHdos%phdos(iomega)*domega
     450                 :     8026700 :       MSD      =MSD       + (cothx/PHdos%omega(iomega))*PHdos%phdos(iomega)*domega
     451                 :             :     end do
     452                 :        4400 :     heatcapa=heatcapa*3
     453                 :        4400 :     entropy=entropy*3
     454                 :        4400 :     internalE=internalE*3*k_B*itemp*100
     455                 :        4400 :     freeE=freeE*3*k_B*itemp*100
     456                 :        4400 :     MSD=MSD*3.d0/mass_amu/2.d0
     457                 :        4400 :     Ftot=U0*Ha_eV+freeE
     458                 :        4444 :     write(20,'(1x,i5,6(1x,f15.3))') itemp*100,freeE,Ftot,heatcapa,entropy,internalE,(MSD)**0.5
     459                 :             :   end do
     460                 :          44 :   close(20)
     461                 :             : 
     462                 :             : end subroutine tdep_calc_thermo
     463                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     464                 :             : 
     465                 :          44 : subroutine tdep_calc_elastic(Phi2,distance,Invar,Lattice)
     466                 :             : 
     467                 :             :   integer :: iatom,ii,jj,kk,ll,iatcell,itypat
     468                 :             :   integer :: INFO,LWORK
     469                 :             :   double precision :: BH,BR,BV,GR,GV,GH,Eaverage,Nuaverage,Laverage,Vp,Vs,Vphi
     470                 :             :   double precision :: rho,E1,E2,E3,Nu12,Nu13,Nu23,Nu21,Nu31,Nu32,G23,G13,G12
     471                 :             :   double precision :: mass_amu,bohr,V_Debye,T_Debye,A_U,A_B,A_G
     472                 :          44 :   integer, allocatable :: IPIV(:)
     473                 :          44 :   double precision, allocatable :: eigenvalues(:)
     474                 :          44 :   double precision, allocatable :: WORK(:)
     475                 :          44 :   double precision, allocatable :: Sij(:,:),Cij(:,:),aijkl(:,:,:,:),cijkl(:,:,:,:)
     476                 :             :   type(atdep_dataset_type), intent(in) :: Invar
     477                 :             :   type(Lattice_type), intent(inout) :: Lattice
     478                 :             :   double precision, intent(in) :: distance(Invar%natom,Invar%natom,4)
     479                 :             :   double precision, intent(in) :: Phi2(3*Invar%natom,3*Invar%natom)
     480                 :             : 
     481                 :          44 :   write(Invar%stdout,'(a)')' '
     482                 :          44 :   write(Invar%stdout,'(a)') ' #############################################################################'
     483                 :          44 :   write(Invar%stdout,'(a)') ' ######################### Elastic constants #################################'
     484                 :          44 :   write(Invar%stdout,'(a)') ' ################ Bulk and Shear modulus--Sound velocities ###################'
     485                 :          44 :   write(Invar%stdout,'(a)') ' #############################################################################'
     486                 :             : 
     487                 :          44 :   bohr=Bohr_Ang*1.0e-10
     488                 :             : ! Define atomic mass average
     489                 :          44 :   mass_amu=zero
     490         [ +  + ]:         150 :   do iatom=1,Invar%natom_unitcell
     491                 :         106 :     itypat=Invar%typat_unitcell(iatom)
     492                 :         150 :     mass_amu=mass_amu+Invar%amu(itypat)
     493                 :             :   end do
     494                 :          44 :   mass_amu=mass_amu/real(Invar%natom_unitcell)
     495                 :             : 
     496                 :          44 :   rho=(mass_amu/1e3)*Invar%natom_unitcell/Lattice%ucvol/bohr**3/Avogadro
     497                 :             : 
     498                 :             : !==========================================================================================
     499                 :             : !===================== Elastic constants ==================================================
     500                 :             : !==========================================================================================
     501                 :             : ! New calculation of elastic constants using the formula (12.28 and 12.29 of
     502                 :             : ! Wallace, Statistical physics of crystals and liquids, Worl Scientific)
     503   [ -  +  +  +  :        5324 :   ABI_MALLOC(aijkl,(3,3,3,3)); aijkl(:,:,:,:)=0.d0
          +  +  +  +  +  
                      + ]
     504   [ -  +  +  +  :        5324 :   ABI_MALLOC(cijkl,(3,3,3,3)); cijkl(:,:,:,:)=0.d0
          +  +  +  +  +  
                      + ]
     505         [ +  + ]:         176 :   do ii=1,3
     506         [ +  + ]:         572 :     do jj=1,3
     507         [ +  + ]:        1716 :       do kk=1,3
     508         [ +  + ]:        5148 :         do ll=1,3
     509         [ +  + ]:      562194 :           do iatom=1,Invar%natom
     510         [ +  + ]:     1766772 :             do iatcell=1,Invar%natom_unitcell
     511                 :             :               aijkl(ii,jj,kk,ll)=aijkl(ii,jj,kk,ll)-Phi2(ii+(iatcell-1)*3,3*(iatom-1)+jj)&
     512                 :     1763208 : &               *distance(iatcell,iatom,kk+1)*distance(iatcell,iatom,ll+1)/2.d0/Lattice%ucvol
     513                 :             :             end do
     514                 :             :           end do
     515                 :             :         enddo
     516                 :             :       enddo
     517                 :             :     enddo
     518                 :             :   enddo
     519                 :             : 
     520         [ +  + ]:         176 :   do ii=1,3
     521         [ +  + ]:         572 :     do jj=1,3
     522         [ +  + ]:        1716 :       do kk=1,3
     523         [ +  + ]:        5148 :         do ll=1,3
     524                 :        4752 :           cijkl(ii,jj,kk,ll)=aijkl(ii,kk,jj,ll)+aijkl(jj,kk,ii,ll)-aijkl(ii,jj,kk,ll)
     525                 :             : !FB          cijkl(ii,jj,kk,ll)=aijkl(ii,kk,jj,ll)+aijkl(jj,kk,ii,ll)-aijkl(jj,ii,kk,ll)
     526                 :             :         enddo
     527                 :             :       enddo
     528                 :             :     enddo
     529                 :             :   enddo
     530         [ -  + ]:          44 :   ABI_FREE(aijkl)
     531                 :             : 
     532   [ +  +  +  +  :        5324 :   cijkl(:,:,:,:)=cijkl(:,:,:,:)*29421.033d0
             +  +  +  + ]
     533                 :             : 
     534   [ -  +  +  +  :        1892 :   ABI_MALLOC(Cij,(6,6)) ; Cij(:,:)=0.d0
                   +  + ]
     535                 :          44 :   Cij(1,1)=cijkl(1,1,1,1) ; Cij(1,2)=cijkl(1,1,2,2) ; Cij(1,3)=cijkl(1,1,3,3)
     536                 :          44 :   Cij(1,4)=cijkl(1,1,2,3) ; Cij(1,5)=cijkl(1,1,1,3) ; Cij(1,6)=cijkl(1,1,1,2)
     537                 :          44 :   Cij(2,1)=cijkl(2,2,1,1) ; Cij(2,2)=cijkl(2,2,2,2) ; Cij(2,3)=cijkl(2,2,3,3)
     538                 :          44 :   Cij(2,4)=cijkl(2,2,2,3) ; Cij(2,5)=cijkl(2,2,1,3) ; Cij(2,6)=cijkl(2,2,1,2)
     539                 :          44 :   Cij(3,1)=cijkl(3,3,1,1) ; Cij(3,2)=cijkl(3,3,2,2) ; Cij(3,3)=cijkl(3,3,3,3)
     540                 :          44 :   Cij(3,4)=cijkl(3,3,2,3) ; Cij(3,5)=cijkl(3,3,1,3) ; Cij(3,6)=cijkl(3,3,1,2)
     541                 :          44 :   Cij(4,1)=cijkl(2,3,1,1) ; Cij(4,2)=cijkl(2,3,2,2) ; Cij(4,3)=cijkl(2,3,3,3)
     542                 :          44 :   Cij(4,4)=cijkl(2,3,2,3) ; Cij(4,5)=cijkl(2,3,1,3) ; Cij(4,6)=cijkl(2,3,1,2)
     543                 :          44 :   Cij(5,1)=cijkl(1,3,1,1) ; Cij(5,2)=cijkl(1,3,2,2) ; Cij(5,3)=cijkl(1,3,3,3)
     544                 :          44 :   Cij(5,4)=cijkl(1,3,2,3) ; Cij(5,5)=cijkl(1,3,1,3) ; Cij(5,6)=cijkl(1,3,1,2)
     545                 :          44 :   Cij(6,1)=cijkl(1,2,1,1) ; Cij(6,2)=cijkl(1,2,2,2) ; Cij(6,3)=cijkl(1,2,3,3)
     546                 :          44 :   Cij(6,4)=cijkl(1,2,2,3) ; Cij(6,5)=cijkl(1,2,1,3) ; Cij(6,6)=cijkl(1,2,1,2)
     547                 :             : ! Remove the rounding errors before writing (for non regression testing purposes)
     548         [ +  + ]:         308 :   do ii=1,6
     549         [ +  + ]:        1892 :     do jj=1,6
     550         [ +  + ]:        1848 :       if (abs(Cij(ii,jj)).lt.tol8) Cij(ii,jj)=zero
     551                 :             :     end do
     552                 :             :   end do
     553                 :          44 :   write(Invar%stdout,'(a)') ' '
     554                 :          44 :   write(Invar%stdout,'(a)') ' ========== Using the formulation proposed by Wallace (using the IFC) ========='
     555                 :          44 :   write(Invar%stdout,'(a)') ' Cijkl [in GPa]='
     556                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | C11 C12 C13 C14 C15 C16 |   ',Cij(1,1),Cij(1,2),Cij(1,3),Cij(1,4),Cij(1,5),Cij(1,6)
     557                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | C21 C22 C23 C24 C25 C26 |   ',Cij(2,1),Cij(2,2),Cij(2,3),Cij(2,4),Cij(2,5),Cij(2,6)
     558                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | C31 C32 C33 C34 C35 C36 |   ',Cij(3,1),Cij(3,2),Cij(3,3),Cij(3,4),Cij(3,5),Cij(3,6)
     559                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | C41 C42 C43 C44 C45 C46 | = ',Cij(4,1),Cij(4,2),Cij(4,3),Cij(4,4),Cij(4,5),Cij(4,6)
     560                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | C51 C52 C53 C54 C55 C56 |   ',Cij(5,1),Cij(5,2),Cij(5,3),Cij(5,4),Cij(5,5),Cij(5,6)
     561                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | C61 C62 C63 C64 C65 C66 |   ',Cij(6,1),Cij(6,2),Cij(6,3),Cij(6,4),Cij(6,5),Cij(6,6)
     562                 :             : 
     563                 :             : ! Compute the eigenvalues of the Cij matrix in order to find the Born-Huang
     564                 :             : ! stability criterion (see Wallace, Thermodynamics of crystal, p39)
     565         [ -  + ]:          44 :   ABI_MALLOC(WORK,(1))
     566   [ -  +  +  +  :        1892 :   ABI_MALLOC(Sij,(6,6)) ; Sij(:,:)=0.d0
                   +  + ]
     567   [ -  +  +  + ]:         308 :   ABI_MALLOC(eigenvalues,(6)) ; eigenvalues(:)=0.d0
     568   [ +  +  +  + ]:        1892 :   Sij(:,:)=Cij(:,:)
     569                 :          44 :   LWORK=-1
     570                 :          44 :   call DSYEV('N','U',6,Sij,6,eigenvalues,WORK,LWORK,INFO)
     571                 :          44 :   LWORK=WORK(1)
     572                 :          44 :   ABI_FREE(WORK)
     573   [ -  +  +  -  :         132 :   ABI_MALLOC(WORK,(LWORK))
          +  -  +  -  -  
                +  -  + ]
     574                 :          44 :   call DSYEV('N','U',6,Sij,6,eigenvalues,WORK,LWORK,INFO)
     575         [ +  + ]:         308 :   do ii=1,6
     576         [ -  + ]:         308 :     if (eigenvalues(ii).lt.0.d0) then
     577                 :           0 :       write(Invar%stdout,'(a)') ' WARNING :'
     578                 :           0 :       write(Invar%stdout,'(a,i3,a,1x,f8.3,1x)') 'The eigenvalue number',ii,'is negative and equals to',eigenvalues(ii)
     579                 :           0 :       write(Invar%stdout,'(a)') 'The Born-Huang stability criterion is not fulfilled'
     580                 :             :     end if
     581                 :             :   end do
     582                 :             : 
     583         [ -  + ]:          44 :   ABI_FREE(WORK)
     584         [ -  + ]:          44 :   ABI_FREE(Sij)
     585         [ -  + ]:          44 :   ABI_FREE(eigenvalues)
     586                 :             : 
     587                 :             : ! For an anisotropic material
     588                 :          44 :   write(Invar%stdout,'(a)') ' '
     589                 :          44 :   write(Invar%stdout,'(a)') ' ========== For an Anisotropic Material ======================================='
     590   [ -  +  +  +  :        1892 :   ABI_MALLOC(Sij,(6,6)) ; Sij(:,:)=0.d0
                   +  + ]
     591   [ -  +  +  + ]:         308 :   ABI_MALLOC(IPIV,(6)); IPIV(:)=0
     592   [ -  +  +  + ]:         308 :   ABI_MALLOC(WORK,(6)); WORK(:)=0.d0
     593   [ +  +  +  + ]:        1892 :   Sij(:,:)=Cij(:,:)
     594                 :          44 :   call DGETRF(6,6,Sij,6,IPIV,INFO)
     595                 :          44 :   call DGETRI(6,Sij,6,IPIV,WORK,6,INFO)
     596         [ -  + ]:          44 :   ABI_FREE(IPIV)
     597         [ -  + ]:          44 :   ABI_FREE(WORK)
     598                 :          44 :   write(Invar%stdout,'(a)') ' Sijkl [in GPa-1]='
     599                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S11 S12 S13 S14 S15 S16 |   ',Sij(1,1),Sij(1,2),Sij(1,3),Sij(1,4),Sij(1,5),Sij(1,6)
     600                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S21 S22 S23 S24 S25 S26 |   ',Sij(2,1),Sij(2,2),Sij(2,3),Sij(2,4),Sij(2,5),Sij(2,6)
     601                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S31 S32 S33 S34 S35 S36 |   ',Sij(3,1),Sij(3,2),Sij(3,3),Sij(3,4),Sij(3,5),Sij(3,6)
     602                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S41 S42 S43 S44 S45 S46 | = ',Sij(4,1),Sij(4,2),Sij(4,3),Sij(4,4),Sij(4,5),Sij(4,6)
     603                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S51 S52 S53 S54 S55 S56 |   ',Sij(5,1),Sij(5,2),Sij(5,3),Sij(5,4),Sij(5,5),Sij(5,6)
     604                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S61 S62 S63 S64 S65 S66 |   ',Sij(6,1),Sij(6,2),Sij(6,3),Sij(6,4),Sij(6,5),Sij(6,6)
     605   [ +  +  +  + ]:        1892 :   Lattice%Sij=Sij
     606         [ -  + ]:          44 :   ABI_FREE(Sij)
     607                 :             : 
     608                 :             : ! For an orthotropic material
     609                 :          44 :   write(Invar%stdout,'(a)') ' '
     610                 :          44 :   write(Invar%stdout,'(a)') ' ========== For an Orthotropic Material (see B. M. Lempriere (1968)) =========='
     611                 :             : 
     612                 :             : ! Mean value of the off-diagonal elements
     613                 :          44 :   Cij(1,2)=(Cij(1,2)+Cij(2,1))/2.d0 ; Cij(2,1)=Cij(1,2)
     614                 :          44 :   Cij(1,3)=(Cij(1,3)+Cij(3,1))/2.d0 ; Cij(3,1)=Cij(1,3)
     615                 :          44 :   Cij(2,3)=(Cij(2,3)+Cij(3,2))/2.d0 ; Cij(3,2)=Cij(2,3)
     616                 :             : 
     617                 :             : ! Young's modulus
     618                 :             :   E1=(Cij(1,1)*Cij(2,2)*Cij(3,3)+2.d0*Cij(2,3)*Cij(1,2)*Cij(1,3)-Cij(1,1)*Cij(2,3)**2-Cij(2,2)*Cij(1,3)**2-Cij(3,3)*Cij(1,2)**2)&
     619                 :          44 : &   /(Cij(2,2)*Cij(3,3)-Cij(2,3)**2)
     620                 :             :   E2=(Cij(1,1)*Cij(2,2)*Cij(3,3)+2.d0*Cij(2,3)*Cij(1,2)*Cij(1,3)-Cij(1,1)*Cij(2,3)**2-Cij(2,2)*Cij(1,3)**2-Cij(3,3)*Cij(1,2)**2)&
     621                 :          44 : &   /(Cij(1,1)*Cij(3,3)-Cij(1,3)**2)
     622                 :             :   E3=(Cij(1,1)*Cij(2,2)*Cij(3,3)+2.d0*Cij(2,3)*Cij(1,2)*Cij(1,3)-Cij(1,1)*Cij(2,3)**2-Cij(2,2)*Cij(1,3)**2-Cij(3,3)*Cij(1,2)**2)&
     623                 :          44 : &   /(Cij(1,1)*Cij(2,2)-Cij(1,2)**2)
     624                 :          44 :   write(Invar%stdout,'(a,3(f8.3,1x))') ' Young modulus E1, E2 and E3 [in GPa]=',E1,E2,E3
     625                 :             : 
     626                 :             : ! Poisson Ratio
     627                 :          44 :   Nu21=(Cij(1,2)*Cij(3,3)-Cij(1,3)*Cij(2,3))/(Cij(1,1)*Cij(3,3)-Cij(1,3)**2)
     628                 :          44 :   Nu31=(Cij(1,3)*Cij(2,2)-Cij(1,2)*Cij(2,3))/(Cij(1,1)*Cij(2,2)-Cij(1,2)**2)
     629                 :          44 :   Nu23=(Cij(1,1)*Cij(2,3)-Cij(1,2)*Cij(1,3))/(Cij(1,1)*Cij(3,3)-Cij(1,3)**2)
     630                 :          44 :   Nu12=(Cij(1,2)*Cij(3,3)-Cij(1,3)*Cij(2,3))/(Cij(2,2)*Cij(3,3)-Cij(2,3)**2)
     631                 :          44 :   Nu13=(Cij(2,2)*Cij(1,3)-Cij(1,2)*Cij(2,3))/(Cij(2,2)*Cij(3,3)-Cij(2,3)**2)
     632                 :          44 :   Nu32=(Cij(1,1)*Cij(2,3)-Cij(1,2)*Cij(1,3))/(Cij(1,1)*Cij(2,2)-Cij(1,2)**2)
     633                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' Poisson ratio Nu21, Nu31, Nu23, Nu12, Nu13 and Nu32=',Nu21,Nu31,Nu23,Nu12,Nu13,Nu32
     634                 :             : 
     635                 :             : ! Shear modulus
     636                 :          44 :   G23=Cij(4,4) ; G13=Cij(5,5) ; G12=Cij(6,6)
     637                 :          44 :   write(Invar%stdout,'(a,3(f8.3,1x))') ' Shear modulus G23, G13 and G12 [in GPa]=',G23,G13,G12
     638                 :             : 
     639                 :             : ! Compliance matrix
     640   [ -  +  +  +  :        1892 :   ABI_MALLOC(Sij,(6,6)) ; Sij(:,:)=0.d0
                   +  + ]
     641                 :          44 :   Sij(1,1)= 1.d0/E1 ; Sij(1,2)=-Nu21/E2 ; Sij(1,3)=-Nu31/E3 ; Sij(1,4)=0.d0     ; Sij(1,5)=0.d0     ; Sij(1,6)=0.d0
     642                 :          44 :   Sij(2,1)=-Nu12/E1 ; Sij(2,2)= 1.d0/E2 ; Sij(2,3)=-Nu32/E3 ; Sij(2,4)=0.d0     ; Sij(2,5)=0.d0     ; Sij(2,6)=0.d0
     643                 :          44 :   Sij(3,1)=-Nu13/E1 ; Sij(3,2)=-Nu23/E2 ; Sij(3,3)= 1.d0/E3 ; Sij(3,4)=0.d0     ; Sij(3,5)=0.d0     ; Sij(3,6)=0.d0
     644                 :          44 :   Sij(4,1)= 0.d0    ; Sij(4,2)= 0.d0    ; Sij(4,3)= 0.d0    ; Sij(4,4)=1.d0/G23 ; Sij(4,5)=0.d0     ; Sij(4,6)=0.d0
     645                 :          44 :   Sij(5,1)= 0.d0    ; Sij(5,2)= 0.d0    ; Sij(5,3)= 0.d0    ; Sij(5,4)=0.d0     ; Sij(5,5)=1.d0/G13 ; Sij(5,6)=0.d0
     646                 :          44 :   Sij(6,1)= 0.d0    ; Sij(6,2)= 0.d0    ; Sij(6,3)= 0.d0    ; Sij(6,4)=0.d0     ; Sij(6,5)=0.d0     ; Sij(6,6)=1.d0/G12
     647                 :             : ! Remove the rounding errors before writing (for non regression testing purposes)
     648         [ +  + ]:         308 :   do ii=1,6
     649         [ +  + ]:        1892 :     do jj=1,6
     650         [ +  + ]:        1848 :       if (abs(Sij(ii,jj)).lt.tol8) Sij(ii,jj)=zero
     651                 :             :     end do
     652                 :             :   end do
     653                 :          44 :   write(Invar%stdout,'(a)') ' Sijkl [in GPa-1]='
     654                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S11 S12 S13 S14 S15 S16 |   ',Sij(1,1),Sij(1,2),Sij(1,3),Sij(1,4),Sij(1,5),Sij(1,6)
     655                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S21 S22 S23 S24 S25 S26 |   ',Sij(2,1),Sij(2,2),Sij(2,3),Sij(2,4),Sij(2,5),Sij(2,6)
     656                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S31 S32 S33 S34 S35 S36 |   ',Sij(3,1),Sij(3,2),Sij(3,3),Sij(3,4),Sij(3,5),Sij(3,6)
     657                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S41 S42 S43 S44 S45 S46 | = ',Sij(4,1),Sij(4,2),Sij(4,3),Sij(4,4),Sij(4,5),Sij(4,6)
     658                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S51 S52 S53 S54 S55 S56 |   ',Sij(5,1),Sij(5,2),Sij(5,3),Sij(5,4),Sij(5,5),Sij(5,6)
     659                 :          44 :   write(Invar%stdout,'(a,6(f8.3,1x))') ' | S61 S62 S63 S64 S65 S66 |   ',Sij(6,1),Sij(6,2),Sij(6,3),Sij(6,4),Sij(6,5),Sij(6,6)
     660                 :             : 
     661                 :             : !==========================================================================================
     662                 :             : !===================== Bulk and Shear modulus--Sound velocities ===========================
     663                 :             : !==========================================================================================
     664                 :             : ! Voigt notation
     665                 :          44 :   write(Invar%stdout,'(a,f9.3)')' For density rho [in kg.m-3]=',rho
     666                 :          44 :   write(Invar%stdout,'(a)')' '
     667                 :          44 :   write(Invar%stdout,'(a)')' ========================= Voigt average (constant strain) ==================='
     668                 :          44 :   BV=((Cij(1,1)+Cij(2,2)+Cij(3,3))+2.d0*(Cij(1,2)+Cij(1,3)+Cij(2,3)))/9.d0
     669                 :          44 :   GV=((Cij(1,1)+Cij(2,2)+Cij(3,3))-     (Cij(1,2)+Cij(1,3)+Cij(2,3))+3.d0*(Cij(4,4)+Cij(5,5)+Cij(6,6)))/15.d0
     670                 :          44 :   write(Invar%stdout,'(2(a,f9.3))')' ISOTHERMAL modulus [in GPa]: Bulk Kt=',BV,' and Shear G=',GV
     671                 :          44 :   Eaverage=9.d0*BV*GV/(3*BV+GV)
     672                 :          44 :   Nuaverage=0.5*(1.d0-(3.d0*GV)/(3.d0*BV+GV) )
     673                 :          44 :   Laverage=(3.d0*BV-2.d0*GV)/3.d0
     674                 :          44 :   write(Invar%stdout,'(3(a,f9.3))')' Average of Young modulus E [in GPa]=',Eaverage,' Lame modulus Lambda [in GPa]=',Laverage,&
     675                 :          88 : &   ' and Poisson ratio Nu=',Nuaverage
     676                 :          44 :   Vp=dsqrt(1.d9*(BV+4.d0*GV/3.d0)/rho)
     677                 :          44 :   Vs=dsqrt(1.d9*GV/rho)
     678                 :          44 :   Vphi=dsqrt(1.d9*BV/rho)
     679                 :          44 :   write(Invar%stdout,'(3(a,f9.3,1x))')' Velocities [in m.s-1]: compressional Vp=',Vp,' shear Vs=',Vs,' and bulk Vphi=',Vphi
     680                 :          44 :   V_Debye=(1./3.*(1./Vp**3+2./Vs**3))**(-1./3.)
     681                 :          44 :   T_Debye= (V_Debye/1.d3/Bohr_Ang/1.d-13*Time_Sec)*(six*pi**2*Invar%natom_unitcell/Lattice%ucvol)**(1./3.)*Ha_K
     682                 :          44 :   write(Invar%stdout,'(2(a,f9.3,1x))')' Debye velocity [in m.s-1]=',V_Debye,' and temperature [in K]=',T_Debye
     683                 :             : 
     684                 :             : ! Reuss notation
     685                 :          44 :   write(Invar%stdout,'(a)')' '
     686                 :          44 :   write(Invar%stdout,'(a)')' ========================= Reuss average (constant stress) ==================='
     687                 :          44 :   BR=1.d0/(Sij(1,1)+Sij(2,2)+Sij(3,3)+2.d0*(Sij(1,2)+Sij(1,3)+Sij(2,3)))
     688                 :          44 :   GR=15.d0/(4.d0*(Sij(1,1)+Sij(2,2)+Sij(3,3))-4.d0*(Sij(1,2)+Sij(1,3)+Sij(2,3))+3.d0*(Sij(4,4)+Sij(5,5)+Sij(6,6)))
     689                 :          44 :   write(Invar%stdout,'(2(a,f9.3))')' ISOTHERMAL modulus [in GPa]: Bulk Kt=',BR,' and Shear G=',GR
     690                 :          44 :   Eaverage=9.d0*BR*GR/(3*BR+GR)
     691                 :          44 :   Nuaverage=0.5*(1.d0-(3.d0*GR)/(3.d0*BR+GR) )
     692                 :          44 :   Laverage=(3.d0*BR-2.d0*GR)/3.d0
     693                 :          44 :   write(Invar%stdout,'(3(a,f9.3))')' Average of Young modulus E [in GPa]=',Eaverage,' Lame modulus Lambda [in GPa]=',Laverage,&
     694                 :          88 : &   ' and Poisson ratio Nu=',Nuaverage
     695                 :          44 :   Vp=dsqrt(1.d9*(BR+4.d0*GR/3.d0)/rho)
     696                 :          44 :   Vs=dsqrt(1.d9*GR/rho)
     697                 :          44 :   Vphi=dsqrt(1.d9*BR/rho)
     698                 :          44 :   write(Invar%stdout,'(3(a,f9.3,1x))')' Velocities [in m.s-1]: compressional Vp=',Vp,' shear Vs=',Vs,' and bulk Vphi=',Vphi
     699                 :          44 :   V_Debye=(1./3.*(1./Vp**3+2./Vs**3))**(-1./3.)
     700                 :          44 :   T_Debye= (V_Debye/1.d3/Bohr_Ang/1.d-13*Time_Sec)*(six*pi**2*Invar%natom_unitcell/Lattice%ucvol)**(1./3.)*Ha_K
     701                 :          44 :   write(Invar%stdout,'(2(a,f9.3,1x))')' Debye velocity [in m.s-1]=',V_Debye,' and temperature [in K]=',T_Debye
     702                 :             : 
     703                 :             : ! Voigt-Reuss-Hill notation
     704                 :          44 :   write(Invar%stdout,'(a)')' '
     705                 :          44 :   write(Invar%stdout,'(a)')' ============================== Hill average ================================='
     706                 :          44 :   BH=(BR+BV)/2.d0
     707                 :          44 :   GH=(GR+GV)/2.d0
     708                 :          44 :   write(Invar%stdout,'(2(a,f9.3))')' ISOTHERMAL modulus [in GPa]: Bulk Kt=',BH,' and Shear G=',GH
     709                 :          44 :   Eaverage=9.d0*BH*GH/(3*BH+GH)
     710                 :          44 :   Nuaverage=0.5*(1.d0-(3.d0*GH)/(3.d0*BH+GH) )
     711                 :          44 :   Laverage=(3.d0*BH-2.d0*GH)/3.d0
     712                 :          44 :   write(Invar%stdout,'(3(a,f9.3))')' Average of Young modulus E [in GPa]=',Eaverage,' Lame modulus Lambda [in GPa]=',Laverage,&
     713                 :          88 : &   ' and Poisson ratio Nu=',Nuaverage
     714                 :          44 :   Vp=dsqrt(1.d9*(BH+4.d0*GH/3.d0)/rho)
     715                 :          44 :   Vs=dsqrt(1.d9*GH/rho)
     716                 :          44 :   Vphi=dsqrt(1.d9*BH/rho)
     717                 :          44 :   write(Invar%stdout,'(3(a,f9.3,1x))')' Velocities [in m.s-1]: compressional Vp=',Vp,' shear Vs=',Vs,' and bulk Vphi=',Vphi
     718                 :          44 :   V_Debye=(1./3.*(1./Vp**3+2./Vs**3))**(-1./3.)
     719                 :          44 :   T_Debye= (V_Debye/1.d3/Bohr_Ang/1.d-13*Time_Sec)*(six*pi**2*Invar%natom_unitcell/Lattice%ucvol)**(1./3.)*Ha_K
     720                 :          44 :   write(Invar%stdout,'(2(a,f9.3,1x))')' Debye velocity [in m.s-1]=',V_Debye,' and temperature [in K]=',T_Debye
     721                 :             : 
     722                 :             : ! Compute the elastic anisotropy
     723                 :          44 :   A_U=5.d0*GV/GR+BV/BR -6.d0
     724                 :          44 :   A_B=(BV-BR)/(BV+BR)
     725                 :          44 :   A_G=(GV-GR)/(GV+GR)
     726                 :          44 :   write(Invar%stdout,'(a)')' '
     727                 :          44 :   write(Invar%stdout,'(a)')' ========================= Elastic anisotropy ================================='
     728                 :          44 :   write(Invar%stdout,'(a,f9.3)')' Elastic anisotropy index : A_U= 5*G_V/G_R + K_V/K_R - 6 =',A_U
     729                 :          44 :   write(Invar%stdout,'(a,f9.3)')' Bulk anisotropy ratio : A_B= (B_V-B_R)/(B_V+B_R) =',A_B
     730                 :          44 :   write(Invar%stdout,'(a,f9.3)')' Shear anisotropy ratio : A_G= (G_V-G_R)/(G_V+G_R) =',A_G
     731                 :             : 
     732                 :             : 
     733                 :             : ! Store the RVH value of the elastic moduli (will be useful for the Gruneisen)
     734                 :          44 :   Lattice%BulkModulus_T=BH
     735                 :          44 :   Lattice%Shear=GH
     736                 :          44 :   Lattice%Density=rho
     737                 :             : 
     738                 :          44 :   ABI_FREE(cijkl)
     739                 :          44 :   ABI_FREE(Cij)
     740                 :          44 :   ABI_FREE(Sij)
     741                 :          44 : end subroutine tdep_calc_elastic
     742                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     743                 :             : 
     744                 :             : end module m_tdep_phdos
        

Generated by: LCOV version 2.3-1