LCOV - code coverage report
Current view: top level - src/80_tdep - m_tdep_dataset.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 80.2 % 653 524
Test Date: 2026-09-19 17:42:43 Functions: 50.0 % 8 4

            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_dataset
       9              : 
      10              :   use defs_basis
      11              :   use m_errors
      12              :   use m_abicore
      13              :   use m_xmpi
      14              :   use m_abihist
      15              :   use m_parser
      16              :   use netcdf
      17              :   use m_nctk
      18              :   use m_fstrings, only : inupper,ljust,next_token
      19              :   use m_io_tools, only : file_exists
      20              :   use m_ddb,      only : ddb_type
      21              :   use m_ddb_hdr,  only : ddb_hdr_type
      22              :   use m_crystal,  only : crystal_t
      23              : 
      24              :  implicit none
      25              : 
      26              :   character(len=6),public,parameter :: version_string = '   4.0'
      27              : 
      28              :   type atdep_dataset_type
      29              : 
      30              :     integer :: natom
      31              :     ! Number of atoms in the supercell
      32              : 
      33              :     integer :: natom_unitcell
      34              :     ! Number of atoms in the unit cell
      35              : 
      36              :     integer :: nshell_max
      37              :     integer :: nstep_max
      38              :     integer :: nstep_min
      39              :     integer :: nstep_tot
      40              :     integer :: my_nstep
      41              :     integer :: ntypat
      42              :     integer :: use_ideal_positions
      43              :     integer :: stdout
      44              :     integer :: stdlog
      45              :     integer :: bzpath
      46              :     integer :: order
      47              :     integer :: slice
      48              :     integer :: enunit
      49              :     integer :: readifc
      50              :     integer :: together
      51              :     integer :: alloy
      52              :     integer :: ityp_alloy1
      53              :     integer :: ityp_alloy2
      54              :     integer :: nproc(2)
      55              :     integer :: bzlength
      56              :     integer :: ngqpt1(3)
      57              :     integer :: ngqpt2(3)
      58              :     integer :: bravais(11)
      59              :     integer :: use_weights
      60              :     integer :: prtphdos
      61              :     integer :: symbec                   ! Symmetrize born effective charges
      62              :     integer, allocatable :: typat_unitcell(:)
      63              :     integer, allocatable :: typat(:)
      64              :     integer, allocatable :: lgth_segments(:)
      65              :     logical :: debug
      66              :     logical :: loto    ! TODO rename dipdip
      67              :     logical :: netcdf
      68              :     double precision :: angle_alpha
      69              :     double precision :: dosdeltae
      70              :     double precision :: rcut
      71              :     double precision :: rcut3
      72              :     double precision :: rcut4
      73              :     double precision :: temperature
      74              :     double precision :: tolread
      75              :     double precision :: tolinbox
      76              :     double precision :: tolmatch
      77              :     double precision :: tolmotif
      78              : 
      79              :     double precision :: rprimd_md(3,3)
      80              :     ! Dimensioned primitive vectors
      81              : 
      82              :     double precision :: multiplicity(3,3)
      83              :     ! Supercell scaling matrix (integers)
      84              : 
      85              :     double precision :: dielt(3,3)
      86              :     ! Dielectric tensor
      87              : 
      88              :     double precision, allocatable :: amu(:)
      89              :     ! amu(natom_unitcell)
      90              :     ! Mass of the atoms (atomic mass unit)
      91              : 
      92              :     double precision, allocatable :: zeff(:,:,:)
      93              :     ! zeff(3,3,natom_unitcell)
      94              :     ! Born effective charge tensor
      95              : 
      96              :     double precision, allocatable :: znucl(:)
      97              :     double precision, allocatable :: qpt(:,:)
      98              :     double precision, allocatable :: xred_unitcell(:,:)
      99              : 
     100              :     character (len=2), allocatable :: special_qpt(:)
     101              :     character (len=fnlen) :: output_prefix
     102              :     character (len=fnlen) :: input_prefix
     103              :     character (len=fnlen) :: output_file
     104              : 
     105              :   end type atdep_dataset_type
     106              : 
     107              :   type MPI_enreg_type
     108              : 
     109              :     integer :: comm_shell
     110              :     integer :: comm_step
     111              :     integer :: comm_shellstep
     112              :     integer :: nproc
     113              :     integer :: nproc_shell
     114              :     integer :: nproc_step
     115              :     integer :: master
     116              :     integer :: me_shell
     117              :     integer :: me_step
     118              :     integer, allocatable :: my_nshell(:)
     119              :     integer :: my_nstep
     120              :     logical :: iam_master
     121              :     integer, allocatable :: nstep_acc(:)
     122              :     integer, allocatable :: nstep_all(:)
     123              :     integer, allocatable :: shft_step(:)
     124              :     logical, allocatable :: my_shell(:)
     125              :     logical, allocatable :: my_step(:)
     126              : 
     127              :   end type MPI_enreg_type
     128              : 
     129              :  public :: tdep_read_input
     130              :  public :: tdep_destroy_invar
     131              :  public :: tdep_init_MPIdata
     132              :  public :: tdep_destroy_mpidata
     133              : 
     134              : contains
     135              : 
     136              : !====================================================================================================
     137              : 
     138           44 :  subroutine tdep_read_input(input_path,Hist,Invar)
     139              : 
     140              : ! Arguments-------------------------------
     141              :   character(len=*), intent(in):: input_path
     142              :   type(atdep_dataset_type),intent(out) :: Invar
     143              :   type(abihist), intent(out) :: Hist
     144              : 
     145              : ! Local variables-------------------------
     146              : ! scalars
     147              :   integer :: values(8)
     148              :   integer :: ncid, ncerr, me,ierr,master
     149              :   integer :: nimage, mdtime, natom_id,nimage_id,time_id,xyz_id,six_id
     150              :   integer :: ntypat_id,iatcell
     151              :   integer :: ii,jj,shift,iatom,itypat,sum_alloy1,sum_alloy2
     152              :   integer:: lenstr, marr, jdtset, tread
     153              :   logical :: has_nimage
     154              :   double precision :: dtion,amu_average,born_average
     155              :   character (len=8) :: date
     156              :   character (len=10) :: time
     157              :   character (len=5) :: zone
     158              :   character(len=500) :: msg
     159              :   character(len=fnlen) :: input_filename,hist_filename,ddb_filename
     160              :   character(len=strlen):: string, raw_string
     161         2288 :   type(crystal_t):: crystal
     162           44 :   type(ddb_type):: ddb
     163         2288 :   type(ddb_hdr_type):: ddb_hdr
     164              : ! arrays
     165              :   character(len=3),parameter :: month_names(12)=(/'Jan','Feb','Mar','Apr','May','Jun',&
     166              : &                                                 'Jul','Aug','Sep','Oct','Nov','Dec'/)
     167           44 :   integer, allocatable:: intarr(:)
     168           44 :   integer, allocatable :: typat_unitcell_tmp(:)
     169              :   real(dp) :: zeff_average(3,3)
     170           44 :   real(dp), allocatable:: zeff_tmp(:,:,:)
     171           88 :   real(dp), allocatable :: xred_unitcell_tmp(:,:),amu_tmp(:),born_charge_tmp(:),znucl_tmp(:)
     172           44 :   real(dp), allocatable:: dprarr(:)
     173              : 
     174              : ! *********************************************************************
     175              : 
     176              : ! Define output files
     177           44 :   Invar%stdout=ab_out
     178           44 :   Invar%stdlog=std_out
     179              : 
     180              : ! Define default values
     181           44 :   Invar%nshell_max=500
     182           44 :   Invar%angle_alpha=90.d0
     183           44 :   Invar%bzpath=0
     184           44 :   Invar%order=2
     185           44 :   Invar%slice=1
     186           44 :   Invar%enunit=0
     187           44 :   Invar%together=1
     188           44 :   Invar%alloy=0
     189           44 :   Invar%ityp_alloy1=0
     190           44 :   Invar%ityp_alloy2=0
     191          132 :   Invar%nproc(:)=1
     192           44 :   Invar%bzlength=0
     193           44 :   Invar%tolread=1.d-8
     194           44 :   Invar%tolmotif=5.d-2
     195           44 :   Invar%tolinbox=5.d-2
     196           44 :   Invar%tolmatch=5.d-2
     197           44 :   Invar%dosdeltae=0.2_dp/Ha_cmm1
     198           44 :   Invar%debug=.false.
     199           44 :   Invar%loto=.false.
     200           44 :   Invar%netcdf=.false.
     201           44 :   Invar%use_ideal_positions=0
     202           44 :   Invar%use_weights=0
     203           44 :   Invar%prtphdos=1
     204           44 :   Invar%symbec=0
     205              : ! In order to have an accuracy better than 1meV
     206          176 :   Invar%ngqpt1(:)=8
     207          176 :   Invar%ngqpt2(:)=32
     208          572 :   Invar%dielt(:,:)=zero; Invar%dielt(1,1)=one; Invar%dielt(2,2)=one; Invar%dielt(3,3)=one
     209              : 
     210           44 :   master = 0
     211           44 :   me = xmpi_comm_rank(xmpi_world)
     212           44 :   if (me==master) then
     213              : 
     214           44 :     if (len_trim(input_path) == 0) then
     215              : 
     216            0 :       write(std_out, "(2a)")" DeprecationWarning: ",ch10
     217            0 :       write(std_out, "(a)") "     The files file has been deprecated in Abinit10 and will be removed in Abinit11."
     218            0 :       write(std_out, "(2a)")"     Use the syntax `atdep t01.abi` where t01.abi is an atdep input,",ch10
     219            0 :       write(std_out, "(2a)")"     and use input variables output_file, indata_prefix, outdata_prefix.",ch10
     220              : 
     221            0 :       write(Invar%stdlog,'(a)',err=10) ' Give name for input file '
     222            0 :       read(*, '(a)',err=10) input_filename
     223            0 :       if ( input_filename == "" ) input_filename='input.in'
     224            0 :       write(Invar%stdlog, '(a)',err=10) '.'//trim(input_filename)
     225              : 10     continue
     226              : !     Check if a NetCDF file is available
     227            0 :       write(Invar%stdlog,'(a)',err=11) ' Give root name for generic input files (NetCDF or ASCII)'
     228            0 :       read(*, '(a)',err=11) Invar%input_prefix
     229            0 :       write(Invar%stdlog, '(a)',err=11) '.'//trim(Invar%input_prefix)
     230              : 11     continue
     231            0 :       write(Invar%stdlog,'(a)', err=12)' Give root name for generic output files:'
     232            0 :       read (*, '(a)', err=12) Invar%output_prefix
     233            0 :       if ( Invar%output_prefix == "" ) Invar%output_prefix = 'atdep'
     234            0 :       write (Invar%stdlog, '(a)', err=12 ) '.'//trim(Invar%output_prefix)
     235              : 12     continue
     236            0 :       Invar%output_file = trim(Invar%output_prefix)//'.abo'
     237              :     else
     238           44 :       input_filename = input_path
     239              : 
     240              :       ! Read input
     241           44 :       string = repeat(" ", strlen)
     242           44 :       raw_string = repeat(" ", strlen)
     243           44 :       call instrng(input_filename, lenstr, 1, strlen, string, raw_string)
     244              :       ! To make case-insensitive, map characters to upper case.
     245           44 :       call inupper(string(1:lenstr))
     246              : 
     247           44 :       marr = 3
     248           44 :       ABI_MALLOC(intarr, (marr))
     249           44 :       ABI_MALLOC(dprarr, (marr))
     250           44 :       jdtset = 0
     251              : 
     252              :       call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), &
     253           44 :                   "indata_prefix", tread, 'KEY', key_value=Invar%input_prefix)
     254           44 :       if (tread == 0) then
     255            0 :         Invar%input_prefix = ''
     256              :       end if
     257           44 :       write(Invar%stdlog, "(2a)")"- Root name for input files: ", trim(Invar%input_prefix)
     258              : 
     259              :       call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), &
     260           44 :                   "outdata_prefix", tread, 'KEY', key_value=Invar%output_prefix)
     261           44 :       if (tread == 0) then
     262            0 :         Invar%output_prefix = 'atdep'
     263              :       end if
     264           44 :       write(Invar%stdlog, "(2a)")"- Root name for output files: ", trim(Invar%output_prefix)
     265              : 
     266              :       call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), &
     267           44 :                   "output_file", tread, 'KEY', key_value=Invar%output_file)
     268           44 :       if (tread == 0) then
     269            0 :         Invar%output_file = trim(Invar%output_prefix) // '.abo'
     270              :       end if
     271           44 :       write(Invar%stdlog, "(2a)")"- Main output file: ", trim(Invar%output_file)
     272              : 
     273           44 :       ABI_FREE(intarr)
     274           44 :       ABI_FREE(dprarr)
     275              : 
     276              :     end if
     277              : 
     278              :     ! Setup other filenames
     279           44 :     if ( Invar%input_prefix == "" ) then
     280            0 :       hist_filename='HIST.nc'
     281            0 :       ddb_filename='DDB'
     282              :     else
     283           44 :       hist_filename=trim(Invar%input_prefix)//'_HIST.nc'
     284           44 :       ddb_filename=trim(Invar%input_prefix)//'_DDB'
     285              :     end if
     286              : 
     287           44 :     open(unit=Invar%stdout,file=trim(Invar%output_file))
     288              : 
     289              :   end if !me
     290              : 
     291           44 :   call xmpi_bcast(input_filename,master,xmpi_world,ierr)
     292           44 :   call xmpi_bcast(hist_filename,master,xmpi_world,ierr)
     293           44 :   call xmpi_bcast(ddb_filename,master,xmpi_world,ierr)
     294           44 :   call xmpi_bcast(Invar%output_prefix,master,xmpi_world,ierr)
     295           44 :   call xmpi_bcast(Invar%input_prefix,master,xmpi_world,ierr)
     296              : 
     297              : #if defined HAVE_NETCDF
     298              :  !Open netCDF file
     299           44 :   ncerr=nf90_open(path=trim(hist_filename),mode=NF90_NOWRITE,ncid=ncid)
     300           44 :   if(ncerr /= NF90_NOERR) then
     301           38 :     write(Invar%stdlog,'(3a)') '-'//'Could not open ',trim(hist_filename),', starting from scratch'
     302           38 :     Invar%netcdf=.false.
     303              :   else
     304            6 :     write(Invar%stdlog,'(3a)') '-'//'Succesfully open ',trim(hist_filename),' for reading'
     305            6 :     write(Invar%stdlog,'(a)') ' Extracting information from NetCDF file...'
     306            6 :     Invar%netcdf=.true.
     307              :   end if
     308              : 
     309           44 :   if ( Invar%netcdf) then
     310              :     call get_dims_hist(ncid,Invar%natom,Invar%ntypat,nimage,mdtime,&
     311            6 : &       natom_id,ntypat_id,nimage_id,time_id,xyz_id,six_id,has_nimage)
     312           26 :     ABI_CALLOC(Invar%amu,(Invar%ntypat))
     313          682 :     ABI_CALLOC(Invar%typat,(Invar%natom))
     314           26 :     ABI_CALLOC(Invar%znucl,(Invar%ntypat))
     315            6 :     call read_csts_hist(ncid,dtion,Invar%typat,Invar%znucl,Invar%amu)
     316              : 
     317              :     ! Need to close NetCDF file because it is going to be reopened by read_md_hist
     318            6 :     ncerr = nf90_close(ncid)
     319              :     ! .false. -> Velocities note used
     320              :     ! .true. -> acell and rprimd may change (2017_04 only NVT/isoK used but maybe
     321              :     ! .false. -> read all times
     322              :     ! NPT one day ?)
     323           18 :     call read_md_hist(hist_filename,Hist,.false.,.true.,.false.)
     324              :   end if
     325              : #endif
     326              : 
     327              : ! =========================================================================== !
     328              : ! Read input file
     329              : 
     330           44 :   string = repeat(" ", strlen)
     331           44 :   raw_string = repeat(" ", strlen)
     332           44 :   call instrng(input_filename, lenstr, 1, strlen, string, raw_string)
     333              :   ! To make case-insensitive, map characters to upper case.
     334           44 :   call inupper(string(1:lenstr))
     335              : 
     336              : ! marr is the aximum array size. It is thus a hard-coded maximum value
     337              : ! for 3 * (number of atoms)
     338           44 :   marr = 9000
     339           44 :   ABI_MALLOC(intarr, (marr))
     340           44 :   ABI_MALLOC(dprarr, (marr))
     341           44 :   jdtset = 0
     342              : 
     343              : ! Mandatory input variables
     344              : ! -------------------------
     345              : 
     346              : ! Bravais lattice
     347           44 :   call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'brav', tread, 'INT')
     348           44 :   if (tread == 0) then
     349              :     write(msg,*)&
     350            0 :      'Variable "brav" is mandatory, but was not found in input file.'
     351            0 :     ABI_ERROR(msg)
     352              :   end if
     353          132 :   Invar%bravais(1:2) = intarr(1:2)
     354              : 
     355              : ! Angle alpha
     356           44 :   if ((Invar%bravais(1).eq.2).or.(Invar%bravais(1).eq.5)) then
     357            4 :     call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'angle', tread, 'DPR')
     358            4 :     if (tread == 0) then
     359              :       write(msg,*)&
     360            0 :        'Variable "angle" is mandatory for this bravais lattice,',ch10,&
     361            0 :        'but was not found in input file.'
     362            0 :       ABI_ERROR(msg)
     363              :     end if
     364            4 :     Invar%angle_alpha = dprarr(1)
     365              :   else
     366           40 :     Invar%angle_alpha=90.d0
     367              :   end if
     368              : 
     369              : ! natom_unitcell
     370           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'natom_unitcell', tread, 'INT')
     371           44 :   if (tread == 0) then
     372              :     write(msg,*)&
     373            0 :      'Variable "natom_unitcell" is mandatory, but was not found in input file.'
     374            0 :     ABI_ERROR(msg)
     375              :   end if
     376           44 :   Invar%natom_unitcell = intarr(1)
     377           44 :   if (3*Invar%natom_unitcell.gt.marr) then
     378              :     write(msg,*)&
     379            0 :      'Maximum number of atoms exceeded. Modify source code to circumvent problem.'
     380            0 :     ABI_ERROR(msg)
     381              :   end if
     382              : 
     383              : ! xred_unitcell
     384          560 :   ABI_CALLOC(Invar%xred_unitcell,(3,Invar%natom_unitcell))
     385           44 :   call intagm(dprarr, intarr, jdtset, marr, 3*Invar%natom_unitcell, string(1:lenstr), 'xred_unitcell', tread, 'DPR')
     386           44 :   if (tread == 0) then
     387              :     write(msg,*)&
     388            0 :      'Variable "xred_unitcell" is mandatory, but was not found in input file.'
     389            0 :     ABI_ERROR(msg)
     390              :   end if
     391          560 :   Invar%xred_unitcell(:,:) = reshape(dprarr(1:3*Invar%natom_unitcell),(/3,Invar%natom_unitcell/))
     392          176 :   do ii=1,3
     393          497 :     do iatcell=1,Invar%natom_unitcell
     394          453 :       if ((Invar%xred_unitcell(ii,iatcell).le.(-0.5)).or.(Invar%xred_unitcell(ii,iatcell).gt.(0.5))) then
     395            3 :         do while (Invar%xred_unitcell(ii,iatcell).le.(-0.5))
     396            0 :           Invar%xred_unitcell(ii,iatcell)=Invar%xred_unitcell(ii,iatcell)+1.d0
     397              :         end do
     398            6 :         do while (Invar%xred_unitcell(ii,iatcell).gt.(0.5))
     399            6 :           Invar%xred_unitcell(ii,iatcell)=Invar%xred_unitcell(ii,iatcell)-1.d0
     400              :         end do
     401              :       end if
     402              :     end do
     403              :   end do
     404              : 
     405              : ! typat_unitcell
     406          239 :   ABI_CALLOC(Invar%typat_unitcell,(Invar%natom_unitcell))
     407           44 :   call intagm(dprarr, intarr, jdtset, marr, Invar%natom_unitcell, string(1:lenstr), 'typat_unitcell', tread, 'INT')
     408           44 :   if (tread == 0) then
     409              :     write(msg,*)&
     410            0 :      'Variable "typat_unitcell" is mandatory, but was not found in input file.'
     411            0 :     ABI_ERROR(msg)
     412              :   end if
     413          151 :   Invar%typat_unitcell(:) = intarr(1:Invar%natom_unitcell)
     414              : 
     415           44 :   if (Invar%netcdf) then
     416           78 :     Invar%rprimd_md(:,:)=TRANSPOSE(Hist%rprimd(:,:,Hist%ihist))
     417              :   else
     418              : ! ntypat
     419           38 :     call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ntypat', tread, 'INT')
     420           38 :     if (tread == 1) then
     421           38 :       Invar%ntypat = intarr(1)
     422              :     else
     423              :       write(msg,*)&
     424            0 :        'The NetCDF file .nc is not used.',ch10,&
     425            0 :        'The variable "ntypat" is thus mandatory.',ch10,&
     426            0 :        'ACTION : Please modify your input file'
     427            0 :       ABI_ERROR(msg)
     428              :     end if
     429              : 
     430              : ! amu
     431          162 :     ABI_MALLOC(Invar%amu,(Invar%ntypat)); Invar%amu(:)=zero
     432           38 :     call intagm(dprarr, intarr, jdtset, marr, Invar%ntypat, string(1:lenstr), 'amu', tread, 'DPR')
     433           38 :     if (tread == 1) then
     434          124 :       Invar%amu = dprarr(1:Invar%ntypat)
     435              :     else
     436              :       write(msg,*)&
     437            0 :        'The NetCDF file .nc is not used.',ch10,&
     438            0 :        'The variable "amu" is thus mandatory.',ch10,&
     439            0 :        'ACTION : Please modify your input file'
     440            0 :       ABI_ERROR(msg)
     441              :     end if
     442              : 
     443              : ! rprimd_md
     444           38 :     call intagm(dprarr, intarr, jdtset, marr, 9, string(1:lenstr), 'rprimd', tread, 'LEN')
     445           38 :     if (tread == 1) then
     446          494 :       Invar%rprimd_md(:,:) = TRANSPOSE(reshape(dprarr(1:9),(/3, 3/)))
     447              :     else
     448              :       write(msg,*)&
     449            0 :        'The NetCDF file .nc is not used.',ch10,&
     450            0 :        'The variable "rprimd" is thus mandatory.',ch10,&
     451            0 :        'ACTION : Please modify your input file'
     452            0 :       ABI_ERROR(msg)
     453              :     end if
     454              : 
     455              : ! natom
     456           38 :     call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'natom', tread, 'INT')
     457           38 :     if (tread == 1) then
     458           38 :       Invar%natom = intarr(1)
     459              :     else
     460              :       write(msg,*)&
     461            0 :        'The NetCDF file .nc is not used.',ch10,&
     462            0 :        'The variable "natom" is thus mandatory.',ch10,&
     463            0 :        'ACTION : Please modify your input file'
     464            0 :       ABI_ERROR(msg)
     465              :     end if
     466              : 
     467              : ! typat
     468         6332 :     ABI_MALLOC(Invar%typat,(Invar%natom)); Invar%typat(:)=0
     469           38 :     call intagm(dprarr, intarr, jdtset, marr, Invar%natom, string(1:lenstr), 'typat', tread, 'INT')
     470           38 :     if (tread == 1) then
     471         6294 :       Invar%typat = intarr(1:Invar%natom)
     472              :     else
     473              :       write(msg,*)&
     474            0 :        'The NetCDF file .nc is not used.',ch10,&
     475            0 :        'The variable "typat" is thus mandatory.',ch10,&
     476            0 :        'ACTION : Please modify your input file'
     477            0 :       ABI_ERROR(msg)
     478              :     end if
     479              : 
     480              :   end if
     481              : 
     482              : ! multiplicity
     483           44 :   call intagm(dprarr, intarr, jdtset, marr, 9, string(1:lenstr), 'multiplicity', tread, 'DPR')
     484           44 :   if (tread == 1) then
     485          572 :     Invar%multiplicity(:,:) = TRANSPOSE(reshape(dprarr(1:9),(/3, 3/)))
     486              :   else
     487              :     write(msg,*)&
     488            0 :      'Variable "multiplicity" is mandatory, but was not found in input file.'
     489            0 :     ABI_ERROR(msg)
     490              :   end if
     491              : 
     492              : ! temperature
     493           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'temperature', tread, 'DPR')
     494           44 :   if (tread == 1) then
     495           44 :     Invar%temperature = dprarr(1)
     496              :   else
     497              :     write(msg,*)&
     498            0 :      'Variable "temperature" is mandatory, but was not found in input file.'
     499            0 :     ABI_ERROR(msg)
     500              :   end if
     501              : 
     502              : ! nstep_max
     503           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nstep_max', tread, 'INT')
     504           44 :   if (tread == 1) then
     505           44 :     Invar%nstep_max = intarr(1)
     506              :   else
     507              :     write(msg,*)&
     508            0 :      'Variable "nstep_max" is mandatory, but was not found in input file.'
     509            0 :     ABI_ERROR(msg)
     510              :   end if
     511              : 
     512              : ! nstep_min
     513           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nstep_min', tread, 'INT')
     514           44 :   if (tread == 1) then
     515           44 :     Invar%nstep_min = intarr(1)
     516              :   else
     517              :     write(msg,*)&
     518            0 :      'Variable "nstep_min" is mandatory, but was not found in input file.'
     519            0 :     ABI_ERROR(msg)
     520              :   end if
     521              : 
     522              : ! rcut
     523           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'rcut', tread, 'LEN')
     524           44 :   if (tread == 1) then
     525           44 :     Invar%rcut = dprarr(1)
     526              :   else
     527              :     write(msg,*)&
     528            0 :      'Variable "rcut" is mandatory, but was not found in input file.'
     529            0 :     ABI_ERROR(msg)
     530              :   end if
     531              : 
     532              : ! debug_mode (optional)
     533           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'debug_mode', tread, 'INT')
     534           44 :   if (tread == 1) then
     535            2 :     if (intarr(1).ne.0) Invar%debug = .true.
     536              :   end if
     537              : 
     538              : ! =========================================================================== !
     539              : ! Read DDB file if available to retrieve the Born effective charges
     540              : ! and dielectric tensor. Enforce charge neutrality by equal redistribution of excess charge
     541              : ! =========================================================================== !
     542              : 
     543              : ! symbec
     544           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'symbec', tread, 'INT')
     545           44 :   if (tread == 1) then
     546            0 :     Invar%symbec = intarr(1)
     547              :     !write(Invar%stdout,'(1x,a20,1x,i4)') ljust('symbec',20),Invar%symbec
     548              :   end if
     549              : 
     550              : 
     551          132 : ABI_MALLOC(Invar%zeff, (3,3,Invar%natom_unitcell))
     552         1435 : Invar%zeff = zero
     553              : 
     554           44 : if (file_exists(ddb_filename).or.file_exists(nctk_ncify(ddb_filename))) then
     555              : 
     556            0 :   call ddb%from_file(ddb_filename, ddb_hdr, crystal, xmpi_world, -1)
     557              :   ! TODO Check that the crystal in the DDB matches the unit cell.
     558              : 
     559            0 :   ii = ddb%get_dielt_zeff(crystal,1,1,0,Invar%dielt,Invar%zeff)
     560            0 :   if (ii/=0) Invar%loto = .true.
     561              : 
     562            0 :   call crystal%free()
     563            0 :   call ddb_hdr%free()
     564            0 :   call ddb%free()
     565              : 
     566              :   !! Take the average born effective charge for each atom.
     567           44 :   if (Invar%symbec==1) then
     568            0 :     do iatom=1,Invar%natom_unitcell
     569              :       born_average = zero
     570            0 :       do ii=1,3
     571            0 :         born_average = born_average + Invar%zeff(ii,ii,iatom)
     572              :       end do
     573            0 :       Invar%zeff(:,:,iatom) = zero
     574            0 :       do ii=1,3
     575            0 :         Invar%zeff(ii,ii,iatom) = born_average / 3
     576              :       end do
     577              :     end do
     578              :   end if
     579              : end if
     580              : 
     581              : 
     582              : ! =========================================================================== !
     583              : ! Output header and mandatory input variables
     584              : ! =========================================================================== !
     585              : 
     586              : ! Write version, copyright, date...
     587           44 :   write(Invar%stdout,*) ' '
     588              : 
     589           44 :   if (Invar%debug) then
     590            2 :     write(Invar%stdout,'(a,a,a)') '.Version ', version_string,' of ATDEP (Debug)'
     591              :   else
     592           42 :     write(Invar%stdout,'(a,a,a)') '.Version ', version_string,' of ATDEP'
     593              :   end if
     594              : 
     595           44 :   write(Invar%stdout,'(a)') '.Copyright (C) 1998-2026 ABINIT group (FB,JB,GA).'
     596           44 :   write(Invar%stdout,'(a)') ' ABINIT comes with ABSOLUTELY NO WARRANTY.'
     597           44 :   write(Invar%stdout,'(a)') ' It is free software, and you are welcome to redistribute it'
     598           44 :   write(Invar%stdout,'(a)') ' under certain conditions (GNU General Public License,'
     599           44 :   write(Invar%stdout,'(a)') ' see ~abinit/COPYING or http://www.gnu.org/copyleft/gpl.txt).'
     600           44 :   write(Invar%stdout,*) ' '
     601           44 :   write(Invar%stdout,'(a)') ' ABINIT is a project of the Universite Catholique de Louvain,'
     602           44 :   write(Invar%stdout,'(a)') ' Corning Inc. and other collaborators, see'
     603           44 :   write(Invar%stdout,'(a)') ' ~abinit/doc/developers/contributors.txt .'
     604           44 :   write(Invar%stdout,'(a)') ' Please read https://docs.abinit.org/theory/acknowledgments for suggested'
     605           44 :   write(Invar%stdout,'(a)') ' acknowledgments of the ABINIT effort.'
     606           44 :   write(Invar%stdout,'(a)') ' For more information, see http://www.abinit.org .'
     607              : 
     608           44 :   call date_and_time(date,time,zone,values)
     609           44 :   write(Invar%stdout,'(/,a,i2,1x,a,1x,i4,a)') '.Starting date : ',values(3),month_names(values(2)),values(1),'.'
     610              : 
     611           44 :   write(Invar%stdout,*) ' '
     612           44 :   write(Invar%stdout,*) '#############################################################################'
     613           44 :   write(Invar%stdout,*) '######################### ECHO OF INPUT FILE ################################'
     614           44 :   write(Invar%stdout,*) '#############################################################################'
     615              : 
     616           44 :   write(Invar%stdout,'(a)') ' ======================= Define the unitcell ================================='
     617           44 :   write(Invar%stdout,'(1x,a20,1x,i4,1x,i4)') ljust('brav',20),Invar%bravais(1),Invar%bravais(2)
     618           44 :   if ((Invar%bravais(1).eq.2).or.(Invar%bravais(1).eq.5)) then
     619            4 :     write(Invar%stdout,'(1x,a20,1x,f15.10)') 'angle',Invar%angle_alpha
     620              :   end if
     621           44 :   write(Invar%stdout,'(1x,a20,1x,i4)') ljust('natom_unitcell',20),Invar%natom_unitcell
     622           44 :   write(Invar%stdout,'(1x,a20)') ljust('xred_unitcell',20)
     623          151 :   do ii=1,Invar%natom_unitcell
     624          472 :     write(Invar%stdout,'(22x,3(f15.10,1x))') (Invar%xred_unitcell(jj,ii), jj=1,3)
     625              :   end do
     626          151 :   write(Invar%stdout,'(1x,a20,20(1x,i4))') ljust('typat_unitcell',20),(Invar%typat_unitcell(jj),jj=1,Invar%natom_unitcell)
     627           44 :   write(Invar%stdout,'(1x,a20,1x,i4)') ljust('ntypat',20),Invar%ntypat
     628          100 :   write(Invar%stdout,'(1x,a20,20(1x,f15.10))') ljust('amu',20),(Invar%amu(jj),jj=1,Invar%ntypat)
     629              : 
     630              : ! znucl (optional)
     631           44 :   if (.not.Invar%netcdf) then
     632           38 :     call intagm(dprarr, intarr, jdtset, marr, Invar%ntypat, string(1:lenstr), 'znucl', tread, 'DPR')
     633           38 :     if (tread == 1) then
     634          162 :       ABI_MALLOC(Invar%znucl,(Invar%ntypat)); Invar%znucl(:)=zero
     635          124 :       Invar%znucl = dprarr(1:Invar%ntypat)
     636           86 :       write(Invar%stdout,'(1x,a20,20(1x,f15.10))') ljust('znucl',20),(Invar%znucl(jj),jj=1,Invar%ntypat)
     637              :     end if
     638              :   end if
     639              : 
     640              : 
     641           44 :   write(Invar%stdout,'(a)') ' ======================= Define the supercell ================================'
     642           44 :   write(Invar%stdout,'(1x,a20)') ljust('rprimd',20)
     643          176 :   do ii=1,3
     644          572 :     write(Invar%stdout,'(22x,3(f15.10,1x))') (Invar%rprimd_md(ii,jj),jj=1,3)
     645              :   end do
     646           44 :   write(Invar%stdout,'(1x,a20)') ljust('multiplicity',20)
     647          176 :   do ii=1,3
     648          572 :     write(Invar%stdout,'(22x,3(f15.10,1x))') (Invar%multiplicity(ii,jj),jj=1,3)
     649              :   end do
     650           44 :   write(Invar%stdout,'(1x,a20,1x,i4)') ljust('natom',20),Invar%natom
     651           44 :   write(Invar%stdout,'(1x,a20)') ljust('typat',20)
     652          750 :   do ii=1,Invar%natom,10
     653          750 :     if (ii+9.lt.Invar%natom) then
     654         7282 :       write(Invar%stdout,'(22x,10(i4,1x))') (Invar%typat(ii+jj-1),jj=1,10)
     655              :     else
     656          306 :       write(Invar%stdout,'(22x,10(i4,1x))') (Invar%typat(jj),jj=ii,Invar%natom)
     657              :     end if
     658              :   end do
     659              : 
     660           44 :   write(Invar%stdout,'(a)') ' ======================= Define computational details ========================'
     661           44 :   write(Invar%stdout,'(1x,a20,1x,i5)') ljust('nstep_max',20),Invar%nstep_max
     662           44 :   write(Invar%stdout,'(1x,a20,1x,i5)') ljust('nstep_min',20),Invar%nstep_min
     663           44 :   write(Invar%stdout,'(1x,a20,1x,f15.10)') ljust('rcut',20),Invar%rcut
     664           44 :   write(Invar%stdout,'(1x,a20,1x,f15.10)') ljust('temperature',20),Invar%temperature
     665              : 
     666              : 
     667              : ! =========================================================================== !
     668              : ! Optional input variables
     669              : ! TODO separate reading optional input variables from writing in the output.
     670              : 
     671           44 :   write(Invar%stdout,'(a)') ' ======================= Optional input variables ============================'
     672              : 
     673              : ! prtphdos
     674           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtphdos', tread, 'INT')
     675           44 :   if (tread == 1) then
     676            0 :     Invar%prtphdos = intarr(1)
     677            0 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('prtphdos',20),Invar%use_ideal_positions
     678              :   end if
     679              : 
     680              : ! dosdeltae
     681           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dosdeltae', tread, 'ENE')
     682           44 :   if (tread == 1) then
     683            0 :     Invar%dosdeltae = dprarr(1)
     684            0 :     write(Invar%stdout,'(1x,a20,1x,f15.10)') ljust('dosdeltae',20),Invar%dosdeltae
     685              :   end if
     686              : 
     687              : ! use_ideal_positions
     688           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'use_ideal_positions', tread, 'INT')
     689           44 :   if (tread == 1) then
     690           40 :     Invar%use_ideal_positions = intarr(1)
     691           40 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('use_ideal_positions',20),Invar%use_ideal_positions
     692              :   end if
     693              : 
     694              : ! born_charge
     695           44 :   call intagm(dprarr, intarr, jdtset, marr, Invar%ntypat, string(1:lenstr), 'born_charge', tread, 'DPR')
     696           44 :   if (tread == 1) then
     697            5 :     Invar%loto=.true.
     698           25 :     ABI_MALLOC(born_charge_tmp,(Invar%ntypat)) ; born_charge_tmp(:) = zero
     699           15 :     born_charge_tmp(:) = dprarr(1:Invar%ntypat)
     700          148 :     Invar%zeff(:,:,:) = zero
     701           16 :     do iatom=1,Invar%natom_unitcell
     702           11 :       itypat = Invar%typat_unitcell(iatom)
     703           49 :       do ii=1,3
     704           44 :         Invar%zeff(ii,ii,iatom) = born_charge_tmp(itypat)
     705              :       end do
     706              :     end do
     707              :     ! GA: TODO eventually change the way this is reported
     708            5 :     write(Invar%stdout,'(1x,a20,20(1x,f15.10))') ljust('born_charge',20),(born_charge_tmp(jj),jj=1,Invar%ntypat)
     709            5 :     ABI_FREE(born_charge_tmp)
     710              :   end if
     711              : 
     712              : ! dielec_constant
     713           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dielec_constant', tread, 'DPR')
     714           44 :   if (tread == 1) then
     715           20 :     do ii=1,3
     716           20 :       Invar%dielt(ii,ii) = dprarr(1)
     717              :     end do
     718            5 :     write(Invar%stdout,'(1x,a20,1x,f15.10)') ljust('dielec_constant',20),Invar%dielt(1,1)
     719              :   end if
     720              : 
     721              : ! bzpath
     722           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'bzpath', tread, 'INT')
     723           44 :   if (tread == 1) then
     724           10 :     Invar%bzpath = intarr(1)
     725           10 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('bzpath',20),Invar%bzpath
     726              : 
     727           10 :     if (Invar%bzpath.lt.0) then
     728            0 :       ABI_MALLOC(Invar%qpt,(3,abs(Invar%bzpath))); Invar%qpt(:,:)=zero
     729              : 
     730            0 :       call intagm(dprarr, intarr, jdtset, marr, 1+3*abs(Invar%bzpath), string(1:lenstr), 'bzpath', tread, 'DPR')
     731            0 :       Invar%qpt(:,:) = reshape(dprarr(2:1+3*abs(Invar%bzpath)), (/3,abs(Invar%bzpath)/))
     732              : 
     733            0 :       write(Invar%stdout,'(a)') ' Q points as given in the input file:'
     734            0 :       do jj=1,abs(Invar%bzpath)
     735            0 :         write(Invar%stdout,'(22x,3(f15.10,1x))') Invar%qpt(:,jj)
     736              :       end do
     737              : 
     738           10 :     else if (Invar%bzpath.gt.0) then
     739           20 :       ABI_MALLOC(Invar%special_qpt,(Invar%bzpath))
     740           10 :       call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'special_qpt', tread, 'KEY', key_value=msg)
     741           10 :       if (tread == 1) then
     742           10 :         jj = 1
     743           64 :         do ii=1,Invar%bzpath
     744           54 :           Invar%special_qpt(ii) = "  "
     745           64 :           ierr = next_token(msg,jj,Invar%special_qpt(ii))
     746              :           !jj = 2*ii-1
     747              :           !Invar%special_qpt(ii) = msg(jj:jj)
     748              :         end do
     749           10 :         write(Invar%stdout,'(a,1x,a2,10("-",a2))') ' Special q-points: ',Invar%special_qpt(:)
     750              :       else
     751              :         write(msg,*)&
     752            0 :          'Variable bzpath > 0, but variable "special_qpt" was not found in input file.'
     753            0 :         ABI_ERROR(msg)
     754              :       end if
     755              :     end if
     756              :   end if
     757              : 
     758              : ! order
     759           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'order', tread, 'INT')
     760           44 :   if (tread == 1) then
     761           14 :     Invar%order = intarr(1)
     762           14 :     if (Invar%order.eq.3) then
     763            6 :       call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'order', tread, 'DPR')
     764            6 :       Invar%rcut3 = dprarr(2)
     765            6 :       write(Invar%stdout,'(1x,a20,1x,i4,1x,f15.10)') ljust('order',20),Invar%order,Invar%rcut3
     766            6 :       if (Invar%rcut3.gt.Invar%rcut) then
     767            0 :         ABI_ERROR('The cutoff radius of the third order cannot be greater than the second order one.')
     768              :       end if
     769            8 :     else if (Invar%order.eq.4) then
     770            8 :       call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'order', tread, 'DPR')
     771            8 :       Invar%rcut3 = dprarr(2)
     772            8 :       Invar%rcut4 = dprarr(3)
     773            8 :       write(Invar%stdout,'(1x,a20,1x,i4,2(1x,f15.10))') ljust('order',20),Invar%order,Invar%rcut3,Invar%rcut4
     774            8 :       if (Invar%rcut4.gt.Invar%rcut) then
     775            0 :         ABI_ERROR('The cutoff radius of the fourth order cannot be greater than the second order one.')
     776              :       end if
     777              :     else
     778            0 :       ABI_ERROR('Only the 3rd and 4th orders are allowed. Change your input file.')
     779              :     end if
     780              :   end if
     781              : 
     782              : ! slice
     783           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'slice', tread, 'INT')
     784           44 :   if (tread == 1) then
     785            2 :     Invar%slice = intarr(1)
     786            2 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('slice',20),Invar%slice
     787              :   end if
     788              : 
     789              : ! enunit
     790           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'enunit', tread, 'INT')
     791           44 :   if (tread == 1) then
     792           36 :     Invar%enunit = intarr(1)
     793           36 :     if (Invar%enunit.eq.0) write(Invar%stdout,'(1x,a20,1x,i4,1x,a)') ljust('enunit',20),Invar%enunit,'(Phonon frequencies in meV)'
     794           36 :     if (Invar%enunit.eq.1) write(Invar%stdout,'(1x,a20,1x,i4,1x,a)') ljust('enunit',20),Invar%enunit,'(Phonon frequencies in cm-1)'
     795           36 :     if (Invar%enunit.eq.2) write(Invar%stdout,'(1x,a20,1x,i4,1x,a)') ljust('enunit',20),Invar%enunit,'(Phonon frequencies in mHa)'
     796           36 :     if (Invar%enunit.eq.3) write(Invar%stdout,'(1x,a20,1x,i4,1x,a)') ljust('enunit',20),Invar%enunit,'(Phonon frequencies in THz)'
     797              :   end if
     798              : 
     799              : ! nproc
     800           44 :   call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'nproc', tread, 'INT')
     801           44 :   if (tread == 1) then
     802            0 :     Invar%nproc(1:2) = intarr(1:2)
     803            0 :     write(Invar%stdout,'(1x,a20,1x,i4,1x,i4)') ljust('nproc',20),Invar%nproc(1),Invar%nproc(2)
     804              :   end if
     805              : 
     806              : ! readifc
     807           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'readifc', tread, 'INT')
     808           44 :   if (tread == 1) then
     809            3 :     Invar%readifc = intarr(1)
     810            3 :     if (Invar%readifc.eq.1) then
     811            1 :       call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'readifc', tread, 'DPR')
     812            1 :       Invar%tolread = dprarr(1)
     813            1 :       write(Invar%stdout,'(1x,a20,1x,i4,1x,f15.10)') ljust('readifc',20),Invar%readifc,Invar%tolread
     814              :     else
     815            2 :       write(Invar%stdout,'(1x,a20,1x,i4)') ljust('readifc',20),Invar%readifc
     816              :     end if
     817              :   end if
     818              : 
     819              : ! alloy
     820           44 :   call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'alloy', tread, 'INT')
     821           44 :   if (tread == 1) then
     822            1 :     Invar%alloy = intarr(1)
     823            1 :     Invar%ityp_alloy1 = intarr(2)
     824            1 :     Invar%ityp_alloy2 = intarr(3)
     825            1 :     write(Invar%stdout,'(1x,a20,1x,3(i4,1x))') ljust('alloy',20),Invar%alloy,Invar%ityp_alloy1,Invar%ityp_alloy2
     826              :   end if
     827              : 
     828              : ! together
     829           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'together', tread, 'INT')
     830           44 :   if (tread == 1) then
     831            1 :     Invar%together = intarr(1)
     832            1 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('together',20),Invar%together
     833              :   end if
     834              : 
     835              : ! bzlength
     836           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'bzlength', tread, 'INT')
     837           44 :   if (tread == 1) then
     838            2 :     Invar%bzlength = intarr(1)
     839            2 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('bzlength',20),Invar%bzlength
     840            6 :     ABI_MALLOC(Invar%lgth_segments,(Invar%bzlength))
     841            2 :     call intagm(dprarr, intarr, jdtset, marr, 1+Invar%bzlength, string(1:lenstr), 'bzlength', tread, 'DPR')
     842           14 :     Invar%lgth_segments = dprarr(2:1+Invar%bzlength)
     843            2 :     write(Invar%stdout,'(a,1x,i3,10("-",i3))') ' Length of BZ : ',Invar%lgth_segments(:)
     844              :   end if
     845              : 
     846              : ! ngqpt1
     847           44 :   call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'ngqpt1', tread, 'INT')
     848           44 :   if (tread == 1) then
     849           44 :     Invar%ngqpt1 = intarr(1:3)
     850           11 :     write(Invar%stdout,'(1x,a20,1x,3(i4,1x))') ljust('ngqpt1',20),Invar%ngqpt1(:)
     851              :   end if
     852              : 
     853              : ! ngqpt2
     854           44 :   call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'ngqpt2', tread, 'INT')
     855           44 :   if (tread == 1) then
     856           48 :     Invar%ngqpt2 = intarr(1:3)
     857           12 :     write(Invar%stdout,'(1x,a20,1x,3(i4,1x))') ljust('ngqpt2',20),Invar%ngqpt2(:)
     858              :   end if
     859              : 
     860              : ! tolmotifinboxmatch
     861              :   !call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'tolmotifinboxmatch', tread, 'DPR')
     862              :   !if (tread == 1) then
     863              :   !  Invar%tolmotif = dprarr(1)
     864              :   !  Invar%tolinbox = dprarr(2)
     865              :   !  Invar%tolmatch = dprarr(3)
     866              :   !  write(Invar%stdout,'(1x,a20,f10.5)') ljust('tolmotif',20),Invar%tolmotif
     867              :   !  write(Invar%stdout,'(1x,a20,f10.5)') ljust('tolinbox',20),Invar%tolinbox
     868              :   !  write(Invar%stdout,'(1x,a20,f10.5)') ljust('tolmatch',20),Invar%tolmatch
     869              :   !end if
     870              : 
     871           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'tolmotif', tread, 'DPR')
     872           44 :   if (tread == 1) then
     873            4 :     Invar%tolmotif = dprarr(1)
     874            4 :     write(Invar%stdout,'(1x,a20,f10.5)') ljust('tolmotif',20),Invar%tolmotif
     875              :   end if
     876              : 
     877           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'tolinbox', tread, 'DPR')
     878           44 :   if (tread == 1) then
     879            4 :     Invar%tolinbox = dprarr(1)
     880            4 :     write(Invar%stdout,'(1x,a20,f10.5)') ljust('tolinbox',20),Invar%tolinbox
     881              :   end if
     882              : 
     883           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'tolmatch', tread, 'DPR')
     884           44 :   if (tread == 1) then
     885            4 :     Invar%tolmatch = dprarr(1)
     886            4 :     write(Invar%stdout,'(1x,a20,f10.5)') ljust('tolmatch',20),Invar%tolmatch
     887              :   end if
     888              : 
     889              : ! use_weights
     890           44 :   call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'use_weights', tread, 'INT')
     891           44 :   if (tread == 1) then
     892            1 :     Invar%use_weights = intarr(1)
     893            1 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('use_weights',20),Invar%use_weights
     894              :   end if
     895              : 
     896           44 :   ABI_FREE(intarr)
     897           44 :   ABI_FREE(dprarr)
     898              : 
     899              : ! =========================================================================== !
     900              : ! Output other information and perform some checks
     901              : 
     902           44 :   if (Invar%use_ideal_positions.eq.0) then
     903           10 :     write(Invar%stdout,'(a)') ' USE AVERAGE POSITIONS TO COMPUTE SPECTRUM'
     904           34 :   else if (Invar%use_ideal_positions.eq.1) then
     905           34 :     write(Invar%stdout,'(a)') ' USE IDEAL POSITIONS TO COMPUTE SPECTRUM'
     906              :   else
     907            0 :     write(Invar%stdout,'(a)') ' STOP: THIS VALUE IS NOT ALLOWED FOR use_ideal_positions'
     908              :   end if
     909           44 :   if (Invar%loto) write(Invar%stdout,'(a)') ' USE NON-ANALYTICAL CORRECTIONS (LO-TO)'
     910              : 
     911              : ! Allowed values
     912           44 :   if ((Invar%together.ne.1).and.(Invar%together.ne.0)) then
     913            0 :     ABI_ERROR('STOP: The value of input variable TOGETHER is not allowed')
     914              :   end if
     915           44 :   if ((Invar%alloy.ne.1).and.(Invar%alloy.ne.0)) then
     916            0 :     ABI_ERROR('STOP: The value of input variable ALLOY is not allowed')
     917              :   end if
     918           44 :   if (Invar%alloy.ge.1) then
     919              :     if ((Invar%ityp_alloy1.lt.1).or.(Invar%ityp_alloy2.lt.1).or.&
     920            1 : &       (Invar%ityp_alloy1.gt.Invar%natom_unitcell).or.(Invar%ityp_alloy2.gt.Invar%natom_unitcell)) then
     921            0 :       ABI_ERROR('STOP: The value of input variables IALLOY are not allowed')
     922              :     end if
     923              :   end if
     924              : 
     925              : ! Incompatible variables :
     926           44 :   if ((Invar%readifc.eq.1).and.(Invar%together.eq.1).and.(Invar%order.gt.2)) then
     927            0 :     ABI_ERROR('STOP: readifc=1, together=1 and order=3 or 4 are incompatible')
     928              :   end if
     929              : 
     930              : ! =========================================================================== !
     931              : ! Treat virtual crystal approximation (VCA) when alloy=1.
     932              : ! Redefine all the data depending on (n)typat(_unitcell) and natom_unitcell
     933              : 
     934              : ! The mixing of zeff will only work for the isotropic case,
     935              : ! that is, if it was specified with input variables born_charge
     936              : 
     937           44 :   if (Invar%alloy.eq.1) then
     938            1 :     sum_alloy1=0
     939            1 :     sum_alloy2=0
     940          129 :     do iatom=1,Invar%natom
     941          128 :       if (Invar%typat(iatom).eq.Invar%ityp_alloy1) then
     942           96 :         sum_alloy1=sum_alloy1+1
     943              :       end if
     944          129 :       if (Invar%typat(iatom).eq.Invar%ityp_alloy2) then
     945           32 :         sum_alloy2=sum_alloy2+1
     946              :       end if
     947              :     end do
     948              :     amu_average   =(Invar%amu(Invar%ityp_alloy1)*sum_alloy1+&
     949            1 : &                   Invar%amu(Invar%ityp_alloy2)*sum_alloy2)/(sum_alloy1+sum_alloy2)
     950            1 :     if (Invar%loto) then
     951            0 :       zeff_average(:,:) = zero
     952            0 :       do iatom=1,Invar%natom_unitcell
     953            0 :         if (Invar%typat_unitcell(iatom).eq.Invar%ityp_alloy1) then
     954            0 :           zeff_average(:,:) = zeff_average(:,:) + Invar%zeff(:,:,iatom) * sum_alloy1
     955              :           exit
     956              :         end if
     957              :       end do
     958            0 :       do iatom=1,Invar%natom_unitcell
     959            0 :         if (Invar%typat_unitcell(iatom).eq.Invar%ityp_alloy2) then
     960            0 :           zeff_average(:,:) = zeff_average(:,:) + Invar%zeff(:,:,iatom) * sum_alloy2
     961              :           exit
     962              :         end if
     963              :       end do
     964            0 :       zeff_average(:,:) = zeff_average(:,:) / (sum_alloy1 + sum_alloy2)
     965            0 :       do iatom=1,Invar%natom_unitcell
     966            0 :         if (Invar%typat_unitcell(iatom).eq.min(Invar%ityp_alloy1,Invar%ityp_alloy2)) then
     967            0 :           Invar%zeff(:,:,iatom) = zeff_average(:,:)
     968              :         end if
     969              :       end do
     970              :     end if
     971            1 :     shift=0
     972            3 :     do iatom=1,Invar%natom_unitcell
     973            3 :       if (Invar%typat_unitcell(iatom).lt.max(Invar%ityp_alloy1,Invar%ityp_alloy2)) then
     974            1 :         Invar%typat_unitcell (iatom-shift)=Invar%typat_unitcell (iatom)
     975            4 :         Invar%xred_unitcell(:,iatom-shift)=Invar%xred_unitcell(:,iatom)
     976            1 :         if (Invar%loto) then
     977            0 :           Invar%zeff(:,:,iatom-shift) = Invar%zeff(:,:,iatom)
     978              :         end if
     979            1 :       else if (Invar%typat_unitcell(iatom).eq.max(Invar%ityp_alloy1,Invar%ityp_alloy2)) then
     980            1 :         shift=shift+1
     981              :       else if (Invar%typat_unitcell(iatom).gt.max(Invar%ityp_alloy1,Invar%ityp_alloy2)) then
     982            0 :         Invar%typat_unitcell (iatom-shift)=Invar%typat_unitcell (iatom) - 1
     983            0 :         Invar%xred_unitcell(:,iatom-shift)=Invar%xred_unitcell(:,iatom)
     984            0 :         if (Invar%loto) then
     985            0 :           Invar%zeff(:,:,iatom-shift) = Invar%zeff(:,:,iatom)
     986              :         end if
     987              :       end if
     988              :     end do
     989            1 :     Invar%natom_unitcell=Invar%natom_unitcell-shift
     990          129 :     do iatom=1,Invar%natom
     991          129 :       if (Invar%typat(iatom).ge.max(Invar%ityp_alloy1,Invar%ityp_alloy2)) then
     992           32 :         Invar%typat(iatom)=Invar%typat(iatom) - 1
     993              :       end if
     994              :     end do
     995            3 :     do itypat=1,Invar%ntypat
     996            3 :       if (itypat.eq.min(Invar%ityp_alloy1,Invar%ityp_alloy2)) then
     997            1 :         Invar%amu          (itypat)=amu_average
     998            1 :       else if (itypat.gt.max(Invar%ityp_alloy1,Invar%ityp_alloy2)) then
     999            0 :         Invar%amu          (itypat-1)=Invar%amu        (itypat)
    1000              :       end if
    1001              :     end do
    1002            1 :     Invar%ntypat=Invar%ntypat-1
    1003            3 :     ABI_MALLOC(typat_unitcell_tmp,(  Invar%natom_unitcell))
    1004            3 :     ABI_MALLOC(xred_unitcell_tmp ,(3,Invar%natom_unitcell))
    1005            3 :     ABI_MALLOC(amu_tmp           ,(  Invar%ntypat))
    1006            1 :     if (Invar%loto) then
    1007            0 :       ABI_MALLOC(zeff_tmp        ,(3,3,Invar%natom_unitcell))
    1008              :     end if
    1009            2 :     typat_unitcell_tmp (:)=Invar%typat_unitcell(1:Invar%natom_unitcell)
    1010            5 :     xred_unitcell_tmp(:,:)=Invar%xred_unitcell(:,1:Invar%natom_unitcell)
    1011            2 :     amu_tmp            (:)=Invar%amu(1:Invar%ntypat)
    1012            1 :     if (Invar%loto) then
    1013            0 :       zeff_tmp(:,:,:) = Invar%zeff(:,:,1:Invar%natom_unitcell)
    1014              :     end if
    1015            3 :     ABI_REMALLOC(Invar%typat_unitcell,(  Invar%natom_unitcell))
    1016            3 :     ABI_REMALLOC(Invar%xred_unitcell ,(3,Invar%natom_unitcell))
    1017            3 :     ABI_REMALLOC(Invar%amu           ,(  Invar%ntypat))
    1018            3 :     ABI_REMALLOC(Invar%zeff          ,(3,3,Invar%natom_unitcell))
    1019            2 :     Invar%typat_unitcell (:)=typat_unitcell_tmp (:)
    1020            5 :     Invar%xred_unitcell(:,:)=xred_unitcell_tmp(:,:)
    1021            2 :     Invar%amu            (:)=amu_tmp            (:)
    1022            1 :     if (Invar%loto) then
    1023            0 :       Invar%zeff(:,:,:)     =zeff_tmp(:,:,:)
    1024              :     end if
    1025            1 :     if (allocated(Invar%znucl)) then
    1026            3 :       ABI_MALLOC(znucl_tmp,(Invar%ntypat))
    1027            2 :       znucl_tmp(:) = Invar%znucl(1:Invar%ntypat)
    1028            3 :       ABI_REMALLOC(Invar%znucl,(Invar%ntypat))
    1029            2 :       Invar%znucl(:) = znucl_tmp(:)
    1030            1 :       ABI_FREE(znucl_tmp)
    1031              :     end if
    1032            1 :     ABI_FREE(typat_unitcell_tmp)
    1033            1 :     ABI_FREE(xred_unitcell_tmp)
    1034            1 :     ABI_FREE(amu_tmp)
    1035            1 :     if (Invar%loto) then
    1036            0 :       ABI_FREE(zeff_tmp)
    1037              :     end if
    1038              : 
    1039            1 :     write(Invar%stdout,'(a)') ' ==================== Virtual Crystal Approximation =========================='
    1040            1 :     write(Invar%stdout,'(a)') ' ================ Several input variables are modified ======================='
    1041            1 :     write(Invar%stdout,'(a)') ' --> Beginning of the modifications'
    1042            1 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('ntypat',20),Invar%ntypat
    1043            1 :     write(Invar%stdout,'(1x,a20,1x,i4)') ljust('natom_unitcell',20),Invar%natom_unitcell
    1044            2 :     write(Invar%stdout,'(1x,a20,20(1x,f15.10))') ljust('amu',20),(Invar%amu(jj),jj=1,Invar%ntypat)
    1045            2 :     write(Invar%stdout,'(1x,a20,20(1x,i4))') ljust('typat_unitcell',20),(Invar%typat_unitcell(jj),jj=1,Invar%natom_unitcell)
    1046            1 :     write(Invar%stdout,'(1x,a20)') ljust('xred_unitcell',20)
    1047            2 :     do ii=1,Invar%natom_unitcell
    1048            5 :       write(Invar%stdout,'(22x,3(f15.10,1x))') (Invar%xred_unitcell(jj,ii), jj=1,3)
    1049              :     end do
    1050            1 :     if (Invar%loto) then
    1051              :       ! GA: TODO eventually change the way this is reported
    1052              :       ! At the moment it is inconsistent with previous report.
    1053            0 :       write(Invar%stdout,'(1x,a20,20(1x,f15.10))') ljust('born_charge',20),(Invar%zeff(1,1,jj),jj=1,Invar%natom_unitcell)
    1054              :     end if
    1055            1 :     write(Invar%stdout,'(1x,a20)') ljust('typat',20)
    1056           14 :     do ii=1,Invar%natom,10
    1057           14 :       if (ii+9.lt.Invar%natom) then
    1058          132 :         write(Invar%stdout,'(22x,10(i4,1x))') (Invar%typat(ii+jj-1),jj=1,10)
    1059              :       else
    1060            9 :         write(Invar%stdout,'(22x,10(i4,1x))') (Invar%typat(jj),jj=ii,Invar%natom)
    1061              :       end if
    1062              :     end do
    1063            1 :     write(Invar%stdout,'(a)') ' --> End of the modifications'
    1064            1 :     write(Invar%stdout,'(a)') ' '
    1065              :   end if
    1066              : 
    1067              : ! Compute Nstep as a function of the slice
    1068           44 :   Invar%nstep_tot=int(float(Invar%nstep_max-Invar%nstep_min)/float(Invar%slice)+1)
    1069           44 :   write(Invar%stdlog,*) 'nstep_tot=',Invar%nstep_tot
    1070              : 
    1071              : 
    1072           88 :  end subroutine tdep_read_input
    1073              : 
    1074              : !====================================================================================================
    1075           44 :  subroutine tdep_destroy_invar(Invar)
    1076              : 
    1077              :   type(atdep_dataset_type), intent(inout) :: Invar
    1078              : 
    1079           44 :   ABI_FREE(Invar%amu)
    1080           44 :   ABI_FREE(Invar%typat)
    1081           44 :   ABI_FREE(Invar%xred_unitcell)
    1082           44 :   ABI_FREE(Invar%typat_unitcell)
    1083           44 :   if (Invar%bzpath.lt.0) then
    1084            0 :     ABI_FREE(Invar%qpt)
    1085           44 :   else if (Invar%bzpath.gt.0) then
    1086           10 :     ABI_FREE(Invar%special_qpt)
    1087              :     end if
    1088           44 :   if (Invar%bzlength.gt.0) then
    1089            2 :     ABI_FREE(Invar%lgth_segments)
    1090              :   end if
    1091           44 :   ABI_SFREE(Invar%zeff)
    1092           44 :   ABI_SFREE(Invar%znucl)
    1093              : 
    1094           44 :  end subroutine tdep_destroy_invar
    1095              : 
    1096              : !====================================================================================================
    1097              : 
    1098           44 :  subroutine tdep_init_MPIdata(Invar,MPIdata)
    1099              : 
    1100              :   type(atdep_dataset_type), intent(inout) :: Invar
    1101              :   type(MPI_enreg_type), intent(out) :: MPIdata
    1102              :   integer :: ii,remain,ierr,iproc,istep
    1103           44 :   integer, allocatable :: tab_step(:)
    1104              :   character(len=500) :: message
    1105              : 
    1106              : #if defined HAVE_MPI
    1107              :   integer :: dimcart,commcart_2d,me_cart_2d
    1108              :   logical :: reorder
    1109           44 :   integer,allocatable :: coords(:),sizecart(:)
    1110           44 :   logical,allocatable :: periode(:), keepdim(:)
    1111              : #endif
    1112              : 
    1113              : ! Check the number of processors
    1114           44 :   MPIdata%nproc_shell=Invar%nproc(1)
    1115           44 :   MPIdata%nproc_step =Invar%nproc(2)
    1116           44 :   MPIdata%nproc = xmpi_comm_size(xmpi_world)
    1117           44 :   if (MPIdata%nproc_step*MPIdata%nproc_shell.ne.MPIdata%nproc) then
    1118            0 :     ABI_WARNING('The parallelization is performed over steps')
    1119            0 :     MPIdata%nproc_step = xmpi_comm_size(xmpi_world)
    1120              :   end if
    1121              : 
    1122           44 :   MPIdata%master         = 0
    1123           44 :   MPIdata%iam_master     =.false.
    1124              : ! Initialize the MPIdata datastructure for sequential calculation
    1125           44 :   if (MPIdata%nproc.eq.1) then
    1126           44 :     MPIdata%comm_shell     = xmpi_comm_null
    1127           44 :     MPIdata%comm_step      = xmpi_comm_null
    1128           44 :     MPIdata%comm_shellstep = xmpi_comm_null
    1129           44 :     MPIdata%me_shell       = 0
    1130           44 :     MPIdata%me_step        = 0
    1131           44 :     MPIdata%my_nstep       = Invar%nstep_tot
    1132           44 :     MPIdata%iam_master     = (MPIdata%me_step == MPIdata%master)
    1133              :   end if
    1134              : 
    1135              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1136              : !!!!!!!!!!!!!!!!!!!!!! Parallel calculation !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1137              : !!!!!!!!!!!!!! Definition of the processor grid !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1138              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1139              : #if defined HAVE_MPI
    1140              : !FB  if (MPIdata%nproc.eq.1) return
    1141              : 
    1142              : ! Create the global cartesian 2D-communicator
    1143           44 :   dimcart=2
    1144           44 :   ABI_MALLOC(sizecart,(dimcart))
    1145           44 :   ABI_MALLOC(periode,(dimcart))
    1146           44 :   sizecart(1)=MPIdata%nproc_shell ! MPIdata%nproc_shell
    1147           44 :   sizecart(2)=MPIdata%nproc_step  ! MPIdata%nproc_step
    1148          132 :   periode(:)=.false.;reorder=.false.
    1149           44 :   call MPI_CART_CREATE(xmpi_world,dimcart,sizecart,periode,reorder,commcart_2d,ierr)
    1150           44 :   ABI_FREE(periode)
    1151           44 :   ABI_FREE(sizecart)
    1152              : 
    1153              : ! Find the index and coordinates of the current processor
    1154           44 :   call MPI_COMM_RANK(commcart_2d,me_cart_2d,ierr)
    1155          132 :   ABI_MALLOC(coords,(dimcart))
    1156           44 :   call MPI_CART_COORDS(commcart_2d,me_cart_2d,dimcart,coords,ierr)
    1157           44 :   MPIdata%me_shell=coords(1)
    1158           44 :   MPIdata%me_step =coords(2)
    1159           44 :   ABI_FREE(coords)
    1160           44 :   if ((MPIdata%me_shell == MPIdata%master).and.(MPIdata%me_step == MPIdata%master)) then
    1161           44 :     MPIdata%iam_master = .true.
    1162              :   end if
    1163              : 
    1164          132 :   ABI_MALLOC(keepdim,(dimcart))
    1165              : ! Create the communicator for shell distribution
    1166           44 :   keepdim(1)=.true.
    1167           44 :   keepdim(2)=.false.
    1168           44 :   call MPI_CART_SUB(commcart_2d,keepdim,MPIdata%comm_shell,ierr)
    1169              : ! Create the communicator for step distribution
    1170           44 :   keepdim(1)=.false.
    1171           44 :   keepdim(2)=.true.
    1172           44 :   call MPI_CART_SUB(commcart_2d,keepdim,MPIdata%comm_step,ierr)
    1173              : ! Create the communicator for shellstep distribution
    1174           44 :   keepdim(1)=.true.
    1175           44 :   keepdim(2)=.true.
    1176           44 :   call MPI_CART_SUB(commcart_2d,keepdim,MPIdata%comm_shellstep,ierr)
    1177           44 :   ABI_FREE(keepdim)
    1178           44 :   call xmpi_comm_free(commcart_2d)
    1179              : 
    1180              : ! Write some data
    1181           44 :   write(message,'(a21,2(1x,i4))') '-Number of processors',MPIdata%nproc_shell,MPIdata%nproc_step
    1182           44 :   call wrtout(Invar%stdout,message,'COLL')
    1183              : !FB  write(message,'(a,2i5)') 'me_shell and me_step : ',MPIdata%me_shell,MPIdata%me_step
    1184              : !FB  call wrtout(Invar%stdout,message,'COLL')
    1185              : #endif
    1186              : 
    1187              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1188              : !!!!!!!!!!!!!! Distribution over STEP processors !!!!!!!!!!!!!!!!!!!!!!!!!!!
    1189              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1190           44 :   MPIdata%my_nstep =int(Invar%nstep_tot/MPIdata%nproc_step)
    1191           44 :   remain=Invar%nstep_tot-MPIdata%nproc_step*MPIdata%my_nstep
    1192           44 :   do ii=1,remain
    1193           44 :     if ((ii-1).eq.MPIdata%me_step) MPIdata%my_nstep=MPIdata%my_nstep+1
    1194              :   end do
    1195          176 :   ABI_MALLOC(MPIdata%nstep_all,(MPIdata%nproc_step)); MPIdata%nstep_all(:)=zero
    1196           44 :   call xmpi_allgather(MPIdata%my_nstep,MPIdata%nstep_all,MPIdata%comm_step,ierr)
    1197           44 :   write(Invar%stdout,'(a)') ' '
    1198           44 :   write(Invar%stdout,'(a,1x,i4)') ' All quantities are computed from nstep_min=',Invar%nstep_min
    1199           44 :   write(Invar%stdout,'(a,1x,i4)') '                               to nstep_max=',Invar%nstep_max
    1200           44 :   if (Invar%slice.ne.1) then
    1201            2 :     write(Invar%stdout,'(a,1x,i4)') '                                    by using a slice=',Invar%slice
    1202              :   end if
    1203           44 :   write(Invar%stdout,'(a,1x,i4)') ' So, the real number of time steps is nstep=',Invar%nstep_tot
    1204           44 :   if (MPIdata%nproc_step.gt.1) then
    1205            0 :     write(Invar%stdout,'(a,1000(1x,i5))') '-Distribution of number of steps wrt the number of processors=',MPIdata%nstep_all(:)
    1206              :   end if
    1207              : 
    1208          220 :   ABI_MALLOC(MPIdata%nstep_acc,(MPIdata%nproc_step+1)); MPIdata%nstep_acc(:)=zero
    1209           44 :   MPIdata%nstep_acc(1)=0
    1210           88 :   do ii=2,MPIdata%nproc_step+1
    1211           88 :     MPIdata%nstep_acc(ii)=MPIdata%nstep_acc(ii-1)+MPIdata%nstep_all(ii-1)
    1212              :   end do
    1213           44 :   if (MPIdata%nstep_acc(MPIdata%nproc_step+1).ne.Invar%nstep_tot) then
    1214            0 :     write(Invar%stdlog,*) 'STOP : pb in nstep_acc'
    1215            0 :     stop
    1216              :   end if
    1217              : 
    1218         1084 :   ABI_MALLOC(tab_step,(Invar%nstep_tot)); tab_step(:)=zero
    1219         1040 :   ABI_MALLOC(MPIdata%my_step ,(Invar%nstep_tot)); MPIdata%my_step (:)=.false.
    1220           88 :   do iproc=1,MPIdata%nproc_step
    1221         1040 :     do istep=1,Invar%nstep_tot
    1222          996 :       if ((istep.gt.MPIdata%nstep_acc(iproc)).and.(istep.le.MPIdata%nstep_acc(iproc+1))) then
    1223          952 :         tab_step(istep)=iproc-1
    1224              :       end if
    1225              :     end do
    1226              :   end do
    1227          996 :   do istep=1,Invar%nstep_tot
    1228          996 :     MPIdata%my_step(istep) = (tab_step(istep) == MPIdata%me_step)
    1229              :   end do
    1230              : 
    1231          176 :   ABI_MALLOC(MPIdata%shft_step,(MPIdata%nproc_step)); MPIdata%shft_step(:)=zero
    1232           44 :   MPIdata%shft_step(1)=0
    1233           44 :   do ii=2,MPIdata%nproc_step
    1234           44 :     MPIdata%shft_step(ii)=MPIdata%shft_step(ii-1)+MPIdata%nstep_all(ii-1)
    1235              :   end do
    1236           44 :   ABI_FREE(tab_step)
    1237              : 
    1238           44 :   Invar%my_nstep=MPIdata%my_nstep
    1239              : 
    1240           44 :  end subroutine tdep_init_MPIdata
    1241              : 
    1242              : !====================================================================================================
    1243              : 
    1244           44 :  subroutine tdep_destroy_mpidata(MPIdata)
    1245              : 
    1246              :   type(MPI_enreg_type), intent(inout) :: MPIdata
    1247              : 
    1248           44 :   ABI_FREE(MPIdata%shft_step)
    1249           44 :   ABI_FREE(MPIdata%nstep_acc)
    1250           44 :   ABI_FREE(MPIdata%nstep_all)
    1251           44 :   ABI_FREE(MPIdata%my_step)
    1252              : 
    1253           44 :  end subroutine tdep_destroy_mpidata
    1254              : 
    1255              : !====================================================================================================
    1256              : 
    1257            0 : end module m_tdep_dataset
        

Generated by: LCOV version 2.3-1