Branch data Line data Source code
1 : :
2 : : #if defined HAVE_CONFIG_H
3 : : #include "config.h"
4 : : #endif
5 : :
6 : : #include "abi_common.h"
7 : :
8 : : module m_tdep_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
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
|