-
Notifications
You must be signed in to change notification settings - Fork 280
/
q2r.f90
118 lines (115 loc) · 4.61 KB
/
q2r.f90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
!
! Copyright (C) 2001-2008 Quantum ESPRESSO group
! This file is distributed under the terms of the
! GNU General Public License. See the file `License'
! in the root directory of the present distribution,
! or http://www.gnu.org/copyleft/gpl.txt .
!
!----------------------------------------------------------------------------
PROGRAM q2r
!----------------------------------------------------------------------------
!! Reads force constant matrices \(C(q)\) produced by the PHonon code
!! for a grid of q-points, calculates the corresponding set of
!! interatomic force constants (IFC), \(C(R)\).
!
!! If a file "fildyn"0 is not found, the code will ignore the variable
!! "fildyn" and will try to read from the following cards the missing
!! information on the q-point grid and file names:
!! - nr1,nr2,nr3: dimensions of the FFT grid formed by the q-point grid;
!! - nfile: number of files containing \(C(q_n)\), \(n=1,\text{nfile}\);
!! - followed by nfile cards: \(\text{filin}\).
!
!! The name and order of files is not important as long as \(q=0\) is
!! the first.
!
USE kinds, ONLY : DP
USE mp, ONLY : mp_bcast
USE mp_world, ONLY : world_comm
USE mp_global, ONLY : mp_startup, mp_global_end
USE io_global, ONLY : ionode_id, ionode, stdout
USE environment, ONLY : environment_start, environment_end
USE el_phon, ONLY : el_ph_nsigma
!
IMPLICIT NONE
!
CHARACTER(len=256) :: fildyn
!! Input file name (character, must be specified) "fildyn"0 contains
!! information on the q-point grid.
!! "fildyn"1-N contain force constants \(C_n = C(q_n)\), for \(n=1,...N\),
!! where N is the number of q-points in the irreducible Brillouin zone.
!! Normally this should be the same as specified on input to the
!! PHonon code.
!! In the non collinear/spin-orbit case the files produced by
!! \(\texttt{ph.x}\) are in .xml format. In this case fildyn is the same
!! as in the PHonon code + the .xml extension.
CHARACTER(len=256) :: filin
!! name of file containing \(C(q_n)\).
CHARACTER(len=256) :: flfrc
!! Output file containing the IFC in real space (character, must be
!! specified).
CHARACTER(len=256) :: prefix
CHARACTER (LEN=10) :: zasr
!! Indicates type of Acoustic Sum Rules used for the Born effective
!! charges (character):
!! - 'no': no Acoustic Sum Rules imposed (default);
!! - 'simple': previous implementation of the asr used (3 translational
!! asr imposed by correction of the diagonal elements of the
!! force-constants matrix);
!! - 'crystal': 3 translational asr imposed by optimized correction of
!! the IFC (projection);
!! - 'one-dim': 3 translational asr + 1 rotational asr imposed by
!! optimized correction of the IFC (the rotation axis is the direction
!! of periodicity. It will work only if this axis considered is one of
!! the cartesian axis);
!! - 'zero-dim': 3 translational asr + 3 rotational asr imposed by
!! optimized correction of the IFC.
!! Note that in certain cases, not all the rotational asr can be applied
!! (e.g. if there are only 2 atoms in a molecule or if all the atoms are
!! aligned, etc.). In these cases the supplementary asr are cancelled
!! during the orthonormalization procedure (see below).
LOGICAL :: la2F
LOGICAL :: loto_2d
!! Set to TRUE to activate two-dimensional treatment of LO-TO splitting.
LOGICAL :: write_lr
!! Set to .true. to write long-range IFC into IFC file when enforcing
!! asr='all' for polar solids in matdyn.
INTEGER :: ios
!
NAMELIST / input / fildyn, flfrc, prefix, zasr, la2F, loto_2d, write_lr, el_ph_nsigma
!
CALL mp_startup()
CALL environment_start('Q2R')
!
IF (ionode) CALL input_from_file ( )
!
fildyn = ' '
flfrc = ' '
prefix = ' '
loto_2d=.false.
write_lr = .false.
zasr = 'no'
!
la2F=.false.
el_ph_nsigma=10
!
!
IF (ionode) READ ( 5, input, IOSTAT =ios )
CALL mp_bcast(ios, ionode_id, world_comm)
CALL errore('q2r','error reading input namelist', abs(ios))
CALL mp_bcast(fildyn, ionode_id, world_comm)
CALL mp_bcast(flfrc, ionode_id, world_comm)
CALL mp_bcast(prefix, ionode_id, world_comm)
CALL mp_bcast(zasr, ionode_id, world_comm)
CALL mp_bcast(loto_2d, ionode_id, world_comm)
CALL mp_bcast(la2F, ionode_id, world_comm)
CALL mp_bcast(el_ph_nsigma, ionode_id, world_comm)
CALL mp_bcast(write_lr, ionode_id, world_comm)
!
CALL do_q2r(fildyn, flfrc, prefix, zasr, la2F, loto_2d, write_lr)
!
CALL environment_end('Q2R')
CALL mp_global_end()
!
END PROGRAM q2r
!
!----------------------------------------------------------------------------