Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Calculate ntrinsic atomic orbitals and analyze wavefunctions
10 : !> \par History
11 : !> 03.2023 created [JGH]
12 : !> \author JGH
13 : ! **************************************************************************************************
14 : MODULE iao_types
15 : USE cell_types, ONLY: cell_type
16 : USE input_constants, ONLY: do_iaoloc_enone,&
17 : do_iaoloc_pm2
18 : USE input_section_types, ONLY: section_vals_get,&
19 : section_vals_get_subs_vals,&
20 : section_vals_type,&
21 : section_vals_val_get
22 : USE kinds, ONLY: dp
23 : #include "./base/base_uses.f90"
24 :
25 : IMPLICIT NONE
26 : PRIVATE
27 :
28 : PUBLIC :: iao_env_type, iao_read_input, iao_set_default
29 :
30 : ! **************************************************************************************************
31 : TYPE iao_env_type
32 : LOGICAL :: do_iao = .FALSE.
33 : !
34 : REAL(KIND=dp) :: eps_svd = 0.0_dp
35 : REAL(KIND=dp) :: eps_occ = 0.0_dp
36 : ! chages
37 : LOGICAL :: do_charges = .FALSE.
38 : ! one-center expansion
39 : LOGICAL :: do_oce = .FALSE.
40 : INTEGER :: lmax_oce = 0
41 : INTEGER :: nbas_oce = 0
42 : LOGICAL :: append_oce = .FALSE.
43 : ! Bond orbitals
44 : LOGICAL :: do_bondorbitals = .FALSE.
45 : ! Wannier centers
46 : LOGICAL :: do_center = .FALSE.
47 : LOGICAL :: pos_periodic = .FALSE.
48 : INTEGER :: loc_operator = 0
49 : INTEGER :: eloc_function = 0
50 : REAL(KIND=dp) :: eloc_weight = 0.0_dp
51 : ! Molden
52 : LOGICAL :: molden_iao = .FALSE.
53 : LOGICAL :: molden_ibo = .FALSE.
54 : ! CUBE files
55 : LOGICAL :: cubes_iao = .FALSE.
56 : LOGICAL :: cubes_ibo = .FALSE.
57 : ! Input sections
58 : TYPE(section_vals_type), POINTER :: iao_cubes_section => NULL(), &
59 : iao_molden_section => NULL(), &
60 : ibo_cubes_section => NULL(), &
61 : ibo_molden_section => NULL(), &
62 : ibo_cc_section => NULL()
63 : END TYPE iao_env_type
64 :
65 : ! **************************************************************************************************
66 :
67 : CONTAINS
68 :
69 : ! **************************************************************************************************
70 : !> \brief ...
71 : !> \param iao_env ...
72 : ! **************************************************************************************************
73 62 : SUBROUTINE iao_set_default(iao_env)
74 : TYPE(iao_env_type), INTENT(INOUT) :: iao_env
75 :
76 : !iao
77 62 : iao_env%do_iao = .FALSE.
78 62 : iao_env%eps_svd = 0.0_dp
79 62 : iao_env%eps_occ = 0.0_dp
80 : ! charges
81 62 : iao_env%do_charges = .FALSE.
82 : ! one-center expansion
83 62 : iao_env%do_oce = .FALSE.
84 62 : iao_env%lmax_oce = 3
85 62 : iao_env%nbas_oce = 10
86 62 : iao_env%append_oce = .FALSE.
87 : ! Bond orbitals
88 62 : iao_env%do_bondorbitals = .FALSE.
89 : ! Wannier centers
90 62 : iao_env%do_center = .FALSE.
91 62 : iao_env%pos_periodic = .FALSE.
92 62 : iao_env%loc_operator = do_iaoloc_pm2
93 62 : iao_env%eloc_function = do_iaoloc_enone
94 62 : iao_env%eloc_weight = 0.0_dp
95 : ! i/o
96 62 : iao_env%molden_iao = .FALSE.
97 62 : iao_env%molden_ibo = .FALSE.
98 62 : iao_env%cubes_iao = .FALSE.
99 62 : iao_env%cubes_ibo = .FALSE.
100 : ! Input sections
101 62 : NULLIFY (iao_env%iao_cubes_section, iao_env%iao_molden_section)
102 62 : NULLIFY (iao_env%ibo_cubes_section, iao_env%ibo_molden_section)
103 62 : NULLIFY (iao_env%ibo_cc_section)
104 :
105 62 : END SUBROUTINE iao_set_default
106 :
107 : ! **************************************************************************************************
108 :
109 : ! **************************************************************************************************
110 : !> \brief ...
111 : !> \param iao_env ...
112 : !> \param iao_section ...
113 : !> \param cell ...
114 : ! **************************************************************************************************
115 64 : SUBROUTINE iao_read_input(iao_env, iao_section, cell)
116 : TYPE(iao_env_type), INTENT(INOUT) :: iao_env
117 : TYPE(section_vals_type), POINTER :: iao_section
118 : TYPE(cell_type), OPTIONAL :: cell
119 :
120 : LOGICAL :: explicit, iao_explicit
121 : TYPE(section_vals_type), POINTER :: subsection
122 :
123 32 : CALL iao_set_default(iao_env)
124 :
125 32 : CALL section_vals_get(iao_section, explicit=iao_explicit)
126 32 : IF (iao_explicit) THEN
127 4 : iao_env%do_iao = .TRUE.
128 : ! input options
129 4 : CALL section_vals_val_get(iao_section, "EPS_SVD", r_val=iao_env%eps_svd)
130 4 : CALL section_vals_val_get(iao_section, "EPS_OCC", r_val=iao_env%eps_occ)
131 4 : CALL section_vals_val_get(iao_section, "ATOMIC_CHARGES", l_val=iao_env%do_charges)
132 4 : iao_env%iao_molden_section => section_vals_get_subs_vals(iao_section, "IAO_MOLDEN")
133 4 : CALL section_vals_get(iao_env%iao_molden_section, explicit=iao_env%molden_iao)
134 4 : iao_env%iao_cubes_section => section_vals_get_subs_vals(iao_section, "IAO_CUBES")
135 4 : CALL section_vals_get(iao_env%iao_cubes_section, explicit=iao_env%cubes_iao)
136 4 : subsection => section_vals_get_subs_vals(iao_section, "ONE_CENTER_EXPANSION")
137 4 : CALL section_vals_get(subsection, explicit=iao_env%do_oce)
138 4 : IF (iao_env%do_oce) THEN
139 4 : subsection => section_vals_get_subs_vals(iao_section, "ONE_CENTER_EXPANSION")
140 4 : CALL section_vals_val_get(subsection, "LMAX", i_val=iao_env%lmax_oce)
141 4 : CALL section_vals_val_get(subsection, "NBAS", i_val=iao_env%nbas_oce)
142 4 : CALL section_vals_val_get(subsection, "APPEND", l_val=iao_env%append_oce)
143 : END IF
144 4 : subsection => section_vals_get_subs_vals(iao_section, "BOND_ORBITALS")
145 4 : CALL section_vals_get(subsection, explicit=iao_env%do_bondorbitals)
146 4 : IF (iao_env%do_bondorbitals) THEN
147 4 : subsection => section_vals_get_subs_vals(iao_section, "BOND_ORBITALS")
148 4 : CALL section_vals_val_get(subsection, "LOCALIZATION_OPERATOR", i_val=iao_env%loc_operator)
149 4 : CALL section_vals_val_get(subsection, "ENERGY_LOCALIZATION_FUNCTION", i_val=iao_env%eloc_function)
150 4 : CALL section_vals_val_get(subsection, "ENERGY_LOCALIZATION_WEIGHT", r_val=iao_env%eloc_weight)
151 4 : iao_env%ibo_molden_section => section_vals_get_subs_vals(subsection, "IBO_MOLDEN")
152 4 : CALL section_vals_get(iao_env%ibo_molden_section, explicit=iao_env%molden_ibo)
153 4 : iao_env%ibo_cubes_section => section_vals_get_subs_vals(subsection, "IBO_CUBES")
154 4 : CALL section_vals_get(iao_env%ibo_cubes_section, explicit=iao_env%cubes_ibo)
155 4 : iao_env%ibo_cc_section => section_vals_get_subs_vals(subsection, "CHARGE_CENTER")
156 4 : CALL section_vals_get(iao_env%ibo_cc_section, explicit=iao_env%do_center)
157 4 : IF (iao_env%do_center) THEN
158 : CALL section_vals_val_get(iao_env%ibo_cc_section, "POSITION_OPERATOR_BERRY", &
159 4 : l_val=iao_env%pos_periodic, explicit=explicit)
160 4 : IF (.NOT. explicit) THEN
161 : ! set default according to cell periodicity
162 0 : iao_env%pos_periodic = .TRUE.
163 0 : IF (PRESENT(cell)) THEN
164 0 : IF (ALL(cell%perd == 0)) iao_env%pos_periodic = .FALSE.
165 : END IF
166 : END IF
167 : END IF
168 : END IF
169 : END IF
170 :
171 32 : END SUBROUTINE iao_read_input
172 :
173 : ! **************************************************************************************************
174 :
175 0 : END MODULE iao_types
|