(git:0de0cc2)
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,&
28  cell_retain,&
29  cell_type
30  USE cp_array_utils, ONLY: cp_2d_r_p_type
31  USE cp_fm_types, ONLY: cp_fm_release,&
32  cp_fm_type
33  USE dbcsr_api, ONLY: dbcsr_deallocate_matrix,&
34  dbcsr_p_type
37  distribution_1d_type
38  USE kinds, ONLY: default_string_length,&
39  dp
41  mp_para_env_type
42  USE particle_types, ONLY: particle_type
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 ! **************************************************************************************************
80  TYPE qs_loc_env_type
81  LOGICAL :: do_localize, first_time
82  LOGICAL :: molecular_states
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()
92  TYPE(localized_wfn_control_type), &
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 ! **************************************************************************************************
121  TYPE localized_wfn_control_type
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
148  END TYPE localized_wfn_control_type
149 
150 ! *** Public ***
154  PUBLIC :: qs_loc_env_type, localized_wfn_control_type
155 
156 CONTAINS
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 
427 END 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)
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...
Definition: qs_loc_types.F:25
subroutine, public localized_wfn_control_create(localized_wfn_control)
create the localized_wfn_control_type
Definition: qs_loc_types.F:234
subroutine, public qs_loc_env_release(qs_loc_env)
...
Definition: qs_loc_types.F:192
subroutine, public localized_wfn_control_release(localized_wfn_control)
release the localized_wfn_control_type
Definition: qs_loc_types.F:262
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)
...
Definition: qs_loc_types.F:317
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)
...
Definition: qs_loc_types.F:367
subroutine, public qs_loc_env_create(qs_loc_env)
...
Definition: qs_loc_types.F:166