(git:d5c4d39)
Loading...
Searching...
No Matches
qs_loc_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief New version of the module for the localization of the molecular orbitals
10!> This should be able to use different definition of the spread functional
11!> It should also calculate the integrals analytically so that it can be
12!> used irrespective of the pw_env and the collocation of wfn on the grids
13!> It should also work with a selected set of states, instead than all of them,
14!> in this case one should check that the selected states have the same occupation number
15!> The spread functional can be only estimated, or also optimized by minimization
16!> and in principle also maximization should be available.
17!> This operations can be required irrespective of the printing requirements
18!> It would be highly desirable to do all this along a MD run every N steps,
19!> and have a trajectory of the centeroids of the localized wfn
20!> In addition these functions can be used for properties calculations
21!> like NMR and XAS. Therefore it is necessary that the rotated wfn are then copied
22!> in the mos fm matrix to be available for next use.
23!> \author MI (05-2005)
24! **************************************************************************************************
26
27 USE cell_types, ONLY: cell_release,&
33 USE cp_fm_types, ONLY: cp_fm_release,&
38 USE kinds, ONLY: default_string_length,&
39 dp
43#include "./base/base_uses.f90"
44
45 IMPLICIT NONE
46
47 PRIVATE
48
49! *** Global parameters ***
50
51 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_loc_types'
52
53! **************************************************************************************************
54!> \brief contains all the info needed by quickstep to calculate
55!> the spread of a selected set of orbitals and if required
56!> to minimize or maximize the spread by rotation of the orbitals
57!> \param para_env info for the distribution of the calculations
58!> \param mo_coeff full matrix containing only the selected subset of real orbitals
59!> \param complex_mo_coeff full matrix containing only the selected subset of complex orbitals
60!> \param local_molecules molecules distributed
61!> \param cell box that contains the system
62!> \param localized_wfn_control variables and parameter that define the spread
63!> functional and the optimization algorithm
64!> \param particle_set position, type, ao_indexes etc for each atom
65!> \param op_sm_set set of sparse matrices used to define the spread operator
66!> when the functional is defined by the use operator acting on the
67!> basis functions, e.g. the Berry phase definition
68!> The matrix element of the type <a|O|b> are computed in initialization
69!> of qs_loc_env
70!> \param op_fm_set set of full matrices used to define the spread operator
71!> when the functional has to be defined directly using the products of MOS
72!> as in the case of the Pipek-Mezek definition.
73!> \param weights for a spread defined as extension of the orbitral in the box, these
74!> factors renormalize with respect to the box size
75!> \note
76!> this type should replace the previous set up for the localization of the wfn
77!> \par History
78!> 04-05 created
79!> \author MI
80! **************************************************************************************************
82 LOGICAL :: do_localize = .false., first_time = .false.
83 LOGICAL :: molecular_states = .false.
84 LOGICAL :: wannier_states = .false.
85 CHARACTER(LEN=default_string_length) :: tag_mo = ""
86 TYPE(mp_para_env_type), POINTER :: para_env => null()
87 TYPE(cp_fm_type), DIMENSION(:), &
88 POINTER :: moloc_coeff => null()
89 TYPE(cp_fm_type), DIMENSION(:, :), &
90 POINTER :: op_fm_set => null()
91 TYPE(distribution_1d_type), POINTER :: local_molecules => null()
92 TYPE(cell_type), POINTER :: cell => null()
94 POINTER :: localized_wfn_control => null()
95 TYPE(particle_type), DIMENSION(:), &
96 POINTER :: particle_set => null()
97 TYPE(dbcsr_p_type), DIMENSION(:, :), &
98 POINTER :: op_sm_set => null()
99 REAL(kind=dp) :: start_time = -1.0_dp, target_time = -1.0_dp
100 REAL(kind=dp) :: weights(6) = -1.0_dp
101 INTEGER :: dim_op = -1
102 END TYPE qs_loc_env_type
103
104! **************************************************************************************************
105!> \brief A type that holds controlling information for the
106!> calculation of the spread of wfn and the optimization of
107!> the spread functional
108!> \param ref_count ...
109!> \param localization_method which algorithm is used for the optimization
110!> \param operator_type how the spread is defined
111!> \param nloc_states number of states on which the spread is computed
112!> \param set_of_states how to choose the states
113!> \param lu_bound_states lower and upper bounds of the set of states
114!> print_cubes:
115!> print_centers:
116!> print_spreads:
117!> \param loc_states list of states on which the spread is computed
118!> \param centers_set arrais containing centers and spreads of the selected wfn
119!> \param centers_file_name output file names
120!> \param spreads_file_name output file names
121! **************************************************************************************************
123 INTEGER :: ref_count = -1
124 INTEGER :: min_or_max = -1
125 INTEGER :: localization_method = -1
126 INTEGER :: operator_type = -1
127 INTEGER, DIMENSION(2) :: nloc_states = -1, nguess = -1
128 INTEGER :: set_of_states = -1
129 INTEGER, DIMENSION(2, 2) :: lu_bound_states = -1
130 INTEGER :: max_iter = -1
131 INTEGER :: out_each = -1
132 INTEGER :: nextra = -1
133 INTEGER :: coeff_po_guess = -1, coeff_po_guess_mo_space = -1
134 REAL(kind=dp) :: eps_localization = -1.0_dp
135 REAL(kind=dp) :: max_crazy_angle = -1.0_dp
136 REAL(kind=dp) :: crazy_scale = -1.0_dp
137 REAL(kind=dp) :: eps_occ = -1.0_dp
138 REAL(kind=dp), DIMENSION(2) :: lu_ene_bound = -1.0_dp
139 LOGICAL :: crazy_use_diag = .false.
140 LOGICAL :: print_cubes = .false., jacobi_fallback = .false., jacobi_refinement = .false.
141 LOGICAL :: print_centers = .false.
142 LOGICAL :: print_spreads = .false.
143 LOGICAL :: do_homo = .false.
144 LOGICAL :: do_mixed = .false., do_cg_po = .false.
145 LOGICAL :: loc_restart = .false.
146 LOGICAL :: use_history = .false.
147 INTEGER, POINTER, DIMENSION(:, :) :: loc_states => null()
148 TYPE(cp_2d_r_p_type), DIMENSION(2) :: centers_set = cp_2d_r_p_type()
150
151! *** Public ***
156
157CONTAINS
158
159! **************************************************************************************************
160!> \brief ...
161!> \param qs_loc_env ...
162!> \par History
163!> 04-05 created
164!> \author MI
165! **************************************************************************************************
166 SUBROUTINE qs_loc_env_create(qs_loc_env)
167
168 TYPE(qs_loc_env_type), INTENT(OUT) :: qs_loc_env
169
170 qs_loc_env%tag_mo = ""
171 NULLIFY (qs_loc_env%para_env)
172 NULLIFY (qs_loc_env%cell)
173 NULLIFY (qs_loc_env%op_sm_set)
174 NULLIFY (qs_loc_env%op_fm_set)
175 NULLIFY (qs_loc_env%local_molecules)
176 NULLIFY (qs_loc_env%moloc_coeff)
177 NULLIFY (qs_loc_env%particle_set)
178 NULLIFY (qs_loc_env%localized_wfn_control)
179 qs_loc_env%weights = 0.0_dp
180
181 END SUBROUTINE qs_loc_env_create
182
183!****f* qs_loc_types/qs_loc_env_release [1.0] *
184
185! **************************************************************************************************
186!> \brief ...
187!> \param qs_loc_env ...
188!> \par History
189!> 04-05 created
190!> \author MI
191! **************************************************************************************************
192 SUBROUTINE qs_loc_env_release(qs_loc_env)
193
194 TYPE(qs_loc_env_type), INTENT(INOUT) :: qs_loc_env
195
196 INTEGER :: i, ii, j
197
198 IF (ASSOCIATED(qs_loc_env%cell)) CALL cell_release(qs_loc_env%cell)
199 IF (ASSOCIATED(qs_loc_env%local_molecules)) &
200 CALL distribution_1d_release(qs_loc_env%local_molecules)
201 IF (ASSOCIATED(qs_loc_env%localized_wfn_control)) THEN
202 CALL localized_wfn_control_release(qs_loc_env%localized_wfn_control)
203 END IF
204 IF (ASSOCIATED(qs_loc_env%para_env)) CALL mp_para_env_release(qs_loc_env%para_env)
205 IF (ASSOCIATED(qs_loc_env%particle_set)) NULLIFY (qs_loc_env%particle_set)
206
207 IF (ASSOCIATED(qs_loc_env%moloc_coeff)) THEN
208 DO i = 1, SIZE(qs_loc_env%moloc_coeff, 1)
209 ii = lbound(qs_loc_env%moloc_coeff, 1) + i - 1
210 CALL cp_fm_release(qs_loc_env%moloc_coeff(ii))
211 END DO
212 DEALLOCATE (qs_loc_env%moloc_coeff)
213 END IF
214
215 CALL cp_fm_release(qs_loc_env%op_fm_set)
216
217 IF (ASSOCIATED(qs_loc_env%op_sm_set)) THEN
218 DO i = 1, SIZE(qs_loc_env%op_sm_set, 2)
219 DO j = 1, SIZE(qs_loc_env%op_sm_set, 1)
220 CALL dbcsr_deallocate_matrix(qs_loc_env%op_sm_set(j, i)%matrix)
221 END DO
222 END DO
223 DEALLOCATE (qs_loc_env%op_sm_set)
224 END IF
225
226 END SUBROUTINE qs_loc_env_release
227
228! **************************************************************************************************
229!> \brief create the localized_wfn_control_type
230!> \param localized_wfn_control ...
231!> \par History
232!> 04.2005 created [MI]
233! **************************************************************************************************
234 SUBROUTINE localized_wfn_control_create(localized_wfn_control)
235 TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
236
237 cpassert(.NOT. ASSOCIATED(localized_wfn_control))
238 ALLOCATE (localized_wfn_control)
239
240 localized_wfn_control%ref_count = 1
241 localized_wfn_control%nloc_states = 0
242 localized_wfn_control%nextra = 0
243 localized_wfn_control%nguess = 0
244 localized_wfn_control%lu_bound_states = 0
245 localized_wfn_control%lu_ene_bound = 0.0_dp
246 localized_wfn_control%print_cubes = .false.
247 localized_wfn_control%print_centers = .false.
248 localized_wfn_control%print_spreads = .false.
249 localized_wfn_control%do_homo = .true.
250 localized_wfn_control%use_history = .false.
251 NULLIFY (localized_wfn_control%loc_states)
252 NULLIFY (localized_wfn_control%centers_set(1)%array)
253 NULLIFY (localized_wfn_control%centers_set(2)%array)
254 END SUBROUTINE localized_wfn_control_create
255
256! **************************************************************************************************
257!> \brief release the localized_wfn_control_type
258!> \param localized_wfn_control ...
259!> \par History
260!> 04.2005 created [MI]
261! **************************************************************************************************
262 SUBROUTINE localized_wfn_control_release(localized_wfn_control)
263
264 TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
265
266 IF (ASSOCIATED(localized_wfn_control)) THEN
267 cpassert(localized_wfn_control%ref_count > 0)
268 localized_wfn_control%ref_count = localized_wfn_control%ref_count - 1
269 IF (localized_wfn_control%ref_count == 0) THEN
270 IF (ASSOCIATED(localized_wfn_control%loc_states)) THEN
271 DEALLOCATE (localized_wfn_control%loc_states)
272 END IF
273 IF (ASSOCIATED(localized_wfn_control%centers_set(1)%array)) THEN
274 DEALLOCATE (localized_wfn_control%centers_set(1)%array)
275 END IF
276 IF (ASSOCIATED(localized_wfn_control%centers_set(2)%array)) THEN
277 DEALLOCATE (localized_wfn_control%centers_set(2)%array)
278 END IF
279 localized_wfn_control%ref_count = 0
280 DEALLOCATE (localized_wfn_control)
281 END IF
282 END IF
283 END SUBROUTINE localized_wfn_control_release
284
285! **************************************************************************************************
286!> \brief retain the localized_wfn_control_type
287!> \param localized_wfn_control ...
288!> \par History
289!> 04.2005 created [MI]
290! **************************************************************************************************
291 SUBROUTINE localized_wfn_control_retain(localized_wfn_control)
292 TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
293
294 cpassert(ASSOCIATED(localized_wfn_control))
295
296 localized_wfn_control%ref_count = localized_wfn_control%ref_count + 1
297 END SUBROUTINE localized_wfn_control_retain
298
299! **************************************************************************************************
300!> \brief ...
301!> \param qs_loc_env ...
302!> \param cell ...
303!> \param local_molecules ...
304!> \param localized_wfn_control ...
305!> \param moloc_coeff ...
306!> \param op_sm_set ...
307!> \param op_fm_set ...
308!> \param para_env ...
309!> \param particle_set ...
310!> \param weights ...
311!> \param dim_op ...
312!> \par History
313!> 04-05 created
314!> \author MI
315! **************************************************************************************************
316 SUBROUTINE get_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, &
317 moloc_coeff, op_sm_set, op_fm_set, para_env, &
318 particle_set, weights, dim_op)
319
320 TYPE(qs_loc_env_type), INTENT(IN) :: qs_loc_env
321 TYPE(cell_type), OPTIONAL, POINTER :: cell
322 TYPE(distribution_1d_type), OPTIONAL, POINTER :: local_molecules
323 TYPE(localized_wfn_control_type), OPTIONAL, &
324 POINTER :: localized_wfn_control
325 TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER :: moloc_coeff
326 TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
327 POINTER :: op_sm_set
328 TYPE(cp_fm_type), DIMENSION(:, :), OPTIONAL, &
329 POINTER :: op_fm_set
330 TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
331 TYPE(particle_type), DIMENSION(:), OPTIONAL, &
332 POINTER :: particle_set
333 REAL(dp), DIMENSION(6), OPTIONAL :: weights
334 INTEGER, OPTIONAL :: dim_op
335
336 IF (PRESENT(cell)) cell => qs_loc_env%cell
337 IF (PRESENT(moloc_coeff)) moloc_coeff => qs_loc_env%moloc_coeff
338 IF (PRESENT(local_molecules)) local_molecules => qs_loc_env%local_molecules
339 IF (PRESENT(localized_wfn_control)) &
340 localized_wfn_control => qs_loc_env%localized_wfn_control
341 IF (PRESENT(op_sm_set)) op_sm_set => qs_loc_env%op_sm_set
342 IF (PRESENT(op_fm_set)) op_fm_set => qs_loc_env%op_fm_set
343 IF (PRESENT(para_env)) para_env => qs_loc_env%para_env
344 IF (PRESENT(particle_set)) particle_set => qs_loc_env%particle_set
345 IF (PRESENT(weights)) weights(1:6) = qs_loc_env%weights(1:6)
346 IF (PRESENT(dim_op)) dim_op = qs_loc_env%dim_op
347
348 END SUBROUTINE get_qs_loc_env
349
350! **************************************************************************************************
351!> \brief ...
352!> \param qs_loc_env ...
353!> \param cell ...
354!> \param local_molecules ...
355!> \param localized_wfn_control ...
356!> \param moloc_coeff ...
357!> \param op_sm_set ...
358!> \param op_fm_set ...
359!> \param para_env ...
360!> \param particle_set ...
361!> \param weights ...
362!> \param dim_op ...
363!> \par History
364!> 04-05 created
365!> \author MI
366! **************************************************************************************************
367 SUBROUTINE set_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, &
368 moloc_coeff, op_sm_set, op_fm_set, para_env, &
369 particle_set, weights, dim_op)
370
371 TYPE(qs_loc_env_type), INTENT(INOUT) :: qs_loc_env
372 TYPE(cell_type), OPTIONAL, POINTER :: cell
373 TYPE(distribution_1d_type), OPTIONAL, POINTER :: local_molecules
374 TYPE(localized_wfn_control_type), OPTIONAL, &
375 POINTER :: localized_wfn_control
376 TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER :: moloc_coeff
377 TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
378 POINTER :: op_sm_set
379 TYPE(cp_fm_type), DIMENSION(:, :), OPTIONAL, &
380 POINTER :: op_fm_set
381 TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
382 TYPE(particle_type), DIMENSION(:), OPTIONAL, &
383 POINTER :: particle_set
384 REAL(dp), DIMENSION(6), OPTIONAL :: weights
385 INTEGER, OPTIONAL :: dim_op
386
387 IF (PRESENT(cell)) THEN
388 CALL cell_retain(cell)
389 CALL cell_release(qs_loc_env%cell)
390 qs_loc_env%cell => cell
391 END IF
392
393 IF (PRESENT(local_molecules)) THEN
394 CALL distribution_1d_retain(local_molecules)
395 IF (ASSOCIATED(qs_loc_env%local_molecules)) &
396 CALL distribution_1d_release(qs_loc_env%local_molecules)
397 qs_loc_env%local_molecules => local_molecules
398 END IF
399
400 IF (PRESENT(localized_wfn_control)) THEN
401 CALL localized_wfn_control_retain(localized_wfn_control)
402 CALL localized_wfn_control_release(qs_loc_env%localized_wfn_control)
403 qs_loc_env%localized_wfn_control => localized_wfn_control
404 END IF
405 IF (PRESENT(para_env)) THEN
406 CALL para_env%retain()
407 CALL mp_para_env_release(qs_loc_env%para_env)
408 qs_loc_env%para_env => para_env
409 END IF
410 IF (PRESENT(particle_set)) qs_loc_env%particle_set => particle_set
411 IF (PRESENT(moloc_coeff)) THEN
412 CALL cp_fm_release(qs_loc_env%moloc_coeff)
413 qs_loc_env%moloc_coeff => moloc_coeff
414 END IF
415 IF (PRESENT(op_sm_set)) THEN
416 qs_loc_env%op_sm_set => op_sm_set
417 END IF
418 IF (PRESENT(op_fm_set)) THEN
419 qs_loc_env%op_fm_set => op_fm_set
420 END IF
421 IF (PRESENT(weights)) THEN
422 qs_loc_env%weights = weights
423 END IF
424 IF (PRESENT(dim_op)) THEN
425 qs_loc_env%dim_op = dim_op
426 END IF
427
428 END SUBROUTINE set_qs_loc_env
429
430END MODULE qs_loc_types
431
Handles all functions related to the CELL.
Definition cell_types.F:15
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
Definition cell_types.F:608
subroutine, public cell_retain(cell)
retains the given cell (see doc/ReferenceCounting.html)
Definition cell_types.F:591
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
subroutine, public distribution_1d_retain(distribution_1d)
retains a distribution_1d
subroutine, public distribution_1d_release(distribution_1d)
releases the given distribution_1d
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Routines for the calculation of molecular states.
Define the data structure for the particle information.
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public localized_wfn_control_create(localized_wfn_control)
create the localized_wfn_control_type
subroutine, public qs_loc_env_release(qs_loc_env)
...
subroutine, public localized_wfn_control_release(localized_wfn_control)
release the localized_wfn_control_type
subroutine, public get_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, moloc_coeff, op_sm_set, op_fm_set, para_env, particle_set, weights, dim_op)
...
subroutine, public set_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, moloc_coeff, op_sm_set, op_fm_set, para_env, particle_set, weights, dim_op)
...
subroutine, public qs_loc_env_create(qs_loc_env)
...
Routines for the calculation of wannier states.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a pointer to a 2d array
represent a full matrix
structure to store local (to a processor) ordered lists of integers.
stores all the informations relevant to an mpi environment
A type that holds controlling information for the calculation of the spread of wfn and the optimizati...
contains all the info needed by quickstep to calculate the spread of a selected set of orbitals and i...