Line data Source code
1 : !!****m*ABINIT/m_anaddb_dataset
2 : !! NAME
3 : !! m_anaddb_dataset
4 : !!
5 : !! FUNCTION
6 : !!
7 : !! COPYRIGHT
8 : !! Copyright (C) 2014-2026 ABINIT group (XG,JCC,CL,MVeithen,XW,MJV)
9 : !! This file is distributed under the terms of the
10 : !! GNU General Public License, see ~abinit/COPYING
11 : !! or http://www.gnu.org/copyleft/gpl.txt .
12 : !!
13 : !! SOURCE
14 :
15 : #if defined HAVE_CONFIG_H
16 : #include "config.h"
17 : #endif
18 :
19 : #include "abi_common.h"
20 :
21 : module m_anaddb_dataset
22 :
23 : use defs_basis
24 : use m_xmpi
25 : use m_abicore
26 : use m_errors
27 : use m_nctk
28 : use netcdf
29 :
30 : use m_parser, only : instrng
31 : use m_fstrings, only : next_token, rmquotes, sjoin, inupper, ltoa, itoa, basename
32 : use m_clib, only : clib_mkdir_if_needed
33 : use m_matrix, only : mati3det
34 : use m_parser, only : intagm, chkvars_in_string, instrng
35 : use m_crystal, only : crystal_t
36 : use m_ddb, only : DDB_QTOL, chkin9
37 : use m_ddb_hdr, only : ddb_hdr_type
38 :
39 : implicit none
40 :
41 : private
42 :
43 : public:: anaddb_dataset_type
44 : !!***
45 :
46 : !----------------------------------------------------------------------
47 :
48 : !!****t*m_anaddb_dataset/anaddb_dataset_type
49 : !! NAME
50 : !! anaddb_dataset_type
51 : !!
52 : !! FUNCTION
53 : !! The anaddb_dataset_type structured datatype
54 : !! gather all the input variables for the anaddb code.
55 : !!
56 : !! SOURCE
57 :
58 : type anaddb_dataset_type
59 :
60 : ! Variables should be declared on separated lines in order to reduce the occurence of git conflicts.
61 : ! Since all these input variables are described in the anaddb_help.html
62 : ! file, they are not described in length here ...
63 : ! Integer
64 : integer:: alphon
65 : integer:: asr
66 : integer:: brav
67 : integer:: chneut
68 : integer:: dieflag
69 : integer:: dipdip
70 : integer:: dipquad
71 : integer:: dossum
72 : integer:: dos_maxmode
73 : integer:: ep_scalprod
74 : integer:: eivec
75 : integer:: elaflag
76 : integer:: elphflag
77 : integer:: enunit
78 : integer:: flexoflag
79 : integer:: freqflag
80 : integer:: gkk2write
81 : integer:: gkk_rptwrite
82 : integer:: gkqwrite
83 : integer:: gruns_nddbs
84 : integer:: ifcana
85 : integer:: ifcflag
86 : integer:: ifcout
87 : integer:: ifltransport
88 : integer:: instrflag
89 : integer:: lwf_anchor_proj
90 : integer:: lwf_disentangle
91 : integer:: lwf_nwann
92 : integer:: lwfflag
93 : integer:: mpopt
94 : integer:: natfix
95 : integer:: natifc
96 : integer:: natprj_bs
97 : integer:: nchan
98 : integer:: ndivsm = 20
99 : integer:: nfreq
100 : integer:: ngrids
101 : integer:: nlflag
102 : integer:: nph1l
103 : integer:: nph2l
104 : integer:: nqpath
105 : integer:: nqshft
106 : integer:: nsphere
107 : integer:: nstrfix
108 : integer:: ntemper
109 : integer:: nwchan
110 : integer:: outboltztrap
111 : integer:: piezoflag
112 : integer:: polflag
113 : integer:: prtdos
114 : integer:: prt_ifc
115 : integer:: prtddb
116 : integer:: prtmbm
117 : integer:: prtfsurf
118 : integer:: prtnest
119 : integer:: prtphbands
120 : integer:: prtsrlr ! print the short-range/long-range decomposition of phonon freq.
121 : integer:: prtvol = 0
122 : integer:: ramansr
123 : integer:: relaxat
124 : integer:: relaxstr
125 : integer:: rfmeth
126 : integer:: selectz
127 : integer:: symdynmat
128 : integer:: sys_dim
129 : integer:: telphint
130 : integer:: thmflag
131 : integer:: qgrid_type
132 : integer:: quadquad
133 : integer:: ep_b_min
134 : integer:: ep_b_max
135 : integer:: ep_int_gkk
136 : integer:: ep_keepbands
137 : integer:: ep_nqpt
138 : integer:: ep_nspline
139 : integer:: ep_prt_yambo
140 : integer:: symgkq
141 : integer:: timdisp
142 : integer:: use_k_fine
143 : integer:: prtbltztrp
144 :
145 : ! These are not input variables, but important dimensions read from ddb
146 : integer:: natom
147 : integer:: msize
148 : integer:: mpert
149 :
150 : integer:: ngqpt(9) ! ngqpt(9) instead of ngqpt(3) is needed in wght9.f
151 : integer:: istrfix(6)
152 : integer:: lwf_ngqpt(3)
153 : integer:: ng2qpt(3)
154 : integer:: qrefine(3)
155 : integer:: kptrlatt(3, 3)
156 : integer:: kptrlatt_fine(3, 3)
157 : integer:: thermal_supercell(3, 3)
158 : integer:: mpatpol(2)
159 : integer:: mpdir(3)
160 :
161 : ! Real(dp)
162 : real(dp):: a2fsmear
163 : real(dp):: band_gap
164 : real(dp):: dielt_env
165 : real(dp):: dielt_thick(2)
166 : real(dp):: dosdeltae
167 : real(dp):: dossmear
168 : real(dp):: dostol
169 : real(dp):: elphsmear
170 : real(dp):: elph_fermie
171 : real(dp):: ep_extrael
172 : real(dp):: eta
173 : real(dp):: freeze_displ
174 : real(dp):: frmax
175 : real(dp):: frmin
176 :
177 : real(dp):: lwf_anchor_qpt(3)
178 : real(dp):: lwf_mu
179 : real(dp):: lwf_sigma
180 : real(dp):: magpen
181 : real(dp):: mustar
182 : real(dp):: temperinc
183 : real(dp):: tempermin
184 : real(dp):: thmtol
185 : real(dp):: rifcsph
186 :
187 : real(dp):: q1shft(3, 4)
188 : real(dp):: q2shft(3)
189 : real(dp):: targetpol(3)
190 : real(dp):: vs_qrad_tolkms(2) = 0
191 :
192 : character(len=fnlen):: filename_input
193 : character(len=fnlen):: filename_output
194 : character(len=fnlen):: prefix_outdata
195 : character(len=fnlen):: filename_ddb
196 : character(len=fnlen):: filename_ddk
197 : character(len=fnlen):: prefix_eph
198 : character(len=fnlen):: filename_gkk
199 : character(len=fnlen):: filename_eigr2d
200 :
201 : character(len=strlen):: input_string
202 : ! The entire input string.
203 : integer:: lenstr ! Length of the entire input string.
204 :
205 : ! Integer arrays
206 : integer, allocatable:: atifc(:)
207 : ! atifc(natom) Atoms for which IFC should be computed.
208 :
209 : integer, allocatable:: atifcflg(:)
210 : ! atifcflg(natom) Flag (0 or 1) to tell which atom is analysed in ifc.
211 :
212 : integer, allocatable:: iatfix(:)
213 : ! iatfix(natom)
214 :
215 : integer, allocatable:: iatprj_bs(:)
216 :
217 : integer, allocatable:: lwf_anchor_iband(:)
218 : integer, allocatable:: lwf_projector(:)
219 :
220 : ! Real arrays
221 : real(dp), allocatable:: qnrml1(:)
222 : ! qnrml1(nph1l)
223 :
224 : real(dp), allocatable:: qnrml2(:)
225 : ! qnrml2(nph2l)
226 :
227 : real(dp), allocatable:: qpath(:,:)
228 : ! qpath(3, nqpath)
229 :
230 : real(dp), allocatable:: qph1l(:,:)
231 : ! qph1l(3, nph1l)
232 :
233 : real(dp), allocatable:: qph2l(:,:)
234 : ! qph2l(3, nph2l)
235 :
236 : real(dp), allocatable:: ep_qptlist(:,:)
237 : ! qph2l(3, ep_nqpt)
238 :
239 : character(len = fnlen), allocatable:: gruns_ddbs(:)
240 : ! gruns_ddbs(gruns_nddbs)
241 :
242 : contains
243 :
244 : procedure :: init => anaddb_dtset_init
245 : ! Construct the object from the dtset.
246 :
247 : procedure :: free => anaddb_dtset_free
248 : ! Free dynamic memory.
249 :
250 : procedure :: read_input => anaddb_dtset_read_input
251 : ! Read input file, and some info from the ddb or IFC.
252 :
253 : procedure :: bcast_files => anaddb_dtset_bcast_files
254 : ! Broadcast file names
255 :
256 : procedure :: outvars => outvars_anaddb
257 : ! Broadcast file names
258 :
259 : end type anaddb_dataset_type
260 : !!***
261 :
262 : contains
263 : !!***
264 :
265 : !!****f*m_anaddb_dataset/anaddb_dtset_free
266 : !!
267 : !! NAME
268 : !! anaddb_dtset_free
269 : !!
270 : !! FUNCTION
271 : !! deallocate remaining arrays in the anaddb_dtset datastructure
272 : !!
273 : !! INPUTS
274 : !! anaddb_dtset = anaddb datastructure
275 : !!
276 : !! SOURCE
277 :
278 81 : subroutine anaddb_dtset_free(dtset)
279 :
280 : !Arguments------------------------------------
281 : !scalars
282 : class(anaddb_dataset_type), intent(inout):: dtset
283 :
284 : ! *************************************************************************
285 :
286 81 : ABI_SFREE(dtset%atifc)
287 81 : ABI_SFREE(dtset%atifcflg)
288 81 : ABI_SFREE(dtset%iatfix)
289 81 : ABI_SFREE(dtset%iatprj_bs)
290 81 : ABI_SFREE(dtset%qnrml1)
291 81 : ABI_SFREE(dtset%qnrml2)
292 81 : ABI_SFREE(dtset%qpath)
293 81 : ABI_SFREE(dtset%qph1l)
294 81 : ABI_SFREE(dtset%qph2l)
295 81 : ABI_SFREE(dtset%ep_qptlist)
296 81 : ABI_SFREE(dtset%gruns_ddbs)
297 81 : if (dtset%lwfflag==1) then
298 2 : ABI_SFREE(dtset%lwf_anchor_iband)
299 79 : else if (dtset%lwfflag==2) then
300 1 : ABI_SFREE(dtset%lwf_projector)
301 : end if
302 :
303 81 : end subroutine anaddb_dtset_free
304 : !!***
305 :
306 : !----------------------------------------------------------------------
307 :
308 : !!****f*m_anaddb_dataset/invars9
309 : !!
310 : !! NAME
311 : !! invars9
312 : !!
313 : !! FUNCTION
314 : !! Open input file for the anaddb code, then reads or echoes the input information.
315 : !!
316 : !! INPUTS
317 : !! lenstr = actual length of string
318 : !! natom = number of atoms, needed for atifc
319 : !! string*(*)=string of characters containing all input variables and data
320 : !!
321 : !! OUTPUT
322 : !! dtset= (derived datatype) contains all the input variables
323 : !!
324 : !! NOTES
325 : !! Should be executed by one processor only.
326 : !!
327 : !! 27/01/2009: MJV: I have cleaned this routine extensively, putting all
328 : !! variables in alphabetical order, and in a second segment the dependent
329 : !! variables which need to be allocated depending on the dimensions read in.
330 : !! Could be divided into two routines as in abinit.
331 : !! FIXME: move checks to chkin9?
332 : !!
333 : !! SOURCE
334 :
335 81 : subroutine invars9(dtset, lenstr, natom, string)
336 :
337 : !Arguments-------------------------------
338 : !scalars
339 : integer, intent(in):: lenstr, natom
340 : character(len=*), intent(in):: string
341 : type(anaddb_dataset_type), intent(inout):: dtset
342 :
343 : !Local variables-------------------------
344 : !scalars
345 : integer, parameter:: vrsddb = 100401 ! Set routine version number here:
346 : integer, parameter:: jdtset = 1
347 : integer:: ii, iph1, iph2, marr, tread, start, idet
348 : character(len = 500):: message
349 : character(len = fnlen):: path
350 : !arrays
351 81 : integer, allocatable:: intarr(:)
352 81 : real(dp), allocatable:: dprarr(:)
353 :
354 : !*********************************************************************
355 81 : marr = 3
356 81 : ABI_MALLOC(intarr, (marr))
357 81 : ABI_MALLOC(dprarr, (marr))
358 :
359 : !copy natom to dtset
360 81 : dtset%natom = natom
361 :
362 : !=====================================================================
363 : !start reading in dimensions and non-dependent variables
364 : !=====================================================================
365 :
366 : !A
367 :
368 : !typical value for gaussian smearing of a2F function
369 81 : dtset%a2fsmear = 0.00002_dp
370 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'a2fsmear',tread, 'ENE')
371 81 : if(tread == 1) dtset%a2fsmear = dprarr(1)
372 81 : if (dtset%a2fsmear < tol6) then
373 : write(message, '(a, f10.3, a, a, a, a, a)' )&
374 0 : 'a2fsmear is ',dtset%a2fsmear, ', but only values > 1.e-6 ',ch10, &
375 0 : 'are allowed',ch10, 'Action: correct a2fsmear in your input file.'
376 0 : ABI_ERROR(message)
377 : end if
378 :
379 81 : dtset%alphon = 0
380 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'alphon',tread, 'INT')
381 81 : if(tread == 1) dtset%alphon = intarr(1)
382 : !FIXME: need a test on input value
383 :
384 81 : dtset%asr = 1
385 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'asr',tread, 'INT')
386 81 : if(tread == 1) dtset%asr = intarr(1)
387 81 : if(dtset%asr < -2 .or. dtset%asr > 6)then
388 : write(message, '(a, i0, 5a)' )&
389 0 : 'asr is ',dtset%asr, ', but the only allowed values',ch10, &
390 0 : 'are 0, 1, 2, 3, 4, 5, 6, -1 or-2 .',ch10, 'Action: correct asr in your input file.'
391 : ! Note : negative values are allowed when the acoustic sum rule
392 : ! is to be applied after the analysis of IFCs
393 : ! 3, 4 are for rotational invariance (under development)
394 : ! 5 is for hermitian imposition of the ASR
395 0 : ABI_ERROR(message)
396 : end if
397 :
398 : !B
399 :
400 : !Target band gap in eV
401 : !The default value is just a very large number that will not be used in changing the band gap
402 81 : dtset%band_gap = 999.0d0
403 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'band_gap',tread, 'DPR')
404 81 : if(tread == 1) dtset%band_gap = dprarr(1)
405 :
406 81 : dtset%brav = 1
407 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'brav',tread, 'INT')
408 81 : if(tread == 1) dtset%brav = intarr(1)
409 81 : if(dtset%brav <= -2 .or. dtset%brav >= 5 .or. dtset%brav == 0)then
410 : write(message, '(a, i0, a5)' )&
411 0 : 'brav is ',dtset%brav, ', but the only allowed values',ch10, &
412 0 : 'are-1, 1, 2, 3 or 4 .',ch10, 'Action: correct brav in your input file.'
413 0 : ABI_ERROR(message)
414 : end if
415 :
416 : !C
417 :
418 81 : dtset%chneut = 1
419 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'chneut',tread, 'INT')
420 81 : if(tread == 1) dtset%chneut = intarr(1)
421 81 : if(dtset%chneut < 0 .or. dtset%chneut > 2)then
422 : write(message, '(a, i0, 5a)' )&
423 0 : 'chneut is ',dtset%chneut, ', but the only allowed values',ch10, &
424 0 : 'are 0, 1 or 2.',ch10, 'Action: correct chneut in your input file.'
425 0 : ABI_ERROR(message)
426 : end if
427 :
428 : !D
429 :
430 81 : dtset%dieflag = 0
431 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dieflag',tread, 'INT')
432 81 : if(tread == 1) dtset%dieflag = intarr(1)
433 81 : if(dtset%dieflag < 0 .or. dtset%dieflag > 4)then
434 : write(message, '(a, i0, 5a)' )&
435 0 : 'dieflag is ',dtset%dieflag, ', but the only allowed values',ch10, &
436 0 : 'are 0, 1, 2, 3 or 4.',ch10, 'Action: correct dieflag in your input file.'
437 0 : ABI_ERROR(message)
438 : end if
439 :
440 81 : dtset%dielt_env = one
441 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dielt_env',tread, 'DPR')
442 81 : if(tread == 1) dtset%dielt_env = dprarr(1)
443 :
444 243 : dtset%dielt_thick(:) = 0
445 81 : call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'dielt_thick',tread, 'DPR')
446 85 : if(tread == 1) dtset%dielt_thick(:) = dprarr(1:2)
447 81 : if(dtset%dielt_thick(1) < zero)then
448 : write(message, '(a, es14.4, 3a)' )&
449 0 : 'dielt_thick is ',dtset%dielt_thick(1), ', which is lower than 0 .',ch10, &
450 0 : 'Action: correct dielt_thick in your input file.'
451 0 : ABI_ERROR(message)
452 : end if
453 :
454 81 : dtset%dipdip = 1
455 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dipdip',tread, 'INT')
456 81 : if(tread == 1) dtset%dipdip = intarr(1)
457 81 : if(dtset%dipdip < -1 .or. dtset%dipdip > 1)then
458 : write(message, '(a, i0, 5a)' )&
459 0 : 'dipdip is ',dtset%dipdip, ', but the only allowed values',ch10, &
460 0 : 'are-1, 0 or 1 .',ch10, 'Action: correct dipdip in your input file.'
461 0 : ABI_ERROR(message)
462 : end if
463 :
464 81 : dtset%dipquad = 1
465 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dipquad',tread, 'INT')
466 81 : if(tread == 1) dtset%dipquad = intarr(1)
467 81 : if(dtset%dipquad < -1 .or. dtset%dipquad > 1)then
468 : write(message, '(a, i0, 5a)' )&
469 0 : 'dipquad is ',dtset%dipquad, ', but the only allowed values',ch10, &
470 0 : 'are 0 or 1 .',ch10, 'Action: correct dipquad in your input file.'
471 0 : ABI_ERROR(message)
472 : end if
473 :
474 81 : dtset%ep_scalprod = 0
475 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_scalprod',tread, 'INT')
476 81 : if(tread == 1) dtset%ep_scalprod = intarr(1)
477 81 : if(dtset%ep_scalprod < 0 .or. dtset%ep_scalprod > 1) then
478 : write(message, '(a, i0, 5a)' )&
479 0 : 'ep_scalprod is ',dtset%ep_scalprod, ', but the only allowed values',ch10, &
480 0 : 'are 0 or 1.',ch10, 'Action: correct ep_scalprod in your input file.'
481 0 : ABI_ERROR(message)
482 : end if
483 :
484 81 : dtset%dosdeltae = 0.2_dp/Ha_cmm1
485 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dosdeltae',tread, 'DPR')
486 81 : if(tread == 1) dtset%dosdeltae = dprarr(1)
487 :
488 : !FIXME : should probably be smaller
489 81 : dtset%dossmear = one/Ha_cmm1
490 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dossmear',tread, 'DPR')
491 81 : if(tread == 1) dtset%dossmear = dprarr(1)
492 81 : if(dtset%dossmear <= zero)then
493 : write(message, '(a, es14.4, 3a)' )&
494 0 : 'dossmear is ',dtset%dossmear, ', which is lower than 0 .',ch10, &
495 0 : 'Action: correct dossmear in your input file.'
496 0 : ABI_ERROR(message)
497 : end if
498 :
499 81 : dtset%dostol = 0.25_dp
500 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dostol',tread, 'DPR')
501 81 : if(tread == 1) dtset%dostol = dprarr(1)
502 81 : if(dtset%dostol < zero)then
503 : write(message, '(a, es14.4, 3a)' )&
504 0 : 'dostol is ',dtset%dostol, ', which is lower than 0 .',ch10, &
505 0 : 'Action: correct dostol in your input file.'
506 0 : ABI_ERROR(message)
507 : end if
508 :
509 81 : dtset%dossum = 0
510 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dossum',tread, 'INT')
511 81 : if(tread == 1) dtset%dossum = intarr(1)
512 81 : if(dtset%dossum < 0 .or. dtset%dossum > one)then
513 : write(message, '(a, i0, 5a)' )&
514 0 : 'dossum is ',dtset%dossum, ', but the only allowed values',ch10, &
515 0 : 'are 0, 1',ch10, 'Action: correct dossum in your input file.'
516 0 : ABI_ERROR(message)
517 : end if
518 :
519 81 : dtset%dos_maxmode = 0
520 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'dos_maxmode',tread, 'INT')
521 81 : if(tread == 1) dtset%dos_maxmode = intarr(1)
522 81 : if(dtset%dos_maxmode < 0 .or. dtset%dos_maxmode > 3*natom)then
523 : write(message, '(a, i0, 5a)' )&
524 0 : 'dos_maxmode is ',dtset%dos_maxmode, ', but the only allowed values',ch10, &
525 0 : 'are 0 to 3*natom ',ch10, 'Action: correct dos_maxmode in your input file.'
526 0 : ABI_ERROR(message)
527 : end if
528 :
529 : !E
530 :
531 81 : dtset%eivec = 0
532 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'eivec',tread, 'INT')
533 81 : if(tread == 1) dtset%eivec = intarr(1)
534 81 : if(dtset%eivec < 0 .or. dtset%eivec > 4)then
535 : write(message, '(a, i0, 5a)' )&
536 0 : 'eivec is ',dtset%eivec, ', but the only allowed values',ch10, &
537 0 : 'are 0, 1, 2, 3 or 4.',ch10, 'Action: correct eivec in your input file.'
538 0 : ABI_ERROR(message)
539 : end if
540 :
541 81 : dtset%elaflag = 0
542 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'elaflag',tread, 'INT')
543 81 : if(tread == 1) dtset%elaflag = intarr(1)
544 81 : if(dtset%elaflag < 0 .or. dtset%elaflag > 5)then
545 : write(message, '(a, i0, 5a)' )&
546 0 : 'elaflag is ',dtset%elaflag, ', but the only allowed values',ch10, &
547 0 : 'are 0, 1, 2, 3, 4 or 5 .',ch10, 'Action: correct elaflag in your input file.'
548 0 : ABI_ERROR(message)
549 : end if
550 :
551 : !By default use the real fermie (tests for abs(elph_fermie) < tol10 in the code)
552 81 : dtset%elph_fermie = zero
553 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'elph_fermie',tread, 'ENE')
554 81 : if(tread == 1) dtset%elph_fermie = dprarr(1)
555 :
556 : !extra charge in unit cell (number of electrons) wrt neutral cell
557 : !holes are negative values (reduce number of electrons)
558 81 : dtset%ep_extrael = zero
559 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_extrael',tread, 'DPR')
560 81 : if(tread == 1) dtset%ep_extrael = dprarr(1)
561 :
562 : !number to control the spline interpolation in RTA
563 81 : dtset%ep_nspline = 20
564 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_nspline',tread, 'INT')
565 81 : if(tread == 1) dtset%ep_nspline = intarr(1)
566 81 : if(dtset%ep_nspline < 0 .or. dtset%ep_nspline > 1000) then
567 : write(message, '(a, i0, 5a)' )&
568 0 : 'ep_nspline is ',dtset%ep_nspline, ', but this should not be ',ch10, &
569 0 : 'negative or too large .',ch10, 'Action: correct ep_nspline in your input file.'
570 0 : ABI_ERROR(message)
571 : end if
572 :
573 : !interpolate gkk or gamma. It should be better to interpolate gkk onto the
574 : !k_phon, since the integration weights will be treated the same way
575 81 : dtset%ep_int_gkk = 0
576 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_int_gkk',tread, 'INT')
577 81 : if(tread == 1) dtset%ep_int_gkk = intarr(1)
578 81 : if(dtset%ep_int_gkk < 0 .or. dtset%ep_int_gkk > 1) then
579 : write(message, '(a, i0, 5a)' )&
580 0 : 'ep_int_gkk is ',dtset%ep_int_gkk, ', but the only allowed values',ch10, &
581 0 : 'are 0 or 1.',ch10, 'Action: correct ep_int_gkk in your input file.'
582 0 : ABI_ERROR(message)
583 : end if
584 :
585 81 : dtset%elphflag = 0
586 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'elphflag',tread, 'INT')
587 81 : if(tread == 1) dtset%elphflag = intarr(1)
588 81 : if(dtset%elphflag < 0 .or. dtset%elphflag > 1)then
589 : write(message, '(a, i0, 5a)' )&
590 0 : 'elphflag = ',dtset%elphflag, ', but the allowed values',ch10, &
591 0 : 'are 0, or 1.',ch10, 'Action: correct elphflag in your input file.'
592 0 : ABI_ERROR(message)
593 : end if
594 :
595 : !typical value for gaussian smearing, but can vary sensibly with the metal
596 81 : dtset%elphsmear = 0.01_dp
597 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'elphsmear',tread, 'ENE')
598 81 : if(tread == 1) dtset%elphsmear = dprarr(1)
599 81 : if (dtset%elphsmear < tol6) then
600 : write(message, '(a, f10.3, 5a)' )&
601 0 : 'elphsmear is ',dtset%elphsmear, '. Only values > 1.e-6 ',ch10, &
602 0 : 'are allowed',ch10, 'Action: correct elphsmear in your input file.'
603 0 : ABI_ERROR(message)
604 : end if
605 :
606 81 : dtset%enunit = 0
607 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'enunit',tread, 'INT')
608 81 : if(tread == 1) dtset%enunit = intarr(1)
609 81 : if(dtset%enunit < 0 .or. dtset%enunit > 2)then
610 : write(message, '(a, i0, 5a)' )&
611 0 : 'enunit is ',dtset%enunit, ', but the only allowed values',ch10, &
612 0 : 'are 0, 1 or 2.',ch10, 'Action: correct enunit in your input file.'
613 0 : ABI_ERROR(message)
614 : end if
615 :
616 : !Default is 0-not used unless telphint == 2
617 81 : dtset%ep_b_max = 0
618 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_b_max',tread, 'INT')
619 81 : if(tread == 1) then
620 1 : dtset%ep_b_max = intarr(1)
621 1 : if(dtset%ep_b_max < 1) then
622 : write(message, '(a, i0, 5a)' )&
623 0 : 'ep_b_max is ',dtset%ep_b_max, ', but the only allowed values',ch10, &
624 0 : 'are between 1 and nband.',ch10, 'Action: correct ep_b_max in your input file.'
625 0 : ABI_ERROR(message)
626 : end if
627 : end if
628 :
629 : !Default is 0-not used unless telphint == 2
630 81 : dtset%ep_b_min = 0
631 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_b_min',tread, 'INT')
632 81 : if(tread == 1) then
633 1 : dtset%ep_b_min = intarr(1)
634 1 : if(dtset%ep_b_min < 1) then
635 : write(message, '(a, i0, 5a)' )&
636 0 : 'ep_b_min is ',dtset%ep_b_min, ', but the only allowed values',ch10, &
637 0 : 'are between 1 and nband.',ch10, 'Action: correct ep_b_min in your input file.'
638 0 : ABI_ERROR(message)
639 : end if
640 : end if
641 :
642 81 : dtset%ep_keepbands = 0
643 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_keepbands',tread, 'INT')
644 81 : if(tread == 1) dtset%ep_keepbands = intarr(1)
645 81 : if(dtset%ep_keepbands < 0 .or. dtset%ep_keepbands > 1) then
646 : write(message, '(a, i0, 5a)' )&
647 0 : 'ep_keepbands is ',dtset%ep_keepbands, ', but the only allowed values',ch10, &
648 0 : 'are 0 or 1 .',ch10, 'Action: correct ep_keepbands in your input file.'
649 0 : ABI_ERROR(message)
650 : end if
651 :
652 81 : dtset%ep_nqpt = 0
653 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_nqpt',tread, 'INT')
654 81 : if(tread == 1) dtset%ep_nqpt = intarr(1)
655 81 : if(dtset%ep_nqpt < 0) then
656 : write(message, '(a, i0, 5a)' )&
657 0 : 'ep_nqpt is ',dtset%ep_nqpt, ', but the only allowed values',ch10, &
658 0 : 'are > 0.',ch10, 'Action: correct ep_nqpt in your input file.'
659 0 : ABI_ERROR(message)
660 : end if
661 :
662 81 : if (dtset%ep_nqpt > 0) then
663 3 : ABI_MALLOC(dtset%ep_qptlist, (3, dtset%ep_nqpt))
664 1 : if(3*dtset%ep_nqpt > marr)then
665 1 : marr = 3*dtset%ep_nqpt
666 1 : ABI_FREE(intarr)
667 1 : ABI_FREE(dprarr)
668 3 : ABI_MALLOC(intarr, (marr))
669 3 : ABI_MALLOC(dprarr, (marr))
670 : end if
671 13 : dtset%ep_qptlist(:,:)=zero
672 1 : call intagm(dprarr, intarr, jdtset, marr, 3*dtset%ep_nqpt, string(1:lenstr), 'ep_qptlist',tread, 'DPR')
673 1 : if(tread == 1) then
674 : dtset%ep_qptlist(1:3, 1:dtset%ep_nqpt)=&
675 15 : reshape(dprarr(1:3*dtset%ep_nqpt), (/3, dtset%ep_nqpt/))
676 : else
677 : write(message, '(3a)')&
678 0 : 'ep_nqpt is non zero but ep_qptlist is absent ',ch10, &
679 0 : 'Action: specify ep_qptlist in your input file.'
680 0 : ABI_ERROR(message)
681 : end if
682 : end if
683 :
684 81 : dtset%eta = 0.00000_dp
685 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'eta',tread, 'DPR')
686 81 : if(tread == 1) dtset%eta = dprarr(1)
687 :
688 : !F
689 :
690 81 : dtset%flexoflag = 0
691 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'flexoflag',tread, 'INT')
692 81 : if(tread == 1) dtset%flexoflag = intarr(1)
693 81 : if(dtset%flexoflag < 0 .or. dtset%flexoflag > 4)then
694 : write(message, '(3a, i0, 5a)' )&
695 0 : ' flexoflag is ',dtset%flexoflag, ', but the only allowed values',ch10, &
696 0 : 'are 0, 1, 2, 3, 4 .',ch10, 'Action: correct flexoflag in your input file.'
697 0 : ABI_ERROR(message)
698 : end if
699 :
700 81 : dtset%freeze_displ = zero
701 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'freeze_displ',tread, 'DPR')
702 81 : if(tread == 1) dtset%freeze_displ = dprarr(1)
703 :
704 81 : dtset%freqflag = 0
705 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'freqflag',tread, 'INT')
706 81 : if(tread == 1) dtset%freqflag = intarr(1)
707 81 : if(dtset%freqflag < 0 .or. dtset%freqflag > 3)then
708 : write(message, '(a, i0, 5a)' )&
709 0 : 'freqflag is ',dtset%freqflag, ', but the only allowed values',ch10, &
710 0 : 'are between 0 to 3 (included).',ch10, 'Action: correct freqflag in your input file.'
711 0 : ABI_ERROR(message)
712 : end if
713 :
714 81 : dtset%frmax = ten
715 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'frmax',tread, 'DPR')
716 81 : if(tread == 1) dtset%frmax = dprarr(1)
717 : ! if (dtset%frmax < 0) then
718 : ! write(message, '(a, f10.3, 5a)' )&
719 : ! 'frmax is ',dtset%frmax, '. Only values > 0 ',ch10, &
720 : ! 'are allowed',ch10, 'Action: correct frmax in your input file.'
721 : ! ABI_ERROR(message)
722 : ! end if
723 :
724 81 : dtset%frmin = zero
725 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'frmin',tread, 'DPR')
726 81 : if(tread == 1) dtset%frmin = dprarr(1)
727 : ! if (dtset%frmin < 0) then
728 : ! write(message, '(a, f10.3, 5a)' )&
729 : ! 'frmin is ',dtset%frmin, '. Only values > 0 ',ch10, &
730 : ! 'are allowed',ch10, 'Action: correct frmin in your input file.'
731 : ! ABI_ERROR(message)
732 : ! end if
733 :
734 : !G
735 :
736 81 : dtset%gkk2write = 0
737 : !call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gkk2write',&
738 : !& tread, 'INT')
739 : !if(tread == 1) dtset%gkk2write = intarr(1)
740 : !if(dtset%gkk2write < 0 .or. dtset%gkk2write > 1) then
741 : !write(message, '(a, a, a, i8, a, a, a, a, a)' )&
742 : !& ' invars9 : ERROR -',ch10, &
743 : !& ' gkk2write is',dtset%gkk2write, &
744 : !& ', but the only allowed values',ch10, &
745 : !& ' are 0 or 1 .',ch10, &
746 : !& ' Action: correct gkk2write in your input file.'
747 : !ABI_ERROR(message)
748 : !end if
749 :
750 81 : dtset%gkk_rptwrite = 0
751 : !call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gkk_rptwrite',&
752 : !& tread, 'INT')
753 : !if(tread == 1) dtset%gkk_rptwrite = intarr(1)
754 : !if(dtset%gkk_rptwrite < 0 .or. dtset%gkk_rptwrite > 1) then
755 : !write(message, '(a, a, a, i8, a, a, a, a, a)' )&
756 : !& ' invars9 : ERROR -',ch10, &
757 : !& ' gkk_rptwrite is',dtset%gkk_rptwrite, &
758 : !& ', but the only allowed values',ch10, &
759 : !& ' are 0 or 1 .',ch10, &
760 : !& ' Action: correct gkk_rptwrite in your input file.'
761 : !ABI_ERROR(message)
762 : !end if
763 :
764 81 : dtset%gkqwrite = 0
765 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gkqwrite',tread, 'INT')
766 81 : if(tread == 1) dtset%gkqwrite = intarr(1)
767 81 : if(dtset%gkqwrite < 0 .or. dtset%gkqwrite > 1) then
768 : write(message, '(a, i0, 5a)' )&
769 0 : 'gkqwrite is ',dtset%gkqwrite, ', but the only allowed values',ch10, &
770 0 : 'are 0 or 1.',ch10, 'Action: correct gkqwrite in your input file.'
771 0 : ABI_ERROR(message)
772 : end if
773 :
774 81 : dtset%gruns_nddbs = 0
775 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gruns_nddbs',tread, 'INT')
776 81 : if (tread == 1) dtset%gruns_nddbs = intarr(1)
777 :
778 81 : if (dtset%gruns_nddbs /= 0) then
779 : ! Read list of DDB paths.
780 3 : ABI_MALLOC(dtset%gruns_ddbs, (dtset%gruns_nddbs))
781 1 : start = index(string, "GRUNS_DDBS") + len("GRUNS_DDBS") + 1
782 4 : do ii = 1, dtset%gruns_nddbs
783 3 : if (next_token(string, start, path) /= 0) then
784 0 : ABI_ERROR(sjoin("Cannot find DDB path in input string:", ch10, string(start:)))
785 : end if
786 4 : dtset%gruns_ddbs(ii) = rmquotes(path)
787 : end do
788 : end if
789 :
790 : !H
791 :
792 : !I
793 :
794 81 : dtset%ifcana = 0
795 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ifcana',tread, 'INT')
796 81 : if(tread == 1) dtset%ifcana = intarr(1)
797 81 : if(dtset%ifcana < 0 .or. dtset%ifcana > 1)then
798 : write(message, '(a, i0, 5a)' )&
799 0 : 'ifcana is ',dtset%ifcana, ', but the only allowed values',ch10, &
800 0 : 'are 0 or 1.',ch10, 'Action: correct ifcana in your input file.'
801 0 : ABI_ERROR(message)
802 : end if
803 :
804 81 : dtset%ifcflag = 0
805 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ifcflag',tread, 'INT')
806 81 : if(tread == 1) dtset%ifcflag = intarr(1)
807 81 : if(dtset%ifcflag < 0 .or. dtset%ifcflag > 1)then
808 : write(message, '(a, i0, 5a)' )&
809 0 : 'ifcflag is ',dtset%ifcflag, ', but the only allowed values',ch10, &
810 0 : 'are 0 or 1.',ch10, 'Action: correct ifcflag in your input file.'
811 0 : ABI_ERROR(message)
812 : end if
813 :
814 81 : dtset%ifcout = 0
815 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ifcout',tread, 'INT')
816 81 : if(tread == 1) dtset%ifcout = intarr(1)
817 81 : if(dtset%ifcout < -1)then
818 : write(message, '(a, i0, 3a)' )&
819 0 : 'ifcout is ',dtset%ifcout, ', which is lower than-1.',ch10, &
820 0 : 'Action: correct ifcout in your input file.'
821 0 : ABI_ERROR(message)
822 : end if
823 :
824 81 : dtset%ifltransport = 0
825 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ifltransport',tread, 'INT')
826 81 : if(tread == 1) dtset%ifltransport = intarr(1)
827 81 : if(dtset%ifltransport < 0 .or. dtset%ifltransport > 3) then
828 : write(message, '(a, i0, 5a)' )&
829 0 : 'ifltransport is ',dtset%ifltransport, ', but the only allowed values',ch10, &
830 0 : 'are 0 or 1 or 2 or 3.',ch10, 'Action: correct ifltransport in your input file.'
831 0 : ABI_ERROR(message)
832 : end if
833 :
834 81 : dtset%instrflag = 0
835 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'instrflag',tread, 'INT')
836 81 : if(tread == 1) dtset%instrflag = intarr(1)
837 81 : if(dtset%instrflag < 0 .or. dtset%instrflag > 1)then
838 : write(message, '(a, i0, 5a)' )&
839 0 : 'instrflag is ',dtset%instrflag, ', but the only allowed values',ch10, &
840 0 : 'are 0, 1.',ch10, 'Action: correct instrflag in your input file.'
841 0 : ABI_ERROR(message)
842 : end if
843 :
844 : !J
845 :
846 : !K
847 :
848 1053 : dtset%kptrlatt = 0
849 : !why this test on reading in kptrlatt?
850 81 : marr = 9
851 81 : ABI_FREE(intarr)
852 81 : ABI_FREE(dprarr)
853 81 : ABI_MALLOC(intarr, (marr))
854 81 : ABI_MALLOC(dprarr, (marr))
855 81 : call intagm(dprarr, intarr, jdtset, marr, 9, string(1:lenstr), 'kptrlatt',tread, 'INT')
856 141 : if(tread == 1)dtset%kptrlatt(1:3, 1:3)=reshape(intarr(1:9), (/3, 3/))
857 : !NOTE: no a priori way to test the validity of the integers in kptrlatt
858 :
859 1053 : dtset%kptrlatt_fine(:,:)=0
860 : marr = 9
861 81 : ABI_FREE(intarr)
862 81 : ABI_FREE(dprarr)
863 81 : ABI_MALLOC(intarr, (marr))
864 81 : ABI_MALLOC(dprarr, (marr))
865 81 : call intagm(dprarr, intarr, jdtset, marr, 9, string(1:lenstr), 'kptrlatt_fine',tread, 'INT')
866 81 : if(tread == 1)dtset%kptrlatt_fine(1:3, 1:3)=reshape(intarr(1:9), (/3, 3/))
867 :
868 :
869 : !L
870 :
871 : ! lwf_*: lattic wannier function
872 324 : dtset%lwf_anchor_qpt(:) = 0.0_dp
873 81 : call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'lwf_anchor_qpt',tread, 'DPR')
874 87 : if(tread == 1) dtset%lwf_anchor_qpt(1:3) = dprarr(1:3)
875 :
876 81 : dtset%lwf_disentangle = 0
877 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'lwf_disentangle',tread, 'INT')
878 81 : if(tread == 1) dtset%lwf_disentangle = intarr(1)
879 81 : if(dtset%lwf_disentangle < 0 .or. dtset%lwf_disentangle > 3)then
880 : write(message, '(a, i0, 5a)' )&
881 0 : 'lwf_disentangle is ',dtset%lwf_disentangle, ', but the only allowed values',ch10, &
882 0 : 'are 0, 1.',ch10, 'Action: correct lwf_disentangle in your input file.'
883 0 : ABI_ERROR(message)
884 : end if
885 :
886 81 : dtset%lwf_anchor_proj = 0
887 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'lwf_anchor_proj',tread, 'INT')
888 81 : if(tread == 1) dtset%lwf_anchor_proj = intarr(1)
889 81 : if(dtset%lwf_anchor_proj < 0 .or. dtset%lwf_anchor_proj > 2)then
890 : write(message, '(a, i0, 5a)' )&
891 0 : 'lwf_anchor_proj is ',dtset%lwf_anchor_proj, ', but the only allowed values',ch10, &
892 0 : 'are 0, 1, 2.',ch10, 'Action: correct lwf_anchor_proj in your input file.'
893 0 : ABI_ERROR(message)
894 : end if
895 :
896 :
897 324 : dtset%lwf_ngqpt(:)=0
898 81 : call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'lwf_ngqpt',tread, 'INT')
899 90 : if(tread == 1) dtset%lwf_ngqpt(1:3)=intarr(1:3)
900 324 : do ii = 1, 3
901 324 : if(dtset%lwf_ngqpt(ii)<0)then
902 : write(message, '(a, i0, a, i0, 3a, i0, a)' )&
903 0 : 'lwf_ngqpt(',ii, ') is ',dtset%lwf_ngqpt(ii), ', which is lower than 0 .',ch10, &
904 0 : 'Action: correct lwf_ngqpt(',ii, ') in your input file.'
905 0 : ABI_ERROR(message)
906 : end if
907 : end do
908 :
909 :
910 81 : dtset%lwfflag = 0
911 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'lwfflag',tread, 'INT')
912 81 : if(tread == 1) dtset%lwfflag = intarr(1)
913 81 : if(dtset%lwfflag < 0 .or. dtset%lwfflag > 2)then
914 : write(message, '(a, i0, 5a)' )&
915 0 : 'lwfflag is ',dtset%lwfflag, ', but the only allowed values',ch10, &
916 0 : 'are 0, 1 and 2.',ch10, 'Action: correct lwfflag in your input file.'
917 0 : ABI_ERROR(message)
918 : end if
919 :
920 :
921 81 : dtset%lwf_mu = 0.0_dp
922 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'lwf_mu',tread, 'DPR')
923 81 : if(tread == 1) dtset%lwf_mu = dprarr(1)
924 :
925 :
926 81 : dtset%lwf_nwann = 0
927 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'lwf_nwann',tread, 'INT')
928 81 : if(tread == 1) dtset%lwf_nwann = intarr(1)
929 81 : if(dtset%lwf_nwann > natom*3)then
930 : write(message, '(a, i0, 2a, i0, 3a)' )&
931 0 : 'lwf_nwann is ',dtset%lwf_nwann, ', which is larger than natom*3',' (=',natom*3, ')',ch10, &
932 0 : 'Action: correct lwf_nwann in your input file.'
933 0 : ABI_ERROR(message)
934 : end if
935 :
936 81 : if( dtset%lwfflag > 0 .and. dtset%lwf_nwann .le. 0)then
937 : write(message, '(a, i0, 3a)' )&
938 0 : 'lwf_nwann is ',dtset%lwf_nwann, ', which is not positive',ch10, &
939 0 : 'Action: correct lwf_nwann in your input file.'
940 0 : ABI_ERROR(message)
941 : end if
942 :
943 81 : dtset%lwf_sigma = 0.01_dp
944 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'lwf_sigma',tread, 'DPR')
945 81 : if(tread == 1) dtset%lwf_sigma = dprarr(1)
946 :
947 : !M
948 :
949 81 : dtset%magpen = 0.0_dp
950 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'magpen',tread, 'DPR')
951 81 : if(tread == 1) dtset%magpen = dprarr(1)
952 :
953 324 : dtset%mpdir(:)=0
954 81 : call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'mpdir',tread, 'INT')
955 90 : if(tread == 1) dtset%mpdir(:)=intarr(1:3)
956 324 : do ii = 1, 3
957 324 : if(dtset%mpdir(ii)<0.or.dtset%mpdir(ii)>1)then
958 : write(message, '(a, i0, a, i0, 3a, i0, a)' )&
959 0 : 'mpdir(',ii, ') is ',dtset%mpdir(ii), &
960 0 : ', whereas it can only be 0 or 1.',ch10, &
961 0 : 'Action: correct mpdir(',ii, ') in your input file.'
962 0 : ABI_ERROR(message)
963 : end if
964 : end do
965 :
966 243 : dtset%mpatpol(:)=0
967 81 : call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'mpatpol',tread, 'INT')
968 87 : if(tread == 1) dtset%mpatpol(:)=intarr(1:2)
969 243 : do ii = 1, 2
970 243 : if(dtset%mpatpol(ii)<0.or.dtset%mpatpol(ii)>natom)then
971 : write(message, '(a, i0, a, i0, 3a, i0, a)' )&
972 0 : 'mpatpol(',ii, ') is ',dtset%mpatpol(ii), &
973 0 : ', which is lower than 0 or larget than the number of atoms in the cell.',ch10, &
974 0 : 'Action: correct mpatpol(',ii, ') in your input file.'
975 0 : ABI_ERROR(message)
976 : end if
977 : end do
978 :
979 81 : dtset%mpopt=2
980 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'mpopt',tread, 'INT')
981 81 : if(tread == 1) dtset%mpopt=intarr(1)
982 :
983 : !typical value for mustar, but can vary sensibly with the metal
984 81 : dtset%mustar = 0.1_dp
985 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'mustar',tread, 'DPR')
986 81 : if(tread == 1) dtset%mustar = dprarr(1)
987 81 : if (dtset%mustar < zero) then
988 : write(message, '(a, f10.3, 5a)' )&
989 0 : 'mustar is ',dtset%mustar, ', but only positive values',ch10, &
990 0 : 'are allowed',ch10, 'Action: correct mustar in your input file.'
991 0 : ABI_ERROR(message)
992 : end if
993 :
994 : !N
995 :
996 81 : dtset%natfix = 0
997 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'natfix',tread, 'INT')
998 81 : if(tread == 1) dtset%natfix = intarr(1)
999 81 : if(dtset%natfix > natom)then
1000 : write(message, '(a, i0, 2a, i0, 3a)' )&
1001 0 : 'natfix is ',dtset%natfix, ', which is larger than natom',' (=',natom, ')',ch10, &
1002 0 : 'Action: correct natfix in your input file.'
1003 0 : ABI_ERROR(message)
1004 : end if
1005 :
1006 81 : if(dtset%natfix < 0)then
1007 : write(message, '(a, i0, 3a)' )&
1008 0 : 'natfix is ',dtset%natfix, ', which is < 0',ch10, &
1009 0 : 'Action: correct natfix in your input file.'
1010 0 : ABI_ERROR(message)
1011 : end if
1012 :
1013 81 : dtset%natifc = 0
1014 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'natifc',tread, 'INT')
1015 81 : if(tread == 1) dtset%natifc = intarr(1)
1016 81 : if(dtset%natifc < 0)then
1017 : write(message, '(a, i0, 3a)' )&
1018 0 : 'natifc is ',dtset%natifc, ', which is lower than 0 .',ch10, &
1019 0 : 'Action: correct natifc in your input file.'
1020 0 : ABI_ERROR(message)
1021 : end if
1022 :
1023 81 : dtset%natprj_bs = 0
1024 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'natprj_bs',tread, 'INT')
1025 81 : if(tread == 1) dtset%natprj_bs = intarr(1)
1026 81 : if(dtset%natprj_bs < 0 .or. dtset%natprj_bs > natom)then
1027 : write(message, '(a, i0, a, i0, 2a)' )&
1028 0 : 'natprj_bs is ',dtset%natprj_bs, ', but must be between 0 and natom = ',natom, ch10, &
1029 0 : 'Action: correct natprj_bs in your input file.'
1030 0 : ABI_ERROR(message)
1031 : end if
1032 :
1033 81 : dtset%nchan = 800
1034 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nchan',tread, 'INT')
1035 81 : if(tread == 1) dtset%nchan = intarr(1)
1036 : !FIXME: check this-it should probably be .ge. 1, not 0
1037 81 : if(dtset%nchan < 0)then
1038 : write(message, '(a, i0, 3a)' )&
1039 0 : 'nchan is ',dtset%nchan, ', which is lower than 0 .',ch10, &
1040 0 : 'Action: correct nchan in your input file.'
1041 0 : ABI_ERROR(message)
1042 : end if
1043 :
1044 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ndivsm',tread, 'INT')
1045 81 : if(tread == 1) dtset%ndivsm = intarr(1)
1046 81 : if(dtset%ndivsm <= 0)then
1047 : write(message, '(a, i0, 3a)' )&
1048 0 : 'ndivsm is ',dtset%ndivsm, ', which is <= 0 .',ch10, &
1049 0 : 'Action: correct ndivsm in your input file.'
1050 0 : ABI_ERROR(message)
1051 : end if
1052 :
1053 81 : dtset%nfreq = 1
1054 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nfreq',tread, 'INT')
1055 81 : if(tread == 1) dtset%nfreq = intarr(1)
1056 81 : if(dtset%nfreq < 0)then
1057 : write(message, '(a, i0, 3a)' )&
1058 0 : 'nfreq is ',dtset%nfreq, ', which is lower than 0 .',ch10, &
1059 0 : 'Action: correct nfreq in your input file.'
1060 0 : ABI_ERROR(message)
1061 : end if
1062 :
1063 324 : dtset%ng2qpt(:)=0
1064 81 : call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'ng2qpt',tread, 'INT')
1065 141 : if(tread == 1) dtset%ng2qpt(:)=intarr(1:3)
1066 324 : do ii = 1, 3
1067 324 : if(dtset%ng2qpt(ii)<0)then
1068 : write(message, '(a, i0, a, i0, 3a, i0, a)' )&
1069 0 : 'ng2qpt(',ii, ') is ',dtset%ng2qpt(ii), ', which is lower than 0 .',ch10, &
1070 0 : 'Action: correct ng2qpt(',ii, ') in your input file.'
1071 0 : ABI_ERROR(message)
1072 : end if
1073 : end do
1074 :
1075 810 : dtset%ngqpt(:)=0
1076 81 : call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'ngqpt',tread, 'INT')
1077 270 : if(tread == 1) dtset%ngqpt(1:3)=intarr(1:3)
1078 324 : do ii = 1, 3
1079 324 : if(dtset%ngqpt(ii)<0)then
1080 : write(message, '(a, i0, a, i0, 3a, i0, a)' )&
1081 0 : 'ngqpt(',ii, ') is ',dtset%ngqpt(ii), ', which is lower than 0 .',ch10, &
1082 0 : 'Action: correct ngqpt(',ii, ') in your input file.'
1083 0 : ABI_ERROR(message)
1084 : end if
1085 : end do
1086 :
1087 81 : dtset%ngrids = 4
1088 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ngrids',tread, 'INT')
1089 81 : if(tread == 1) dtset%ngrids = intarr(1)
1090 81 : if(dtset%ngrids < 0)then
1091 : write(message, '(a, i0, 3a)' )&
1092 0 : 'ngrids is ',dtset%ngrids, ', which is lower than 0 .',ch10, &
1093 0 : 'Action: correct ngrids in your input file.'
1094 0 : ABI_ERROR(message)
1095 : end if
1096 :
1097 81 : dtset%nlflag = 0
1098 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nlflag',tread, 'INT')
1099 81 : if(tread == 1) dtset%nlflag = intarr(1)
1100 81 : if(dtset%nlflag < 0 .or. dtset%nlflag > 3)then
1101 : write(message, '(a, i0, 5a)' )&
1102 0 : 'nlflag is ',dtset%nlflag, ', but the only allowed values',ch10, &
1103 0 : 'are 0, 1, 2 or 3.',ch10, 'Action: correct nlflag in your input file.'
1104 0 : ABI_ERROR(message)
1105 : end if
1106 :
1107 81 : dtset%nph1l = 0
1108 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nph1l',tread, 'INT')
1109 81 : if(tread == 1) dtset%nph1l = intarr(1)
1110 81 : if(dtset%nph1l < 0)then
1111 : write(message, '(a, i0, 3a)' )&
1112 0 : 'nph1l is ',dtset%nph1l, ', which is lower than 0 .',ch10, &
1113 0 : 'Action: correct nph1l in your input file.'
1114 0 : ABI_ERROR(message)
1115 : end if
1116 :
1117 81 : dtset%nph2l = 0
1118 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nph2l',tread, 'INT')
1119 81 : if(tread == 1) dtset%nph2l = intarr(1)
1120 81 : if(dtset%nph2l < 0)then
1121 : write(message, '(a, i0, 3a)' )&
1122 0 : 'nph2l is ',dtset%nph2l, ', which is lower than 0 .',ch10, &
1123 0 : 'Action: correct nph2l in your input file.'
1124 0 : ABI_ERROR(message)
1125 : end if
1126 :
1127 81 : dtset%nqpath = 0
1128 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nqpath',tread, 'INT')
1129 81 : if(tread == 1) dtset%nqpath = intarr(1)
1130 81 : if(dtset%nqpath < 0)then
1131 : write(message, '(a, i0, 3a)' )&
1132 0 : 'nqpath is ',dtset%nqpath, ', but must be positive',ch10, &
1133 0 : 'Action: correct elphflag in your input file.'
1134 0 : ABI_ERROR(message)
1135 : end if
1136 :
1137 81 : dtset%nqshft = 1
1138 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nqshft',tread, 'INT')
1139 81 : if(tread == 1) dtset%nqshft = intarr(1)
1140 81 : if(dtset%nqshft < 0 .or. dtset%nqshft == 3 .or. dtset%nqshft >= 5 )then
1141 : write(message, '(a, i0, 5a)' )&
1142 0 : 'nqshft is ',dtset%nqshft, ', but the only allowed values',ch10, &
1143 0 : 'are 1, 2 or 4 .',ch10, 'Action: correct nqshft in your input file.'
1144 0 : ABI_ERROR(message)
1145 : end if
1146 :
1147 81 : dtset%nsphere = 0
1148 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nsphere',tread, 'INT')
1149 81 : if(tread == 1) dtset%nsphere = intarr(1)
1150 81 : if(dtset%nsphere < -1)then
1151 : write(message, '(a, i0, 3a)' )&
1152 0 : 'nsphere is ',dtset%nsphere, ', while it must be >= 0 or equal to-1',ch10, &
1153 0 : 'Action: correct nsphere in your input file.'
1154 0 : ABI_ERROR(message)
1155 : end if
1156 :
1157 81 : dtset%nstrfix = 0
1158 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nstrfix',tread, 'INT')
1159 81 : if(tread == 1) dtset%nstrfix = intarr(1)
1160 81 : if(dtset%nstrfix > 6)then
1161 : write(message, '(a, i0, 3a)' )&
1162 0 : 'nstrfix is ',dtset%nstrfix, ', which is larger than 6',ch10, &
1163 0 : 'Action: correct nstrfix in your input file.'
1164 0 : ABI_ERROR(message)
1165 : end if
1166 :
1167 81 : if(dtset%nstrfix < 0)then
1168 : write(message, '(a, i0, 3a)' )&
1169 0 : 'nstrfix is ',dtset%nstrfix, ', which is < 0',ch10, &
1170 0 : 'Action: correct nstrfix in your input file.'
1171 0 : ABI_ERROR(message)
1172 : end if
1173 :
1174 81 : dtset%ntemper = 10
1175 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ntemper',tread, 'INT')
1176 81 : if(tread == 1) dtset%ntemper = intarr(1)
1177 81 : if(dtset%ntemper < 0)then
1178 : write(message, '(a, i0, 3a)' )&
1179 0 : 'ntemper is ',dtset%ntemper, ', which is lower than 0',ch10, &
1180 0 : 'Action: correct ntemper in your input file.'
1181 0 : ABI_ERROR(message)
1182 : end if
1183 :
1184 81 : dtset%nwchan = 10
1185 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nwchan',tread, 'INT')
1186 81 : if(tread == 1) dtset%nwchan = intarr(1)
1187 : !FIXME: check this-it should probably be .ge. 1, not 0
1188 81 : if(dtset%nwchan < 0)then
1189 : write(message, '(a, i0, 3a)' )&
1190 0 : 'nwchan is ',dtset%nwchan, ', which is lower than 0 .',ch10, &
1191 0 : 'Action: correct nwchan in your input file.'
1192 0 : ABI_ERROR(message)
1193 : end if
1194 :
1195 : !O
1196 81 : dtset%outboltztrap = 0
1197 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'outboltztrap',tread, 'INT')
1198 81 : if(tread == 1) dtset%outboltztrap = intarr(1)
1199 81 : if(dtset%outboltztrap < 0 .or. dtset%outboltztrap > 1)then
1200 : write(message, '(a, i0, 5a)' )&
1201 0 : 'outboltztrap is ',dtset%outboltztrap, ', but the only allowed values',ch10, &
1202 0 : 'are 0 or 1.',ch10, 'Action: correct outboltztrap in your input file.'
1203 0 : ABI_ERROR(message)
1204 : end if
1205 :
1206 :
1207 : !P
1208 81 : dtset%piezoflag = 0
1209 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'piezoflag',tread, 'INT')
1210 81 : if(tread == 1) dtset%piezoflag = intarr(1)
1211 81 : if(dtset%piezoflag < 0 .or. dtset%piezoflag > 7)then
1212 : write(message, '(3a, i0, 5a)' )&
1213 0 : ' piezoflag is ',dtset%piezoflag, ', but the only allowed values',ch10, &
1214 0 : 'are 0, 1, 2, 3, 4, 5, 6, 7 .',ch10, 'Action: correct piezoflag in your input file.'
1215 0 : ABI_ERROR(message)
1216 : end if
1217 :
1218 81 : dtset%polflag = 0
1219 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'polflag',tread, 'INT')
1220 81 : if(tread == 1) dtset%polflag = intarr(1)
1221 81 : if(dtset%polflag < 0 .or. dtset%polflag > 1)then
1222 : write(message, '(a, i0, 5a)' )&
1223 0 : 'polflag is ',dtset%polflag, ', but the only allowed values',ch10, &
1224 0 : 'are 0 or 1.',ch10, 'Action: correct polflag in your input file.'
1225 0 : ABI_ERROR(message)
1226 : end if
1227 :
1228 81 : dtset%prtbltztrp = 0
1229 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtbltztrp',tread, 'INT')
1230 81 : if(tread == 1) dtset%prtbltztrp = intarr(1)
1231 81 : if(dtset%prtbltztrp < 0 .or. dtset%prtbltztrp > 1)then
1232 : write(message, '(a, i0, 5a)' )&
1233 0 : 'prtbltztrp is ',dtset%prtbltztrp, ', but the only allowed values',ch10, &
1234 0 : 'are 0 or 1.',ch10, 'Action: correct prtbltztrp in your input file.'
1235 0 : ABI_ERROR(message)
1236 : end if
1237 :
1238 : ! Default is no output for PHDOS
1239 81 : dtset%prtdos = 0
1240 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtdos',tread, 'INT')
1241 81 : if(tread == 1) dtset%prtdos = intarr(1)
1242 81 : if(dtset%prtdos < 0 .or. dtset%prtdos > 2) then
1243 : write(message, '(a, i0, 5a)' )&
1244 0 : 'prtdos is ',dtset%prtdos, ', but the only allowed values',ch10, &
1245 0 : 'are 0 (no output) or 1 (gaussians) or 2 (tetrahedra) ',ch10, &
1246 0 : 'Action: correct prtdos in your input file.'
1247 0 : ABI_ERROR(message)
1248 : end if
1249 :
1250 : !Default is no output for the Fermi Surface
1251 81 : dtset%prtfsurf = 0
1252 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtfsurf',tread, 'INT')
1253 81 : if(tread == 1) dtset%prtfsurf = intarr(1)
1254 81 : if(dtset%prtfsurf < 0 .or. dtset%prtfsurf > 2) then
1255 : write(message, '(a, i0, 5a)' )&
1256 0 : 'prtfsurf is ',dtset%prtfsurf, '. The only allowed values',ch10, &
1257 0 : 'are 0 (no output) or 1 (Xcrysden bxsf format)',ch10, &
1258 0 : 'Action: correct prtfsurf in your input file.'
1259 0 : ABI_ERROR(message)
1260 : end if
1261 :
1262 : !Default is no output of the real space IFC to file
1263 81 : dtset%prt_ifc = 0
1264 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prt_ifc',tread, 'INT')
1265 81 : if(tread == 1) dtset%prt_ifc = intarr(1)
1266 81 : if(dtset%prt_ifc < 0 .or. dtset%prt_ifc > 1) then
1267 : write(message, '(a, i0, 5a)' )&
1268 0 : 'prtf_ifc is ',dtset%prt_ifc, '. The only allowed values',ch10, &
1269 0 : 'are 0 (no output) or 1 (AI2PS format)',ch10, &
1270 0 : 'Action: correct prt_ifc in your input file.'
1271 0 : ABI_ERROR(message)
1272 : end if
1273 : ! check that ifcout is set
1274 81 : if (dtset%prt_ifc /= 0 .and. dtset%ifcout == 0) then
1275 0 : dtset%ifcout = -1 ! this forces output of all IFC
1276 : end if
1277 :
1278 : !Default is no output of the DDB to file
1279 81 : dtset%prtddb = 0
1280 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtddb',tread, 'INT')
1281 81 : if(tread == 1) dtset%prtddb = intarr(1)
1282 81 : if(dtset%prtddb < 0 .or. dtset%prtddb > 1) then
1283 : write(message, '(a, i0, 5a)' )&
1284 0 : 'prtf_ddb is ',dtset%prtddb, '. The only allowed values',ch10, &
1285 0 : 'are 0 (no output) or 1 (print DDB and DDB.nc files)',ch10, &
1286 0 : 'Action: correct prtddb in your input file.'
1287 0 : ABI_ERROR(message)
1288 : end if
1289 : ! check that ifcflag is set
1290 81 : if (dtset%prtddb /= 0 .and. dtset%ifcflag == 0) then
1291 0 : dtset%ifcflag = 1 ! this forces the use of IFC
1292 : end if
1293 :
1294 81 : dtset%prtmbm = 0
1295 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtmbm',tread, 'INT')
1296 81 : if(tread == 1) dtset%prtmbm = intarr(1)
1297 : !FIXME: should check whether value of prtmbm is valid
1298 :
1299 : !Default is no output of the nesting factor
1300 81 : dtset%prtnest = 0
1301 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtnest',tread, 'INT')
1302 81 : if(tread == 1) dtset%prtnest = intarr(1)
1303 81 : if(dtset%prtnest < 0 .or. dtset%prtnest > 2) then
1304 : write(message, '(a, i0, 5a)' )&
1305 0 : 'prtnest is ',dtset%prtnest, ' The only allowed values',ch10, &
1306 0 : 'are 0 (no nesting), 1 (XY format) or 2 (XY+Xcrysden format)',ch10, &
1307 0 : 'Action: correct prtnest in your input file.'
1308 0 : ABI_ERROR(message)
1309 : end if
1310 :
1311 81 : dtset%prtphbands = 1
1312 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtphbands',tread, 'INT')
1313 81 : if (tread == 1) dtset%prtphbands = intarr(1)
1314 81 : if (all(dtset%prtphbands /= [0, 1, 2])) then
1315 : write(message, '(a, i0, a)' )&
1316 0 : 'prtphbands is ',dtset%prtphbands, ', but the only allowed values are [0, 1, 2].'
1317 0 : ABI_ERROR(message)
1318 : end if
1319 :
1320 81 : dtset%prtsrlr = 0
1321 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtsrlr',tread, 'INT')
1322 81 : if(tread == 1) dtset%prtsrlr = intarr(1)
1323 81 : if(dtset%prtsrlr < 0 .or. dtset%prtsrlr > 1)then
1324 : write(message, '(a, i0, 5a)' )&
1325 0 : 'prtsrlr is ',dtset%prtsrlr, ', but the only allowed values',ch10, &
1326 0 : 'are 0 or 1.',ch10, 'Action: correct prtsrlr in your input file.'
1327 0 : ABI_ERROR(message)
1328 : end if
1329 :
1330 81 : dtset%prtvol = 0
1331 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'prtvol',tread, 'INT')
1332 81 : if(tread == 1) dtset%prtvol = intarr(1)
1333 :
1334 : !Q
1335 :
1336 324 : dtset%q2shft(:)=zero
1337 81 : call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'q2shft',tread, 'DPR')
1338 93 : if(tread == 1) dtset%q2shft(:)=dprarr(1:3)
1339 : !FIXME: need a test on valid entries for q2shft
1340 :
1341 81 : dtset%qgrid_type = 1 ! default is uniform nqpt(:) grid
1342 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'qgrid_type',tread, 'INT')
1343 81 : if(tread == 1) dtset%qgrid_type = intarr(1)
1344 81 : if(dtset%qgrid_type < 1 .or. dtset%qgrid_type > 2) then
1345 : write(message, '(a, i0, 5a)' )&
1346 0 : 'qgrid_type is ',dtset%qgrid_type, ' The only allowed values',ch10, &
1347 0 : 'are 1 (uniform grid from nqpt) or 2 (listed in ep_nqpt, ep_qptlist)',ch10, &
1348 0 : 'Action: correct qgrid_type in your input file.'
1349 0 : ABI_ERROR(message)
1350 : end if
1351 :
1352 324 : dtset%qrefine = 1 ! default is no refinement
1353 81 : call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'qrefine',tread, 'INT')
1354 84 : if(tread == 1) dtset%qrefine = intarr(1:3)
1355 324 : do ii = 1, 3
1356 324 : if(dtset%qrefine(ii) < 1) then
1357 : write(message, '(a, 3i0, a, a, a, a, a)' )&
1358 0 : 'qrefine is',dtset%qrefine, ' The only allowed values',ch10, &
1359 0 : 'are integers >= 1 giving the refinement of the ngqpt grid',ch10, &
1360 0 : 'Action: correct qrefine in your input file.'
1361 0 : ABI_ERROR(message)
1362 : end if
1363 : end do
1364 :
1365 81 : dtset%quadquad = 1
1366 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'quadquad',tread, 'INT')
1367 81 : if(tread == 1) dtset%quadquad = intarr(1)
1368 81 : if(dtset%quadquad < -1 .or. dtset%quadquad > 1)then
1369 : write(message, '(a, i0, 5a)' )&
1370 0 : 'quadquad is ',dtset%quadquad, ', but the only allowed values',ch10, &
1371 0 : 'are 0 or 1 .',ch10, 'Action: correct quadquad in your input file.'
1372 0 : ABI_ERROR(message)
1373 : end if
1374 :
1375 : !R
1376 :
1377 81 : dtset%ramansr = 0
1378 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ramansr',tread, 'INT')
1379 81 : if(tread == 1) dtset%ramansr = intarr(1)
1380 81 : if(dtset%ramansr < 0 .or. dtset%ramansr > 2)then
1381 : write(message, '(a, i0, 5a)' )&
1382 0 : 'ramansr is ',dtset%ramansr, ', but the only allowed values',ch10, &
1383 0 : 'are 0, 1 or 2.',ch10, 'Action: correct ramansr in your input file.'
1384 0 : ABI_ERROR(message)
1385 : end if
1386 :
1387 81 : dtset%relaxat = 0
1388 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'relaxat',tread, 'INT')
1389 81 : if(tread == 1) dtset%relaxat = intarr(1)
1390 81 : if(dtset%relaxat < 0 .or. dtset%relaxat > 1)then
1391 : write(message, '(a, i0, 5a)' )&
1392 0 : 'relaxat is ',dtset%relaxat, ', but the only allowed values',ch10, &
1393 0 : 'are 0 or 1.',ch10, 'Action: correct relaxat in your input file.'
1394 0 : ABI_ERROR(message)
1395 : end if
1396 :
1397 81 : dtset%relaxstr = 0
1398 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'relaxstr',tread, 'INT')
1399 81 : if(tread == 1) dtset%relaxstr = intarr(1)
1400 81 : if(dtset%relaxstr < 0 .or. dtset%relaxstr > 1)then
1401 : write(message, '(a, i0, 5a)' )&
1402 0 : 'relaxstr is ',dtset%relaxstr, 'but the only allowed values',ch10, &
1403 0 : 'are 0 or 1.',ch10, 'Action: correct relaxstr in your input file.'
1404 0 : ABI_ERROR(message)
1405 : end if
1406 :
1407 81 : dtset%rfmeth = 1
1408 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'rfmeth',tread, 'INT')
1409 81 : if(tread == 1) dtset%rfmeth = intarr(1)
1410 81 : if(dtset%rfmeth < 1 .or. dtset%rfmeth > 2)then
1411 : write(message, '(a, i0, 5a)' )&
1412 0 : 'rfmeth is ',dtset%rfmeth, ', but the only allowed values',ch10, &
1413 0 : 'are 1 or 2.',ch10, 'Action: correct rfmeth in your input file.'
1414 0 : ABI_ERROR(message)
1415 : end if
1416 :
1417 81 : dtset%rifcsph = zero
1418 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'rifcsph',tread, 'DPR')
1419 81 : if(tread == 1) dtset%rifcsph = dprarr(1)
1420 : ! if(dtset%rifcsph < -tol12)then
1421 : ! write(message, '(a, f10.3, 3a)' )&
1422 : !& 'rifcsph is ',dtset%rifcsph, ', which is lower than zero.',ch10, &
1423 : !& 'Action: correct rifcsph in your input file.'
1424 : ! ABI_ERROR(message)
1425 : ! end if
1426 :
1427 : !S
1428 :
1429 81 : dtset%selectz = 0
1430 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'selectz',tread, 'INT')
1431 81 : if(tread == 1) dtset%selectz = intarr(1)
1432 81 : if(dtset%selectz < 0 .or. dtset%selectz > 2)then
1433 : write(message, '(a, i0, 5a)' )&
1434 0 : 'selectz is ',dtset%selectz, ', but the only allowed values',ch10, &
1435 0 : 'are 0, 1 or 2 .',ch10, 'Action: correct selectz in your input file.'
1436 0 : ABI_ERROR(message)
1437 : end if
1438 :
1439 81 : dtset%symdynmat = 1
1440 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'symdynmat',tread, 'INT')
1441 81 : if(tread == 1) dtset%symdynmat = intarr(1)
1442 81 : if(dtset%symdynmat /= 0 .and. dtset%symdynmat /= 1)then
1443 : write(message, '(a, i0, 5a)' )&
1444 0 : 'symdynmat is ',dtset%symdynmat, '. The only allowed values',ch10, &
1445 0 : 'are 0, or 1.',ch10, 'Action: correct symdynmat in your input file.'
1446 0 : ABI_ERROR(message)
1447 : end if
1448 :
1449 81 : dtset%sys_dim=1
1450 81 : call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'sys_dim',tread,'INT')
1451 81 : if(tread==1) dtset%sys_dim=intarr(1)
1452 81 : if(dtset%sys_dim<1.or.dtset%sys_dim>9)then
1453 : write(message, '(a,i0,5a)' )&
1454 0 : 'sys_dim is ',dtset%sys_dim,', but the only allowed values',ch10,&
1455 0 : 'are 1, 2, 3, 4, 5, 6, 7 or 8.',ch10,'Action: correct sys_dim in your input file.'
1456 0 : ABI_ERROR(message)
1457 : end if
1458 : !T
1459 :
1460 324 : dtset%targetpol(:) = 0._dp
1461 81 : call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'targetpol',tread, 'DPR')
1462 87 : if(tread == 1) dtset%targetpol(1:3) = dprarr(1:3)
1463 :
1464 : !Default is use gaussian integration
1465 81 : dtset%telphint = 1
1466 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'telphint',tread, 'INT')
1467 81 : if(tread == 1) dtset%telphint = intarr(1)
1468 81 : if(dtset%telphint < 0 .or. dtset%telphint > 3) then
1469 : write(message, '(a, i0, 6a)' )&
1470 0 : 'telphint is ',dtset%telphint, '. The only allowed values',ch10, &
1471 0 : 'are 0 (tetrahedron) or 1 (gaussian) or ','2 (set of bands occupied ep_b_min, ep_b_max) or 3 (Fermi Dirac).',ch10, &
1472 0 : 'Action: correct telphint in your input file.'
1473 0 : ABI_ERROR(message)
1474 : end if
1475 :
1476 81 : dtset%temperinc = 100.0_dp
1477 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'temperinc',tread, 'DPR')
1478 81 : if(tread == 1) dtset%temperinc = dprarr(1)
1479 81 : if(dtset%temperinc < zero)then
1480 : write(message, '(a, f10.3, 3a)' )&
1481 0 : 'temperinc is ',dtset%temperinc, ', which is lower than 0 .',ch10, &
1482 0 : 'Action: correct temperinc in your input file.'
1483 0 : ABI_ERROR(message)
1484 : end if
1485 :
1486 81 : dtset%tempermin = 100.0_dp
1487 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'tempermin',tread, 'DPR')
1488 81 : if(tread == 1) dtset%tempermin = dprarr(1)
1489 81 : if(dtset%tempermin < -tol12)then
1490 : write(message, '(a, f10.3, 3a)' )&
1491 0 : 'tempermin is ',dtset%tempermin, ', which is lower than 0 .',ch10, &
1492 0 : 'Action: correct tempermin in your input file.'
1493 0 : ABI_ERROR(message)
1494 : end if
1495 :
1496 1053 : dtset%thermal_supercell(:,:)=0
1497 81 : marr = 9
1498 81 : ABI_FREE(intarr)
1499 81 : ABI_FREE(dprarr)
1500 81 : ABI_MALLOC(intarr, (marr))
1501 81 : ABI_MALLOC(dprarr, (marr))
1502 81 : call intagm(dprarr, intarr, jdtset, marr, 9, string(1:lenstr), 'thermal_supercell',tread, 'INT')
1503 93 : if(tread == 1) dtset%thermal_supercell(1:3, 1:3)=reshape(intarr(1:9), (/3, 3/))
1504 81 : call mati3det(dtset%thermal_supercell, idet)
1505 1053 : if(sum(abs(dtset%thermal_supercell))>0 .and. idet == 0) then
1506 : write(message, '(a, 9I6, 5a)' )&
1507 0 : 'thermal_supercell is ',dtset%thermal_supercell, ', but the matrix must be non singular',ch10, &
1508 0 : 'with a non zero determinant.',ch10, 'Action: correct thermal_supercell in your input file.'
1509 0 : ABI_ERROR(message)
1510 : end if
1511 :
1512 81 : dtset%thmflag = 0
1513 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'thmflag',tread, 'INT')
1514 81 : if(tread == 1) dtset%thmflag = intarr(1)
1515 81 : if(dtset%thmflag < 0 .or. dtset%thmflag > 8)then
1516 : write(message, '(a, i0, 5a)' )&
1517 0 : 'thmflag is ',dtset%thmflag, ', but the only allowed values',ch10, &
1518 0 : 'are between 0 to 8 (included).',ch10, 'Action: correct thmflag in your input file.'
1519 0 : ABI_ERROR(message)
1520 : end if
1521 :
1522 81 : dtset%thmtol = 0.25_dp
1523 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'thmtol',tread, 'DPR')
1524 81 : if(tread == 1) dtset%thmtol = dprarr(1)
1525 81 : if(dtset%thmtol < zero)then
1526 : write(message, '(a, es14.4, 3a)' )&
1527 0 : 'thmtol is ',dtset%thmtol, ', which is lower than 0 .',ch10, &
1528 0 : 'Action: correct thmtol in your input file.'
1529 0 : ABI_ERROR(message)
1530 : end if
1531 :
1532 81 : dtset%timdisp = 0
1533 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'timdisp',tread, 'INT')
1534 81 : if(tread == 1) dtset%timdisp = intarr(1)
1535 :
1536 81 : dtset%ep_prt_yambo = 0
1537 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ep_prt_yambo',tread, 'INT')
1538 81 : if(tread == 1) dtset%ep_prt_yambo = intarr(1)
1539 81 : if(dtset%ep_prt_yambo < 0 .or. dtset%ep_prt_yambo > 1) then
1540 : write(message, '(a, i0, 5a)' )&
1541 0 : 'ep_prt_yambo is ',dtset%ep_prt_yambo, ', but the only allowed values',ch10, &
1542 0 : 'are 0 or 1.',ch10, 'Action: correct ep_prt_yambo in your input file.'
1543 0 : ABI_ERROR(message)
1544 : end if
1545 :
1546 : !default means _do_ symmetrize the ep coupling matrices over qpoints
1547 81 : dtset%symgkq = 1
1548 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'symgkq',tread, 'INT')
1549 81 : if(tread == 1) dtset%symgkq = intarr(1)
1550 81 : if(dtset%symgkq < 0 .or. dtset%symgkq > 1) then
1551 : write(message, '(a, i0, 5a)' )&
1552 0 : 'symgkq is ',dtset%symgkq, ', but the only allowed values',ch10, &
1553 0 : 'are 0 or 1.',ch10, 'Action: correct symgkq in your input file.'
1554 0 : ABI_ERROR(message)
1555 81 : else if (dtset%symgkq == 0) then
1556 1 : ABI_WARNING('You have turned off el-ph matrix symmetrization over q. Use at own risk')
1557 : end if
1558 :
1559 : !U
1560 :
1561 81 : dtset%use_k_fine = 0
1562 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'use_k_fine',tread, 'INT')
1563 81 : if(tread == 1) dtset%use_k_fine = intarr(1)
1564 81 : if(dtset%use_k_fine /= 1 .and. dtset%use_k_fine /= 0) then
1565 : write(message, '(a, i0, 5a)' )&
1566 0 : 'use_k_fine is ',dtset%use_k_fine, ', but the only allowed values',ch10, &
1567 0 : 'are 1 or 0.',ch10, 'Action: correct use_k_fine in your input file.'
1568 0 : ABI_ERROR(message)
1569 : end if
1570 :
1571 81 : if(dtset%use_k_fine == 1) then
1572 0 : if (sum(dtset%kptrlatt) == 0 .or. sum(dtset%kptrlatt_fine) == 0 ) then
1573 0 : ABI_ERROR('If a finer k-grid is used, you must specify both kptrlatt and kptrlatt_fine')
1574 : end if
1575 : end if
1576 :
1577 :
1578 : !V
1579 243 : dtset%vs_qrad_tolkms(:) = zero
1580 81 : call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'vs_qrad_tolkms',tread, 'DPR')
1581 81 : if (tread == 1) then
1582 3 : dtset%vs_qrad_tolkms(:) = dprarr(1:2)
1583 1 : ABI_CHECK(dprarr(1) >= zero, "vs_qrad must be >= 0")
1584 1 : ABI_CHECK(dprarr(2) > zero, "vs_tolkms must be > zero")
1585 : end if
1586 : !W
1587 :
1588 : !X
1589 :
1590 : !Y
1591 :
1592 : !Z
1593 :
1594 : !=====================================================================
1595 : !end non-dependent variables
1596 : !=====================================================================
1597 :
1598 : !=======================================================================
1599 : !Read in dependent variables (dependent on dimensions above)
1600 : !=======================================================================
1601 :
1602 : !A
1603 :
1604 243 : ABI_MALLOC(dtset%atifc, (dtset%natifc))
1605 243 : ABI_MALLOC(dtset%atifcflg, (natom))
1606 107 : dtset%atifc(:) = 0
1607 81 : if(dtset%natifc >= 1)then
1608 : ! default to 1 for first natifc atoms
1609 42 : dtset%atifc(1:dtset%natifc)=1
1610 :
1611 16 : if(dtset%natifc > marr)then
1612 0 : marr = dtset%natifc
1613 0 : ABI_FREE(intarr)
1614 0 : ABI_FREE(dprarr)
1615 0 : ABI_MALLOC(intarr, (marr))
1616 0 : ABI_MALLOC(dprarr, (marr))
1617 : end if
1618 16 : call intagm(dprarr, intarr, jdtset, marr, dtset%natifc, string(1:lenstr), 'atifc',tread, 'INT')
1619 58 : if(tread == 1) dtset%atifc = intarr(1:dtset%natifc)
1620 : ! check of whether values of atifc are valid is done in chkin9
1621 : end if
1622 :
1623 : !B
1624 :
1625 : !C
1626 :
1627 : !D
1628 :
1629 : !E
1630 :
1631 : !F
1632 :
1633 : !G
1634 :
1635 : !H
1636 :
1637 : !I
1638 :
1639 162 : ABI_MALLOC(dtset%iatfix, (natom))
1640 341 : dtset%iatfix(:) = 0
1641 81 : if ((dtset%relaxat == 1).and.(dtset%natfix > 0)) then
1642 0 : if(natom > marr)then
1643 0 : marr = natom
1644 0 : ABI_FREE(intarr)
1645 0 : ABI_FREE(dprarr)
1646 0 : ABI_MALLOC(intarr, (marr))
1647 0 : ABI_MALLOC(dprarr, (marr))
1648 : end if
1649 0 : call intagm(dprarr, intarr, jdtset, marr, dtset%natfix, string(1:lenstr), 'iatfix',tread, 'INT')
1650 0 : if(tread == 1) dtset%iatfix(1:dtset%natfix) = intarr(1:dtset%natfix)
1651 : end if
1652 : !FIXME: need a test on values of iatfix: are they just 1 or 0?
1653 :
1654 81 : if ((dtset%relaxstr == 1).and.(dtset%nstrfix > 0)) then
1655 7 : dtset%istrfix(:) = 0
1656 1 : call intagm(dprarr, intarr, jdtset, marr, dtset%nstrfix, string(1:lenstr), 'istrfix',tread, 'INT')
1657 3 : if(tread == 1) dtset%istrfix(1:dtset%nstrfix) = intarr(1:dtset%nstrfix)
1658 : end if
1659 : !FIXME: need a test on values of istrfix
1660 :
1661 81 : if (dtset%natprj_bs > 0) then
1662 9 : ABI_MALLOC(dtset%iatprj_bs, (dtset%natprj_bs))
1663 3 : if(dtset%natprj_bs > marr)then
1664 0 : marr = dtset%natprj_bs
1665 0 : ABI_FREE(intarr)
1666 0 : ABI_FREE(dprarr)
1667 0 : ABI_MALLOC(intarr, (marr))
1668 3 : ABI_MALLOC(dprarr, (marr))
1669 : end if
1670 9 : dtset%iatprj_bs(:)=0
1671 3 : call intagm(dprarr, intarr, jdtset, marr, dtset%natprj_bs, string(1:lenstr), 'iatprj_bs',tread, 'INT')
1672 3 : if(tread == 1) then
1673 9 : dtset%iatprj_bs(1:dtset%natprj_bs)=intarr(1:dtset%natprj_bs)
1674 : else
1675 : write(message, '(3a)')&
1676 0 : 'natprj_bs is non zero but iatprj_bs is absent ',ch10, &
1677 0 : 'Action: specify iatprj_bs in your input file.'
1678 0 : ABI_ERROR(message)
1679 : end if
1680 : end if
1681 :
1682 : !J
1683 :
1684 : !K
1685 :
1686 : !L
1687 :
1688 :
1689 81 : if (dtset%lwfflag .eq. 1 ) then
1690 6 : ABI_MALLOC(dtset%lwf_anchor_iband, (dtset%lwf_nwann))
1691 :
1692 2 : if(dtset%lwf_nwann > marr)then
1693 0 : marr = dtset%lwf_nwann
1694 0 : ABI_FREE(intarr)
1695 0 : ABI_FREE(dprarr)
1696 0 : ABI_MALLOC(intarr, (marr))
1697 2 : ABI_MALLOC(dprarr, (marr))
1698 : end if
1699 8 : dtset%lwf_anchor_iband(:)=0
1700 2 : call intagm(dprarr, intarr, jdtset, marr, dtset%lwf_nwann, string(1:lenstr), 'lwf_anchor_iband',tread, 'INT')
1701 2 : if(tread == 1) then
1702 8 : dtset%lwf_anchor_iband(1:dtset%lwf_nwann)=intarr(1:dtset%lwf_nwann)
1703 : !else
1704 : ! write(message, '(3a)')&
1705 : ! 'lwfflag > 0 and lwf_anchor_proj = 1 but lwf_anchor_iband is absent ',ch10, &
1706 : ! 'Action: specify lwf_anchor_iband in your input file.'
1707 : ! ABI_ERROR(message)
1708 : end if
1709 :
1710 79 : else if (dtset%lwfflag .eq. 2 ) then
1711 :
1712 3 : ABI_MALLOC(dtset%lwf_projector, (dtset%lwf_nwann))
1713 :
1714 1 : if(dtset%lwf_nwann > marr)then
1715 0 : marr = dtset%lwf_nwann
1716 0 : ABI_FREE(intarr)
1717 0 : ABI_FREE(dprarr)
1718 0 : ABI_MALLOC(intarr, (marr))
1719 1 : ABI_MALLOC(dprarr, (marr))
1720 : end if
1721 4 : dtset%lwf_projector(:)=0
1722 1 : call intagm(dprarr, intarr, jdtset, marr, dtset%lwf_nwann, string(1:lenstr), 'lwf_projector',tread, 'INT')
1723 1 : if(tread == 1) then
1724 4 : dtset%lwf_projector(1:dtset%lwf_nwann)=intarr(1:dtset%lwf_nwann)
1725 : else
1726 : write(message, '(3a)')&
1727 0 : 'lwfflag = 2 and lwf_anchor_proj = 1 but lwf_projector is absent ',ch10, &
1728 0 : 'Action: specify lwf_projector in your input file.'
1729 0 : ABI_ERROR(message)
1730 : end if
1731 :
1732 : end if
1733 :
1734 : !M
1735 :
1736 : !N
1737 :
1738 : !O
1739 :
1740 : !P
1741 :
1742 : !Q
1743 :
1744 81 : if (dtset%nqshft /= 0)then
1745 81 : if(3*dtset%nqshft > marr)then
1746 4 : marr = 3*dtset%nqshft
1747 4 : ABI_FREE(intarr)
1748 4 : ABI_FREE(dprarr)
1749 12 : ABI_MALLOC(intarr, (marr))
1750 89 : ABI_MALLOC(dprarr, (marr))
1751 : end if
1752 1377 : dtset%q1shft(:,:)=zero
1753 81 : call intagm(dprarr, intarr, jdtset, marr, 3*dtset%nqshft, string(1:lenstr), 'q1shft',tread, 'DPR')
1754 81 : if(tread == 1) dtset%q1shft(1:3, 1:dtset%nqshft)=&
1755 476 : & reshape(dprarr(1:3*dtset%nqshft), (/3, dtset%nqshft/))
1756 : end if
1757 :
1758 243 : ABI_MALLOC(dtset%qph1l, (3, dtset%nph1l))
1759 243 : ABI_MALLOC(dtset%qnrml1, (dtset%nph1l))
1760 81 : if (dtset%nph1l /= 0)then
1761 57 : if(4*dtset%nph1l > marr)then
1762 33 : marr = 4*dtset%nph1l
1763 33 : ABI_FREE(intarr)
1764 33 : ABI_FREE(dprarr)
1765 99 : ABI_MALLOC(intarr, (marr))
1766 123 : ABI_MALLOC(dprarr, (marr))
1767 : end if
1768 2501 : dtset%qph1l(:,:)=zero
1769 668 : dtset%qnrml1(:)=zero
1770 57 : call intagm(dprarr, intarr, jdtset, marr, 4*dtset%nph1l, string(1:lenstr), 'qph1l',tread, 'DPR')
1771 57 : if(tread == 1)then
1772 668 : do iph1 = 1, dtset%nph1l
1773 2444 : do ii = 1, 3
1774 2444 : dtset%qph1l(ii, iph1)=dprarr(ii+(iph1-1)*4)
1775 : end do
1776 611 : dtset%qnrml1(iph1)=dprarr(4+(iph1-1)*4)
1777 668 : if(abs(dtset%qnrml1(iph1))<DDB_QTOL)then
1778 : write(message, '(5a)' )&
1779 0 : 'The first list of wavevectors ','should not have non-analytical data.',ch10, &
1780 0 : 'Action: correct the first list',' of wavevectors in the input file.'
1781 0 : ABI_ERROR(message)
1782 : end if
1783 : end do
1784 : end if
1785 : end if
1786 :
1787 243 : ABI_MALLOC(dtset%qph2l, (3, dtset%nph2l))
1788 243 : ABI_MALLOC(dtset%qnrml2, (dtset%nph2l))
1789 81 : if (dtset%nph2l /= 0)then
1790 24 : if(4*dtset%nph2l > marr)then
1791 6 : marr = 4*dtset%nph2l
1792 6 : ABI_FREE(intarr)
1793 6 : ABI_FREE(dprarr)
1794 18 : ABI_MALLOC(intarr, (marr))
1795 36 : ABI_MALLOC(dprarr, (marr))
1796 : end if
1797 172 : dtset%qph2l(:,:)=zero
1798 61 : dtset%qnrml2(:)=zero
1799 24 : call intagm(dprarr, intarr, jdtset, marr, 4*dtset%nph2l, string(1:lenstr), 'qph2l',tread, 'DPR')
1800 24 : if(tread == 1)then
1801 61 : do iph2 = 1, dtset%nph2l
1802 148 : do ii = 1, 3
1803 148 : dtset%qph2l(ii, iph2)=dprarr(ii+(iph2-1)*4)
1804 : end do
1805 37 : dtset%qnrml2(iph2)=dprarr(4+(iph2-1)*4)
1806 61 : if(abs(dtset%qnrml2(iph2))>DDB_QTOL)then
1807 : write(message, '(5a)' )&
1808 0 : 'The second list of wavevectors',' should have only non-analytical data.',ch10, &
1809 0 : 'Action: correct the second list','of wavevectors in the input file.'
1810 0 : ABI_ERROR(message)
1811 : end if
1812 : end do
1813 : end if
1814 : end if
1815 :
1816 81 : if (dtset%nqpath > 0) then
1817 72 : ABI_MALLOC(dtset%qpath, (3, dtset%nqpath))
1818 24 : if(3*dtset%nqpath > marr)then
1819 14 : marr = 3*dtset%nqpath
1820 14 : ABI_FREE(intarr)
1821 14 : ABI_FREE(dprarr)
1822 42 : ABI_MALLOC(intarr, (marr))
1823 52 : ABI_MALLOC(dprarr, (marr))
1824 : end if
1825 708 : dtset%qpath(:,:)=zero
1826 24 : call intagm(dprarr, intarr, jdtset, marr, 3*dtset%nqpath, string(1:lenstr), 'qpath',tread, 'DPR')
1827 24 : if(tread == 1) then
1828 756 : dtset%qpath(1:3, 1:dtset%nqpath)= reshape(dprarr(1:3*dtset%nqpath), (/3, dtset%nqpath/))
1829 : else
1830 : write(message, '(3a)')&
1831 0 : 'nqpath is non zero but qpath is absent ',ch10, &
1832 0 : 'Action: specify qpath in your input file.'
1833 0 : ABI_ERROR(message)
1834 : end if
1835 : end if
1836 :
1837 : !R
1838 :
1839 : !S
1840 :
1841 : !T
1842 :
1843 : !U
1844 :
1845 : !V
1846 :
1847 : !W
1848 :
1849 : !X
1850 :
1851 : !Y
1852 :
1853 : !Z
1854 :
1855 : !=======================================================================
1856 : !Finished reading in variables-deallocate
1857 : !=======================================================================
1858 :
1859 81 : ABI_FREE(dprarr)
1860 81 : ABI_FREE(intarr)
1861 :
1862 : !=======================================================================
1863 : !Check consistency of input variables:
1864 : !=======================================================================
1865 :
1866 81 : if (dtset%frmin > dtset%frmax) then
1867 : write(message, '(3a)' )&
1868 0 : 'frmax should be higher than frmin',ch10, &
1869 0 : 'Action: change frmax and/or frmin in your input file.'
1870 0 : ABI_ERROR(message)
1871 : end if
1872 :
1873 81 : if (dtset%nqpath == 0 .and. dtset%elphflag == 1) then
1874 : write(message, '(4a)' )&
1875 0 : 'elphflag is 1 but no nqpath has been specified','for phonon linewidths',ch10, &
1876 0 : 'Action: specify nqpath and qpath(3, nqpath) in your input file.'
1877 0 : ABI_ERROR(message)
1878 : end if
1879 :
1880 81 : if(dtset%telphint /= 2 .and. (dtset%ep_b_min /= 0 .or. dtset%ep_b_max /= 0)) then
1881 : write(message, '(a, i0, 3a)' )&
1882 0 : 'telphint is ',dtset%telphint, ', but ep_b_min or ep_b_max',ch10, &
1883 0 : 'are set /= 1. They will not be used'
1884 0 : call wrtout(std_out, message, 'COLL')
1885 0 : ABI_WARNING(message)
1886 :
1887 81 : else if(dtset%telphint == 2 .and. (dtset%ep_b_min == 0 .or. dtset%ep_b_max == 0)) then
1888 : write(message, '(a, i0, 4a)' )&
1889 0 : 'telphint is ',dtset%telphint, ', but ep_b_min or ep_b_max',ch10, &
1890 0 : 'are not both set. ',ch10, &
1891 0 : 'Action: set ep_b_min and ep_b_max in your input file.',ch10
1892 0 : ABI_ERROR(message)
1893 : end if
1894 :
1895 81 : if(dtset%thmflag < 3) then
1896 : if ((dtset%telphint == 0 .or. dtset%prtnest == 1 .or. &
1897 962 : dtset%prtnest == 2 .or. dtset%prtfsurf == 1) .and. sum(dtset%kptrlatt) == 0 ) then
1898 : write (message, '(3a)') &
1899 0 : 'if tetrahedron integration is used, ',&
1900 0 : 'or the output of the nesting function/Fermi surface is required, ',&
1901 0 : 'you must specify the kptrlatt'
1902 0 : ABI_ERROR(message)
1903 : end if
1904 : end if
1905 :
1906 81 : if(dtset%prtdos /= 0 .and. dtset%ifcflag /= 1) then
1907 : write(message, '(3a)' )&
1908 0 : 'ifcflag must be 1 when the calculation of the phonon DOS is required ',ch10, &
1909 0 : 'Action: correct ifcflag in your input file.'
1910 0 : ABI_ERROR(message)
1911 : end if
1912 :
1913 81 : if(dtset%prtsrlr /= 0 .and. dtset%ifcflag /= 1) then
1914 : write(message, '(3a)' )&
1915 0 : 'ifcflag must be 1 for the SR/LR decomposition of the phonon frequencies',ch10, &
1916 0 : 'Action: correct ifcflag in your input file.'
1917 0 : ABI_ERROR(message)
1918 : end if
1919 :
1920 81 : if (dtset%gruns_nddbs /= 0 .and. dtset%ifcflag /= 1) then
1921 0 : ABI_ERROR("ifcflag must be 1 for Gruneisen calculation")
1922 : end if
1923 :
1924 81 : if (dtset%vs_qrad_tolkms(1) /= zero .and. dtset%ifcflag /= 1) then
1925 0 : ABI_ERROR("ifcflag must be 1 to calculate speed of sound")
1926 : end if
1927 :
1928 324 : if(dtset%prtdos /= 0 .and. sum(abs(dtset%ng2qpt(:))) < 3 ) then
1929 : write(message, '(3a)' )&
1930 0 : 'ng2qpt must be specified when the calculation of the phonon DOS is required ',ch10, &
1931 0 : 'Action: correct ng2qpt in your input file.'
1932 0 : ABI_ERROR(message)
1933 : end if
1934 :
1935 81 : if (dtset%ifltransport /= 0 .and. dtset%ep_keepbands /= 1) then
1936 : write(message, '(3a)' )&
1937 0 : 'Band dependency of electron phonon matrix elements must be kept for transport ',ch10, &
1938 0 : 'Action: set ep_keepbands to 1 in your input file.'
1939 0 : ABI_ERROR(message)
1940 : end if
1941 :
1942 1053 : if (dtset%ifltransport > 1 .and. sum(abs(dtset%kptrlatt)) == 0) then
1943 : write(message, '(3a)' )&
1944 0 : 'For inelastic transport or electron lifetime calculations you must specify kprtlatt ',ch10, &
1945 0 : 'Action: copy kptrlatt from your abinit GS file to your anaddb input file.'
1946 0 : ABI_ERROR(message)
1947 : end if
1948 :
1949 : !FIXME: add check that if freeze_displ /= 0 then you need to be doing ifc and phonon interpolation
1950 :
1951 810 : if (dtset%ifcflag > 0 .and. sum(abs(dtset%ngqpt)) == 0) then
1952 : write(message, '(3a)' )&
1953 0 : 'if you want interatomic force constant output, anaddb needs ngqpt input variable ',ch10, &
1954 0 : 'Action: set ngqpt in your input file.'
1955 0 : ABI_ERROR(message)
1956 : end if
1957 :
1958 :
1959 81 : if (dtset%ifcflag /= 1 .and. dtset%lwfflag > 0) then
1960 : write(message, '(3a)' )&
1961 0 : 'if you want to construct the lattice wannier functions, IFC must be computed.', ch10, &
1962 0 : 'Action: set ifcflag to 1.'
1963 0 : ABI_ERROR(message)
1964 : end if
1965 :
1966 :
1967 :
1968 : !check that q-grid refinement is a divisor of ngqpt in each direction
1969 645 : if(any(dtset%qrefine(1:3) > 1) .and. &
1970 : any(abs(dmod(dble(dtset%ngqpt(1:3))/dble(dtset%qrefine(1:3)), one)) > tol10) ) then
1971 : write(message, '(a, 3i10, a, a, a, 3i8, a, a)' )&
1972 0 : 'qrefine is',dtset%qrefine(1:3), ' The only allowed values',ch10, &
1973 0 : 'are integers which are divisors of the ngqpt grid', dtset%ngqpt(1:3), ch10, &
1974 0 : 'Action: correct qrefine in your input file.'
1975 0 : ABI_ERROR(message)
1976 : end if
1977 :
1978 : !check that fermie and nelect are not both specified
1979 81 : if(abs(dtset%elph_fermie) > tol10 .and. abs(dtset%ep_extrael) > tol10) then
1980 : write(message, '(a, E10.2, a, E10.2, a, a, a)' )&
1981 0 : 'elph_fermie (',dtset%elph_fermie, ') and ep_extrael (',dtset%ep_extrael, '), may not both be non 0',ch10, &
1982 0 : 'Action: remove one of the two in your input file.'
1983 0 : ABI_ERROR(message)
1984 : end if
1985 :
1986 : ! Check for possible typos.
1987 81 : call anaddb_chkvars(string)
1988 :
1989 81 : end subroutine invars9
1990 : !!***
1991 :
1992 : !----------------------------------------------------------------------
1993 :
1994 : !!****f*m_anaddb_dataset/outvars_anaddb
1995 : !!
1996 : !! NAME
1997 : !! outvars_anaddb
1998 : !!
1999 : !! FUNCTION
2000 : !! Open input file for the anaddb code, then
2001 : !! echoes the input information.
2002 : !!
2003 : !! INPUTS
2004 : !! dtset= (derived datatype) contains all the input variables
2005 : !! nunit = unit number for input or output
2006 : !!
2007 : !! OUTPUT
2008 : !! (only writing)
2009 : !!
2010 : !! NOTES
2011 : !! Should be executed by one processor only.
2012 : !!
2013 : !! SOURCE
2014 :
2015 162 : subroutine outvars_anaddb(dtset, nunit)
2016 :
2017 : !Arguments-------------------------------
2018 : !scalars
2019 : class(anaddb_dataset_type), intent(inout):: dtset
2020 : integer, intent(in):: nunit
2021 :
2022 : !Local variables-------------------------
2023 : !scalars
2024 : integer:: ii, iph1, iph2, iqpt, iqshft
2025 :
2026 : !*********************************************************************
2027 :
2028 : !Write the heading
2029 13122 : write(nunit, '(a, 80a, a)') ch10, ('=',ii = 1, 80), ch10
2030 162 : write(nunit, '(2a)' )' -outvars_anaddb: echo values of input variables ----------------------',ch10
2031 :
2032 : !The flags
2033 : if (dtset%dieflag /= 0 .or. dtset%ifcflag /= 0 .or. &
2034 : dtset%flexoflag /= 0 .or. &
2035 : dtset%nlflag /= 0 .or. dtset%thmflag /= 0 .or. &
2036 : dtset%elaflag /= 0 .or. dtset%elphflag /= 0 .or. &
2037 : dtset%polflag /= 0 .or. dtset%instrflag /= 0 .or. &
2038 162 : dtset%piezoflag /= 0 .or. dtset%freqflag /= 0) then
2039 152 : write(nunit, '(a)')' Flags :'
2040 152 : if(dtset%dieflag /= 0)write(nunit, '(3x, a9, 3i10)')' dieflag',dtset%dieflag
2041 152 : if(dtset%flexoflag /= 0)write(nunit, '(3x, a9, 3i10)')'flexoflag',dtset%flexoflag
2042 152 : if(dtset%ifcflag /= 0)write(nunit, '(3x, a9, 3i10)')' ifcflag',dtset%ifcflag
2043 152 : if(dtset%nlflag /= 0)write(nunit, '(3x, a9, 3i10)')' nlflag',dtset%nlflag
2044 152 : if(dtset%thmflag /= 0)write(nunit, '(3x, a9, 3i10)')' thmflag',dtset%thmflag
2045 152 : if(dtset%elaflag /= 0)write(nunit, '(3x, a9, 3i10)')' elaflag',dtset%elaflag
2046 152 : if(dtset%elphflag /= 0)write(nunit, '(3x, a9, 3i10)')' elphflag',dtset%elphflag
2047 152 : if(dtset%polflag /= 0)write(nunit, '(3x, a9, 3i10)')' polflag',dtset%polflag
2048 152 : if(dtset%instrflag /= 0)write(nunit, '(3x, a9, 3i10)')'instrflag',dtset%instrflag
2049 152 : if(dtset%piezoflag /= 0)write(nunit, '(3x, a9, 3i10)')'piezoflag',dtset%piezoflag
2050 152 : if(dtset%lwfflag /= 0)write(nunit, '(3x, a9, 3i10)')'lwfflag',dtset%lwfflag
2051 152 : if(dtset%freqflag /= 0)write(nunit, '(3x, a9, 3i10)')'lwfflag',dtset%freqflag
2052 : end if
2053 :
2054 : !Write the general information
2055 : if (dtset%rfmeth /= 1 .or. &
2056 : dtset%enunit /= 0 .or. &
2057 : dtset%eivec /= 0 .or. &
2058 : dtset%asr /= 0 .or. &
2059 : dtset%chneut /= 0 .or. &
2060 162 : dtset%selectz /= 0 .or. dtset%symdynmat /= 1) then
2061 154 : write(nunit, '(a)')' Miscellaneous information :'
2062 154 : if(dtset%rfmeth /= 1)write(nunit, '(3x, a9, 3i10)')' rfmeth',dtset%rfmeth
2063 154 : if(dtset%enunit /= 0)write(nunit, '(3x, a9, 3i10)')' enunit',dtset%enunit
2064 154 : if(dtset%eivec /= 0) write(nunit, '(3x, a9, 3i10)')' eivec',dtset%eivec
2065 154 : if(dtset%asr /= 0) write(nunit, '(3x, a9, 3i10)')' asr',dtset%asr
2066 154 : if(dtset%chneut /= 1)write(nunit, '(3x, a9, 3i10)')' chneut',dtset%chneut
2067 154 : if(dtset%selectz /= 0)write(nunit, '(3x, a9, 3i10)')' selectz',dtset%selectz
2068 154 : if(dtset%symdynmat /= 1)write(nunit, '(3x, a9, 3i10)')'symdynmat',dtset%symdynmat
2069 : end if
2070 162 : if(dtset%prtvol /= 0) write(nunit, '(3x, a9, i10)')' prtvol',dtset%prtvol
2071 :
2072 : !Frequency information
2073 162 : if(dtset%dieflag == 1)then
2074 16 : write(nunit, '(a)')' Frequency information :'
2075 16 : write(nunit, '(3x, a9, 3i10)')' nfreq',dtset%nfreq
2076 16 : write(nunit, '(3x, a9, 7x, 3es16.8)')' frmin',dtset%frmin
2077 16 : write(nunit, '(3x, a9, 7x, 3es16.8)')' frmax',dtset%frmax
2078 : end if
2079 :
2080 : !For interatomic force constant information
2081 162 : if(dtset%ifcflag /= 0)then
2082 110 : write(nunit, '(a)')' Interatomic Force Constants Inputs :'
2083 110 : write(nunit, '(3x, a9, 3i10)')' dipdip',dtset%dipdip
2084 110 : write(nunit, '(3x, a9, 3i10)')' dipquad',dtset%dipquad
2085 110 : write(nunit, '(3x, a9, 3i10)')' quadquad',dtset%quadquad
2086 110 : if(dtset%nsphere /= 0)write(nunit, '(3x, a9, 3i10)')' nsphere',dtset%nsphere
2087 110 : if(abs(dtset%rifcsph)>tol10)write(nunit, '(3x, a9, E16.6)')' nsphere',dtset%rifcsph
2088 110 : write(nunit, '(3x, a9, 3i10)')' ifcana',dtset%ifcana
2089 110 : write(nunit, '(3x, a9, 3i10)')' ifcout',dtset%ifcout
2090 110 : if(dtset%natifc >= 1)then
2091 26 : write(nunit, '(3x, a9, 3i10)')' natifc',dtset%natifc
2092 66 : write(nunit, '(3x, a9, 8i10)')' atifc',(dtset%atifc(ii), ii = 1, dtset%natifc)
2093 : end if
2094 110 : write(nunit, '(a)')' Description of grid 1 :'
2095 110 : write(nunit, '(3x, a9, 3i10)')' brav',dtset%brav
2096 110 : write(nunit, '(3x, a9, 3i10)')' ngqpt',dtset%ngqpt(1:3)
2097 110 : write(nunit, '(3x, a9, 3i10)')' nqshft',dtset%nqshft
2098 110 : if (dtset%nqshft /= 0)then
2099 110 : write(nunit, '(3x, a9)')' q1shft'
2100 242 : do iqshft = 1, dtset%nqshft
2101 638 : write(nunit, '(19x, 4es16.8)') (dtset%q1shft(ii, iqshft), ii = 1, 3)
2102 : end do
2103 : end if
2104 434 : if (any(dtset%qrefine(:) > 1)) then
2105 2 : write(nunit, '(3x, a9, 3i10)')' qrefine', dtset%qrefine
2106 : end if
2107 : ! Speed of sound
2108 110 : if (dtset%vs_qrad_tolkms(1) > zero) then
2109 6 : write(nunit, '(a, 2es16.8)')"vs_qrad_tolkms", (dtset%vs_qrad_tolkms(:))
2110 : end if
2111 : end if
2112 :
2113 : !Phonon density of states with gaussian method
2114 162 : if(dtset%prtdos /= 0)then
2115 22 : write(nunit, '(a)')' Phonon DOS information :'
2116 22 : write(nunit, '(3x, a9, es16.8)')'dosdeltae',dtset%dosdeltae
2117 22 : write(nunit, '(3x, a9, es16.8)')' dossmear',dtset%dossmear
2118 : end if
2119 :
2120 : !Thermal information
2121 162 : if(dtset%thmflag /= 0)then
2122 22 : write(nunit, '(a)')' Thermal information :'
2123 22 : write(nunit, '(3x, a9, 3i10)')' nchan',dtset%nchan
2124 22 : write(nunit, '(3x, a9, 3i10)')' nwchan',dtset%nwchan
2125 22 : write(nunit, '(3x, a9, 7x, 3es16.8)')' dostol',dtset%dostol
2126 22 : write(nunit, '(3x, a9, 7x, 3es16.8)')' thmtol',dtset%thmtol
2127 22 : write(nunit, '(3x, a9, 3i10)')' ntemper',dtset%ntemper
2128 22 : write(nunit, '(3x, a9, 7x, 3es16.8)')'temperinc',dtset%temperinc
2129 22 : write(nunit, '(3x, a9, 7x, 3es16.8)')'tempermin',dtset%tempermin
2130 : endif
2131 :
2132 : !Grid 2 description
2133 162 : if(dtset%thmflag /= 0 .or. dtset%prtdos /= 0)then
2134 44 : write(nunit, '(a)')' Description of grid 2 (Fourier interp. or BZ sampling):'
2135 44 : write(nunit, '(3x, a9, 3i10)')' ng2qpt',dtset%ng2qpt(1:3)
2136 44 : write(nunit, '(3x, a9, 3i10)')' ngrids',dtset%ngrids
2137 44 : write(nunit, '(3x, a9, 7x, 3es16.8)')' q2shft',dtset%q2shft(1:3)
2138 : end if
2139 :
2140 : !Non-linear response information
2141 162 : if (dtset%nlflag /= 0) then
2142 8 : write(nunit, '(a)')' Non-linear response information :'
2143 8 : write(nunit, '(3x, a9, i10)') ' alphon',dtset%alphon
2144 8 : write(nunit, '(3x, a9, 3i10)')' prtmbm',dtset%prtmbm
2145 8 : write(nunit, '(3x, a9, 3i10)')' ramansr',dtset%ramansr
2146 : end if
2147 :
2148 : !Structural relaxation at fixed polarization
2149 162 : if (dtset%polflag /= 0) then
2150 6 : write(nunit, '(a)')' Relaxation at fixed polarization :'
2151 6 : if (dtset%relaxat == 1) then
2152 4 : write(nunit, '(3x, a9, i10)') ' relaxat',dtset%relaxat
2153 : end if
2154 6 : if (dtset%relaxstr == 1) then
2155 4 : write(nunit, '(a12, i10)') ' relaxstr',dtset%relaxstr
2156 : end if
2157 : end if
2158 :
2159 : !Elphon information
2160 162 : if (dtset%elphflag /= 0) then
2161 30 : write(nunit, '(a)')' Elphon calculation will be carried out'
2162 30 : write(nunit, '(a12, E16.6)') 'elphsmear', dtset%elphsmear
2163 30 : write(nunit, '(a12, E16.6)') 'a2fsmear', dtset%a2fsmear
2164 30 : write(nunit, '(a12, E16.6)') 'mustar', dtset%mustar
2165 30 : write(nunit, '(a12, i10)') 'nqpath', dtset%nqpath
2166 30 : write(nunit, '(a12)') 'qpath'
2167 270 : do iqpt = 1, dtset%nqpath
2168 270 : write(nunit, '(12x, 3(E16.6, 1x))') dtset%qpath(:,iqpt)
2169 : end do
2170 30 : write(nunit, '(a12, i10)') 'telphint', dtset%telphint
2171 30 : if (dtset%telphint == 0) then
2172 4 : write(nunit, '(a)') ' Tetrahedron integration for elphon'
2173 26 : else if (dtset%telphint == 1) then
2174 24 : write(nunit, '(a)') ' Smeared weight integration for elphon'
2175 2 : else if (dtset%telphint == 2) then
2176 2 : write(nunit, '(a)') ' Band filtered integration for elphon'
2177 : end if
2178 30 : if (abs(dtset%elph_fermie) > tol10) then
2179 4 : write(nunit, '(a12, E16.6)') 'elph_fermie', dtset%elph_fermie
2180 : end if
2181 30 : if (dtset%ep_extrael /= 0) then
2182 2 : if (abs(dtset%ep_extrael) > 1.0d2) then
2183 0 : write(nunit, '(a, E20.12)')' Doping set by the user is (negative for el doping) :',dtset%ep_extrael
2184 : else
2185 2 : write(nunit, '(a, E16.6)') 'Elphon: extra electrons per unit cell = ', dtset%ep_extrael
2186 : end if
2187 : end if
2188 30 : if (dtset%ep_nspline /= 20) then
2189 0 : write(nunit, '(a, I8)') 'Elphon: scale factor for spline interpolation in RTA = ', dtset%ep_nspline
2190 : end if
2191 30 : if (dtset%band_gap < 10.0d0) then
2192 0 : write(nunit, '(a, E16.6)') 'Elphon: set band gap to (in eV) = ', dtset%band_gap
2193 : end if
2194 :
2195 390 : if (sum(abs(dtset%kptrlatt)) > 0) then
2196 100 : write(nunit, '(a12, 3(3(i3, 1x), 2x))' ) 'kptrlatt',reshape( dtset%kptrlatt(:,:), (/9/) )
2197 : end if
2198 :
2199 390 : if (sum(abs(dtset%kptrlatt_fine)) > 0) then
2200 0 : write(nunit, '(a12, 3(3(i3, 1x), 2x))' ) 'kptrlatt_fine ',reshape( dtset%kptrlatt_fine(:,:), (/9/) )
2201 : end if
2202 :
2203 30 : if (dtset%ep_keepbands == 1) then
2204 10 : write(nunit, '(a)') ' Will keep band dependency in gkk in memory.'
2205 10 : write(nunit, '(a)') ' WARNING: the memory requirements will be multiplied by nbands**2 !!!'
2206 : end if
2207 :
2208 30 : if (dtset%ep_scalprod == 1) then
2209 8 : write(nunit, '(a)') ' scalar product will be performed when assembling the gamma matrices.'
2210 8 : write(nunit, '(a)') ' WARNING: with this option you can not distinguish which '
2211 8 : write(nunit, '(a)') ' linewidth comes from which phonon mode !!!'
2212 : end if
2213 :
2214 30 : if (dtset%prtbltztrp == 1) write(nunit, '(a)') ' Will output input files for BoltzTraP'
2215 30 : if (dtset%prtfsurf == 1) write(nunit, '(a)') ' Will output fermi surface in XCrysDen format'
2216 30 : if (dtset%prt_ifc == 1) write(nunit, '(a)') ' Will output real space IFC in AI2PS and TDEP format'
2217 30 : if (dtset%prtnest == 1) write(nunit, '(a)') ' Will output nesting factor'
2218 :
2219 30 : if (dtset%ifltransport == 1) then
2220 10 : write(nunit, '(a)') ' Will perform transport calculation in elphon to get'
2221 10 : write(nunit, '(a, a)') ' resistivity and thermal conductivity as a function of T',ch10
2222 10 : write(nunit, '(a, es16.6, a)' ) ' Minimum temperature for transport outputs: ', dtset%tempermin, ' K'
2223 10 : write(nunit, '(a, es16.6, a)' ) ' Maximum temperature for transport outputs: ', &
2224 20 : dtset%tempermin+dtset%temperinc*dtset%ntemper, ' K'
2225 10 : write(nunit, '(a, i6)' ) ' Number of temperature points for transport outputs: ', dtset%ntemper
2226 10 : write(nunit, '(a)' )
2227 : end if
2228 :
2229 30 : if (dtset%gkqwrite == 1) then
2230 2 : write(nunit, '(a, a)' ) 'Gkk matrix elements on input grid of ',&
2231 4 : 'qpoints will be written to disk. File gkqfile must be absent.'
2232 : end if
2233 30 : if (dtset%gkk_rptwrite == 1) then
2234 0 : write(nunit, '(a, a)' ) 'Gkk matrix elements in real space ',&
2235 0 : 'will be written to disk. File gkk_rpt_file must be absent.'
2236 : end if
2237 30 : if (dtset%gkk2write == 1) then
2238 0 : write(nunit, '(a, a)' ) 'Full grid gkk matrix elements ',&
2239 0 : 'will be written to disk. File gkk2file must be absent.'
2240 : end if
2241 : end if
2242 :
2243 162 : if (dtset%gruns_nddbs /= 0) then
2244 2 : write(nunit, '(a)' ) "Will compute Gruneisen parameters with finite difference method. DDB files:"
2245 8 : do ii = 1, dtset%gruns_nddbs
2246 8 : write(nunit, "(2a)")" ",trim(dtset%gruns_ddbs(ii))
2247 : end do
2248 : end if
2249 :
2250 : ! lattice wannier function Information
2251 162 : if (dtset%lwfflag > 0) then
2252 6 : write(nunit, '(a)')' Lattice Wannier function information:'
2253 6 : write(nunit, '(a20, i10)') ' lwfflag', dtset%lwfflag
2254 6 : write(nunit, '(a20, i10)') ' lwf_nwann', dtset%lwf_nwann
2255 6 : write(nunit, '(a20, i10)') ' lwf_anchor_proj', dtset%lwf_anchor_proj
2256 24 : write(nunit, '(a20, 3i10)') ' lwf_ngqpt',(dtset%lwf_ngqpt(ii), ii = 1, 3)
2257 6 : write(nunit, '(a20, i10)') ' lwf_disentangle', dtset%lwf_disentangle
2258 6 : write(nunit, '(a20, E16.6)') ' lwf_mu', dtset%lwf_mu
2259 6 : write(nunit, '(a20, E16.6)') ' lwf_sigma', dtset%lwf_sigma
2260 24 : write(nunit, '(a20, 3E16.6)') ' lwf_anchor_qpt',(dtset%lwf_anchor_qpt(ii), ii = 1, 3)
2261 6 : if (abs(dtset%lwf_anchor_proj) > 0) then
2262 4 : write(nunit, '(a20)',advance="no") ' lwf_anchor_iband'
2263 16 : do ii = 1, dtset%lwf_nwann
2264 16 : write(nunit, '(3x, I5)', advance="no") dtset%lwf_anchor_iband(ii)
2265 : end do
2266 4 : write(nunit, '(a)') ' '
2267 : end if
2268 :
2269 6 : if (dtset%lwfflag .eq. 2) then
2270 2 : write(nunit, '(a20)',advance="no") ' lwf_projector'
2271 8 : do ii = 1, dtset%lwf_nwann
2272 8 : write(nunit, '(3x, I5)', advance="no") dtset%lwf_projector(ii)
2273 : end do
2274 2 : write(nunit, '(a)') ' '
2275 : end if
2276 : end if
2277 :
2278 :
2279 : !List of vector 1 (reduced coordinates)
2280 162 : if(dtset%nph1l /= 0)then
2281 114 : write(nunit, '(a)')' First list of wavevector (reduced coord.) :'
2282 114 : write(nunit, '(3x, a9, 3i10)')' nph1l',dtset%nph1l
2283 114 : write(nunit, '(3x, a9)')' qph1l'
2284 1336 : do iph1 = 1, dtset%nph1l
2285 : write(nunit, '(19x, 3es16.8, 2x, es11.3)') &
2286 5002 : (dtset%qph1l(ii, iph1), ii = 1, 3), dtset%qnrml1(iph1)
2287 : end do
2288 : end if
2289 :
2290 : !List of vector 2 (cartesian coordinates)
2291 162 : if(dtset%nph2l /= 0)then
2292 48 : write(nunit, '(a)')' Second list of wavevector (cart. coord.) :'
2293 48 : write(nunit, '(3x, a9, 3i10)')' nph2l',dtset%nph2l
2294 48 : write(nunit, '(3x, a9)')' qph2l'
2295 122 : do iph2 = 1, dtset%nph2l
2296 344 : write(nunit, '(19x, 3es16.8, 2x, es11.3)') (dtset%qph2l(ii, iph2), ii = 1, 3), dtset%qnrml2(iph2)
2297 : end do
2298 : end if
2299 :
2300 : !phonon frozen in supercell
2301 162 : if (abs(dtset%freeze_displ) > tol10) then
2302 6 : write(nunit, '(a)') 'Phonon displacements will be output, frozen into supercells'
2303 6 : write(nunit, '(a, E20.10)') ' Chosen amplitude of frozen displacements = ', dtset%freeze_displ
2304 : end if
2305 :
2306 : !atom projected bs files
2307 162 : if (abs(dtset%natprj_bs) > 0) then
2308 6 : write(nunit, '(a)') 'Phonon band structure files, with atomic projections, will be output '
2309 6 : write(nunit, '(a)') ' Chosen atoms for projection = '
2310 6 : write(nunit, '(10I6)') dtset%iatprj_bs
2311 : end if
2312 :
2313 : !magnetic penalty (constrained DFPT)
2314 162 : if (abs(dtset%magpen) > tol8) then
2315 6 : write(nunit, '(a)') ' Second-order quantities calculated with constrained DFPT will be transformed'
2316 6 : write(nunit, '(3x, a9, 7x, 1es16.8)')' magpen',dtset%magpen
2317 6 : write(nunit, '(3x, a9, 2i3)') ' mpatpol',dtset%mpatpol(1:2)
2318 6 : write(nunit, '(3x, a9, 3i3)') ' mpdir',dtset%mpdir(1:3)
2319 6 : write(nunit, '(3x, a9, i3)') ' mpopt',dtset%mpopt
2320 6 : if (dtset%timdisp == 1) then
2321 4 : write(nunit, '(a)') ' Third-order frequency derivatives calculated with constrained DFPT response functions will be transformed'
2322 4 : write(nunit, '(3x, a9, i3)') ' timdisp',dtset%timdisp
2323 : end if
2324 : end if
2325 13122 : write(nunit, '(a, 80a, a)') ch10, ('=',ii = 1, 80), ch10
2326 :
2327 : !Frequency interpolation
2328 162 : if (abs(dtset%magpen) > tol8 .and. dtset%freqflag/=0) then
2329 6 : write(nunit, '(a)') ' Frequency interpolation of second-order quantities calculated with constrained DFPT '
2330 6 : write(nunit, '(3x, a9, i10)') ' nfreq',dtset%nfreq
2331 6 : write(nunit, '(3x, a9, 7x, es16.8)')' frmin',dtset%frmin
2332 6 : write(nunit, '(3x, a9, 7x, es16.8)')' frmax',dtset%frmax
2333 6 : write(nunit, '(3x, a9, 7x, es16.8)')' eta',dtset%eta
2334 : end if
2335 :
2336 :
2337 162 : end subroutine outvars_anaddb
2338 : !!***
2339 :
2340 : !----------------------------------------------------------------------
2341 :
2342 : !!****f*m_anaddb_dataset/anaddb_dtset_init
2343 : !!
2344 : !! NAME
2345 : !! anaddb_dtset_init
2346 : !!
2347 : !! FUNCTION
2348 : !! Initialize the code ppddb9: write heading and make the first i/os
2349 : !!
2350 : !! INPUTS
2351 : !! input_path: String with input file path. Empty string activates files file in legacy mode.
2352 : !!
2353 : !! OUTPUT
2354 : !! character(len = fnlen) filnam(7)=character strings giving file names
2355 : !!
2356 : !! NOTES
2357 : !! 1. Should be executed by one processor only.
2358 : !! 2. File names refer to following files, in order:
2359 : !! (1) Formatted input file
2360 : !! (2) Formatted output file
2361 : !! (3) Input Derivative Database
2362 : !! (4) Output Molecular Dynamics
2363 : !! (5) Input electron-phonon matrix elements
2364 : !! (6) Root name for electron-phonon file names
2365 : !! (7) Name of file containing the 3 ddk filenames and the GS wf file name
2366 : !!
2367 : !! SOURCE
2368 :
2369 81 : subroutine anaddb_dtset_init(dtset, input_path)
2370 :
2371 : !Arguments-------------------------------
2372 : class(anaddb_dataset_type), intent(inout):: dtset
2373 : character(len=*), intent(in):: input_path
2374 :
2375 : !Local variables-------------------------
2376 : !scalars
2377 : integer:: lenstr, marr, jdtset, tread, i1, ierr
2378 : character(len=strlen):: string, raw_string, fname, dirpath
2379 : character(len=fnlen):: unused
2380 : !character(len = 500):: msg
2381 : !arrays
2382 81 : integer, allocatable:: intarr(:)
2383 81 : real(dp), allocatable:: dprarr(:)
2384 : ! *********************************************************************
2385 :
2386 81 : dtset%filename_input = input_path
2387 81 : dtset%filename_output = "run.abo"
2388 81 : dtset%prefix_outdata = trim(" ")
2389 81 : dtset%filename_ddb = trim(" ")
2390 81 : dtset%filename_ddk = trim(" ")
2391 81 : dtset%prefix_eph = trim(" ")
2392 81 : dtset%filename_gkk = trim(" ")
2393 81 : dtset%filename_eigr2d = trim(" ")
2394 :
2395 :
2396 81 : if (len_trim(input_path) == 0) then
2397 : !write(msg, "(3a)") "Please run Anaddb as: anaddb input.in",ch10,&
2398 : ! "Note that using a files file is no longer supported in Abinit10."
2399 : !ABI_ERROR(msg)
2400 : ! Legacy Files file mode.
2401 1 : write(std_out, "(2a)")" DeprecationWarning: ",ch10
2402 1 : write(std_out, "(a)") " The files file has been deprecated in Abinit9 and will be removed in Abinit10."
2403 1 : write(std_out, "(2a)")" Use the syntax `anaddb t01.abi` where t01.abi is an anaddb input with ddb_filepath.",ch10
2404 1 : write(std_out, "(3a)")' ddb_filepath = "out_DDB"',ch10, ch10
2405 :
2406 1 : write(std_out, *)' Give name for formatted input file: '
2407 1 : read(std_in, '(a)' ) dtset%filename_input
2408 1 : write(std_out, '(a, a)' )'- ',trim(dtset%filename_input)
2409 1 : write(std_out, *)' Give name for formatted output file: '
2410 1 : read(std_in, '(a)' ) dtset%filename_output
2411 1 : write(std_out, '(a, a)' )'- ',trim(dtset%filename_output)
2412 1 : write(std_out, *)' Give name for input derivative database: '
2413 1 : read(std_in, '(a)' ) dtset%filename_ddb
2414 1 : write(std_out, '(a, a)' )'- ',trim(dtset%filename_ddb)
2415 1 : write(std_out, *)' Give name for output molecular dynamics: '
2416 1 : read(std_in, '(a)' ) unused
2417 1 : write(std_out, '(a, a)' )'- ',trim(unused)
2418 : ! GA: This message is confusing, because filnam(5) is also for EIG2D files.
2419 1 : write(std_out, *)' Give name for input elphon matrix elements (GKK file): '
2420 1 : read(std_in, '(a)' ) dtset%filename_gkk
2421 1 : write(std_out, '(a, a)' )'- ',trim(dtset%filename_gkk)
2422 1 : write(std_out, *)' Give root name for elphon output files: '
2423 1 : read(std_in, '(a)' ) dtset%prefix_eph
2424 1 : write(std_out, '(a, a)' )'- ',trim(dtset%prefix_eph)
2425 1 : write(std_out, *)' Give name for file containing ddk filenames for elphon/transport: '
2426 1 : read(std_in, '(a)' ) dtset%filename_ddk
2427 1 : write(std_out, '(a, a)' )'- ',trim(dtset%filename_ddk)
2428 1 : dtset%prefix_outdata = trim(" ")
2429 :
2430 : end if
2431 :
2432 : ! Read input
2433 81 : string = repeat(" ", strlen)
2434 81 : raw_string = repeat(" ", strlen)
2435 81 : call instrng(dtset%filename_input, lenstr, 1, strlen, string, raw_string)
2436 : ! To make case-insensitive, map characters to upper case.
2437 81 : call inupper(string(1:lenstr))
2438 :
2439 81 : marr = 3
2440 81 : ABI_MALLOC(intarr, (marr))
2441 81 : ABI_MALLOC(dprarr, (marr))
2442 81 : jdtset = 0
2443 :
2444 : ! Allow user to override default values
2445 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), "output_file", tread, 'KEY', key_value=dtset%filename_output)
2446 81 : write(std_out, '(2a)')'- Name for formatted output file: ', trim(dtset%filename_output)
2447 :
2448 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'ddb_filepath', tread, 'KEY', key_value=dtset%filename_ddb)
2449 : !Check that we didnt use a files file
2450 81 : if (len_trim(input_path) > 0) then
2451 80 : ABI_CHECK(tread == 1, 'ddb_filepath variable must be specified in the input file')
2452 : end if
2453 81 : write(std_out, "(2a)")'- Input derivative database: ', trim(dtset%filename_ddb)
2454 :
2455 : ! Nobody knows the scope of this line in the files file.
2456 : !call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'md_output', tread, 'KEY', key_value=filnam(4))
2457 :
2458 : ! GA: This variable name is confusing, because filnam(5) is also for EIG2D files.
2459 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), "gkk_filepath", tread, 'KEY', key_value=dtset%filename_gkk)
2460 81 : if (tread == 1) write(std_out, "(2a)")'- Name for input elphon matrix elements (GKK file): ', trim(dtset%filename_gkk)
2461 : ! GA: This is to keep old behavior. To be cleaned or removed.
2462 81 : dtset%filename_eigr2d = dtset%filename_gkk
2463 :
2464 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), "eph_prefix", tread, 'KEY', key_value=dtset%prefix_eph)
2465 81 : if (tread == 1) write(std_out, "(2a)")"- Root name for elphon output files: ", trim(dtset%prefix_eph)
2466 :
2467 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), "ddk_filepath", tread, 'KEY', key_value=dtset%filename_ddk)
2468 81 : if (tread == 1) write(std_out, "(2a)")"- File containing ddk filenames for elphon/transport: ", trim(dtset%filename_ddk)
2469 :
2470 81 : call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), "outdata_prefix", tread, 'KEY', key_value=dtset%prefix_outdata)
2471 81 : if (tread == 1) then
2472 7 : write(std_out, "(2a)")'- Root name for output files: ', trim(dtset%prefix_outdata)
2473 : end if
2474 :
2475 81 : ABI_FREE(intarr)
2476 81 : ABI_FREE(dprarr)
2477 :
2478 : ! Compute OUTPUT_PREFIX as in abinit.
2479 : ! I do not change the "files" file to avoid backward compatibility issue
2480 81 : if (len_trim(dtset%prefix_outdata) == 0) then
2481 74 : fname = basename(trim(dtset%filename_output))
2482 74 : i1 = index(fname, ".",back=.true.)
2483 74 : if ( i1 > 1 ) then
2484 74 : dtset%prefix_outdata = fname(:i1-1)
2485 : end if
2486 74 : write(std_out, "(2a)")'- Root name for output files set to: ', trim(dtset%prefix_outdata)
2487 : endif
2488 :
2489 81 : i1 = index(dtset%prefix_outdata, "/", back=.True.)
2490 81 : if (i1 > 0) then
2491 0 : dirpath = dtset%prefix_outdata(1:i1-1)
2492 0 : call clib_mkdir_if_needed(dirpath, ierr)
2493 0 : ABI_CHECK(ierr == 0, sjoin("Error", itoa(ierr), "while trying to create directory", dirpath))
2494 : end if
2495 :
2496 81 : end subroutine anaddb_dtset_init
2497 : !!***
2498 :
2499 : !!****f*m_anaddb_dataset/anaddb_dtset_bcast_files
2500 : !! NAME
2501 : !! anaddb_dtset_bcast_files
2502 : !!
2503 : !! FUNCTION
2504 : !! Broadcast filenames
2505 : !!
2506 : !! INPUTS
2507 : !!
2508 : !! OUTPUT
2509 : !!
2510 : !! SOURCE
2511 :
2512 81 : subroutine anaddb_dtset_bcast_files(dtset, comm)
2513 :
2514 : class(anaddb_dataset_type), intent(inout):: dtset
2515 : integer, intent(in) :: comm
2516 :
2517 : integer, parameter :: master = 0
2518 : integer :: ierr
2519 :
2520 81 : call xmpi_bcast(dtset%filename_input, master, comm, ierr)
2521 81 : call xmpi_bcast(dtset%filename_output, master, comm, ierr)
2522 81 : call xmpi_bcast(dtset%prefix_outdata, master, comm, ierr)
2523 81 : call xmpi_bcast(dtset%filename_ddb, master, comm, ierr)
2524 81 : call xmpi_bcast(dtset%filename_ddk, master, comm, ierr)
2525 81 : call xmpi_bcast(dtset%prefix_eph, master, comm, ierr)
2526 81 : call xmpi_bcast(dtset%filename_gkk, master, comm, ierr)
2527 81 : call xmpi_bcast(dtset%filename_eigr2d, master, comm, ierr)
2528 :
2529 81 : end subroutine anaddb_dtset_bcast_files
2530 : !!***
2531 :
2532 : !!****f*m_anaddb_dataset/anaddb_chkvars
2533 : !! NAME
2534 : !! anaddb_chkvars
2535 : !!
2536 : !! FUNCTION
2537 : !! Examines the input string, to check whether all names are allowed.
2538 : !!
2539 : !! INPUTS
2540 : !! string*(*)=string of character
2541 : !! the string (with upper case) from the input file, to which the XYZ data is (possibly) appended
2542 : !!
2543 : !! OUTPUT
2544 : !!
2545 : !! SOURCE
2546 :
2547 81 : subroutine anaddb_chkvars(string)
2548 :
2549 : !Arguments------------------------------------
2550 : !scalars
2551 : character(len=*), intent(in):: string
2552 :
2553 : !Local variables-------------------------------
2554 : !scalars
2555 : integer, parameter:: protocol0 = 0
2556 : character(len = 100):: list_logicals, list_strings, list_vars_img
2557 : character(len = 10000):: list_vars
2558 :
2559 : !************************************************************************
2560 :
2561 : !Here, list all admitted variable names (max 10 per line, to fix the ideas)
2562 : !Note: Do not use "double quotation mark" for the string since it triggers a bug in docchk.py (abirules script)
2563 : !<ANADDB_VARS>
2564 : !A
2565 81 : list_vars= ' alphon asr a2fsmear atifc'
2566 : !B
2567 81 : list_vars = trim(list_vars)//' brav band_gap'
2568 : !C
2569 81 : list_vars = trim(list_vars)//' chneut'
2570 : !D
2571 81 : list_vars = trim(list_vars)//' dieflag dielt_env dielt_thick dipdip dipquad dossum dosdeltae dossmear dostol dos_maxmode'
2572 : !E
2573 81 : list_vars = trim(list_vars)//' ep_scalprod eivec elaflag elphflag enunit'
2574 81 : list_vars = trim(list_vars)//' ep_b_min ep_b_max ep_int_gkk ep_keepbands ep_nqpt ep_nspline ep_prt_yambo'
2575 81 : list_vars = trim(list_vars)//' elphsmear elph_fermie ep_extrael ep_qptlist eta'
2576 : !F
2577 81 : list_vars = trim(list_vars)//' flexoflag freeze_displ freqflag frmax frmin'
2578 : !G
2579 81 : list_vars = trim(list_vars)//' gkk2write gkk_rptwrite gkqwrite gruns_nddbs'
2580 : !H
2581 : !I
2582 81 : list_vars = trim(list_vars)//' ifcana ifcflag ifcout ifltransport instrflag istrfix iatfix iatprj_bs'
2583 : !J
2584 : !K
2585 81 : list_vars = trim(list_vars)//' kptrlatt kptrlatt_fine'
2586 : !L
2587 :
2588 81 : list_vars = trim(list_vars)//' lwf_anchor_iband lwf_anchor_proj lwf_anchor_qpt'
2589 81 : list_vars = trim(list_vars)//' lwf_disentangle lwf_mu lwf_ngqpt lwf_nwann lwf_projector lwf_sigma'
2590 81 : list_vars = trim(list_vars)//' lwfflag'
2591 : !M
2592 81 : list_vars = trim(list_vars)//' magpen mpatpol mpdir mpopt mustar'
2593 : !N
2594 81 : list_vars = trim(list_vars)//' natfix natifc natom natprj_bs nchan ndivsm nfreq ngrids nlflag nph1l nph2l'
2595 81 : list_vars = trim(list_vars)//' nqpath nqshft nsphere nstrfix ntemper nwchan ngqpt ng2qpt'
2596 : !O
2597 81 : list_vars = trim(list_vars)//' outboltztrap'
2598 : !P
2599 81 : list_vars = trim(list_vars)//' piezoflag polflag prtddb prtdos prt_ifc prtmbm prtfsurf'
2600 81 : list_vars = trim(list_vars)//' prtnest prtphbands prtsrlr prtvol prtbltztrp'
2601 : !Q
2602 81 : list_vars = trim(list_vars)//' qrefine qgrid_type q1shft q2shft qnrml1 qnrml2 qpath qph1l qph2l quadquad'
2603 : !R
2604 81 : list_vars = trim(list_vars)//' ramansr relaxat relaxstr rfmeth rifcsph'
2605 : !S
2606 81 : list_vars = trim(list_vars)//' selectz symdynmat symgkq sys_dim'
2607 : !T
2608 81 : list_vars = trim(list_vars)//' targetpol telphint thmflag temperinc tempermin thermal_supercell thmtol timdisp'
2609 : !U
2610 81 : list_vars = trim(list_vars)//' use_k_fine'
2611 : !V
2612 81 : list_vars = trim(list_vars)//' vs_qrad_tolkms'
2613 : !W
2614 : !X
2615 : !Y
2616 : !Z
2617 :
2618 : !
2619 81 : list_vars_img=' '
2620 :
2621 : !Logical input variables
2622 81 : list_logicals=' '
2623 :
2624 : !String input variables
2625 81 : list_strings=' gruns_ddbs ddb_filepath output_file outdata_prefix gkk_filepath eph_prefix ddk_filepath' ! md_output
2626 : !</ANADDB_VARS>
2627 :
2628 : !Extra token, also admitted:
2629 : !<ANADDB_UNITS>
2630 81 : list_vars = trim(list_vars)//' au Angstr Angstrom Angstroms Bohr Bohrs eV meV Ha'
2631 81 : list_vars = trim(list_vars)//' Hartree Hartrees K nm Ry Rydberg Rydbergs S Sec Second T Tesla'
2632 : !</ANADDB_UNITS>
2633 :
2634 : !<ANADDB_OPERATORS>
2635 81 : list_vars = trim(list_vars)//' sqrt '
2636 : !</ANADDB_OPERATORS>
2637 :
2638 : !Transform to upper case
2639 81 : call inupper(list_vars)
2640 81 : call inupper(list_vars_img)
2641 81 : call inupper(list_logicals)
2642 81 : call inupper(list_strings)
2643 :
2644 81 : call chkvars_in_string(protocol0, list_vars, list_vars_img, list_logicals, list_strings, string)
2645 :
2646 81 : end subroutine anaddb_chkvars
2647 : !!***
2648 :
2649 :
2650 : !!****f*m_anaddb_dataset/anaddb_dtset_read_input
2651 : !! NAME
2652 : !! anaddb_dtset_read_input
2653 : !!
2654 : !! FUNCTION
2655 : !!
2656 : !! INPUTS
2657 : !!
2658 : !! OUTPUT
2659 : !!
2660 : !! SOURCE
2661 :
2662 81 : subroutine anaddb_dtset_read_input(dtset, comm)
2663 :
2664 : class(anaddb_dataset_type), intent(inout):: dtset
2665 : integer, intent(in):: comm
2666 :
2667 : !Local variables-------------------------------
2668 : integer, parameter:: master = 0
2669 : integer :: lenstr
2670 : integer:: ierr
2671 : integer :: my_rank
2672 : logical :: iam_master
2673 : character(len = strlen):: string, raw_string
2674 4212 : type(ddb_hdr_type) :: ddb_hdr
2675 :
2676 81 : my_rank = xmpi_comm_rank(comm)
2677 81 : iam_master = (my_rank == master)
2678 :
2679 : ! Must read natom from the DDB before being able to allocate some arrays needed for invars9
2680 81 : call ddb_hdr%open_read(dtset%filename_ddb, comm=comm, dimonly = 1)
2681 :
2682 81 : dtset%natom = ddb_hdr%natom
2683 81 : dtset%mpert = ddb_hdr%mpert
2684 81 : dtset%msize = ddb_hdr%msize
2685 :
2686 : ! Read the input file, and store the information in a long string of characters
2687 : ! strlen from defs_basis module
2688 81 : if (iam_master) then
2689 81 : call instrng(dtset%filename_input, lenstr, 1, strlen, string, raw_string)
2690 : ! To make case-insensitive, map characters to upper case.
2691 81 : call inupper(string(1:lenstr))
2692 : end if
2693 :
2694 81 : call xmpi_bcast(string, master, comm, ierr)
2695 81 : call xmpi_bcast(raw_string, master, comm, ierr)
2696 81 : call xmpi_bcast(lenstr, master, comm, ierr)
2697 :
2698 81 : dtset%lenstr = lenstr
2699 81 : dtset%input_string = string
2700 :
2701 : ! Save input string in global variable so that we can access it in ntck_open_create
2702 81 : ABI_MALLOC_TYPE_SCALAR(character(len=len_trim(raw_string)), INPUT_STRING)
2703 81 : INPUT_STRING = trim(raw_string)
2704 :
2705 : ! Read the inputs
2706 81 : call invars9(dtset, dtset%lenstr, dtset%natom, dtset%input_string)
2707 :
2708 : ! Set some inputs depending on what the ddb contains
2709 81 : if (.not. ddb_hdr%has_d3E_lw) then
2710 : ! The default value is 1.
2711 : ! Here we set the flags to zero if Q*is not available.
2712 : ! iblock_quadrupoles = ddb_lw%get_quadrupoles(ddb_hdr%ddb_version, 1, BLKTYP_d3E_lw, qdrp_cart)
2713 73 : dtset%dipquad = 0
2714 73 : dtset%quadquad = 0
2715 : end if
2716 :
2717 81 : call ddb_hdr%free()
2718 :
2719 : ! GA: This used to be after the dry run exit.
2720 : ! Check the value and transform the meaning of atifc (1 and 0 only)
2721 81 : call chkin9(dtset%atifcflg,dtset%atifc,dtset%natifc,dtset%natom)
2722 :
2723 81 : end subroutine anaddb_dtset_read_input
2724 : !!***
2725 :
2726 0 : end module m_anaddb_dataset
2727 : !!***
|