(git:374b731)
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-2024 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,&
31 USE cp_fm_types, ONLY: cp_fm_release,&
33 USE dbcsr_api, ONLY: dbcsr_deallocate_matrix,&
34 dbcsr_p_type
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 orbitals
59!> \param local_molecules molecules distributed
60!> \param cell box that contains the system
61!> \param localized_wfn_control variables and parameter that define the spread
62!> functional and the optimization algorithm
63!> \param particle_set position, type, ao_indexes etc for each atom
64!> \param op_sm_set set of sparse matrices used to define the spread operator
65!> when the functional is defined by the use operator acting on the
66!> basis functions, e.g. the Berry phase definition
67!> The matrix element of the type <a|O|b> are computed in initialization
68!> of qs_loc_env
69!> \param op_fm_set set of full matrices used to define the spread operator
70!> when the functional has to be defined directly using the products of MOS
71!> as in the case of the Pipek-Mezek definition.
72!> \param weights for a spread defined as extension of the orbitral in the box, these
73!> factors renormalize with respect to the box size
74!> \note
75!> this type should replace the previous set up for the localization of the wfn
76!> \par History
77!> 04-05 created
78!> \author MI
79! **************************************************************************************************
81 LOGICAL :: do_localize, first_time
83 LOGICAL :: wannier_states
84 CHARACTER(LEN=default_string_length) :: tag_mo
85 TYPE(mp_para_env_type), POINTER :: para_env => null()
86 TYPE(cp_fm_type), DIMENSION(:), &
87 POINTER :: moloc_coeff => null()
88 TYPE(cp_fm_type), DIMENSION(:, :), &
89 POINTER :: op_fm_set => null()
90 TYPE(distribution_1d_type), POINTER :: local_molecules => null()
91 TYPE(cell_type), POINTER :: cell => null()
93 POINTER :: localized_wfn_control => null()
94 TYPE(particle_type), DIMENSION(:), &
95 POINTER :: particle_set => null()
96 TYPE(dbcsr_p_type), DIMENSION(:, :), &
97 POINTER :: op_sm_set => null()
98 REAL(kind=dp) :: start_time, target_time
99 REAL(kind=dp) :: weights(6)
100 INTEGER :: dim_op
101 END TYPE qs_loc_env_type
102
103! **************************************************************************************************
104!> \brief A type that holds controlling information for the
105!> calculation of the spread of wfn and the optimization of
106!> the spread functional
107!> \param ref_count ...
108!> \param localization_method which algorithm is used for the optimization
109!> \param operator_type how the spread is defined
110!> \param nloc_states number of states on which the spread is computed
111!> \param set_of_states how to choose the states
112!> \param lu_bound_states lower and upper bounds of the set of states
113!> print_cubes:
114!> print_centers:
115!> print_spreads:
116!> \param loc_states list of states on which the spread is computed
117!> \param centers_set arrais containing centers and spreads of the selected wfn
118!> \param centers_file_name output file names
119!> \param spreads_file_name output file names
120! **************************************************************************************************
122 INTEGER :: ref_count
123 INTEGER :: min_or_max
124 INTEGER :: localization_method
125 INTEGER :: operator_type
126 INTEGER, DIMENSION(2) :: nloc_states, nguess
127 INTEGER :: set_of_states
128 INTEGER, DIMENSION(2, 2) :: lu_bound_states
129 INTEGER :: max_iter
130 INTEGER :: out_each
131 INTEGER :: nextra
132 INTEGER :: coeff_po_guess, coeff_po_guess_mo_space
133 REAL(kind=dp) :: eps_localization
134 REAL(kind=dp) :: max_crazy_angle
135 REAL(kind=dp) :: crazy_scale
136 REAL(kind=dp) :: eps_occ
137 REAL(kind=dp), DIMENSION(2) :: lu_ene_bound
138 LOGICAL :: crazy_use_diag
139 LOGICAL :: print_cubes, jacobi_fallback, jacobi_refinement
140 LOGICAL :: print_centers
141 LOGICAL :: print_spreads
142 LOGICAL :: do_homo
143 LOGICAL :: do_mixed, do_cg_po
144 LOGICAL :: loc_restart
145 LOGICAL :: use_history
146 INTEGER, POINTER, DIMENSION(:, :) :: loc_states => null()
147 TYPE(cp_2d_r_p_type), DIMENSION(2) :: centers_set
149
150! *** Public ***
155
156CONTAINS
157
158! **************************************************************************************************
159!> \brief ...
160!> \param qs_loc_env ...
161!> \par History
162!> 04-05 created
163!> \author MI
164! **************************************************************************************************
165 SUBROUTINE qs_loc_env_create(qs_loc_env)
166
167 TYPE(qs_loc_env_type), INTENT(OUT) :: qs_loc_env
168
169 qs_loc_env%tag_mo = ""
170 NULLIFY (qs_loc_env%para_env)
171 NULLIFY (qs_loc_env%cell)
172 NULLIFY (qs_loc_env%op_sm_set)
173 NULLIFY (qs_loc_env%op_fm_set)
174 NULLIFY (qs_loc_env%local_molecules)
175 NULLIFY (qs_loc_env%moloc_coeff)
176 NULLIFY (qs_loc_env%particle_set)
177 NULLIFY (qs_loc_env%localized_wfn_control)
178 qs_loc_env%weights = 0.0_dp
179
180 END SUBROUTINE qs_loc_env_create
181
182!****f* qs_loc_types/qs_loc_env_release [1.0] *
183
184! **************************************************************************************************
185!> \brief ...
186!> \param qs_loc_env ...
187!> \par History
188!> 04-05 created
189!> \author MI
190! **************************************************************************************************
191 SUBROUTINE qs_loc_env_release(qs_loc_env)
192
193 TYPE(qs_loc_env_type), INTENT(INOUT) :: qs_loc_env
194
195 INTEGER :: i, ii, j
196
197 IF (ASSOCIATED(qs_loc_env%cell)) CALL cell_release(qs_loc_env%cell)
198 IF (ASSOCIATED(qs_loc_env%local_molecules)) &
199 CALL distribution_1d_release(qs_loc_env%local_molecules)
200 IF (ASSOCIATED(qs_loc_env%localized_wfn_control)) THEN
201 CALL localized_wfn_control_release(qs_loc_env%localized_wfn_control)
202 END IF
203 IF (ASSOCIATED(qs_loc_env%para_env)) CALL mp_para_env_release(qs_loc_env%para_env)
204 IF (ASSOCIATED(qs_loc_env%particle_set)) NULLIFY (qs_loc_env%particle_set)
205
206 IF (ASSOCIATED(qs_loc_env%moloc_coeff)) THEN
207 DO i = 1, SIZE(qs_loc_env%moloc_coeff, 1)
208 ii = lbound(qs_loc_env%moloc_coeff, 1) + i - 1
209 CALL cp_fm_release(qs_loc_env%moloc_coeff(ii))
210 END DO
211 DEALLOCATE (qs_loc_env%moloc_coeff)
212 END IF
213
214 CALL cp_fm_release(qs_loc_env%op_fm_set)
215
216 IF (ASSOCIATED(qs_loc_env%op_sm_set)) THEN
217 DO i = 1, SIZE(qs_loc_env%op_sm_set, 2)
218 DO j = 1, SIZE(qs_loc_env%op_sm_set, 1)
219 CALL dbcsr_deallocate_matrix(qs_loc_env%op_sm_set(j, i)%matrix)
220 END DO
221 END DO
222 DEALLOCATE (qs_loc_env%op_sm_set)
223 END IF
224
225 END SUBROUTINE qs_loc_env_release
226
227! **************************************************************************************************
228!> \brief create the localized_wfn_control_type
229!> \param localized_wfn_control ...
230!> \par History
231!> 04.2005 created [MI]
232! **************************************************************************************************
233 SUBROUTINE localized_wfn_control_create(localized_wfn_control)
234 TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
235
236 cpassert(.NOT. ASSOCIATED(localized_wfn_control))
237 ALLOCATE (localized_wfn_control)
238
239 localized_wfn_control%ref_count = 1
240 localized_wfn_control%nloc_states = 0
241 localized_wfn_control%nextra = 0
242 localized_wfn_control%nguess = 0
243 localized_wfn_control%lu_bound_states = 0
244 localized_wfn_control%lu_ene_bound = 0.0_dp
245 localized_wfn_control%print_cubes = .false.
246 localized_wfn_control%print_centers = .false.
247 localized_wfn_control%print_spreads = .false.
248 localized_wfn_control%do_homo = .true.
249 localized_wfn_control%use_history = .false.
250 NULLIFY (localized_wfn_control%loc_states)
251 NULLIFY (localized_wfn_control%centers_set(1)%array)
252 NULLIFY (localized_wfn_control%centers_set(2)%array)
253 END SUBROUTINE localized_wfn_control_create
254
255! **************************************************************************************************
256!> \brief release the localized_wfn_control_type
257!> \param localized_wfn_control ...
258!> \par History
259!> 04.2005 created [MI]
260! **************************************************************************************************
261 SUBROUTINE localized_wfn_control_release(localized_wfn_control)
262
263 TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
264
265 IF (ASSOCIATED(localized_wfn_control)) THEN
266 cpassert(localized_wfn_control%ref_count > 0)
267 localized_wfn_control%ref_count = localized_wfn_control%ref_count - 1
268 IF (localized_wfn_control%ref_count == 0) THEN
269 IF (ASSOCIATED(localized_wfn_control%loc_states)) THEN
270 DEALLOCATE (localized_wfn_control%loc_states)
271 END IF
272 IF (ASSOCIATED(localized_wfn_control%centers_set(1)%array)) THEN
273 DEALLOCATE (localized_wfn_control%centers_set(1)%array)
274 END IF
275 IF (ASSOCIATED(localized_wfn_control%centers_set(2)%array)) THEN
276 DEALLOCATE (localized_wfn_control%centers_set(2)%array)
277 END IF
278 localized_wfn_control%ref_count = 0
279 DEALLOCATE (localized_wfn_control)
280 END IF
281 END IF
282 END SUBROUTINE localized_wfn_control_release
283
284! **************************************************************************************************
285!> \brief retain the localized_wfn_control_type
286!> \param localized_wfn_control ...
287!> \par History
288!> 04.2005 created [MI]
289! **************************************************************************************************
290 SUBROUTINE localized_wfn_control_retain(localized_wfn_control)
291 TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
292
293 cpassert(ASSOCIATED(localized_wfn_control))
294
295 localized_wfn_control%ref_count = localized_wfn_control%ref_count + 1
296 END SUBROUTINE localized_wfn_control_retain
297
298! **************************************************************************************************
299!> \brief ...
300!> \param qs_loc_env ...
301!> \param cell ...
302!> \param local_molecules ...
303!> \param localized_wfn_control ...
304!> \param moloc_coeff ...
305!> \param op_sm_set ...
306!> \param op_fm_set ...
307!> \param para_env ...
308!> \param particle_set ...
309!> \param weights ...
310!> \param dim_op ...
311!> \par History
312!> 04-05 created
313!> \author MI
314! **************************************************************************************************
315 SUBROUTINE get_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, &
316 moloc_coeff, op_sm_set, op_fm_set, para_env, particle_set, weights, dim_op)
317
318 TYPE(qs_loc_env_type), INTENT(IN) :: qs_loc_env
319 TYPE(cell_type), OPTIONAL, POINTER :: cell
320 TYPE(distribution_1d_type), OPTIONAL, POINTER :: local_molecules
321 TYPE(localized_wfn_control_type), OPTIONAL, &
322 POINTER :: localized_wfn_control
323 TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER :: moloc_coeff
324 TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
325 POINTER :: op_sm_set
326 TYPE(cp_fm_type), DIMENSION(:, :), OPTIONAL, &
327 POINTER :: op_fm_set
328 TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
329 TYPE(particle_type), DIMENSION(:), OPTIONAL, &
330 POINTER :: particle_set
331 REAL(dp), DIMENSION(6), OPTIONAL :: weights
332 INTEGER, OPTIONAL :: dim_op
333
334 IF (PRESENT(cell)) cell => qs_loc_env%cell
335 IF (PRESENT(moloc_coeff)) moloc_coeff => qs_loc_env%moloc_coeff
336 IF (PRESENT(local_molecules)) local_molecules => qs_loc_env%local_molecules
337 IF (PRESENT(localized_wfn_control)) &
338 localized_wfn_control => qs_loc_env%localized_wfn_control
339 IF (PRESENT(op_sm_set)) op_sm_set => qs_loc_env%op_sm_set
340 IF (PRESENT(op_fm_set)) op_fm_set => qs_loc_env%op_fm_set
341 IF (PRESENT(para_env)) para_env => qs_loc_env%para_env
342 IF (PRESENT(particle_set)) particle_set => qs_loc_env%particle_set
343 IF (PRESENT(weights)) weights(1:6) = qs_loc_env%weights(1:6)
344 IF (PRESENT(dim_op)) dim_op = qs_loc_env%dim_op
345
346 END SUBROUTINE get_qs_loc_env
347
348! **************************************************************************************************
349!> \brief ...
350!> \param qs_loc_env ...
351!> \param cell ...
352!> \param local_molecules ...
353!> \param localized_wfn_control ...
354!> \param moloc_coeff ...
355!> \param op_sm_set ...
356!> \param op_fm_set ...
357!> \param para_env ...
358!> \param particle_set ...
359!> \param weights ...
360!> \param dim_op ...
361!> \par History
362!> 04-05 created
363!> \author MI
364! **************************************************************************************************
365 SUBROUTINE set_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, &
366 moloc_coeff, op_sm_set, op_fm_set, para_env, particle_set, weights, dim_op)
367
368 TYPE(qs_loc_env_type), INTENT(INOUT) :: qs_loc_env
369 TYPE(cell_type), OPTIONAL, POINTER :: cell
370 TYPE(distribution_1d_type), OPTIONAL, POINTER :: local_molecules
371 TYPE(localized_wfn_control_type), OPTIONAL, &
372 POINTER :: localized_wfn_control
373 TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER :: moloc_coeff
374 TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
375 POINTER :: op_sm_set
376 TYPE(cp_fm_type), DIMENSION(:, :), OPTIONAL, &
377 POINTER :: op_fm_set
378 TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
379 TYPE(particle_type), DIMENSION(:), OPTIONAL, &
380 POINTER :: particle_set
381 REAL(dp), DIMENSION(6), OPTIONAL :: weights
382 INTEGER, OPTIONAL :: dim_op
383
384 IF (PRESENT(cell)) THEN
385 CALL cell_retain(cell)
386 CALL cell_release(qs_loc_env%cell)
387 qs_loc_env%cell => cell
388 END IF
389
390 IF (PRESENT(local_molecules)) THEN
391 CALL distribution_1d_retain(local_molecules)
392 IF (ASSOCIATED(qs_loc_env%local_molecules)) &
393 CALL distribution_1d_release(qs_loc_env%local_molecules)
394 qs_loc_env%local_molecules => local_molecules
395 END IF
396
397 IF (PRESENT(localized_wfn_control)) THEN
398 CALL localized_wfn_control_retain(localized_wfn_control)
399 CALL localized_wfn_control_release(qs_loc_env%localized_wfn_control)
400 qs_loc_env%localized_wfn_control => localized_wfn_control
401 END IF
402 IF (PRESENT(para_env)) THEN
403 CALL para_env%retain()
404 CALL mp_para_env_release(qs_loc_env%para_env)
405 qs_loc_env%para_env => para_env
406 END IF
407 IF (PRESENT(particle_set)) qs_loc_env%particle_set => particle_set
408 IF (PRESENT(moloc_coeff)) THEN
409 CALL cp_fm_release(qs_loc_env%moloc_coeff)
410 qs_loc_env%moloc_coeff => moloc_coeff
411 END IF
412 IF (PRESENT(op_sm_set)) THEN
413 qs_loc_env%op_sm_set => op_sm_set
414 END IF
415 IF (PRESENT(op_fm_set)) THEN
416 qs_loc_env%op_fm_set => op_fm_set
417 END IF
418 IF (PRESENT(weights)) THEN
419 qs_loc_env%weights = weights
420 END IF
421 IF (PRESENT(dim_op)) THEN
422 qs_loc_env%dim_op = dim_op
423 END IF
424
425 END SUBROUTINE set_qs_loc_env
426
427END MODULE qs_loc_types
428
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:559
subroutine, public cell_retain(cell)
retains the given cell (see doc/ReferenceCounting.html)
Definition cell_types.F:542
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
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:55
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...