Line data Source code
1 : !!****m* ABINIT/defs_basis
2 : !! NAME
3 : !! defs_basis
4 : !!
5 : !! FUNCTION
6 : !! This module contains definitions for a number of named constants and
7 : !! physical constants, as well as associated datatypes and methods.
8 : !!
9 : !! COPYRIGHT
10 : !! Copyright (C) 2000-2026 ABINIT group (HM, XG,XW, EB)
11 : !! This file is distributed under the terms of the
12 : !! GNU General Public License, see ~abinit/COPYING
13 : !! or http://www.gnu.org/copyleft/gpl.txt .
14 : !!
15 : !! NOTES
16 : !! Of the named constants,
17 : !! by far the most important are those that define the 'kind' types of
18 : !! virtually all the variables used in a (well-written) FORTRAN 90 code
19 : !! the content of this file is derived from 'Numerical Recipes in Fortran 90'
20 : !! W.H. Press et al., volume 2 of 'Fortran Numerical Recipes', Cambridge
21 : !! University Press, Second Edition (1996), p. 937 and 1361
22 : !!
23 : !! SOURCE
24 :
25 : #if defined HAVE_CONFIG_H
26 : #include "config.h"
27 : #endif
28 :
29 : module defs_basis
30 :
31 : !#ifdef HAVE_FC_ISO_FORTRAN_2008
32 : ! use ISO_FORTRAN_ENV, only : input_unit, output_unit, error_unit
33 : !#endif
34 :
35 : implicit none
36 :
37 : !Keyword 'integer' stands for default integer type
38 : !and may be used whenever integer are presumed to be small
39 :
40 : !nb of bytes related to an integer subtype n such as -10^(argument) < n < 10^(argument) (this is standard F90)
41 : integer, parameter :: i1b=selected_int_kind(2)
42 : integer, parameter :: i2b=selected_int_kind(4)
43 : integer, parameter :: i4b=selected_int_kind(9)
44 : integer, parameter :: i8b=selected_int_kind(18)
45 :
46 : !nb of bytes related to default simple-precision real/complex subtypes
47 : !(= 4 for many machine architectures, = 8 for e.g. Cray)
48 : integer, parameter :: sp=kind(1.0) ! Single precision should not be used
49 :
50 : !nb of bytes related to default double-precision real/complex subtypes
51 : !(= 8 for many machine architectures)
52 : integer, parameter :: dp=kind(1.0d0)
53 :
54 : ! Please DO NOT USE use complex(dpc) as complex(dp) is completely equivalent.
55 : ! dpc is still needed because nvfortran with ELPA (eos_nvhpc_23.9_elpa), for unknown reasons,
56 : ! raises an internal compiler error when compiling m_slk if dpc is not declared here.
57 : integer, parameter :: dpc=kind((1.0_dp,1.0_dp))
58 :
59 : !nb of bytes related to GW arrays, that can be tuned from sp to dp independently
60 : !of other variables in ABINIT. Presently single-precision is the default (see config/specs/options.conf)..
61 : #if defined HAVE_GW_DPC
62 : integer, parameter :: gwp=kind(1.0d0)
63 : #else
64 : integer, parameter :: gwp=kind(1.0)
65 : #endif
66 :
67 : !The default lengths
68 : ! TODO: We should increase fnlen to be able to handle multiple pseudos paths in the input file
69 : ! but it seems that increasing this value triggers bugs in the rest of code because people
70 : ! do not trim input strings and use character(len=500) :: msg
71 :
72 : !integer, parameter :: fnlen=264 ! maximum length of file name variables
73 : integer, parameter :: fnlen=400 ! maximum length of file name variables
74 : integer, parameter :: strlen=2000000 ! maximum length of input string
75 :
76 : ! The input file used to run the code, allocated and set by parsefile.
77 : ! It will be added to the netcdf files in ntck_open_create
78 : character(len=:), allocatable, save :: INPUT_STRING
79 :
80 : integer, parameter :: md5_slen = 32 ! length of strings storing the pseudos' md5 checksum.
81 : character(len=md5_slen),parameter :: md5_none = "None"
82 :
83 : integer, parameter :: abi_slen=80 ! maximum length of string variables
84 :
85 : !Some constants:
86 :
87 : ! UNIX unit numbers: standard input, standard output, ab_out, and a number for temporary access to a file.
88 : ! Please, use these named constants instead of write(*,*),
89 : ! it makes the code more readable and easier to change.
90 :
91 : !Default values
92 : !integer, parameter :: std_in = input_unit
93 : !integer, parameter :: ab_in = input_unit
94 : !integer, parameter :: std_out_default = output_unit
95 : !integer, parameter :: ab_out_default=7
96 : !integer, parameter :: std_err = error_unit
97 : integer, parameter :: std_in=5
98 : integer, parameter :: ab_in=5
99 : integer, parameter :: std_out_default=6
100 : integer, parameter :: ab_out_default=7 ! TODO: This should be initialized at run-time.
101 : integer, parameter :: std_err=0
102 :
103 : integer, parameter :: dev_null=-1 ! Fake unit number used to skip the printing in wrtout.
104 : integer, parameter :: ab_xml_out = 50 ! this unit is used to print output into an XML file
105 : integer, parameter :: tmp_unit=9,tmp_unit2=10
106 :
107 : !These vars should be private and only modifiable via an appropriate method (see below)
108 : integer, public, save :: ab_out = ab_out_default
109 : integer, public, save :: std_out = std_out_default
110 : !It should be put to xmpi_world (but it is not possible for the moment - v6.9)
111 : integer, public, save :: abinit_comm_output = -1 !This default value has to be changed at start !!!
112 :
113 : ! the maximum length of a record in a file connected for sequential access.
114 : integer,public,parameter :: ABI_RECL=524288 ! 2**19
115 :
116 : integer,public,parameter :: MAX_NSHIFTK = 210
117 : ! Maximum number of shifts in input k-mesh.
118 :
119 : !Real dp constants
120 : real(dp), parameter :: zero=0._dp
121 : real(dp), parameter :: one=1._dp
122 : real(dp), parameter :: two=2._dp
123 : real(dp), parameter :: three=3._dp
124 : real(dp), parameter :: four=4._dp
125 : real(dp), parameter :: five=5._dp
126 : real(dp), parameter :: six=6._dp
127 : real(dp), parameter :: seven=7._dp
128 : real(dp), parameter :: eight=8._dp
129 : real(dp), parameter :: nine=9._dp
130 : real(dp), parameter :: ten=10._dp
131 :
132 : !Real sp constants
133 : real(sp), parameter :: zero_sp=0._sp
134 : real(sp), parameter :: one_sp=1._sp
135 :
136 : !Fractionary real constants
137 : real(dp), parameter :: half=0.50_dp
138 : real(dp), parameter :: onehalf=1.50_dp
139 : real(dp), parameter :: third=one/three
140 : real(dp), parameter :: quarter=0.25_dp
141 : real(dp), parameter :: fifth=0.20_dp
142 : real(dp), parameter :: sixth=one/six
143 : real(dp), parameter :: seventh=one/seven
144 : real(dp), parameter :: eighth=0.125_dp
145 : real(dp), parameter :: ninth=one/nine
146 : real(dp), parameter :: two_thirds=two*third
147 : real(dp), parameter :: four_thirds=four*third
148 : real(dp), parameter :: five_thirds=five*third
149 : real(dp), parameter :: three_quarters=0.75_dp
150 : real(dp), parameter :: three_fifth=three/five
151 :
152 : !Real constants related to the golden number
153 : real(dp), parameter :: gold=1.618033988749894848204586834365638117720309179_dp
154 : real(dp), parameter :: goldenratio=two-gold
155 :
156 : !Real constants derived from pi
157 : real(dp), parameter :: pi=3.141592653589793238462643383279502884197_dp
158 : real(dp), parameter :: two_pi=two*pi
159 : real(dp), parameter :: four_pi=four*pi
160 : real(dp), parameter :: piinv=one/pi
161 : !The following are not used
162 : !real(dp), parameter :: rad_to_deg=180._dp/pi
163 : !real(dp), parameter :: deg_to_rad=one/rad_to_deg
164 : !real(dp), parameter :: half_pi=pi*half
165 : !real(dp), parameter :: third_pi=pi*third
166 : !real(dp), parameter :: quarter_pi=pi*quarter
167 : !real(dp), parameter :: two_thirds_pi=two_thirds*pi
168 :
169 : !Real precision
170 : real(dp), parameter :: greatest_real = huge(one)
171 : real(dp), parameter :: smallest_real = -greatest_real
172 : real(dp), parameter :: tol1= 0.1_dp
173 : real(dp), parameter :: tol2= 0.01_dp
174 : real(dp), parameter :: tol3= 0.001_dp
175 : real(dp), parameter :: tol4= 0.0001_dp
176 : real(dp), parameter :: tol5= 0.00001_dp
177 : real(dp), parameter :: tol6= 0.000001_dp
178 : real(dp), parameter :: tol7= 0.0000001_dp
179 : real(dp), parameter :: tol8= 0.00000001_dp
180 : real(dp), parameter :: tol9= 0.000000001_dp
181 : real(dp), parameter :: tol10=0.0000000001_dp
182 : real(dp), parameter :: tol11=0.00000000001_dp
183 : real(dp), parameter :: tol12=0.000000000001_dp
184 : real(dp), parameter :: tol13=0.0000000000001_dp
185 : real(dp), parameter :: tol14=0.00000000000001_dp
186 : real(dp), parameter :: tol15=0.000000000000001_dp
187 : real(dp), parameter :: tol16=0.0000000000000001_dp
188 : real(dp), parameter :: tol17=0.00000000000000001_dp
189 : real(dp), parameter :: tol18=0.000000000000000001_dp
190 : real(dp), parameter :: tol19=0.0000000000000000001_dp
191 : real(dp), parameter :: tol20=0.00000000000000000001_dp
192 : real(dp), parameter :: tol30=1.0e-30_dp
193 :
194 : !real constants derived from sqrt(n.)
195 : real(dp), parameter :: sqrt2=1.4142135623730950488016887242096939_dp
196 : real(dp), parameter :: half_sqrt2=0.70710678118654752440084436210484697_dp
197 : real(dp), parameter :: sqrt3=1.7320508075688772935274463415058739_dp
198 : real(dp), parameter :: half_sqrt3=0.86602540378443864676372317075293693_dp
199 : real(dp), parameter :: sqrthalf=0.70710678118654752440084436210484697_dp
200 :
201 : !Conversion factors of common use, not directly related to physical quantities.
202 : real(dp), parameter :: b2Mb=one/1024.0_dp**2 ! conversion factor bytes --> Mbytes
203 : real(dp), parameter :: b2Gb=b2Mb/1024.0_dp ! conversion factor bytes --> Gbytes
204 :
205 : ! This value is used as sentinel to initialize real values that are "undefined" i.e.
206 : ! values that cannot be computed or values that do not make any sense in a particular context
207 : ! e.g. stress tensor in NSCF calculations. The sentinel is used the yaml routines to print "undef" instead of the
208 : ! numerical value.
209 : real(dp),parameter :: MAGIC_UNDEF = 9.9999999999D+99
210 :
211 : ! Max Memory in Mb available for a MPI processor
212 : ! This quantity might be used at runtime to determine how to distribute memory.
213 : ! The default value (2Gb) can be changed at runtime via the command line interface.
214 : real(dp), save, protected :: mem_per_cpu_mb = two * 1024_dp
215 :
216 : !=========================================================
217 : !First part of physical constant definitions
218 :
219 : ! Previous values from NIST 2006 from http://physics.nist.gov/cuu/Constants/index.html
220 :
221 : !real(dp), parameter :: Bohr_Ang=0.52917720859_dp ! 1 Bohr, in Angstrom
222 : !real(dp), parameter :: Ang_Bohr = one / Bohr_Ang ! 1 Angstrom in Bohr
223 : !real(dp), parameter :: Bohr_meter=Bohr_Ang * 1.d-10 ! 1 Bohr in meter
224 : !real(dp), parameter :: Bohr_cm=Bohr_meter * 100_dp ! 1 Bohr in cm
225 : !real(dp), parameter :: Ha_cmm1=219474.6313705_dp ! 1 Hartree in cm^-1
226 : !real(dp), parameter :: Ha_eV=27.21138386_dp ! 1 Hartree in eV
227 : !real(dp), parameter :: eV_Ha=one/Ha_eV ! 1 eV in Hartree
228 : !real(dp), parameter :: Ha_meV=Ha_eV*1000_dp ! 1 Hartree in meV
229 : !real(dp), parameter :: Ha_K=315774.65_dp ! 1Hartree in Kelvin
230 : !real(dp), parameter :: Ha_THz=6579.683920722_dp ! 1 Hartree in THz
231 : !real(dp), parameter :: Ha_s=Ha_THz*1e12*two_pi ! 1 Hartree in s
232 : !real(dp), parameter :: Ha_J=4.35974394d-18 !1 Hartree in J
233 :
234 : !real(dp), parameter :: e_Cb=1.602176487d-19 ! minus the electron charge in Coulomb
235 : !real(dp), parameter :: kb_SI=1.380649d-23 ! Boltzmann constant in Joule/K (CODATA 2017 value.)
236 : !real(dp), parameter :: Avogadro=6.02214179d23 ! per mole
237 : !real(dp), parameter :: Speed_Light_SI=2.99792458d8 ! speed of light in SI
238 :
239 : ! 09/2025 [SP] update with 2022 NIST values from the same website.
240 : ! See also P. J. Mohr et al., Review Mod. Phys. 97, 025002 (2025)
241 : !
242 : real(dp), parameter :: Bohr_Ang = 0.529177210544_dp ! 1 Bohr, in Angstrom
243 : real(dp), parameter :: Ang_Bohr = one / Bohr_Ang ! 1 Angstrom in Bohr
244 : real(dp), parameter :: Bohr_meter = Bohr_Ang * 1.d-10 ! 1 Bohr in meter
245 : real(dp), parameter :: Bohr_cm = Bohr_meter * 100_dp ! 1 Bohr in cm
246 : real(dp), parameter :: Ha_eV = 27.211386245981_dp ! 1 Hartree in eV
247 : real(dp), parameter :: Ha_cmm1 = 219474.63136314_dp ! 1 Hartree in cm^-1
248 : real(dp), parameter :: eV_Ha = one / Ha_eV ! 1 eV in Hartree
249 : real(dp), parameter :: Ha_meV = Ha_eV * 1000_dp ! 1 Hartree in meV
250 : real(dp), parameter :: Ha_K = 315775.02480398_dp ! 1 Hartree in Kelvin
251 : real(dp), parameter :: Ha_THz = 6579.6839204999_dp ! 1 Hartree in THz
252 : real(dp), parameter :: Ha_s = Ha_THz * 1e12 * two_pi ! 1 Hartree in s
253 : real(dp), parameter :: Ha_J = 4.3597447222060d-18 ! 1 Hartree in J
254 :
255 : ! Since 2019, the following constants have been defined and are now exact [SP].
256 : real(dp), parameter :: e_Cb = 1.602176634d-19 ! minus the electron charge in Coulomb
257 : real(dp), parameter :: kb_SI = 1.380649d-23 ! Boltzmann constant in Joule/K
258 : real(dp), parameter :: Avogadro = 6.02214076d23 ! per mole
259 : real(dp), parameter :: Speed_Light_SI = 299792458_dp ! Speed of light in vacuum (m/s)
260 : ! Note: In SI, c is fixed and the fine structure constant (alpha) is measured.
261 : ! In a.u., alpha is fixed and c is measured. Be carefull when using them.
262 : ! Here we define c.
263 :
264 : !=========================================================
265 : !Second part of physical constant definitions
266 :
267 : ! Previous values from NIST 2006 from http://physics.nist.gov/cuu/Constants/index.html
268 :
269 : !real(dp), parameter :: kb_HaK=8.617343d-5/Ha_eV ! Boltzmann constant in Ha/K
270 : !real(dp), parameter :: kb_THzK=kb_HaK*Ha_THz ! Boltzmann constant in THz/K
271 : !real(dp), parameter :: amu_emass=1.660538782d-27/9.10938215d-31 ! 1 atomic mass unit in electronic mass
272 : !real(dp), parameter :: HaBohr3_GPa=Ha_eV/Bohr_Ang**3*e_Cb*1.0d+21 ! 1 Ha/Bohr^3 in GPa
273 : !real(dp), parameter :: Ohmcm=two*pi*Ha_THz*ninth*ten ! 1 Ohm.cm in atomic units
274 : !!real(dp), parameter :: eps0=8.854187817d-12 ! permittivity of free space in F/m
275 : !real(dp), parameter :: eps0=one/(four_pi*0.0000001_dp*299792458.0_dp**2)
276 : !real(dp), parameter :: AmuBohr2_Cm2=e_Cb*1.0d20/(Bohr_Ang*Bohr_Ang)
277 :
278 : ! 09/2025 [SP] update with 2022 NIST values from the same website.
279 : ! See also P. J. Mohr et al., Review Mod. Phys. 97, 025002 (2025)
280 :
281 : real(dp), parameter :: kb_HaK = kb_SI / Ha_J ! Boltzmann constant in Ha/K
282 : real(dp), parameter :: kb_THzK = kb_HaK * Ha_THz ! Boltzmann constant in THz/K
283 : real(dp), parameter :: amu_emass = 1.66053906892d-27 / 9.1093837139d-31 ! 1 atomic mass unit in electronic mass
284 : real(dp), parameter :: HaBohr3_GPa = Ha_eV / Bohr_Ang**3 * e_Cb * 1.0d+21 ! 1 Ha/Bohr^3 in GPa
285 : real(dp), parameter :: Ohmcm = two * pi * Ha_THz * ninth * ten ! 1 Ohm.cm in atomic units
286 : real(dp), parameter :: eps0 = one / (four_pi * 0.0000001_dp * Speed_Light_SI**2) ! permittivity of free space in F/m
287 : real(dp), parameter :: AmuBohr2_Cm2 = e_Cb * 1.0d20 / (Bohr_Ang * Bohr_Ang)
288 :
289 : !=========================================================
290 : !Third part of physical constant definitions
291 :
292 : ! Real physical constants
293 : ! Previous values from NIST 2006 from http://physics.nist.gov/cuu/Constants/index.html
294 :
295 : !real(dp), parameter :: InvFineStruct=137.035999679_dp ! Inverse of fine structure constant
296 : !real(dp), parameter :: FineStructureConstant=0.0072973525664_dp ! 2014 CODATA value
297 : !real(dp), parameter :: FineStructureConstant2=0.000053251354478_dp ! Square of fine structure constant
298 : !real(dp), parameter :: Speed_Light=Speed_light_SI/2.1876912633d6 ! speed of light in atomic units
299 : !real(dp), parameter :: Time_Sec=2.418884326505D-17 ! Atomic unit of time in seconds
300 :
301 : ! 09/2025 [SP] update with 2022 NIST values from the same website.
302 : ! See also P. J. Mohr et al., Review Mod. Phys. 97, 025002 (2025)
303 : !
304 : ! Note: In SI, c is fixed and the fine structure constant (alpha) is measured.
305 : ! In a.u., alpha is fixed and c is measured. Be carefull when used them.
306 : ! Here we defined c.
307 :
308 : real(dp), parameter :: InvFineStruct= 137.035999177_dp ! Inverse of fine structure constant
309 : real(dp), parameter :: FineStructureConstant = 0.0072973525643_dp ! Fine structure constant
310 : real(dp), parameter :: FineStructureConstant2 = FineStructureConstant**2 ! Square of fine structure constant
311 :
312 : !Works until now
313 :
314 : !The compiler nvhpc has a problem with this line ?!?
315 : real(dp), parameter :: Speed_Light = InvFineStruct ! Speed of light in atomic units
316 : !So, replace with this line with straight value of Speed_Light
317 : !real(dp), parameter :: Speed_Light= 137.035999177_dp
318 :
319 : !
320 : real(dp), parameter :: Time_Sec = 2.4188843265864D-17 ! Atomic unit of time in seconds
321 :
322 : !=========================================================
323 : !Fourth part of physical constant definitions
324 :
325 : ! Real physical constants
326 : ! Previous values from NIST 2006 from http://physics.nist.gov/cuu/Constants/index.html
327 :
328 : ! real(dp), parameter :: BField_Tesla=4.254383d-6 ! Tesla in a.u.
329 : ! real(dp), parameter :: dipole_moment_debye=0.393430307_dp ! Debye unit in a.u.
330 : ! real(dp), parameter :: siemens_SI=e_Cb**2 / Ha_J / Time_Sec ! Siemens in SI: A/V = C^2 / (J * s)
331 : ! real(dp), parameter :: volt_SI=Ha_J/e_Cb ! Volt in SI: J/C
332 : !!EB suppress *0.5_dp ! Atomic unit of induction field (in Tesla) * mu_B (in atomic units).
333 : ! real(dp), parameter :: mu_B_SI=9.274009994D-24 ! Bohr magneton in SI
334 : ! real(dp), parameter :: mu_B = 0.5_dp ! Bohr magneton in atomic units
335 :
336 : ! 09/2025 [SP] update with 2022 NIST values from the same website.
337 : ! See also P. J. Mohr et al., Review Mod. Phys. 97, 025002 (2025)
338 : !
339 : ! Note: In SI, c is fixed and the fine structure constant (alpha) is measured.
340 : ! In a.u., alpha is fixed and c is measured. Be carefull when used them. Here we defined c.
341 :
342 : real(dp), parameter :: mu_B_SI = 9.2740100657D-24 ! Bohr magneton in SI
343 : real(dp), parameter :: mu_0_SI = 1.25663706127d-6 ! Vacuum permeability in atomic units
344 : real(dp), parameter :: mu_B = 0.5_dp ! Bohr magneton in atomic units
345 : real(dp), parameter :: BField_Tesla = mu_B_SI / (Ha_J * mu_B) ! Tesla in a.u.
346 : real(dp), parameter :: dipole_moment_debye = 0.393430307_dp ! Debye unit in a.u.
347 : real(dp), parameter :: siemens_SI = e_Cb**2 / Ha_J / Time_Sec ! Siemens in SI: A/V = C^2 / (J * s)
348 : real(dp), parameter :: volt_SI = Ha_J / e_Cb ! Volt in SI: J/C
349 : real(dp), parameter :: EFG_SI = volt_SI / Bohr_meter**2 ! E-field gradient in SI : Volt/m^2
350 :
351 : !End of physical constants
352 : !=========================================================
353 :
354 : !Complex constants
355 : !double precision
356 : complex(dp), parameter :: czero = (0._dp,0._dp)
357 : complex(dp), parameter :: cone = (1._dp,0._dp)
358 : complex(dp), parameter :: ctwo = (2._dp,0._dp)
359 : complex(dp), parameter :: j_dpc = (0._dp,1.0_dp)
360 :
361 : ! single-precision
362 : complex(sp), parameter :: czero_sp = (0._sp,0._sp)
363 : complex(sp), parameter :: cone_sp = (1._sp,0._sp)
364 : complex(sp), parameter :: ctwo_sp = (2._sp,0._sp)
365 : complex(sp), parameter :: j_sp = (0._sp,1.0_sp)
366 :
367 : !Pauli matrix
368 : complex(dp), parameter :: pauli_mat(2,2,0:3) = reshape([cone,czero,czero,cone, &
369 : czero,cone,cone,czero,&
370 : czero,j_dpc,-j_dpc,czero,&
371 : cone,czero,czero,-cone], [2,2,4])
372 :
373 : !Character constants
374 : character(len=1), parameter :: ch10 = char(10)
375 : character(len=fnlen),parameter :: ABI_NOFILE="__None__"
376 :
377 : ! File used to dump the error message in m_error.
378 : ! Extremely useful when we run on many CPUs since logging, in this case, is automatically disabled
379 : ! As a consequence, we get error messages in the main log only if the problem is encountered by the master node!
380 : ! Note that the file is removed in xmpi_init (if present).
381 : character(len=fnlen),parameter :: ABI_MPIABORTFILE="__ABI_MPIABORTFILE__"
382 :
383 : ! Error codes used by the bindings.
384 : integer, parameter, public :: AB7_NO_ERROR = 0
385 : integer, parameter, public :: AB7_ERROR_OBJ = 1
386 : integer, parameter, public :: AB7_ERROR_ARG = 2
387 : integer, parameter, public :: AB7_ERROR_INVARS_ATT = 3
388 : integer, parameter, public :: AB7_ERROR_INVARS_ID = 4
389 : integer, parameter, public :: AB7_ERROR_INVARS_SIZE = 5
390 : integer, parameter, public :: AB7_ERROR_SYM_NOT_PRIMITIVE = 6
391 : integer, parameter, public :: AB7_ERROR_SYM_BRAVAIS_XRED = 7
392 : integer, parameter, public :: AB7_ERROR_MIXING_ARG = 8
393 : integer, parameter, public :: AB7_ERROR_MIXING_CONVERGENCE = 9
394 : integer, parameter, public :: AB7_ERROR_MIXING_INTERNAL = 10
395 : integer, parameter, public :: AB7_ERROR_MIXING_INC_NNSLOOP = 11
396 :
397 : ! Values of optdriver corresponding to the different run-levels.
398 : integer, parameter, public :: RUNL_GSTATE = 0
399 : integer, parameter, public :: RUNL_RESPFN = 1
400 : integer, parameter, public :: RUNL_SCREENING = 3
401 : integer, parameter, public :: RUNL_SIGMA = 4
402 : integer, parameter, public :: RUNL_NONLINEAR = 5
403 : integer, parameter, public :: RUNL_GWR = 6
404 : integer, parameter, public :: RUNL_EPH = 7
405 : integer, parameter, public :: RUNL_WFK = 8
406 : integer, parameter, public :: RUNL_RTTDDFT = 9
407 : integer, parameter, public :: RUNL_GWLS = 66
408 : integer, parameter, public :: RUNL_BSE = 99
409 : integer, parameter, public :: RUNL_LONGWAVE = 10
410 :
411 : ! Integer flags defining the task to be performed in wfk_analyze
412 : integer,public,parameter :: WFK_TASK_NONE = 0
413 : integer,public,parameter :: WFK_TASK_FULLBZ = 1
414 : integer,public,parameter :: WFK_TASK_CLASSIFY = 2
415 : integer,public,parameter :: WFK_TASK_PAW_AEPSI = 3
416 : integer,public,parameter :: WFK_TASK_EINTERP = 4
417 : integer,public,parameter :: WFK_TASK_DDK = 5
418 : integer,public,parameter :: WFK_TASK_DDK_DIAGO = 6
419 : integer,public,parameter :: WFK_TASK_OPTICS_FULLBZ = 7
420 : integer,public,parameter :: WFK_TASK_KPTS_ERANGE= 8
421 : integer,public,parameter :: WFK_TASK_CHECK_SYMTAB = 9
422 : integer,public,parameter :: WFK_TASK_WANNIER = 10
423 : integer,public,parameter :: WFK_TASK_PSEUDOBANDS = 11
424 :
425 : ! Flags defining the method used for performing IO (input variable iomode)
426 : integer, parameter, public :: IO_MODE_FORTRAN_MASTER = -1
427 : integer, parameter, public :: IO_MODE_FORTRAN = 0
428 : integer, parameter, public :: IO_MODE_MPI = 1
429 : integer, parameter, public :: IO_MODE_NETCDF = 2 ! Only for legacy code, should not be used for new implementations.
430 : integer, parameter, public :: IO_MODE_ETSF = 3
431 :
432 : ! FFT libraries (correspond to fftalga = ngfft(7)/100)
433 : integer,parameter,public :: FFT_SG = 1
434 : integer,parameter,public :: FFT_FFTW3 = 3
435 : integer,parameter,public :: FFT_SG2002 = 4
436 : integer,parameter,public :: FFT_DFTI = 5
437 :
438 : ! Parameters for non-local algorithm (were previously stored in nloalg(3) and nloalg(4)
439 : integer,parameter,public :: NLO_MBLKPW = 199
440 : integer,parameter,public :: NLO_MINCAT = 10
441 :
442 : ! This is used to compute the maximum index of the perturbation as 2*natom + MPERT_MAX
443 : ! GA: But this is not actually the maximum perturbation, see m_dfpt_loopert
444 : integer,parameter,public :: MPERT_MAX = 11
445 :
446 : ! Parameters for the GPU implementation(s)
447 : ! GPU implementation undetermined
448 : integer,parameter,public :: ABI_GPU_UNKNOWN =-1
449 : ! Not using any GPU implementation, implies running on CPU
450 : integer,parameter,public :: ABI_GPU_DISABLED = 0
451 : ! Legacy GPU implementation relying on NVIDIA CUDA kernels, not preferred
452 : integer,parameter,public :: ABI_GPU_LEGACY = 1
453 : ! GPU implementation relying on OpenMP v5 "TARGET" construct
454 : integer,parameter,public :: ABI_GPU_OPENMP = 2
455 : ! GPU implementation relying on Kokkos + cuda framework
456 : integer,parameter,public :: ABI_GPU_KOKKOS = 3
457 : ! Please note that a GPU linalg library supported in gpu_toolbox (ie: CUDA) backs up OpenMP and Kokkos variants.
458 :
459 : !Parameters for LOG/STATUS files treatment
460 : !This variables tell the code if some lines have to be written in a LOG/STATUS file
461 : logical, public, save :: do_write_log =.true.
462 : logical, public, save :: do_write_status=.true.
463 : ! Max. numbers of CPU core for the writing of LOG/STATUS file for each CPU
464 : ! (if more than NPROC_NO_EXTRA_LOG cpu core are used, no *_LOG_Pxxx is written;
465 : ! the same for the *_STATUS_Pxxx file)
466 : integer, parameter, public :: NPROC_NO_EXTRA_LOG = 2 !@WC
467 : integer, parameter, public :: NPROC_NO_EXTRA_STATUS = 2 !@WC
468 : !Name of the file that (if present in current directory)
469 : !will avoid creation of LOG/STATUS files
470 : character(len=fnlen),parameter :: ABI_NO_LOG_FILE="_NOLOG"
471 : !Name of the file that (if present in current directory)
472 : !will enforce creation of LOG/STATUS files
473 : character(len=fnlen),parameter :: ABI_ENFORCE_LOG_FILE="_LOG"
474 : !Name of the file that (if present in current directory)
475 : !will enforce creation of LOG file only for master proc
476 : character(len=fnlen),parameter :: ABI_MAIN_LOG_FILE="_MAINLOG"
477 :
478 : ! Arrays
479 : integer,parameter :: identity_3d(3,3) = reshape([1,0,0,0,1,0,0,0,1], [3,3])
480 : integer,parameter :: inversion_3d(3,3) = reshape([-1,0,0,0,-1,0,0,0,-1], [3,3])
481 :
482 : !A collection of small datatypes for ragged arrays
483 : !A small datatype for ragged integer 1D-arrays
484 : type coeffi1_type
485 : integer :: size
486 : integer, allocatable :: value(:)
487 : end type coeffi1_type
488 : !A small datatype for ragged integer 2D-arrays
489 : type coeffi2_type
490 : integer :: size
491 : integer, allocatable :: value(:,:)
492 : end type coeffi2_type
493 : !A small datatype for ragged integer 3D-arrays
494 : type coeffi3_type
495 : integer :: size
496 : integer, allocatable :: value(:,:,:)
497 : end type coeffi3_type
498 : !A small datatype for ragged integer 4D-arrays
499 : type coeffi4_type
500 : integer :: size
501 : integer, allocatable :: value(:,:,:,:)
502 : end type coeffi4_type
503 : !A small datatype for ragged integer 5D-arrays
504 : type coeffi5_type
505 : integer :: size
506 : integer, allocatable :: value(:,:,:,:,:)
507 : end type coeffi5_type
508 : !A small datatype for ragged complex 1D-arrays
509 : type coeff1c_type
510 : complex(dp), allocatable :: value(:)
511 : end type coeff1c_type
512 : !A small datatype for ragged complex 2D-arrays
513 : type coeff2c_type
514 : complex(dp), allocatable :: value(:,:)
515 : end type coeff2c_type
516 : !A small datatype for ragged complex 3D-arrays
517 : type coeff3c_type
518 : complex(dp), allocatable :: value(:,:,:)
519 : end type coeff3c_type
520 : !A small datatype for ragged complex 4D-arrays
521 : type coeff4c_type
522 : complex(dp), allocatable :: value(:,:,:,:)
523 : end type coeff4c_type
524 : !A small datatype for ragged complex 5D-arrays
525 : type coeff5c_type
526 : complex(dp), allocatable :: value(:,:,:,:,:)
527 : end type coeff5c_type
528 : !A small datatype for ragged real 1D-arrays
529 : type coeff1_type
530 : real(dp), allocatable :: value(:)
531 : end type coeff1_type
532 : !A small datatype for ragged real 2D-arrays
533 : type coeff2_type
534 : real(dp), allocatable :: value(:,:)
535 : end type coeff2_type
536 : !A small datatype for ragged real 3D-arrays
537 : type coeff3_type
538 : real(dp), allocatable :: value(:,:,:)
539 : end type coeff3_type
540 : !A small datatype for ragged real 4D-arrays
541 : type coeff4_type
542 : real(dp), allocatable :: value(:,:,:,:)
543 : end type coeff4_type
544 : !A small datatype for ragged real 5D-arrays
545 : type coeff5_type
546 : real(dp), allocatable :: value(:,:,:,:,:)
547 : end type coeff5_type
548 : !A small datatype for ragged real 6D-arrays
549 : type coeff6_type
550 : real(dp), allocatable :: value(:,:,:,:,:,:)
551 : end type coeff6_type
552 : !A small datatype for ragged real 7D-arrays.
553 : type coeff7_type
554 : real(dp), allocatable :: value(:,:,:,:,:,:,:)
555 : end type coeff7_type
556 :
557 : CONTAINS !==============================================================================
558 : !!***
559 :
560 : !!****f* defs_basis/abi_log_status_state
561 : !! NAME
562 : !! abi_log_status_state
563 : !!
564 : !! FUNCTION
565 : !! Change values of do_write_log and do_write_status flags.
566 : !! These flags tell the code to write (or not) a LOG/STATUS file.
567 : !!
568 : !! INPUTS
569 : !! new_do_write_log=new value for do_write_log
570 : !! new_do_write_status=new value for do_write_status
571 : !!
572 : !! SOURCE
573 :
574 556 : subroutine abi_log_status_state(new_do_write_log,new_do_write_status)
575 :
576 : !Arguments ------------------------------------
577 : logical,optional,intent(in) :: new_do_write_log,new_do_write_status
578 : !************************************************************************
579 :
580 556 : if (PRESENT(new_do_write_log)) do_write_log =new_do_write_log
581 556 : if (PRESENT(new_do_write_status)) do_write_status=new_do_write_status
582 :
583 556 : end subroutine abi_log_status_state
584 : !!***
585 :
586 : !----------------------------------------------------------------------
587 :
588 : !!****f* defs_basis/abi_io_redirect
589 : !! NAME
590 : !! abi_io_redirect
591 : !!
592 : !! FUNCTION
593 : !! Redirect unit numbers (and|or) change the MPI communicator for the IO (output and log file).
594 : !! This routine can be used in client code (e.g. bigdft)
595 : !! that wants to call the abinit routines packed in an external library.
596 : !!
597 : !! INPUTS
598 : !! new_ab_out=new value for output file unit
599 : !! new_std_out=new value for standard output unit
600 : !! new_io_comm=new value for IO MPI communicator
601 : !!
602 : !! SOURCE
603 :
604 24914 : subroutine abi_io_redirect(new_ab_out,new_std_out,new_io_comm)
605 :
606 : !Arguments ------------------------------------
607 : integer,optional,intent(in) :: new_std_out,new_ab_out,new_io_comm
608 : !************************************************************************
609 :
610 24914 : if (PRESENT(new_ab_out)) ab_out = new_ab_out
611 24914 : if (PRESENT(new_std_out)) std_out = new_std_out
612 24914 : if (PRESENT(new_io_comm)) abinit_comm_output = new_io_comm
613 :
614 24914 : end subroutine abi_io_redirect
615 : !!***
616 :
617 : !----------------------------------------------------------------------
618 :
619 : !!****f* defs_basis/print_kinds
620 : !! NAME
621 : !! print_kinds
622 : !!
623 : !! FUNCTION
624 : !! Prints info on the basic data types, e.g. kind, precision...
625 : !!
626 : !! INPUTS
627 : !! unit = Unit number for output file.
628 : !!
629 : !! SOURCE
630 :
631 1150 : subroutine print_kinds(unit)
632 :
633 : !Arguments-------------------------------------
634 : integer,optional,intent(in) :: unit
635 :
636 : !Local variables-------------------------------
637 : integer :: my_unt
638 : ! *********************************************************************
639 :
640 1150 : my_unt=std_out; if (PRESENT(unit)) my_unt = unit
641 :
642 1150 : write(my_unt,'(a)')' DATA TYPE INFORMATION: '
643 :
644 : write(my_unt,'(a,/,2(a,i6,/),2(a,e16.8e3,/),a,e16.8e3)')&
645 1150 : ' REAL: Data type name: REAL(DP) ',&
646 1150 : ' Kind value: ',KIND(0.0_dp),&
647 1150 : ' Precision: ',PRECISION(0.0_dp),&
648 1150 : ' Smallest nonnegligible quantity relative to 1: ',EPSILON(0.0_dp),&
649 1150 : ' Smallest positive number: ',TINY(0.0_dp),&
650 2300 : ' Largest representable number: ',HUGE(0.0_dp)
651 :
652 : write(my_unt,'(a,/,2(a,i0,/),a,i0)')&
653 1150 : ' INTEGER: Data type name: INTEGER(default) ', &
654 1150 : ' Kind value: ',KIND(0), &
655 1150 : ' Bit size: ',BIT_SIZE(0), &
656 2300 : ' Largest representable number: ',HUGE(0)
657 :
658 : write(my_unt,'(a,/,a,i0)')&
659 1150 : ' LOGICAL: Data type name: LOGICAL ',&
660 2300 : ' Kind value: ',KIND(.TRUE.)
661 :
662 : write(my_unt,'(2a,i0)')&
663 1150 : ' CHARACTER: Data type name: CHARACTER ',&
664 2300 : ' Kind value: ',KIND('C')
665 :
666 1150 : end subroutine print_kinds
667 : !!***
668 :
669 : !!****f* defs_basis/str2wfktask
670 : !! NAME
671 : !! str2wfktask
672 : !!
673 : !! FUNCTION
674 : !! Convert a string into one of the integer flags WFK_TASK_*
675 : !! Return WFK_TASK_NONE if string is invalid.
676 : !!
677 : !! SOURCE
678 :
679 12 : integer pure function str2wfktask(str) result(wfk_task)
680 :
681 : !Arguments ------------------------------------
682 : character(len=*),intent(in) :: str
683 : !************************************************************************
684 :
685 : select case (str)
686 : case ("wfk_fullbz")
687 : wfk_task = WFK_TASK_FULLBZ
688 : case ("classify")
689 : wfk_task = WFK_TASK_CLASSIFY
690 : case ("paw_aepsi")
691 : wfk_task = WFK_TASK_PAW_AEPSI
692 : case ("wfk_einterp")
693 : wfk_task = WFK_TASK_EINTERP
694 : case ("wfk_ddk")
695 : wfk_task = WFK_TASK_DDK
696 : case ("wfk_ddk_diago")
697 : wfk_task = WFK_TASK_DDK_DIAGO
698 : case ("wfk_kpts_erange")
699 : wfk_task = WFK_TASK_KPTS_ERANGE
700 : case ("optics_fullbz", "wfk_optics_fullbz")
701 : wfk_task = WFK_TASK_OPTICS_FULLBZ
702 : case ("check_symtab")
703 : wfk_task = WFK_TASK_CHECK_SYMTAB
704 : case ("wannier")
705 : wfk_task = WFK_TASK_WANNIER
706 : case ("pseudobands")
707 : wfk_task = WFK_TASK_PSEUDOBANDS
708 : case default
709 12 : wfk_task = WFK_TASK_NONE
710 : end select
711 :
712 12 : end function str2wfktask
713 : !!***
714 :
715 : !----------------------------------------------------------------------
716 :
717 : !!****f* defs_basis/set_mem_per_cpu_mb
718 : !! NAME
719 : !! set_mem_per_cpu_mb
720 : !!
721 : !! FUNCTION
722 : !! Set the value of global variable `mem_per_cpu_mb`
723 : !!
724 : !! SOURCE
725 :
726 0 : subroutine set_mem_per_cpu_mb(mem_mb)
727 :
728 : !Arguments-------------------------------------
729 : real(dp),intent(in) :: mem_mb
730 : ! *********************************************************************
731 :
732 : !print *, "Setting mem_per_cpu_mb to", mem_mb
733 0 : mem_per_cpu_mb = mem_mb
734 :
735 0 : end subroutine set_mem_per_cpu_mb
736 : !!***
737 :
738 : !----------------------------------------------------------------------
739 :
740 0 : end module defs_basis
741 : !!***
|