LCOV - code coverage report
Current view: top level - src/80_tdep - m_tdep_phi3.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 95.0 % 436 414
Test Date: 2026-09-21 22:40:37 Functions: 100.0 % 7 7

            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_phi3
       9              : 
      10              :   use defs_basis
      11              :   use m_errors
      12              :   use m_abicore
      13              :   use m_numeric_tools
      14              :   use m_linalg_interfaces
      15              :   use m_xmpi
      16              :   use m_io_tools
      17              :   use m_crystal,          only : crystal_t
      18              :   use m_ddb,              only : ddb_type
      19              :   use m_ifc,              only : ifc_type
      20              :   use m_tdep_abitypes,    only : Qbz_type
      21              :   use m_htetra
      22              :   use m_kpts,             only : kpts_ibz_from_kptrlatt, tetra_from_kptrlatt
      23              :   use m_tdep_qpt,         only : Qpoints_type
      24              :   use m_tdep_dataset,     only : atdep_dataset_type, MPI_enreg_type
      25              :   use m_tdep_latt,        only : Lattice_type
      26              :   use m_tdep_shell,       only : Shell_type
      27              :   use m_tdep_sym,         only : Symmetries_type
      28              :   use m_tdep_phi2,        only : Eigen_type,tdep_init_eigen2nd,tdep_destroy_eigen2nd
      29              :   use m_tdep_sampling,    only : tdep_Sampling_type
      30              :   use m_tdep_solver,      only : tdep_Solver_type
      31              :   use m_tdep_model,       only : tdep_Model_type
      32              :   use m_tdep_constraints, only : Constraints_type
      33              : 
      34              :   implicit none
      35              : 
      36              :   public :: tdep_calc_ftot3
      37              :   public :: tdep_calc_phi3ref
      38              :   public :: tdep_write_phi3
      39              :   public :: tdep_build_phi3_333
      40              :   public :: tdep_calc_gruneisen
      41              :   public :: tdep_write_gruneisen
      42              :   public :: tdep_calc_alpha_gamma
      43              : !FB  public :: tdep_calc_lifetime1
      44              : !  public :: tdep_calc_lifetime2
      45              : 
      46              : contains
      47              : 
      48              : !====================================================================================================
      49           14 :  subroutine tdep_calc_ftot3(Model,Invar,Shell3at,ucart,Sym)
      50              : 
      51              :   type(tdep_Model_type),intent(inout) :: Model
      52              :   type(atdep_dataset_type),intent(in) :: Invar
      53              :   type(Shell_type),intent(in) :: Shell3at
      54              :   type(Symmetries_type),intent(in) :: Sym
      55              :   double precision, intent(in)  :: ucart(3,Invar%natom,Invar%my_nstep)
      56              : 
      57              :   integer :: iatom,jatom,katom,isym,itrans,ishell,iatshell
      58              :   integer :: ii,jj,kk,istep
      59           14 :   double precision, allocatable :: Phi3_333(:,:,:)
      60           14 :   double precision, allocatable :: ucart_blas(:)
      61           14 :   double precision, allocatable :: ftot3(:,:)
      62              : 
      63          574 :   ABI_MALLOC(Phi3_333,(3,3,3)) ; Phi3_333(:,:,:)=0.d0
      64       152750 :   ABI_MALLOC(ftot3,(3*Invar%natom,Invar%my_nstep)); ftot3(:,:)=0.d0
      65         2554 :   do iatom=1,Invar%natom
      66        10882 :     do ishell=1,Shell3at%nshell
      67              : !     Build the 3x3x3 IFC of an atom in this shell
      68         8328 :       if (Shell3at%neighbours(iatom,ishell)%n_interactions.eq.0) cycle
      69        88976 :       do iatshell=1,Shell3at%neighbours(iatom,ishell)%n_interactions
      70        79388 :         jatom=Shell3at%neighbours(iatom,ishell)%atomj_in_shell(iatshell)
      71        79388 :         katom=Shell3at%neighbours(iatom,ishell)%atomk_in_shell(iatshell)
      72        79388 :         isym =Shell3at%neighbours(iatom,ishell)%sym_in_shell(iatshell)
      73        79388 :         itrans=Shell3at%neighbours(iatom,ishell)%transpose_in_shell(iatshell)
      74        79388 :         call tdep_build_phi3_333(isym,Model%Phi3(:,:,:,ishell),Phi3_333,Sym,itrans)
      75              : !       Calculation of the force components (third order)
      76      1675476 :         do istep=1,Invar%my_nstep
      77      6430428 :           do ii=1,3
      78     20640880 :             do jj=1,3
      79     61922640 :               do kk=1,3
      80              :                 ftot3(3*(iatom-1)+ii,istep)=ftot3(3*(iatom-1)+ii,istep)+&
      81     57159360 : &                    Phi3_333(ii,jj,kk)*ucart(jj,jatom,istep)*ucart(kk,katom,istep)
      82              :               end do !kk
      83              :             end do !jj
      84              :           end do !ii
      85              :         end do !istep
      86              :       end do !iatshell
      87              :     end do !ishell
      88              :   end do !iatom
      89           14 :   ABI_FREE(Phi3_333)
      90       152694 :   ftot3(:,:)=ftot3(:,:)/2.d0
      91              : 
      92         7676 :   ABI_MALLOC(ucart_blas,(3*Invar%natom)); ucart_blas(:)=0.d0
      93          294 :   do istep=1,Invar%my_nstep
      94       152680 :     ucart_blas(:)=0.d0
      95        51080 :     do jatom=1,Invar%natom
      96       203480 :       do jj=1,3
      97       203200 :         ucart_blas(3*(jatom-1)+jj)=ucart(jj,jatom,istep)
      98              :       end do
      99              :     end do
     100              :     call DGEMM('T','N',1,1,3*Invar%natom,1./3.d0,ftot3(:,istep),3*Invar%natom,ucart_blas,&
     101          280 : &              3*Invar%natom,0.d0,Model%Phi3UiUjUk(istep),3*Invar%natom)
     102              :     Model%Forces(3*Invar%natom*(istep-1)+1:3*Invar%natom*istep)=&
     103       152694 : &   Model%Forces(3*Invar%natom*(istep-1)+1:3*Invar%natom*istep)-ftot3(:,istep)
     104              :   end do
     105           14 :   ABI_FREE(ucart_blas)
     106           14 :   ABI_FREE(ftot3)
     107              : 
     108           14 :  end subroutine tdep_calc_ftot3
     109              : 
     110              : !=====================================================================================================
     111           14 : subroutine tdep_calc_phi3ref(Solver,Shell3at,Phi3_ref)
     112              : 
     113              :   type(tdep_Solver_type),intent(in) :: Solver
     114              :   type(Shell_type),intent(in) :: Shell3at
     115              :   double precision, intent(inout) :: Phi3_ref(3,3,3,Shell3at%nshell)
     116              : 
     117              :   integer :: ishell,ncoeff,ncoeff_prev
     118              :   integer :: ii,jj,kk,kappa
     119           14 :   double precision, allocatable :: Phi3_coeff(:)
     120              : 
     121          220 :   ABI_CALLOC(Phi3_coeff,(Solver%ncoeff3rd))
     122          192 :   Phi3_coeff(:) = Solver%theta(Solver%ncoeff1st+Solver%ncoeff2nd+1:Solver%ncoeff1st+Solver%ncoeff2nd+Solver%ncoeff3rd)
     123              : 
     124           63 :   do ishell=1,Shell3at%nshell
     125              : !   Build the 3x3x3 IFC per shell
     126           49 :     ncoeff     =Shell3at%ncoeff(ishell)
     127           49 :     ncoeff_prev=Shell3at%ncoeff_prev(ishell)
     128           49 :     kappa=0
     129          196 :     do ii=1,3
     130          637 :       do jj=1,3
     131         1911 :         do kk=1,3
     132         1323 :           kappa=kappa+1
     133         6570 :           Phi3_ref(ii,jj,kk,ishell)=sum(Shell3at%proj(kappa,1:ncoeff,ishell)*Phi3_coeff(ncoeff_prev+1:ncoeff_prev+ncoeff))
     134              :         end do
     135              :       end do
     136              :     end do
     137              : !   Remove the rounding errors before writing (for non regression testing purposes)
     138          210 :     do ii=1,3
     139          637 :       do jj=1,3
     140         1911 :         do kk=1,3
     141         1764 :           if (abs(Phi3_ref(ii,jj,kk,ishell)).lt.tol8) Phi3_ref(ii,jj,kk,ishell)=zero
     142              :         end do
     143              :       end do
     144              :     end do
     145              :   end do
     146           14 :   ABI_FREE(Phi3_coeff)
     147              : 
     148           14 : end subroutine tdep_calc_phi3ref
     149              : 
     150              : !=====================================================================================================
     151           14 : subroutine tdep_write_phi3(distance,Invar,Phi3_ref,Shell3at,Sym)
     152              : 
     153              :   type(atdep_dataset_type),intent(in) :: Invar
     154              :   type(Symmetries_type),intent(in) :: Sym
     155              :   type(Shell_type),intent(in) :: Shell3at
     156              :   double precision, intent(in) :: distance(Invar%natom,Invar%natom,4)
     157              :   double precision, intent(in) :: Phi3_ref(3,3,3,Shell3at%nshell)
     158              : 
     159              :   integer :: ishell,isym,jatom,katom
     160              :   integer :: iatref,jatref,katref,iatshell,itrans
     161              :   integer :: ii,jj
     162              :   double precision :: tmp1,tmp2,tmp3
     163           14 :   double precision, allocatable :: Phi3_333(:,:,:)
     164              : 
     165           14 :   write(Invar%stdout,*) ' '
     166           14 :   write(Invar%stdout,*) '#############################################################################'
     167           14 :   write(Invar%stdout,*) '#### For each shell, list of coefficients (IFC), number of neighbours... ####'
     168           14 :   write(Invar%stdout,*) '#############################################################################'
     169              : 
     170              : ! Write the IFCs in the data.out file (with others specifications:
     171              : ! number of atoms in a shell, Trace...)
     172          574 :   ABI_MALLOC(Phi3_333,(3,3,3)) ; Phi3_333(:,:,:)=0.d0
     173           63 :   do ishell=1,Shell3at%nshell
     174           49 :     iatref=Shell3at%iatref(ishell)
     175           63 :     if (Shell3at%neighbours(iatref,ishell)%n_interactions.ne.0) then
     176           49 :       jatref=Shell3at%jatref(ishell)
     177           49 :       katref=Shell3at%katref(ishell)
     178           49 :       write(Invar%stdout,'(a,i4,a,i4,a)') ' ======== NEW SHELL (ishell=',ishell,&
     179           98 : &           '): There are',Shell3at%neighbours(iatref,ishell)%n_interactions,' atoms on this shell'
     180          626 :       do iatshell=1,Shell3at%neighbours(iatref,ishell)%n_interactions
     181          577 :         jatom=Shell3at%neighbours(iatref,ishell)%atomj_in_shell(iatshell)
     182          577 :         katom=Shell3at%neighbours(iatref,ishell)%atomk_in_shell(iatshell)
     183          577 :         isym =Shell3at%neighbours(iatref,ishell)%sym_in_shell(iatshell)
     184          577 :         itrans=Shell3at%neighbours(iatref,ishell)%transpose_in_shell(iatshell)
     185          577 :         call tdep_build_phi3_333(isym,Phi3_ref(:,:,:,ishell),Phi3_333,Sym,itrans)
     186          577 :         write(Invar%stdout,'(a,i4,a,i4)') '  For iatcell=',iatref,' ,with type=',mod(iatref-1,Invar%natom_unitcell)+1
     187          577 :         write(Invar%stdout,'(a,i4,a,i4)') '  For jatom  =',jatom ,' ,with type=',mod(jatom -1,Invar%natom_unitcell)+1
     188          577 :         write(Invar%stdout,'(a,i4,a,i4)') '  For katom  =',katom ,' ,with type=',mod(katom -1,Invar%natom_unitcell)+1
     189         2308 :         do jj=1,3
     190         1731 :           if (jj==1) write(Invar%stdout,'(a)') '  Phi3^{alpha beta x}='
     191         1731 :           if (jj==2) write(Invar%stdout,'(a)') '  Phi3^{alpha beta y}='
     192         1731 :           if (jj==3) write(Invar%stdout,'(a)') '  Phi3^{alpha beta z}='
     193         7501 :           do ii=1,3
     194         5193 :             if (abs(Phi3_333(ii,1,jj)).lt.5.d-7) then
     195         1443 :               tmp1=0.d0
     196              :             else
     197         3750 :               tmp1=Phi3_333(ii,1,jj)
     198              :             end if
     199         5193 :             if (abs(Phi3_333(ii,2,jj)).lt.5.d-7) then
     200         1413 :               tmp2=0.d0
     201              :             else
     202         3780 :               tmp2=Phi3_333(ii,2,jj)
     203              :             end if
     204         5193 :             if (abs(Phi3_333(ii,3,jj)).lt.5.d-7) then
     205         1445 :               tmp3=0.d0
     206              :             else
     207         3748 :               tmp3=Phi3_333(ii,3,jj)
     208              :             end if
     209         6924 :             write(Invar%stdout,'(2x,3(f9.6,1x))') tmp1,tmp2,tmp3
     210              :           end do
     211              :         end do
     212          577 :         write(Invar%stdout,'(a,3(f9.6,1x))') '  (i,j) vector components:', (distance(iatref,jatom,jj+1),jj=1,3)
     213          577 :         write(Invar%stdout,'(a,3(f9.6,1x))') '  (j,k) vector components:', (distance(jatom ,katom,jj+1),jj=1,3)
     214          577 :         write(Invar%stdout,'(a,3(f9.6,1x))') '  (k,i) vector components:', (distance(katom,iatref,jj+1),jj=1,3)
     215          626 :         write(Invar%stdout,*) ' '
     216              :       end do !iatshell
     217              :     end if !n_interactions
     218              :   end do !ishell
     219           14 :   ABI_FREE(Phi3_333)
     220              : 
     221           14 : end subroutine tdep_write_phi3
     222              : 
     223              : !=====================================================================================================
     224        10493 : subroutine tdep_calc_gruneisen(distance,Eigen2nd,Gruneisen,iqpt,Invar,Phi3_ref,qpt_cart,Rlatt_cart,Shell3at,Sym)
     225              : 
     226              :   type(Symmetries_type),intent(in) :: Sym
     227              :   type(atdep_dataset_type),intent(in) :: Invar
     228              :   type(Shell_type),intent(in) :: Shell3at
     229              :   type(Eigen_type),intent(in) :: Eigen2nd
     230              :   integer,intent(in) :: iqpt
     231              :   double precision,intent(in) :: distance(Invar%natom,Invar%natom,4)
     232              :   double precision,intent(in) :: Phi3_ref(3,3,3,Shell3at%nshell)
     233              :   double precision,intent(in) :: Rlatt_cart(3,Invar%natom_unitcell,Invar%natom)
     234              :   double precision,intent(in) :: qpt_cart(3)
     235              :   double complex  ,intent(out) :: Gruneisen(3*Invar%natom_unitcell,3,3)
     236              : 
     237              :   integer :: ii,jj,kk,iatcell,jatom,katom,itypat,jtypat,natom_unitcell,ll
     238              :   integer :: imode,nmode,jat_mod,jatcell,iatshell,ishell,isym,itrans
     239              :   double precision :: phase
     240              :   double precision :: F_strain(3,3)
     241        10493 :   double precision, allocatable :: Phi3_333(:,:,:)
     242        10493 :   double complex, allocatable :: eigen_prod(:,:,:,:,:),eigenvec_loc(:,:),omega(:)
     243              : 
     244              : ! Define quantities
     245        10493 :   natom_unitcell=Invar%natom_unitcell
     246        10493 :   nmode=3*Invar%natom_unitcell
     247        41972 :   do ii=1,3
     248       136409 :     do jj=1,3
     249       125916 :       if (ii.eq.jj) then
     250              : !FB        F_strain(ii,jj)= 1./dsqrt(6.d0)
     251              : !FB        F_strain(ii,jj)=1./dsqrt(15.d0)
     252        31479 :         F_strain(ii,jj)= 1.d0
     253              : !FB        F_strain(ii,jj)= 0.8
     254              :       else
     255              : !FB        F_strain(ii,jj)= 1./dsqrt(6.d0)/2.d0
     256              : !FB        F_strain(ii,jj)=2./dsqrt(15.d0)
     257        62958 :         F_strain(ii,jj)=0.d0
     258              : !FB        F_strain(ii,jj)= 0.3
     259              :       end if
     260              :     end do
     261              :   end do
     262              : 
     263              : ! Calculation of the eigenvectors product (and phonon frequencies)
     264      4146685 :   ABI_MALLOC(eigen_prod,  (3,3,natom_unitcell,natom_unitcell,nmode)) ; eigen_prod(:,:,:,:,:)=czero
     265       513241 :   ABI_MALLOC(eigenvec_loc,(3*natom_unitcell,3*natom_unitcell))       ; eigenvec_loc(:,:)    =czero
     266        31275 :   do iatcell=1,natom_unitcell
     267        75545 :     do jatcell=1,natom_unitcell
     268       197862 :       do ii=1,3
     269       575510 :         do jj=1,3
     270              :           eigenvec_loc((iatcell-1)*3+ii,(jatcell-1)*3+jj)=dcmplx(Eigen2nd%eigenvec(1,ii,iatcell,jj,jatcell,iqpt),&
     271       531240 : &                                                                Eigen2nd%eigenvec(2,ii,iatcell,jj,jatcell,iqpt))
     272              :         end do !ii
     273              :       end do !jj
     274              :     end do !jatcell
     275              :   end do !iatcell
     276        93825 :   ABI_MALLOC(omega,(3*natom_unitcell)); omega(:)=czero
     277        31275 :   do iatcell=1,natom_unitcell
     278        75545 :     do jatcell=1,natom_unitcell
     279       197862 :       do ii=1,3
     280       575510 :         do jj=1,3
     281      3230592 :           do imode=1,nmode
     282              :             eigen_prod(ii,jj,iatcell,jatcell,imode)=conjg(eigenvec_loc((iatcell-1)*3+ii,imode))*&
     283      2699352 : &                                                         eigenvec_loc((jatcell-1)*3+jj,imode)
     284              :             omega(imode)=omega(imode)+eigen_prod(ii,jj,iatcell,jatcell,imode)*&
     285              : &                              dcmplx(Eigen2nd%dynmat(1,ii,iatcell,jj,jatcell,iqpt),&
     286      3097782 : &                                     Eigen2nd%dynmat(2,ii,iatcell,jj,jatcell,iqpt))
     287              : !FB            write(Invar%stdlog,'(a,5(1x,i4),2(1x,f15.3))') 'imode,iatcell,jatcell,ii,jj=',imode,iatcell,jatcell,ii,jj
     288              : !FB                                                           eigen_prod(ii,jj,iatcell,jatcell,imode)
     289              :           end do !imode
     290              :         end do !ii
     291              :       end do !jj
     292              :     end do !jatcell
     293              :   end do !iatcell
     294              : 
     295        72839 :   do imode=1,nmode
     296        72839 :     if (abs(aimag(omega(imode))).gt.tol8) then
     297            0 :       write(Invar%stdlog,'(a,1x,e15.8,1x,a,i4)') '>>>> WARNING : Imaginary part of the phonon frequency is not zero (',&
     298            0 : &                                                aimag(omega(imode)),') for mode :',imode
     299              : !FB      stop
     300              :     end if
     301              :   end do
     302              : !FB  write(Invar%stdlog,'(a,1(1x,i4),6(1x,f15.3))') 'iqpt,Grun=',iqpt,(dsqrt(real(omega(imode))),imode=1,6)
     303        10493 :   ABI_FREE(omega)
     304              : 
     305              : 
     306              : ! Calculation of the Gruneisen
     307       419720 :   ABI_MALLOC(Phi3_333,(3,3,3)) ; Phi3_333(:,:,:)=0.d0
     308       697523 :   Gruneisen(:,:,:)=czero
     309        42430 :   do ishell=1,Shell3at%nshell
     310       113375 :     do iatcell=1,Invar%natom_unitcell
     311        70945 :       itypat=Invar%typat_unitcell(iatcell)
     312       811660 :       do iatshell=1,Shell3at%neighbours(iatcell,ishell)%n_interactions
     313       708778 :         jatom=Shell3at%neighbours(iatcell,ishell)%atomj_in_shell(iatshell)
     314       708778 :         katom=Shell3at%neighbours(iatcell,ishell)%atomk_in_shell(iatshell)
     315       708778 :         isym =Shell3at%neighbours(iatcell,ishell)%sym_in_shell(iatshell)
     316       708778 :         itrans=Shell3at%neighbours(iatcell,ishell)%transpose_in_shell(iatshell)
     317       708778 :         jat_mod=mod(jatom+Invar%natom_unitcell-1,Invar%natom_unitcell)+1
     318       708778 :         jtypat=Invar%typat_unitcell(jat_mod)
     319       708778 :         phase=0.d0
     320      2835112 :         do jj=1,3
     321      2835112 :           phase=phase+2*pi*Rlatt_cart(jj,iatcell,jatom)*qpt_cart(jj)
     322              :         end do
     323       708778 :         call tdep_build_phi3_333(isym,Phi3_ref(:,:,:,ishell),Phi3_333,Sym,itrans)
     324      2906057 :         do ii=1,3
     325      9214114 :           do jj=1,3
     326     27642342 :             do kk=1,3
     327     82927026 :              do ll=1,3
     328    476827830 :                 do imode=1,nmode
     329              :                   Gruneisen(imode,kk,ll)=Gruneisen(imode,kk,ll)-dcmplx(Phi3_333(ii,jj,kk),0.d0)*&
     330              : &                                  eigen_prod(ii,jj,iatcell,jat_mod,imode)*&
     331              : &                                  exp(dcmplx(0.d0,phase))*dcmplx(F_strain(kk,ll),0.d0)*dcmplx(distance(iatcell,katom,ll+1),0.d0)/&
     332              : &                                  dcmplx(dsqrt(Invar%amu(itypat)*Invar%amu(jtypat))*amu_emass,0.d0)/&
     333    457690824 : &                                  dcmplx(6*Eigen2nd%eigenval(imode,iqpt)**2,0.d0)
     334              : !FB                  do ll=1,3
     335              : !FB                    Gruneisen(imode,kk,ll)=Gruneisen(imode,kk,ll)-dcmplx(Phi3_333(ii,jj,kk),0.d0)*&
     336              : !FB&                                    eigen_prod(ii,jj,iatcell,jat_mod,imode)*&
     337              : !FB&                                    exp(dcmplx(0.d0,phase))*F_strain(kk,ll)*dcmplx(distance(iatcell,katom,ll+1),0.d0)/&
     338              : !FB&                                    dcmplx(dsqrt(Invar%amu(itypat)*Invar%amu(jtypat))*amu_emass,0.d0)/&
     339              : !FB&                                    dcmplx(6*Eigen2nd%eigenval(imode,iqpt)**2,0.d0)
     340              : !FB!FB                  write(Invar%stdlog,'(a,4(1x,i4),2(1x,f15.3))') 'ii,jj,kk,imode,Grun=',ii,jj,kk,imode,Gruneisen(imode,kk,kk)
     341              : !FB                  end do !ll
     342              :                 end do !imode
     343              :               end do !ll
     344              :             end do !kk
     345              :           end do !jj
     346              :         end do !ii
     347              :       end do !iatshell
     348              :     end do !iatcell
     349              :   end do !ishell
     350              : 
     351              : !FB  Gruneisen(:,:,:)=Gruneisen(:,:,:)*dcmplx(dsqrt(6.d0),0.d0)
     352              : !FB  do imode=1,nmode
     353              : !FB    write(Invar%stdlog,'(a,1(1x,i4),6(1x,f15.3))') 'imode,Grun=',imode,(Gruneisen(imode,kk,kk),kk=1,3)
     354              : !FB  end do
     355        10493 :   ABI_FREE(Phi3_333)
     356        10493 :   ABI_FREE(eigen_prod)
     357        10493 :   ABI_FREE(eigenvec_loc)
     358              : 
     359        10493 : end subroutine tdep_calc_gruneisen
     360              : 
     361              : !=====================================================================================================
     362       868131 : subroutine tdep_build_phi3_333(isym,Phi3_ref,Phi3_333,Sym,itrans)
     363              : 
     364              :   type(Symmetries_type),intent(in) :: Sym
     365              :   double precision, intent(in) :: Phi3_ref(3,3,3)
     366              :   double precision, intent(out) :: Phi3_333(3,3,3)
     367              :   integer,intent(in) :: isym,itrans
     368              : 
     369              :   integer :: alpha,beta,gama
     370              :   integer :: ii,jj,kk,ee,ff,gg,mu,nu,xi
     371              :   double precision :: Phi3_tmp(3,3,3)
     372              : 
     373              : 
     374              : ! Transform in the new basis wrt S_ref
     375       868131 :   Phi3_333(:,:,:)=zero
     376      3472524 :   do mu=1,3
     377     11285703 :     do alpha=1,3
     378     33857109 :       do nu=1,3
     379    101571327 :         do beta=1,3
     380    304713981 :           do xi=1,3
     381    914141943 :             do gama=1,3
     382              :               Phi3_333(mu,nu,xi)=Phi3_333(mu,nu,xi)+&
     383    843823332 : &             Sym%S_ref(mu,alpha,isym,1)*Sym%S_ref(nu,beta,isym,1)*Sym%S_ref(xi,gama,isym,1)*Phi3_ref(alpha,beta,gama)
     384              :             end do
     385              :           end do
     386              :         end do
     387              :       end do
     388              :     end do
     389              :   end do
     390              : 
     391              : ! Take into account the 6 allowed permutations
     392       868131 :   Phi3_tmp(:,:,:)=Phi3_333(:,:,:)
     393       868131 :   if ((itrans.lt.1).or.(itrans.gt.6)) then
     394            0 :     ABI_BUG('This value of the symmetry index is not permitted')
     395              :   end if
     396      3472524 :   do ii=1,3
     397     11285703 :     do jj=1,3
     398     33857109 :       do kk=1,3
     399     23439537 :         if (itrans==1) then ; ee=ii ; ff=jj ; gg=kk ; endif !\Phi3_efg
     400     23439537 :         if (itrans==2) then ; ee=ii ; ff=kk ; gg=jj ; endif !\Phi3_egf
     401     23439537 :         if (itrans==3) then ; ee=jj ; ff=ii ; gg=kk ; endif !\Phi3_feg
     402     23439537 :         if (itrans==4) then ; ee=jj ; ff=kk ; gg=ii ; endif !\Phi3_fge
     403     23439537 :         if (itrans==5) then ; ee=kk ; ff=ii ; gg=jj ; endif !\Phi3_gef
     404     23439537 :         if (itrans==6) then ; ee=kk ; ff=jj ; gg=ii ; endif !\Phi3_gfe
     405     31252716 :         Phi3_333(ee,ff,gg)=Phi3_tmp(ii,jj,kk)
     406              :       end do
     407              :     end do
     408              :   end do
     409              : 
     410       868131 : end subroutine tdep_build_phi3_333
     411              : 
     412              : !=====================================================================================================
     413           14 : subroutine tdep_calc_alpha_gamma(distance,Eigen2nd,Invar,Lattice,MPIdata,Phi3_ref,Qbz,Rlatt_cart,Shell3at,Sym)
     414              : 
     415              :   type(Eigen_type),intent(in) :: Eigen2nd
     416              :   type(atdep_dataset_type),intent(in) :: Invar
     417              :   type(Lattice_type),intent(inout) :: Lattice
     418              :   type(Shell_type),intent(in) :: Shell3at
     419              :   type(Symmetries_type),intent(in) :: Sym
     420              :   type(Qbz_type),intent(in) :: Qbz
     421              :   type(MPI_enreg_type), intent(in) :: MPIdata
     422              :   double precision,intent(in) :: distance(Invar%natom,Invar%natom,4)
     423              :   double precision,intent(in) :: Phi3_ref(3,3,3,Shell3at%nshell)
     424              :   double precision,intent(in) :: Rlatt_cart(3,Invar%natom_unitcell,Invar%natom)
     425              : 
     426              :   integer :: iq_ibz,ii,jj,nmode,ntemp,itemp,kk,imode,ll
     427              :   integer :: alpha,beta
     428              :   double precision :: k_B,wovert,xx,C_v,E_th,Vp,Vs,P_th2
     429           14 :   double precision, allocatable :: heatcapa(:),grun_thermo(:,:,:),u_vib(:)
     430           14 :   double precision, allocatable :: heatcapa_HA(:,:),grun_thermo_HA(:,:,:,:),p_thermo1(:,:,:)
     431           14 :   double precision, allocatable :: p_thermo_HA(:,:,:,:),u_vib_HA(:,:)
     432           14 :   double precision, allocatable :: p_thermo2(:),tmp(:)
     433              :   double precision :: Gama_tensor(3,3),alpha_v_tensor(3,3),P_th_tensor(3,3),P_th1_tensor(3,3)
     434           14 :   double complex, allocatable :: Gruneisen(:,:,:),Grun_mean(:)
     435              :   character(len=500) :: message
     436              :   integer :: ierr
     437              : 
     438           14 :   ierr = 0
     439              : 
     440         1008 :   ABI_MALLOC(Gruneisen,(3*Invar%natom_unitcell,3,3)); Gruneisen(:,:,:)=czero
     441          126 :   ABI_MALLOC(Grun_mean,(3*Invar%natom_unitcell))    ; Grun_mean(:)    =czero
     442              : 
     443           14 :   ntemp=1000
     444           14 :   nmode=3*Invar%natom_unitcell
     445           14 :   k_B=kb_HaK*Ha_eV
     446          126 :   ABI_MALLOC(heatcapa,(nmode))       ; heatcapa   (:)    =0.d0
     447          980 :   ABI_MALLOC(grun_thermo,(nmode,3,3)); grun_thermo(:,:,:)=0.d0
     448          952 :   ABI_MALLOC(p_thermo1,(nmode,3,3))  ; p_thermo1  (:,:,:)=0.d0
     449        14014 :   ABI_MALLOC(p_thermo2,(ntemp))      ; p_thermo2  (:)    =0.d0
     450          112 :   ABI_MALLOC(u_vib,(nmode))          ; u_vib      (:)    =0.d0
     451        98056 :   ABI_MALLOC(heatcapa_HA,(nmode,ntemp))       ; heatcapa_HA   (:,:)    =0.d0
     452       882252 :   ABI_MALLOC(grun_thermo_HA,(nmode,ntemp,3,3)); grun_thermo_HA(:,:,:,:)=0.d0
     453       882210 :   ABI_MALLOC(p_thermo_HA,(nmode,ntemp,3,3))   ; p_thermo_HA   (:,:,:,:)=0.d0
     454        98042 :   ABI_MALLOC(u_vib_HA,(nmode,ntemp))          ; u_vib_HA      (:,:)    =0.d0
     455              : ! Loop over irreducible q-points
     456              : ! =======================
     457         1978 :   do iq_ibz=1,Qbz%nqibz
     458              : 
     459              : !   Compute the gruneisen for this q-point
     460              : !   ======================================
     461         7856 :     if ((sum(abs(Qbz%qibz_cart(:,iq_ibz)))).lt.tol8) cycle  ! G point
     462              :     call tdep_calc_gruneisen(distance,Eigen2nd,Gruneisen,iq_ibz,Invar,&
     463         1962 : &                            Phi3_ref,Qbz%qibz_cart(:,iq_ibz),Rlatt_cart,Shell3at,Sym)
     464        13086 :     Grun_mean(:)=czero
     465        13086 :     do ii=1,3*Invar%natom_unitcell
     466        46458 :       do jj=1,3
     467       144612 :         do kk=1,3
     468       133488 :           Grun_mean(ii)=Grun_mean(ii)+Gruneisen(ii,jj,kk)
     469              :         end do
     470              :       end do
     471              :     end do
     472        13086 :     if (sum(abs(aimag(Grun_mean(:)))).gt.tol8) then
     473            0 :       write(message,'(i5,1x,100(e15.6,1x))') iq_ibz,( real(Grun_mean(ii)),ii=1,nmode)
     474            0 :       ABI_ERROR_NOSTOP(message,ierr)
     475            0 :       write(message,'(i5,1x,100(e15.6,1x))') iq_ibz,(aimag(Grun_mean(ii)),ii=1,nmode)
     476            0 :       ABI_ERROR_NOSTOP(message,ierr)
     477            0 :       ABI_ERROR('tdep_calc_alpha_gamma : The imaginary part of the Gruneisen is not equal to zero')
     478              :     end if
     479              : !   If the Gruneisen is isotropic
     480              : !FB    do ii=1,3
     481              : !FB      tmp1=0.d0
     482              : !FB      do jj=1,3
     483              : !FB        tmp1=tmp1 + real(Gruneisen(ii,jj,jj))
     484              : !FB      end do
     485              : !FB      do jj=1,3
     486              : !FB        Gruneisen(ii,jj,jj)=dcmplx(tmp1/3.d0,0.d0)
     487              : !FB      end do
     488              : !FB      write(Invar%stdlog,'(2(i5,1x),100(e15.6,1x))') iq_ibz,ii,Gruneisen(ii,jj,jj)
     489              : !FB    end do
     490              : 
     491              : !   Compute the heat capacity and thermodynamical gruneisen parameter at present temperature
     492              : !   ========================================================================================
     493         1962 :     wovert=1.d0/(2*Invar%temperature*k_B)
     494        13086 :     do ii=1,nmode
     495        11124 :       xx=Eigen2nd%eigenval(ii,iq_ibz)*Ha_eV
     496        11124 :       if (xx.le.0) cycle
     497        11124 :       heatcapa(ii)       =heatcapa(ii)       +(wovert*xx/sinh(wovert*xx))**2*Qbz%wtqibz(iq_ibz)
     498              :       ! Gamma= sum_i Gamma_i*C_Vi / C_V
     499       144612 :       grun_thermo(ii,:,:)=grun_thermo(ii,:,:)+(wovert*xx/sinh(wovert*xx))**2*Qbz%wtqibz(iq_ibz)*real(Gruneisen(ii,:,:))*3.d0
     500              :       ! P    = sum_i Gamma_i*E_i / V
     501       144612 :       p_thermo1(ii,:,:)  =p_thermo1(ii,:,:)  +  (xx/2.d0/tanh(wovert*xx))   *Qbz%wtqibz(iq_ibz)*real(Gruneisen(ii,:,:))*3.d0
     502        13086 :       u_vib(ii)          =u_vib(ii)          +  (xx/2.d0/tanh(wovert*xx))   *Qbz%wtqibz(iq_ibz)
     503              :     end do
     504              : !   Compute the heat capacity and thermodynamical gruneisen parameter as a function of temperature
     505              : !   ==============================================================================================
     506      1963976 :     do itemp=1,ntemp
     507      1962000 :       wovert=1.d0/(2*real(itemp)*10*k_B)
     508     13087964 :       do ii=1,nmode
     509     11124000 :         xx=Eigen2nd%eigenval(ii,iq_ibz)*Ha_eV
     510     11124000 :         if (xx.le.0) cycle
     511     11124000 :         heatcapa_HA(ii,itemp)       =heatcapa_HA(ii,itemp)       +(wovert*xx/sinh(wovert*xx))**2*Qbz%wtqibz(iq_ibz)
     512              :         grun_thermo_HA(ii,itemp,:,:)=grun_thermo_HA(ii,itemp,:,:)+(wovert*xx/sinh(wovert*xx))**2*Qbz%wtqibz(iq_ibz)&
     513    144612000 : &                                   *real(Gruneisen(ii,:,:))*3.d0
     514              :         p_thermo_HA(ii,itemp,:,:)   =p_thermo_HA(ii,itemp,:,:)   +  (xx/2.d0/tanh(wovert*xx))   *Qbz%wtqibz(iq_ibz)&
     515    144612000 : &                                   *real(Gruneisen(ii,:,:))*3.d0
     516     13086000 :         u_vib_HA(ii,itemp)          =u_vib_HA(ii,itemp)          +  (xx/2.d0/tanh(wovert*xx))   *Qbz%wtqibz(iq_ibz)
     517              :       end do
     518              :     end do
     519              :   end do
     520           14 :   ABI_FREE(Gruneisen)
     521           14 :   ABI_FREE(Grun_mean)
     522              : ! Compute the pressure as the integral of Gamma*C_v overt T
     523        14014 :   ABI_MALLOC(tmp,(ntemp)) ; tmp(:)=0.d0
     524        14014 :   do itemp=1,ntemp
     525        56014 :     do ii=1,3
     526       182000 :       do jj=1,3
     527       924000 :         tmp(itemp)=tmp(itemp)+sum(grun_thermo_HA(:,itemp,ii,jj))/3.d0
     528              :       end do
     529              :     end do
     530              :   end do
     531           14 :   call simpson_int(ntemp,10.d0,tmp,p_thermo2)
     532           14 :   ABI_FREE(tmp)
     533              : 
     534           14 :   if (MPIdata%iam_master) then
     535           14 :     open(unit=20,file=trim(Invar%output_prefix)//'_thermo3.dat')
     536           14 :     open(unit=21,file=trim(Invar%output_prefix)//'_alpha_gamma.dat')
     537           14 :     write(20,'(a)')'#   T(K)    C_v(k_B/fu)        Gamma     alpha_v*10^6(K^-1)   E_th(eV)                       P_th(GPa)'
     538           14 :     write(20,'(a,72x,a)')'#',' ----------------------------------------------'
     539           14 :     write(20,'(a,72x,a)')'#','  {sum G_i.U_iV}  {int G.C_v/V dT}    {G.U/V}'
     540           14 :     write(21,'(a)')'#   T(K)      Gamma_11         Gamma_22        Gamma_33      alpha_11        alpha_22        alpha_33',&
     541           28 : &                  '        alpha_12        alpha_13        alpha_23'
     542           14 :     write(20,'(2a)')'# --------------------------------------------------------------------------------------------------',&
     543           28 :                     '--------------------'
     544              :   end if
     545        14014 :   do itemp=1,ntemp
     546        98000 :     C_v    =sum(heatcapa_HA   (:,itemp))
     547        98000 :     E_th   =sum(u_vib_HA    (:,itemp))
     548        14000 :     alpha_v_tensor(:,:)=zero
     549        14000 :     Gama_tensor   (:,:)=zero
     550        14000 :     P_th1_tensor  (:,:)=zero
     551        14000 :     P_th_tensor   (:,:)=zero
     552        98000 :     do imode=1,nmode
     553      1092000 :       Gama_tensor (:,:)=Gama_tensor (:,:)+grun_thermo_HA(imode,itemp,:,:)/C_v
     554      1106000 :       P_th1_tensor(:,:)=P_th1_tensor(:,:)+p_thermo_HA   (imode,itemp,:,:)/(Lattice%ucvol*Bohr_Ang**3*1.d-30)*e_Cb/10**9
     555              :     end do
     556              : !   alpha=sum{I=1,6;J=1,6} S(I,J) Gama_tensor (J)
     557        56000 :     do ii=1,3
     558       182000 :       do jj=1,3
     559       126000 :         if (ii.eq.1.and.jj.eq.1) alpha=1
     560       126000 :         if (ii.eq.2.and.jj.eq.2) alpha=2
     561       126000 :         if (ii.eq.3.and.jj.eq.3) alpha=3
     562       126000 :         if (ii.eq.2.and.jj.eq.3) alpha=4
     563       126000 :         if (ii.eq.1.and.jj.eq.3) alpha=5
     564       126000 :         if (ii.eq.1.and.jj.eq.2) alpha=6
     565       126000 :         if (ii.eq.3.and.jj.eq.2) alpha=4
     566       126000 :         if (ii.eq.3.and.jj.eq.1) alpha=5
     567       126000 :         if (ii.eq.2.and.jj.eq.1) alpha=6
     568       504000 :         do kk=1,3
     569      1638000 :           do ll=1,3
     570      1134000 :             if (kk.eq.1.and.ll.eq.1) beta=1
     571      1134000 :             if (kk.eq.2.and.ll.eq.2) beta=2
     572      1134000 :             if (kk.eq.3.and.ll.eq.3) beta=3
     573      1134000 :             if (kk.eq.2.and.ll.eq.3) beta=4
     574      1134000 :             if (kk.eq.1.and.ll.eq.3) beta=5
     575      1134000 :             if (kk.eq.1.and.ll.eq.2) beta=6
     576      1134000 :             if (kk.eq.3.and.ll.eq.2) beta=4
     577      1134000 :             if (kk.eq.3.and.ll.eq.1) beta=5
     578      1134000 :             if (kk.eq.2.and.ll.eq.1) beta=6
     579              :             alpha_v_tensor(ii,jj)=alpha_v_tensor(ii,jj)+Lattice%Sij(alpha,beta)*Gama_tensor(kk,ll)*C_v*kb_HaK*Ha_J/1.d9/&
     580      1512000 : &                                 (Lattice%ucvol*Bohr_Ang**3*1.d-30)
     581              :           end do
     582              :         end do
     583       168000 :         P_th_tensor(ii,jj)   =Gama_tensor(ii,jj)*E_th/(Lattice%ucvol*Bohr_Ang**3*1.d-30)*e_Cb/10**9
     584              :       end do
     585              :     end do
     586        14000 :     P_th2  =      p_thermo2(itemp)*k_B/(Lattice%ucvol*Bohr_Ang**3*1.d-30)*e_Cb/10**9
     587        14014 :     if (MPIdata%iam_master) then
     588        14000 :       write(20,'(1x,i5,7(1x,f15.3))') itemp*10,C_v,(Gama_tensor(1,1)+Gama_tensor(2,2)+Gama_tensor(3,3))/3.d0,&
     589        14000 : &                                                  (alpha_v_tensor(1,1)+alpha_v_tensor(2,2)+alpha_v_tensor(3,3))*1.d6,&
     590        14000 : &                                             E_th,(P_th1_tensor(1,1)+P_th1_tensor(2,2)+P_th1_tensor(3,3))/3.d0,&
     591        28000 : &                                            P_th2,(P_th_tensor(1,1)+P_th_tensor(2,2)+P_th_tensor(3,3))/3.d0
     592        14000 :       write(21,'(1x,i5,9(1x,f15.3))') itemp*10,Gama_tensor(1,1),Gama_tensor(2,2),Gama_tensor(3,3),&
     593        14000 : &                                     alpha_v_tensor(1,1)*1.d6,alpha_v_tensor(2,2)*1.d6,alpha_v_tensor(3,3)*1.d6,&
     594        28000 : &                                     alpha_v_tensor(1,2)*1.d6,alpha_v_tensor(1,3)*1.d6,alpha_v_tensor(2,3)*1.d6
     595              :     end if
     596              :   end do
     597           14 :   if (MPIdata%iam_master) then
     598           14 :     close(20)
     599           14 :     close(21)
     600              :   end if
     601           14 :   ABI_FREE(heatcapa_HA)
     602           14 :   ABI_FREE(grun_thermo_HA)
     603           14 :   ABI_FREE(p_thermo_HA)
     604           14 :   ABI_FREE(u_vib_HA)
     605              : 
     606              : ! Summary
     607              : ! =======
     608           14 :   write(Invar%stdout,*) ' '
     609           14 :   write(Invar%stdout,*) '#############################################################################'
     610           14 :   write(Invar%stdout,*) '####### Gruneisen parameter, Thermal expansion, Thermal pressure... #########'
     611           14 :   write(Invar%stdout,*) '#############################################################################'
     612           98 :   C_v    =sum(heatcapa(:))
     613           98 :   E_th   =sum(u_vib   (:))
     614           14 :   alpha_v_tensor(:,:)=zero
     615           14 :   Gama_tensor   (:,:)=zero
     616           14 :   P_th1_tensor  (:,:)=zero
     617           14 :   P_th_tensor   (:,:)=zero
     618           98 :   do imode=1,nmode
     619         1092 :     Gama_tensor (:,:)=Gama_tensor (:,:)+grun_thermo(imode,:,:)/C_v
     620         1106 :     P_th1_tensor(:,:)=P_th1_tensor(:,:)+p_thermo1  (imode,:,:)/(Lattice%ucvol*Bohr_Ang**3*1.d-30)*e_Cb/10**9
     621              :   end do
     622              : ! alpha=sum{I=1,6;J=1,6} S(I,J) Gama_tensor (J)
     623           56 :   do ii=1,3
     624          182 :     do jj=1,3
     625          126 :       if (ii.eq.1.and.jj.eq.1) alpha=1
     626          126 :       if (ii.eq.2.and.jj.eq.2) alpha=2
     627          126 :       if (ii.eq.3.and.jj.eq.3) alpha=3
     628          126 :       if (ii.eq.2.and.jj.eq.3) alpha=4
     629          126 :       if (ii.eq.1.and.jj.eq.3) alpha=5
     630          126 :       if (ii.eq.1.and.jj.eq.2) alpha=6
     631          126 :       if (ii.eq.3.and.jj.eq.2) alpha=4
     632          126 :       if (ii.eq.3.and.jj.eq.1) alpha=5
     633          126 :       if (ii.eq.2.and.jj.eq.1) alpha=6
     634          504 :       do kk=1,3
     635         1638 :         do ll=1,3
     636         1134 :           if (kk.eq.1.and.ll.eq.1) beta=1
     637         1134 :           if (kk.eq.2.and.ll.eq.2) beta=2
     638         1134 :           if (kk.eq.3.and.ll.eq.3) beta=3
     639         1134 :           if (kk.eq.2.and.ll.eq.3) beta=4
     640         1134 :           if (kk.eq.1.and.ll.eq.3) beta=5
     641         1134 :           if (kk.eq.1.and.ll.eq.2) beta=6
     642         1134 :           if (kk.eq.3.and.ll.eq.2) beta=4
     643         1134 :           if (kk.eq.3.and.ll.eq.1) beta=5
     644         1134 :           if (kk.eq.2.and.ll.eq.1) beta=6
     645              :           alpha_v_tensor(ii,jj)=alpha_v_tensor(ii,jj)+Lattice%Sij(alpha,beta)*Gama_tensor(kk,ll)*C_v*kb_HaK*Ha_J/1.d9/&
     646         1512 : &                               (Lattice%ucvol*Bohr_Ang**3*1.d-30)
     647              :         end do
     648              :       end do
     649          168 :       P_th_tensor(ii,jj)=Gama_tensor(ii,jj)*E_th/(Lattice%ucvol*Bohr_Ang**3*1.d-30)*e_Cb/10**9
     650              :     end do
     651              :   end do
     652           14 :   P_th2  =p_thermo2(int(Invar%temperature/10))*k_B/(Lattice%ucvol*Bohr_Ang**3*1.d-30)*e_Cb/10**9
     653              :   Lattice%BulkModulus_S=Lattice%BulkModulus_T*(1.+(alpha_v_tensor(1,1)+alpha_v_tensor(2,2)+alpha_v_tensor(3,3))*&
     654           14 : &                       (Gama_tensor(1,1)+   Gama_tensor(2,2)+   Gama_tensor(3,3))/3.d0*Invar%temperature)
     655           14 :   Lattice%HeatCapa_P=C_v*Lattice%BulkModulus_S/Lattice%BulkModulus_T
     656           14 :   Vp=dsqrt(1.d9*(Lattice%BulkModulus_S+4.d0*Lattice%Shear/3.d0)/Lattice%Density)
     657           14 :   Vs=dsqrt(1.d9*Lattice%Shear/Lattice%Density)
     658           14 :   write(Invar%stdout,'(a)') ' See the gruneisen.dat, alpha_gamma.dat and thermo3.dat files'
     659           14 :   write(Invar%stdout,'(a)') ' '
     660           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Gruneisen parameter :                 Gamma=',&
     661           28 : &          (Gama_tensor(1,1)+Gama_tensor(2,2)+Gama_tensor(3,3))/3.d0
     662           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                The Gruneisen matrix is  |',&
     663           28 : &          Gama_tensor(1,1),Gama_tensor(1,2),Gama_tensor(1,3),'|'
     664           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                                         |',&
     665           28 : &          Gama_tensor(2,1),Gama_tensor(2,2),Gama_tensor(2,3),'|'
     666           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                                         |',&
     667           28 : &          Gama_tensor(3,1),Gama_tensor(3,2),Gama_tensor(3,3),'|'
     668           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Thermal expansion (K^{-1}*10^6) :   alpha_v=',&
     669           28 : &          (alpha_v_tensor(1,1)+alpha_v_tensor(2,2)+alpha_v_tensor(3,3))*1.d6
     670           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '        The thermal expansion matrix is  |',&
     671           28 : &          alpha_v_tensor(1,1)*1.d6,alpha_v_tensor(1,2)*1.d6,alpha_v_tensor(1,3)*1.d6,'|'
     672           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                                         |',&
     673           28 : &          alpha_v_tensor(2,1)*1.d6,alpha_v_tensor(2,2)*1.d6,alpha_v_tensor(2,3)*1.d6,'|'
     674           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                                         |',&
     675           28 : &          alpha_v_tensor(3,1)*1.d6,alpha_v_tensor(3,2)*1.d6,alpha_v_tensor(3,3)*1.d6,'|'
     676           14 :   write(Invar%stdout,'(a)') ' Thermal pressure (in GPa) : '
     677           14 :   write(Invar%stdout,'(a)') '    ------- w   intrinsic effects and w   ZPE --------'
     678           14 :   write(Invar%stdout,'(a,1x,f15.3)') '                 P_th=sum_i Gamma_i*E_i/V   =',&
     679           28 : &          (P_th1_tensor(1,1)+P_th1_tensor(2,2)+P_th1_tensor(3,3))/3.d0
     680           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '           The thermal pressure matrix is|',&
     681           28 : &          P_th1_tensor(1,1),P_th1_tensor(1,2),P_th1_tensor(1,3),'|'
     682           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                                         |',&
     683           28 : &          P_th1_tensor(2,1),P_th1_tensor(2,2),P_th1_tensor(2,3),'|'
     684           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                                         |',&
     685           28 : &          P_th1_tensor(3,1),P_th1_tensor(3,2),P_th1_tensor(3,3),'|'
     686           14 :   write(Invar%stdout,'(a)') '    ------- w   intrinsic effects and w/o ZPE --------'
     687           14 :   write(Invar%stdout,'(a,1x,f15.3)') '                 P_th=integ{Gamma*C_v/V dT} =',P_th2
     688           14 :   write(Invar%stdout,'(a)') '    ------- w/o intrinsic effects and w/o ZPE --------'
     689           14 :   write(Invar%stdout,'(a,1x,f15.3)') '                 P_th=Gamma*E_th/V          =',&
     690           28 : &          (P_th_tensor(1,1)+P_th_tensor(2,2)+P_th_tensor(3,3))/3.d0
     691           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '           The thermal pressure matrix is|',&
     692           28 : &          P_th_tensor(1,1),P_th_tensor(1,2),P_th_tensor(1,3),'|'
     693           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                                         |',&
     694           28 : &          P_th_tensor(2,1),P_th_tensor(2,2),P_th_tensor(2,3),'|'
     695           14 :   write(Invar%stdout,'(a,3(1x,f8.3),a)') '                                         |',&
     696           28 : &          P_th_tensor(3,1),P_th_tensor(3,2),P_th_tensor(3,3),'|'
     697           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Volume (bohr^3 per unit cell):            V=',Lattice%ucvol
     698           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Thermal energy (eV) :                  E_th=',E_th
     699           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Heat capacity at constant V (k_B/f.u.): C_v=',C_v
     700           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Heat capacity at constant P (k_B/f.u.): C_p=',Lattice%HeatCapa_P
     701           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Isothermal Bulk Modulus (GPa):          B_T=',Lattice%BulkModulus_T
     702           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Isentropic Bulk Modulus (GPa):          B_S=',Lattice%BulkModulus_S
     703           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Longitudinal sound velocity (m.s-1):     Vp=',Vp
     704           14 :   write(Invar%stdout,'(a,1x,f15.3)') ' Transverse sound velocity (m.s-1):       Vs=',Vs
     705           14 :   ABI_FREE(heatcapa)
     706           14 :   ABI_FREE(grun_thermo)
     707           14 :   ABI_FREE(p_thermo1)
     708           14 :   ABI_FREE(p_thermo2)
     709           14 :   ABI_FREE(u_vib)
     710              : 
     711           14 : end subroutine tdep_calc_alpha_gamma
     712              : 
     713              : !=====================================================================================================
     714           14 : subroutine tdep_write_gruneisen(distance,Eigen2nd,Invar,Phi3_ref,Qpt,Rlatt_cart,Shell3at,Sym)
     715              : 
     716              :   type(Symmetries_type),intent(in) :: Sym
     717              :   type(atdep_dataset_type),intent(in) :: Invar
     718              :   type(Shell_type),intent(in) :: Shell3at
     719              :   type(Eigen_type),intent(in) :: Eigen2nd
     720              :   type(Qpoints_type),intent(in) :: Qpt
     721              :   double precision,intent(in) :: distance(Invar%natom,Invar%natom,4)
     722              :   double precision,intent(in) :: Phi3_ref(3,3,3,Shell3at%nshell)
     723              :   double precision,intent(in) :: Rlatt_cart(3,Invar%natom_unitcell,Invar%natom)
     724              : 
     725              :   integer :: iqpt,nmode,ii,jj,kk
     726              :   double precision :: qpt_cart(3)
     727           14 :   double complex, allocatable :: Gruneisen(:,:,:)
     728           14 :   double complex, allocatable :: Grun_mean(:)
     729              :   character(len=500) :: message
     730              :   integer :: ierr
     731              : 
     732           14 :   ierr = 0
     733              : 
     734           14 :   nmode=3*Invar%natom_unitcell
     735         1008 :   ABI_MALLOC(Gruneisen,(3*Invar%natom_unitcell,3,3)); Gruneisen(:,:,:)=czero
     736          126 :   ABI_MALLOC(Grun_mean,(3*Invar%natom_unitcell))    ; Grun_mean(:)    =czero
     737           14 :   open(unit=53,file=trim(Invar%output_prefix)//'_gruneisen.dat')
     738           14 :   open(unit=54,file=trim(Invar%output_prefix)//'_gruneisen-ij.dat')
     739              : 
     740         8573 :   do iqpt=1,Qpt%nqpt
     741              : 
     742              : !   Compute the Gruneisen
     743              : !   =====================
     744        59949 :     Grun_mean(:)=czero
     745        34236 :     qpt_cart(:)=Qpt%qpt_cart(:,iqpt)
     746        34236 :     if ((sum(abs(Qpt%qpt_red(:,iqpt)))).lt.tol8) cycle  ! G point
     747        34132 :     if (abs(sum(Qpt%qpt_red(:,iqpt)**2)-1.d0).lt.tol8) cycle ! Gp point
     748         8531 :     call tdep_calc_gruneisen(distance,Eigen2nd,Gruneisen,iqpt,Invar,Phi3_ref,qpt_cart,Rlatt_cart,Shell3at,Sym)
     749        59753 :     do ii=1,3*Invar%natom_unitcell
     750       213419 :       do jj=1,3
     751       665886 :         do kk=1,3
     752       460998 :           write(54,'(4(i5,1x),500(e15.6,1x))') iqpt,ii,jj,kk,Gruneisen(ii,jj,kk)
     753       614664 :           if (abs(aimag(Gruneisen(ii,jj,kk))).gt.tol8) then
     754            0 :             ABI_WARNING('Real part :')
     755            0 :             write(message,'(4(i5,1x),100(e15.6,1x))') iqpt,ii,jj,kk,real(Gruneisen(ii,jj,kk))
     756            0 :             ABI_WARNING(message)
     757            0 :             ABI_WARNING('Imaginary part :')
     758            0 :             write(message,'(4(i5,1x),100(e15.6,1x))') iqpt,ii,jj,kk,aimag(Gruneisen(ii,jj,kk))
     759            0 :             ABI_WARNING(message)
     760            0 :             ABI_WARNING('tdep_write_gruneisen : The imaginary part of the Gruneisen is not equal to zero')
     761              :          end if
     762              :         end do
     763              :       end do
     764              :     end do
     765        59753 :     do ii=1,3*Invar%natom_unitcell
     766       213419 :       do jj=1,3
     767       665886 :         do kk=1,3
     768       614664 :           Grun_mean(ii)=Grun_mean(ii)+Gruneisen(ii,jj,kk)
     769              :         end do
     770              :       end do
     771              :     end do
     772              : 
     773              : !   Write the Gruneisen
     774              : !   ===================
     775        59767 :     if (sum(abs(aimag(Grun_mean(:)))).gt.3*Invar%natom_unitcell*tol8) then
     776            0 :       ABI_WARNING('Real part :')
     777            0 :       write(message,'(i5,1x,100(e15.6,1x))') iqpt,(real(Grun_mean(ii)),ii=1,nmode)
     778            0 :       ABI_WARNING(message)
     779            0 :       ABI_WARNING('Imaginary part :')
     780            0 :       write(message,'(i5,1x,100(e15.6,1x))') iqpt,(aimag(Grun_mean(ii)),ii=1,nmode)
     781            0 :       ABI_WARNING(message)
     782            0 :       ABI_WARNING('tdep_write_gruneisen : The imaginary part of Grun_mean is not equal to zero')
     783              :     else
     784              : !FB      write(53,'(i5,1x,500(e15.6,1x))') iqpt,(real(Grun_mean(ii)),ii=1,nmode),&
     785              : !FB                ((real(Grun_shell(ii,jj)),ii=1,nmode),jj=1,Shell3at%nshell)
     786        59753 :       write(53,'(i5,1x,500(e15.6,1x))') iqpt,(real(Grun_mean(ii)),ii=1,nmode)
     787              :     end if
     788              :   end do
     789           14 :   close(53)
     790           14 :   close(54)
     791           14 :   ABI_FREE(Grun_mean)
     792           14 :   ABI_FREE(Gruneisen)
     793              : 
     794           14 : end subroutine tdep_write_gruneisen
     795              : 
     796              : !=====================================================================================================
     797              : end module m_tdep_phi3
     798              : 
     799              : !FB!=====================================================================================================
     800              : !FBsubroutine tdep_calc_lifetime1(Crystal,distance,Eigen2nd,Ifc,Invar,Lattice,Phi3_ref,Qbz,Rlatt_cart,Shell3at,Sym)
     801              : !FB
     802              : !FB  type(crystal_t),intent(in) :: Crystal
     803              : !FB  type(Symmetries_type),intent(in) :: Sym
     804              : !FB  type(atdep_dataset_type),intent(in) :: Invar
     805              : !FB  type(Shell_type),intent(in) :: Shell3at
     806              : !FB  type(Lattice_type),intent(in) :: Lattice
     807              : !FB  type(Eigen_type),intent(in) :: Eigen2nd
     808              : !FB  type(Qbz_type),intent(in) :: Qbz
     809              : !FB  type(ifc_type),intent(in) :: Ifc
     810              : !FB  double precision,intent(in) :: distance(Invar%natom,Invar%natom,4)
     811              : !FB  double precision,intent(in) :: Phi3_ref(3,3,3,Shell3at%nshell)
     812              : !FB  double precision,intent(in) :: Rlatt_cart(3,Invar%natom_unitcell,Invar%natom)
     813              : !FB
     814              : !FB  integer :: iq_bz,jq_bz,kq_bz,nmode,ii,tot_count
     815              : !FB  integer :: okp_count,okm_count
     816              : !FB  double precision :: iqbz(3),jqbz(3),kqbz(3),ipjpk(3),imjpk(3)
     817              : !FB!  double complex, allocatable :: Gruneisen(:,:,:)
     818              : !FB!  double complex, allocatable :: Grun_mean(:)
     819              : !FB  integer :: ierr
     820              : !FB
     821              : !FB  ierr = 0
     822              : !FB
     823              : !FB  nmode=3*Invar%natom_unitcell
     824              : !FB  tot_count=zero
     825              : !FB  okp_count=zero
     826              : !FB  okm_count=zero
     827              : !FB  do ii=1,3
     828              : !FB    write(Invar%stdout,'(a,3(e15.6,1x),1x)') 'Gmet=',Lattice%gmet(ii,:)
     829              : !FB    write(Invar%stdout,'(a,3(e15.6,1x),1x)') 'Gprim=',Lattice%gprim(ii,:)
     830              : !FB  end do
     831              : !FB  do iq_bz=1,Qbz%nqbz
     832              : !FB    iqbz(:)=Qbz%qbz(:,iq_bz)
     833              : !FB!    iqbz(:)=0.2
     834              : !FB    write(Invar%stdout,'(a,3(e15.6,1x),1x)') 'Qbz1=',iqbz(:)
     835              : !FB    do jq_bz=1,Qbz%nqbz
     836              : !FB      jqbz(:)=Qbz%qbz(:,jq_bz)
     837              : !FB!      jqbz(:)=0.3
     838              : !FB      do kq_bz=1,Qbz%nqbz
     839              : !FB        tot_count=tot_count+1
     840              : !FB        kqbz(:)=Qbz%qbz(:,kq_bz)
     841              : !FB!        kqbz(:)=0.5
     842              : !FB        ipjpk(:)=iqbz(:)+jqbz(:)+kqbz(:)
     843              : !FB        imjpk(:)=iqbz(:)-jqbz(:)+kqbz(:)
     844              : !FB        if (sum(abs(ipjpk(:)-int(ipjpk(:)))).lt.tol4) then
     845              : !FB          write(Invar%stdout,'(a,i4,1x,i4,1x,i4)')'OK for qi+qj+qk=G',iq_bz,jq_bz,kq_bz
     846              : !FB          okp_count=okp_count+1
     847              : !FB        else if (sum(abs(imjpk(:)-int(imjpk(:)))).lt.tol4) then
     848              : !FB          write(Invar%stdout,'(a,i4,1x,i4,1x,i4)')'OK for qi-qj+qk=G',iq_bz,jq_bz,kq_bz
     849              : !FB          okm_count=okm_count+1
     850              : !FB        else
     851              : !FB          cycle
     852              : !FB        end if
     853              : !FB!       do imode=1,nmode
     854              : !FB!         do jmode=1,nmode
     855              : !FB!           do kmode=1,nmode
     856              : !FB!            end do
     857              : !FB!          end do
     858              : !FB!        end do
     859              : !FB      end do
     860              : !FB    end do
     861              : !FB  end do
     862              : !FB  write(Invar%stdout,'(a,i10)') 'Total number of (q1,q2,q3) =',tot_count
     863              : !FB  write(Invar%stdout,'(a,i10)') 'Partial number of (q1+q2+q3) =',okp_count
     864              : !FB  write(Invar%stdout,'(a,i10)') 'Partial number of (q1-q2+q3) =',okm_count
     865              : !FB
     866              : !FBend subroutine tdep_calc_lifetime1
     867              : 
     868              : !=====================================================================================================
     869              : !FBsubroutine tdep_calc_lifetime2(Crystal,distance,Eigen2nd,Ifc,Invar,Lattice,MPIdata,Phi3_ref,Qbz,Rlatt_cart,Shell3at,Sym)
     870              : !FB
     871              : !FB!Arguments ------------------------------------
     872              : !FB!scalars
     873              : !FB integer,intent(in) :: ncid,comm
     874              : !FB real(dp),intent(in) :: dosdeltae !,dossmear
     875              : !FB type(gruns_t),intent(in) :: gruns
     876              : !FB character(len=*),intent(in) :: prefix
     877              : !FB!arrays
     878              : !FB
     879              : !FB  type(crystal_t),intent(in) :: Crystal
     880              : !FB  type(Symmetries_type),intent(in) :: Sym
     881              : !FB  type(atdep_dataset_type),intent(in) :: Invar
     882              : !FB  type(Shell_type),intent(in) :: Shell3at
     883              : !FB  type(Lattice_type),intent(in) :: Lattice
     884              : !FB  type(Eigen_type),intent(in) :: Eigen2nd
     885              : !FB  type(MPI_enreg_type), intent(in) :: MPIdata
     886              : !FB  type(Qbz_type),intent(in) :: Qbz
     887              : !FB  type(ifc_type),intent(in) :: Ifc
     888              : !FB  double precision,intent(in) :: distance(Invar%natom,Invar%natom,4)
     889              : !FB  double precision,intent(in) :: Phi3_ref(3,3,3,Shell3at%nshell)
     890              : !FB  double precision,intent(in) :: Rlatt_cart(3,Invar%natom_unitcell,Invar%natom)
     891              : !FB
     892              : !FB!Local variables-------------------------------
     893              : !FB!scalars
     894              : !FB integer,parameter :: master=0,qptopt1=1,bcorr0=0
     895              : !FB integer :: nprocs,my_rank,iqibz,nqbz,nqibz,ierr,ii,nu,ncerr,nomega,cnt,unt,io
     896              : !FB real(dp) :: gavg,omega_min,omega_max,v2
     897              : !FB type(htetra_t) :: tetra
     898              : !FB character(len=500) :: msg
     899              : !FB!arrays
     900              : !FB integer :: qptrlatt(3,3)
     901              : !FB integer :: ngqpt(3)
     902              : !FB real(dp) :: shiftq(3,1)
     903              : !FB real(dp),allocatable :: gvals_qibz(:,:),wvols_qibz(:,:,:),dwdq_qibz(:,:,:)
     904              : !FB real(dp),allocatable :: qibz(:,:),qbz(:,:),wtq(:)
     905              : !FB real(dp),allocatable :: wdt(:,:),wdos(:,:),grdos(:,:),gr2dos(:,:),wibz(:),omega_mesh(:)
     906              : !FB real(dp),allocatable :: vdos(:,:),v2dos(:,:)
     907              : !FB real(dp),allocatable :: phdispl_cart_qibz(:,:,:,:,:)
     908              : !FB
     909              : !FB! ************************************************************************
     910              : !FB
     911              : !FB comm = MPIdata%comm_step
     912              : !FB nprocs  = xmpi_comm_size(comm)
     913              : !FB my_rank = xmpi_comm_rank(comm)
     914              : !FB
     915              : !FB write(msg,'(a,(80a),4a)')ch10,('=',ii=1,80),ch10,ch10,' Calculation of Lifetime ',ch10
     916              : !FB call wrtout(Invar%stdout,msg)
     917              : !FB
     918              : !FB ! Generate the q-mesh by finding the IBZ and the corresponding weights.
     919              : !FB qptrlatt = 0
     920              : !FB do ii=1,3
     921              : !FB   qptrlatt(ii,ii) = Invar%ngqpt1(:)
     922              : !FB end do
     923              : !FB nshiftq=1
     924              : !FB shiftq(:,:)=0.0
     925              : !FB
     926              : !FB ! Get IBZ and BZ.
     927              : !FB call kpts_ibz_from_kptrlatt(Crystal, qptrlatt, qptopt1, nshiftq, shiftq, &
     928              : !FB   nqibz, qibz, wtq, nqbz, qbz)
     929              : !FB
     930              : !FB ! Build tetrahedra
     931              : !FB tetra = tetra_from_kptrlatt(Crystal, qptopt1, qptrlatt, nshiftq, shiftq, nqibz, qibz, comm, msg, ierr)
     932              : !FB if (ierr /= 0) ABI_ERROR(msg)
     933              : !FB
     934              : !FB ABI_CALLOC(wvols_qibz, (gruns%natom3, gruns%nvols, nqibz))
     935              : !FB ABI_CALLOC(gvals_qibz, (gruns%natom3, nqibz))
     936              : !FB ABI_CALLOC(dwdq_qibz, (3, gruns%natom3, nqibz))
     937              : !FB ABI_CALLOC(phdispl_cart_qibz, (2, gruns%natom3, gruns%natom3, gruns%nvols, nqibz))
     938              : !FB
     939              : !FB gavg = zero
     940              : !FB do iqibz=1,nqibz
     941              : !FB   if (mod(iqibz, nprocs) /= my_rank) cycle ! mpi-parallelism
     942              : !FB   call gruns_fourq(gruns, qibz(:,iqibz), wvols_qibz(:,:,iqibz), gvals_qibz(:,iqibz), &
     943              : !FB                    dwdq_qibz(:,:,iqibz), phdispl_cart_qibz(:,:,:,:,iqibz))
     944              : !FB   gavg = gavg + wtq(iqibz) * sum(gvals_qibz(:,iqibz))
     945              : !FB end do
     946              : !FB gavg = gavg / gruns%natom3
     947              : !FB
     948              : !FB call xmpi_sum(gavg, comm, ierr)
     949              : !FB call xmpi_sum(wvols_qibz, comm, ierr)
     950              : !FB call xmpi_sum(gvals_qibz, comm, ierr)
     951              : !FB call xmpi_sum(dwdq_qibz, comm, ierr)
     952              : !FB call xmpi_sum(phdispl_cart_qibz, comm, ierr)
     953              : !FB
     954              : !FB omega_min = gruns%ifc_vol(gruns%iv0)%omega_minmax(1)
     955              : !FB omega_max = gruns%ifc_vol(gruns%iv0)%omega_minmax(2)
     956              : !FB nomega = nint((omega_max - omega_min) / dosdeltae) + 1
     957              : !FB nomega = max(6, nomega) ! Ensure Simpson integration will be ok
     958              : !FB
     959              : !FB ABI_MALLOC(omega_mesh, (nomega))
     960              : !FB omega_mesh = arth(omega_min, dosdeltae, nomega)
     961              : !FB omega_max = omega_mesh(nomega)
     962              : !FB !write(std_out,*)"hello",omega_min,omega_max,dosdeltae,(omega_max-omega_min) / (nomega-1)
     963              : !FB ABI_MALLOC(wibz, (nqibz))
     964              : !FB ABI_MALLOC(wdt, (nomega, 2))
     965              : !FB ABI_CALLOC(wdos, (nomega, 2))
     966              : !FB ABI_CALLOC(grdos, (nomega, 2))
     967              : !FB ABI_CALLOC(gr2dos, (nomega, 2))
     968              : !FB ABI_CALLOC(vdos, (nomega, 2))
     969              : !FB ABI_CALLOC(v2dos, (nomega, 2))
     970              : !FB
     971              : !FB ! Compute DOSes.
     972              : !FB cnt = 0
     973              : !FB do iqibz=1,nqibz
     974              : !FB   do nu=1,gruns%natom3
     975              : !FB     cnt = cnt + 1; if (mod(cnt, nprocs) /= my_rank) cycle ! mpi-parallelism
     976              : !FB     wibz = wvols_qibz(nu, gruns%iv0, :)
     977              : !FB     call tetra%get_onewk(iqibz,bcorr0,nomega,nqibz,wibz,omega_min,omega_max,one,wdt)
     978              : !FB     wdt = wdt*wtq(iqibz)
     979              : !FB     wdos = wdos + wdt
     980              : !FB     grdos = grdos + wdt * gvals_qibz(nu,iqibz)
     981              : !FB     gr2dos = gr2dos + wdt * gvals_qibz(nu,iqibz) ** 2
     982              : !FB     v2 = sum(dwdq_qibz(1:3,nu,iqibz) ** 2)
     983              : !FB     vdos = vdos + wdt * sqrt(v2)
     984              : !FB     v2dos = v2dos + wdt * v2
     985              : !FB   end do
     986              : !FB end do
     987              : !FB
     988              : !FB call xmpi_sum(wdos, comm, ierr)
     989              : !FB call xmpi_sum(grdos, comm, ierr)
     990              : !FB call xmpi_sum(gr2dos, comm, ierr)
     991              : !FB call xmpi_sum(vdos, comm, ierr)
     992              : !FB call xmpi_sum(v2dos, comm, ierr)
     993              : !FB
     994              : !FB if (my_rank == master) then
     995              : !FB   write(unt,'(a)')'# Phonon density of states, Gruneisen DOS and phonon group velocity DOS'
     996              : !FB   write(unt,'(a)')"# Energy in Hartree, DOS in states/Hartree"
     997              : !FB   write(unt,'(a,i0)')'# Tetrahedron method with nqibz= ',nqibz
     998              : !FB   write(unt,"(a,f8.5)")"# Average Gruneisen parameter:", gavg
     999              : !FB   write(unt,'(5a)') &
    1000              : !FB     "# omega PH_DOS Gruns_DOS Gruns**2_DOS Vel_DOS  Vel**2_DOS  PH_IDOS Gruns_IDOS Gruns**2_IDOS Vel_IDOS Vel**2_IDOS"
    1001              : !FB   do io=1,nomega
    1002              : !FB     write(unt, "(11es17.8)")omega_mesh(io), &
    1003              : !FB       wdos(io,1), grdos(io,1), gr2dos(io,1), vdos(io,1), v2dos(io,1), &
    1004              : !FB       wdos(io,2), grdos(io,2), gr2dos(io,2), vdos(io,2), v2dos(io,2)
    1005              : !FB   end do
    1006              : !FB end if
    1007              : !FB
    1008              : !FB
    1009              : !FB ABI_FREE(qibz)
    1010              : !FB ABI_FREE(wtq)
    1011              : !FB ABI_FREE(qbz)
    1012              : !FB ABI_FREE(wvols_qibz)
    1013              : !FB ABI_FREE(gvals_qibz)
    1014              : !FB ABI_FREE(dwdq_qibz)
    1015              : !FB ABI_FREE(phdispl_cart_qibz)
    1016              : !FB ABI_FREE(omega_mesh)
    1017              : !FB ABI_FREE(wibz)
    1018              : !FB ABI_FREE(wdt)
    1019              : !FB ABI_FREE(wdos)
    1020              : !FB ABI_FREE(grdos)
    1021              : !FB ABI_FREE(gr2dos)
    1022              : !FB ABI_FREE(v2dos)
    1023              : !FB ABI_FREE(vdos)
    1024              : !FB
    1025              : !FB call tetra%free()
    1026              : !FB
    1027              : !FBend subroutine tdep_calc_lifetime2
    1028              : !!***
        

Generated by: LCOV version 2.3-1