1!>================================================================================
2!!
3!! Modules:
4!!
5!! (1) nrtype_m      Originally By ?      Last Modified 8/22/2010 (gsm)
6!!
7!!     Global constants and parameters.
8!!
9!!================================================================================
10
11#include "f_defs.h"
12
13#ifdef HDF5
14#define AUTO_VER(x) VER_ ## x ## _HDF5
15#else
16#define AUTO_VER(x) VER_ ## x ## _FORT
17#endif
18
19module nrtype_m
20
21  implicit none
22
23  public ! only public parameters here
24
25! Below are the version number for each BerkeleyGW file. These numbers should
26! be changed whenever the structure of the file is altered and there`s either
27! incompatibility with the previous version or a new feature. The version
28! should be -1 if that file is not versioned yet, which corresponds to
29! the formats used in the Berkeley 1.0.x family.
30  integer, parameter :: VER_WFN_FORT = -1
31  integer, parameter :: VER_WFN_HDF5 = 1
32  integer, parameter :: VER_WFN = AUTO_VER(WFN)
33  integer, parameter :: VER_EPS_FORT = -1
34  integer, parameter :: VER_EPS_HDF5 = 3
35  integer, parameter :: VER_EPS = AUTO_VER(EPS)
36  integer, parameter :: VER_BSE_FORT = 1
37  integer, parameter :: VER_BSE_HDF5 = 2
38  integer, parameter :: VER_BSE = AUTO_VER(BSE)
39
40! Screening types, typically stored in a variable named `iscreen`
41  integer, parameter :: SCREEN_SEMICOND = 0 !< semiconductor screening
42  integer, parameter :: SCREEN_GRAPHENE = 1 !< graphene screening
43  integer, parameter :: SCREEN_METAL = 2 !< metal screening
44
45! Truncation flags, typically stored in a variable named `itrunc` or `icutv`
46  integer, parameter :: TRUNC_NONE = 0 !< no truncation (3D)
47  integer, parameter :: TRUNC_SPHERICAL = 2 !< 0D spherical truncation
48  integer, parameter :: TRUNC_WIRE = 4 !< 1D cell wire truncation
49  integer, parameter :: TRUNC_BOX = 5 !< 0D cell box truncation
50  integer, parameter :: TRUNC_SLAB = 6 !< 2D slab truncation
51  integer, parameter :: TRUNC_SUPERCELL = 7 !< supercell truncation (3D), experimental
52
53!> Maximum number of bands supported by the *inread* routines. This sets the
54!! size of arrays such as "occupations". These arrays should all be allocated
55!! dynamically in the future.
56  integer, parameter :: MAX_BANDS = 1000000 ! "occupations" array => 7MB
57!> Maximum number of {k,q}-points supported by the *inread* routines.
58!! The actual number of k-points/q-points in the WFN/bsemat/epsmat files
59!! can be larger.
60  integer, parameter :: MAX_KPTS = 100000 ! "kpt_read" array => 0.8 MB
61
62!> parameters for real-space resolution in cell-truncation schemes
63  integer, parameter :: n_in_box = 2
64  integer, parameter :: n_in_wire = 4
65
66!> parameter for construction of Wigner-Seitz cell
67  integer, parameter :: ncell = 3
68
69!> number of Monte-Carlo integration points
70  integer, parameter :: nmc_coarse = 250000
71  integer, parameter :: nmc_fine = 2500000
72  integer, parameter :: nmc = nmc_fine
73
74!> type definitions following the convention of Numerical Recipes
75!! do not ever use single-precision!!
76!  integer, parameter :: SP = kind(1.0)
77  integer, parameter :: DP = kind(1.0d0)
78!  integer, parameter :: SPC = kind((1.0,1.0))
79  integer, parameter :: DPC = kind((1.0d0,1.0d0))
80
81!> a shift on the grid in order to avoid the singularity for truncation
82  real(DP), parameter :: trunc_shift(3) = (/0.5d0, 0.5d0, 0.5d0/)
83
84!> physical constants
85!!
86!! These are the "2010 CODATA recommended values" taken from
87!! "The NIST Reference on Constants, Units, and Uncertainty"
88!! http://physics.nist.gov/cuu/
89!!
90!! The following variables are used throughout the package:
91!!     'BOHR', 'bohr' is Bohr radius, in Angstrom
92!!     'RYD', 'ryd2eV', 'rydberg' is Rydberg constant times hc, in eV
93!!     'HARTREE', 'hartree' is Hartree energy, in eV
94!!     'LIGHTSPEED' is inverse alpha (fine-structure constant)
95!!
96!! These variables are defined in the following files:
97!!     Common/nrtype.f90
98!!     Common/svninfo.f90
99!!     Common/wfn_utils.cpp
100!!     MeanField/EPM/ff2vq.py
101!!     MeanField/EPM/sysParams.f90
102!!     MeanField/EPM/vca.py
103!!     MeanField/ICM/icm.cpp
104!!     Visual/common.py
105!!
106  real(DP), parameter :: BOHR = 0.52917721092_dp
107  real(DP), parameter :: RYD = 13.60569253_dp
108  real(DP), parameter :: LIGHTSPEED = 137.035999074_dp
109
110!> mathematical constants
111!!  real(SP), parameter :: PI_S = 3.1415926535897932384626433832795_sp
112  real(DP), parameter :: PI_D = 3.1415926535897932384626433832795_dp
113  real(DP), parameter :: TOL_Small = 1.0d-6
114  real(DP), parameter :: TOL_Zero = 1.0d-12
115  real(DP), parameter :: TOL_Degeneracy = 1.0d-6
116  real(DP), parameter :: INF = 1.0d12
117
118!> Do direct diagonalization for BSE
119  integer, parameter :: BSE_ALGO_DIAG = 1
120!> Solve BSE with Lanczos alg. by M. Shao and C. Yang.
121  integer, parameter :: BSE_ALGO_LANCZOS = 2
122!> Solve BSE with Haydock scheme. Only works with TDA.
123  integer, parameter :: BSE_ALGO_HAYDOCK = 3
124
125end module nrtype_m
126
127#undef AUTO_VER
128