(git:f2099e5)
Loading...
Searching...
No Matches
qs_ot_scf.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 basic functionality for using ot in the scf routines.
10!> \par History
11!> 01.2003 : Joost VandeVondele : adapted for LSD
12!> \author Joost VandeVondele (25.08.2002)
13! **************************************************************************************************
16 USE cp_dbcsr_api, ONLY: &
18 dbcsr_set, dbcsr_type, dbcsr_type_no_symmetry
20 dbcsr_dot,&
26 USE cp_fm_types, ONLY: cp_fm_type
34 USE kinds, ONLY: dp
36 USE qs_mo_types, ONLY: get_mo_set,&
39 USE qs_ot, ONLY: qs_ot_get_orbitals,&
42 USE qs_ot_minimizer, ONLY: ot_mini
51#include "./base/base_uses.f90"
52
53 IMPLICIT NONE
54
55 PRIVATE
56
57 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_ot_scf'
58 ! *** Public subroutines ***
59
60 PUBLIC :: ot_scf_init
61 PUBLIC :: ot_scf_mini
62 PUBLIC :: ot_scf_destroy
63 PUBLIC :: ot_scf_read_input
64
65CONTAINS
66
67! **************************************************************************************************
68!> \brief ...
69!> \param qs_ot_env ...
70!> \param scf_section ...
71!> \param do_kpoints ...
72! **************************************************************************************************
73 SUBROUTINE ot_scf_read_input(qs_ot_env, scf_section, do_kpoints)
74 TYPE(qs_ot_type), DIMENSION(:), POINTER :: qs_ot_env
75 TYPE(section_vals_type), POINTER :: scf_section
76 LOGICAL, INTENT(IN) :: do_kpoints
77
78 CHARACTER(len=*), PARAMETER :: routinen = 'ot_scf_read_input'
79
80 INTEGER :: handle, ispin, nspin, output_unit
81 LOGICAL :: explicit
82 TYPE(cp_logger_type), POINTER :: logger
83 TYPE(section_vals_type), POINTER :: ot_section
84
85 CALL timeset(routinen, handle)
86
87 logger => cp_get_default_logger()
88 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
89 extension=".log")
90
91 ! decide default settings
92 CALL qs_ot_settings_init(qs_ot_env(1)%settings)
93
94 ! use ot input new style
95 ot_section => section_vals_get_subs_vals(scf_section, "OT")
96 CALL section_vals_get(ot_section, explicit=explicit)
97
98 CALL ot_readwrite_input(qs_ot_env(1)%settings, ot_section, output_unit, &
99 complex_kpoints=do_kpoints)
100
101 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
102 "PRINT%PROGRAM_RUN_INFO")
103
104 ! copy the ot settings type so it is identical
105 nspin = SIZE(qs_ot_env)
106 DO ispin = 2, nspin
107 qs_ot_env(ispin)%settings = qs_ot_env(1)%settings
108 END DO
109
110 CALL timestop(handle)
111
112 END SUBROUTINE ot_scf_read_input
113
114! **************************************************************************************************
115!> \brief performs the actual minimisation, needs only limited info
116!> updated for restricted calculations
117!> matrix_dedc is the derivative of the energy with respect to the orbitals (except for a factor 2*fi)
118!> a null pointer for matrix_s implies that matrix_s is the unit matrix
119!> \param mo_array ...
120!> \param matrix_dedc ...
121!> \param smear ...
122!> \param matrix_s ...
123!> \param energy ...
124!> \param energy_only ...
125!> \param delta ...
126!> \param qs_ot_env ...
127! **************************************************************************************************
128 SUBROUTINE ot_scf_mini(mo_array, matrix_dedc, smear, matrix_s, energy, &
129 energy_only, delta, qs_ot_env)
130
131 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mo_array
132 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_dedc
133 TYPE(smear_type), POINTER :: smear
134 TYPE(dbcsr_type), POINTER :: matrix_s
135 REAL(kind=dp) :: energy
136 LOGICAL, INTENT(INOUT) :: energy_only
137 REAL(kind=dp) :: delta
138 TYPE(qs_ot_type), DIMENSION(:), POINTER :: qs_ot_env
139
140 CHARACTER(len=*), PARAMETER :: routinen = 'ot_scf_mini'
141
142 INTEGER :: handle, ispin, k, n, nspin
143 REAL(kind=dp) :: ener_nondiag, trace
144 TYPE(cp_1d_r_p_type), ALLOCATABLE, DIMENSION(:) :: expectation_values, occupation_numbers, &
145 scaling_factor
146 TYPE(cp_logger_type), POINTER :: logger
147 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_dedc_physical, matrix_dedc_scaled
148 TYPE(dbcsr_type), POINTER :: mo_coeff
149
150 CALL timeset(routinen, handle)
151
152 NULLIFY (logger)
153 logger => cp_get_default_logger()
154
155 nspin = SIZE(mo_array)
156
157 ALLOCATE (occupation_numbers(nspin))
158 ALLOCATE (scaling_factor(nspin))
159
160 IF (qs_ot_env(1)%settings%do_ener) THEN
161 ALLOCATE (expectation_values(nspin))
162 END IF
163
164 DO ispin = 1, nspin
165 CALL get_mo_set(mo_set=mo_array(ispin), occupation_numbers=occupation_numbers(ispin)%array)
166 ALLOCATE (scaling_factor(ispin)%array(SIZE(occupation_numbers(ispin)%array)))
167 scaling_factor(ispin)%array = 2.0_dp*occupation_numbers(ispin)%array
168 IF (qs_ot_env(1)%settings%do_ener) THEN
169 ALLOCATE (expectation_values(ispin)%array(SIZE(occupation_numbers(ispin)%array)))
170 END IF
171 END DO
172
173 ! optimizing orbital energies somehow implies non-equivalent orbitals
174 IF (qs_ot_env(1)%settings%do_ener) THEN
175 cpassert(qs_ot_env(1)%settings%do_rotation)
176 END IF
177 ! add_nondiag_energy requires do_ener
178 IF (qs_ot_env(1)%settings%add_nondiag_energy) THEN
179 cpassert(qs_ot_env(1)%settings%do_ener)
180 END IF
181
182 ! get a rotational force
183 IF (.NOT. energy_only) THEN
184 IF (qs_ot_env(1)%settings%do_rotation) THEN
185 DO ispin = 1, SIZE(qs_ot_env)
186 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
187 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
188 CALL dbcsr_multiply('T', 'N', 1.0_dp, mo_coeff, matrix_dedc(ispin)%matrix, &
189 0.0_dp, qs_ot_env(ispin)%rot_mat_chc)
190 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_chc)
191
192 CALL dbcsr_scale_by_vector(qs_ot_env(ispin)%matrix_buf1, alpha=scaling_factor(ispin)%array, side='right')
193 ! create the derivative of the energy wrt to rot_mat_u
194 CALL dbcsr_multiply('N', 'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%matrix_buf1, &
195 0.0_dp, qs_ot_env(ispin)%rot_mat_dedu)
196 END DO
197
198 ! here we construct the derivative of the free energy with respect to the evals
199 ! (note that this requires the diagonal elements of chc)
200 ! the mo occupations should in principle remain unaltered
201 IF (qs_ot_env(1)%settings%do_ener) THEN
202 DO ispin = 1, SIZE(mo_array)
203 CALL dbcsr_get_diag(qs_ot_env(ispin)%rot_mat_chc, expectation_values(ispin)%array)
204 qs_ot_env(ispin)%ener_gx = expectation_values(ispin)%array
205 CALL set_mo_occupation(mo_set=mo_array(ispin), &
206 smear=smear, eval_deriv=qs_ot_env(ispin)%ener_gx)
207 END DO
208 END IF
209
210 ! chc only needs to be stored in u independent form if we require add_nondiag_energy,
211 ! which will use it in non-selfconsistent form for e.g. the linesearch
212 ! transform C^T H C -> U C^T H C U ^ T
213 IF (qs_ot_env(1)%settings%add_nondiag_energy) THEN
214 DO ispin = 1, SIZE(qs_ot_env)
215 CALL dbcsr_get_info(qs_ot_env(ispin)%rot_mat_u, nfullcols_total=k)
216 CALL dbcsr_multiply('N', 'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%rot_mat_chc, &
217 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
218 CALL dbcsr_multiply('N', 'T', 1.0_dp, qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_u, &
219 0.0_dp, qs_ot_env(ispin)%rot_mat_chc)
220 END DO
221 END IF
222 END IF
223 END IF
224
225 ! evaluate non-diagonal energy contribution
226 ener_nondiag = 0.0_dp
227 IF (qs_ot_env(1)%settings%add_nondiag_energy) THEN
228 DO ispin = 1, SIZE(qs_ot_env)
229 ! transform \tilde H to the current basis of C (assuming non-selfconsistent H)
230 CALL dbcsr_get_info(qs_ot_env(ispin)%rot_mat_u, nfullcols_total=k)
231 CALL dbcsr_multiply('T', 'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_u, qs_ot_env(ispin)%rot_mat_chc, &
232 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
233 CALL dbcsr_multiply('N', 'N', 1.0_dp, qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%rot_mat_u, &
234 0.0_dp, qs_ot_env(ispin)%matrix_buf2)
235
236 ! subtract the current ener_x from the diagonal
237 CALL dbcsr_get_diag(qs_ot_env(ispin)%matrix_buf2, expectation_values(ispin)%array)
238 expectation_values(ispin)%array = expectation_values(ispin)%array - qs_ot_env(ispin)%ener_x
239 CALL dbcsr_set_diag(qs_ot_env(ispin)%matrix_buf2, expectation_values(ispin)%array)
240
241 ! get nondiag energy trace (D^T D)
242 CALL dbcsr_dot(qs_ot_env(ispin)%matrix_buf2, qs_ot_env(ispin)%matrix_buf2, trace)
243 ener_nondiag = ener_nondiag + 0.5_dp*qs_ot_env(1)%settings%nondiag_energy_strength*trace
244
245 ! get gradient (again ignoring dependencies of H)
246 IF (.NOT. energy_only) THEN
247 ! first for the ener_x (-2*(diag(C^T H C)-ener_x))
248 qs_ot_env(ispin)%ener_gx = qs_ot_env(ispin)%ener_gx - &
249 qs_ot_env(1)%settings%nondiag_energy_strength*expectation_values(ispin)%array
250
251 ! next for the rot_mat_u derivative (2 * k * \tilde H U D)
252 CALL dbcsr_multiply('N', 'N', 1.0_dp, qs_ot_env(ispin)%rot_mat_chc, qs_ot_env(ispin)%rot_mat_u, &
253 0.0_dp, qs_ot_env(ispin)%matrix_buf1)
254 CALL dbcsr_multiply('N', 'N', 2.0_dp*qs_ot_env(1)%settings%nondiag_energy_strength, &
255 qs_ot_env(ispin)%matrix_buf1, qs_ot_env(ispin)%matrix_buf2, &
256 1.0_dp, qs_ot_env(ispin)%rot_mat_dedu)
257 END IF
258 END DO
259 END IF
260
261 ! this is kind of a hack so far (costly memory wise), we locally recreate the scaled matrix_hc, and
262 ! use it in the following, eventually, as occupations numbers get more integrated, it should become possible
263 ! to remove this.
264 ALLOCATE (matrix_dedc_scaled(SIZE(matrix_dedc)))
265 NULLIFY (matrix_dedc_physical)
266 IF (qs_ot_env(1)%settings%occupation_preconditioner) THEN
267 ALLOCATE (matrix_dedc_physical(SIZE(matrix_dedc)))
268 END IF
269 DO ispin = 1, SIZE(matrix_dedc)
270 ALLOCATE (matrix_dedc_scaled(ispin)%matrix)
271 CALL dbcsr_copy(matrix_dedc_scaled(ispin)%matrix, matrix_dedc(ispin)%matrix)
272
273 IF (qs_ot_env(1)%settings%occupation_preconditioner) THEN
274 ALLOCATE (matrix_dedc_physical(ispin)%matrix)
275 CALL dbcsr_copy(matrix_dedc_physical(ispin)%matrix, matrix_dedc(ispin)%matrix)
276 CALL dbcsr_scale_by_vector(matrix_dedc_physical(ispin)%matrix, &
277 alpha=2.0_dp*occupation_numbers(ispin)%array, side='right')
278 scaling_factor(ispin)%array = 2.0_dp
279 END IF
280 CALL dbcsr_scale_by_vector(matrix_dedc_scaled(ispin)%matrix, alpha=scaling_factor(ispin)%array, side='right')
281 END DO
282
283 ! notice we use qs_ot_env(1) for driving all output and the minimization in case of LSD
284 qs_ot_env(1)%etotal = energy + ener_nondiag
285
286 IF (qs_ot_env(1)%settings%occupation_preconditioner .AND. &
287 (qs_ot_env(1)%settings%ot_method == "CG" .OR. &
288 qs_ot_env(1)%settings%ot_method == "SD")) THEN
289 CALL ot_mini(qs_ot_env, matrix_dedc_scaled, matrix_hc_physical=matrix_dedc_physical)
290 ELSE
291 CALL ot_mini(qs_ot_env, matrix_dedc_scaled)
292 END IF
293
294 delta = qs_ot_env(1)%delta
295 energy_only = qs_ot_env(1)%energy_only
296
297 ! generate the orbitals using the new matrix_x
298 DO ispin = 1, SIZE(qs_ot_env)
299 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
300 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
301 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
302 CASE ("TOD")
303 IF (ASSOCIATED(matrix_s)) THEN
304 CALL dbcsr_multiply('N', 'N', 1.0_dp, matrix_s, qs_ot_env(ispin)%matrix_x, &
305 0.0_dp, qs_ot_env(ispin)%matrix_sx)
306 ELSE
307 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_x)
308 END IF
309 CALL qs_ot_get_p(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin))
310 CALL qs_ot_get_orbitals(mo_coeff, qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin))
311 CASE ("REF")
312 CALL qs_ot_get_orbitals_ref(mo_coeff, matrix_s, qs_ot_env(ispin)%matrix_x, &
313 qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_gx_old, &
314 qs_ot_env(ispin)%matrix_dx, qs_ot_env(ispin), qs_ot_env(1))
315 CASE DEFAULT
316 cpabort("Algorithm not yet implemented")
317 END SELECT
318 END DO
319
320 IF (qs_ot_env(1)%restricted) THEN
321 CALL mo_set_restrict(mo_array, convert_dbcsr=.true.)
322 END IF
323 !
324 ! obtain the new set of OT eigenvalues and set the occupations accordingly
325 !
326 IF (qs_ot_env(1)%settings%do_ener) THEN
327 DO ispin = 1, SIZE(mo_array)
328 mo_array(ispin)%eigenvalues = qs_ot_env(ispin)%ener_x
329 CALL set_mo_occupation(mo_set=mo_array(ispin), &
330 smear=smear)
331 END DO
332 END IF
333
334 ! cleanup
335 DO ispin = 1, SIZE(scaling_factor)
336 DEALLOCATE (scaling_factor(ispin)%array)
337 END DO
338 DEALLOCATE (scaling_factor)
339 IF (qs_ot_env(1)%settings%do_ener) THEN
340 DO ispin = 1, SIZE(expectation_values)
341 DEALLOCATE (expectation_values(ispin)%array)
342 END DO
343 DEALLOCATE (expectation_values)
344 END IF
345 DEALLOCATE (occupation_numbers)
346 DO ispin = 1, SIZE(matrix_dedc_scaled)
347 CALL dbcsr_release(matrix_dedc_scaled(ispin)%matrix)
348 DEALLOCATE (matrix_dedc_scaled(ispin)%matrix)
349 END DO
350 DEALLOCATE (matrix_dedc_scaled)
351 IF (ASSOCIATED(matrix_dedc_physical)) THEN
352 DO ispin = 1, SIZE(matrix_dedc_physical)
353 CALL dbcsr_release(matrix_dedc_physical(ispin)%matrix)
354 DEALLOCATE (matrix_dedc_physical(ispin)%matrix)
355 END DO
356 DEALLOCATE (matrix_dedc_physical)
357 END IF
358
359 CALL timestop(handle)
360
361 END SUBROUTINE ot_scf_mini
362
363! **************************************************************************************************
364!> \brief initialises qs_ot_env so that mo_coeff is the current point
365!> and that the minization can be started.
366!> \param mo_array ...
367!> \param matrix_s ...
368!> \param qs_ot_env ...
369!> \param matrix_ks ...
370!> \param broyden_adaptive_sigma ...
371! **************************************************************************************************
372 SUBROUTINE ot_scf_init(mo_array, matrix_s, qs_ot_env, matrix_ks, broyden_adaptive_sigma)
373
374 TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mo_array
375 TYPE(dbcsr_type), POINTER :: matrix_s
376 TYPE(qs_ot_type), DIMENSION(:), POINTER :: qs_ot_env
377 TYPE(dbcsr_type), POINTER :: matrix_ks
378 REAL(kind=dp) :: broyden_adaptive_sigma
379
380 CHARACTER(len=*), PARAMETER :: routinen = 'ot_scf_init'
381
382 INTEGER :: handle, ispin, k, n, nspin
383 LOGICAL :: is_equal
384 TYPE(cp_fm_type), POINTER :: mo_coeff_fm
385 TYPE(dbcsr_type), POINTER :: mo_coeff
386
387 CALL timeset(routinen, handle)
388
389 DO ispin = 1, SIZE(mo_array)
390 IF (.NOT. ASSOCIATED(mo_array(ispin)%mo_coeff_b)) THEN
391 cpabort("Shouldn't get there")
392 ! we do ot then copy fm to dbcsr
393 ! allocate that somewhere else ! fm -> dbcsr
394 CALL dbcsr_init_p(mo_array(ispin)%mo_coeff_b)
395 CALL cp_dbcsr_m_by_n_from_row_template(mo_array(ispin)%mo_coeff_b, template=matrix_ks, &
396 n=mo_array(ispin)%nmo, &
397 sym=dbcsr_type_no_symmetry)
398 END IF
399 END DO
400
401 ! *** set a history for broyden
402 DO ispin = 1, SIZE(qs_ot_env)
403 qs_ot_env(ispin)%broyden_adaptive_sigma = broyden_adaptive_sigma
404 END DO
405
406 ! **** SCP
407 ! **** SCP
408 ! adapted for work with the restricted keyword
409 nspin = SIZE(qs_ot_env)
410
411 DO ispin = 1, nspin
412
413 CALL qs_ot_set_context(qs_ot_env(ispin), spin_index=ispin)
414
415 NULLIFY (mo_coeff)
416 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff, mo_coeff=mo_coeff_fm)
417 CALL copy_fm_to_dbcsr(mo_coeff_fm, mo_coeff) !fm -> dbcsr
418
419 CALL dbcsr_get_info(mo_coeff, nfullrows_total=n, nfullcols_total=k)
420
421 ! allocate
422 CALL qs_ot_allocate(qs_ot_env(ispin), matrix_ks, mo_coeff_fm%matrix_struct)
423
424 ! set c0,sc0
425 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_c0, mo_coeff)
426 IF (ASSOCIATED(matrix_s)) THEN
427 CALL dbcsr_multiply('N', 'N', 1.0_dp, matrix_s, qs_ot_env(ispin)%matrix_c0, &
428 0.0_dp, qs_ot_env(ispin)%matrix_sc0)
429 ELSE
430 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sc0, qs_ot_env(ispin)%matrix_c0)
431 END IF
432
433 ! init
434 CALL qs_ot_init(qs_ot_env(ispin))
435
436 ! set x
437 CALL dbcsr_set(qs_ot_env(ispin)%matrix_x, 0.0_dp)
438 CALL dbcsr_set(qs_ot_env(ispin)%matrix_sx, 0.0_dp)
439
440 IF (qs_ot_env(ispin)%settings%do_rotation) THEN
441 CALL dbcsr_set(qs_ot_env(ispin)%rot_mat_x, 0.0_dp)
442 CALL dbcsr_set(qs_ot_env(ispin)%rot_mat_u, 0.0_dp)
443 CALL dbcsr_add_on_diag(qs_ot_env(ispin)%rot_mat_u, 1.0_dp)
444 END IF
445
446 IF (qs_ot_env(ispin)%settings%do_ener) THEN
447 is_equal = SIZE(qs_ot_env(ispin)%ener_x) == SIZE(mo_array(ispin)%eigenvalues)
448 cpassert(is_equal)
449 qs_ot_env(ispin)%ener_x = mo_array(ispin)%eigenvalues
450 END IF
451
452 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
453 CASE ("TOD")
454 ! get c
455 CALL qs_ot_get_p(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin))
456 CASE ("REF")
457 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_x, qs_ot_env(ispin)%matrix_c0)
458 CALL dbcsr_copy(qs_ot_env(ispin)%matrix_sx, qs_ot_env(ispin)%matrix_sc0)
459 CASE DEFAULT
460 cpabort("Algorithm not yet implemented")
461 END SELECT
462
463 END DO
464 CALL timestop(handle)
465 END SUBROUTINE ot_scf_init
466
467! **************************************************************************************************
468!> \brief ...
469!> \param qs_ot_env ...
470! **************************************************************************************************
471 SUBROUTINE ot_scf_destroy(qs_ot_env)
472
473 TYPE(qs_ot_type) :: qs_ot_env
474
475 CALL qs_ot_destroy(qs_ot_env)
476
477 END SUBROUTINE ot_scf_destroy
478
479END MODULE qs_ot_scf
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_set_diag(matrix, diag)
Copies the diagonal elements from the given array into the given matrix.
subroutine, public dbcsr_get_diag(matrix, diag)
Copies the diagonal elements from the given matrix into the given array.
subroutine, public dbcsr_add_on_diag(matrix, alpha)
Adds the given scalar to the diagonal of the matrix. Reserves any missing diagonal blocks.
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
subroutine, public dbcsr_scale_by_vector(matrix, alpha, side)
Scales the rows/columns of given matrix.
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_m_by_n_from_row_template(matrix, template, n, sym)
Utility function to create dbcsr matrix, m x n matrix (n arbitrary) with the same processor grid and ...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public mo_set_restrict(mo_array, convert_dbcsr)
make the beta orbitals explicitly equal to the alpha orbitals effectively copying the orbital data
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count, cmo_coeff)
Get the components of a MO set data structure.
orbital transformations
subroutine, public ot_mini(qs_ot_env, matrix_hc, matrix_hc_im, matrix_hc_physical, matrix_hc_physical_im, para_env_inter_kp, gradient_only, gradient_prepared)
...
basic functionality for using ot in the scf routines.
Definition qs_ot_scf.F:14
subroutine, public ot_scf_init(mo_array, matrix_s, qs_ot_env, matrix_ks, broyden_adaptive_sigma)
initialises qs_ot_env so that mo_coeff is the current point and that the minization can be started.
Definition qs_ot_scf.F:373
subroutine, public ot_scf_read_input(qs_ot_env, scf_section, do_kpoints)
...
Definition qs_ot_scf.F:74
subroutine, public ot_scf_mini(mo_array, matrix_dedc, smear, matrix_s, energy, energy_only, delta, qs_ot_env)
performs the actual minimisation, needs only limited info updated for restricted calculations matrix_...
Definition qs_ot_scf.F:130
subroutine, public ot_scf_destroy(qs_ot_env)
...
Definition qs_ot_scf.F:472
orbital transformations
Definition qs_ot_types.F:15
subroutine, public qs_ot_init(qs_ot_env)
init matrices, needs c0 and sc0 so that c0*sc0=1
subroutine, public qs_ot_settings_init(settings)
sets default values for the settings type
subroutine, public qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k, energy_dimension)
allocates the data in qs_ot_env, for a calculation with fm_struct_ref ortho_k allows for specifying a...
subroutine, public ot_readwrite_input(settings, ot_section, output_unit, complex_kpoints, eigensolver)
...
subroutine, public qs_ot_set_context(qs_ot_env, spin_index, kpoint_index, local_kpoint_index, kpoint_weight)
label an OT environment by spin and optional irreducible k-point context
subroutine, public qs_ot_destroy(qs_ot_env)
deallocates data
orbital transformations
Definition qs_ot.F:15
subroutine, public qs_ot_get_p(matrix_x, matrix_sx, qs_ot_env)
computes p=x*S*x and the matrix functionals related matrices
Definition qs_ot.F:2643
subroutine, public qs_ot_get_orbitals(matrix_c, matrix_x, qs_ot_env)
c=(c0*cos(p^0.5)+x*sin(p^0.5)*p^(-0.5)) x rot_mat_u this assumes that x is already ortho to S*C0,...
Definition qs_ot.F:3207
subroutine, public qs_ot_get_orbitals_ref(matrix_c, matrix_s, matrix_x, matrix_sx, matrix_gx_old, matrix_dx, qs_ot_env, qs_ot_env1)
...
Definition qs_ot.F:1881
parameters that control an scf iteration
represent a pointer to a 1d array
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains the parameters needed by a scf run