(git:6344619)
Loading...
Searching...
No Matches
qs_cdft_scf_utils.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 Auxiliary routines for performing a constrained DFT SCF run with Quickstep.
10!> \par History
11!> - Separated some routines from qs_scf (03.2018) [Nico Holmberg]
12!> \author Nico Holmberg (03.2018)
13! **************************************************************************************************
16 USE cp_files, ONLY: close_file,&
21 USE input_constants, ONLY: &
27 USE kinds, ONLY: default_path_length,&
28 dp
29 USE mathlib, ONLY: invert_matrix
35#include "./base/base_uses.f90"
36
37 IMPLICIT NONE
38
39 PRIVATE
40
41 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_cdft_scf_utils'
42
46
47CONTAINS
48
49! **************************************************************************************************
50!> \brief Prepares the finite difference stencil for computing the Jacobian. The constraints
51!> are re-evaluated by perturbing each constraint.
52!> \param qs_env the qs_env where to build the Jacobian
53!> \param output_unit the output unit number
54!> \param nwork the number of perturbations to take in the negative direction
55!> \param pwork the number of perturbations to take in the positive direction
56!> \param coeff list of coefficients that determine how to sum up the various perturbations
57!> \param step_multiplier list of values that determine how large steps to take for each perturbatio
58!> \param dh total length of the interval to use for computing the finite difference derivatives
59!> \par History
60!> 03.2018 created [Nico Holmberg]
61! **************************************************************************************************
62 SUBROUTINE prepare_jacobian_stencil(qs_env, output_unit, nwork, pwork, &
63 coeff, step_multiplier, dh)
64 TYPE(qs_environment_type), POINTER :: qs_env
65 INTEGER :: output_unit, nwork, pwork
66 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: coeff, step_multiplier, dh
67
68 CHARACTER(len=15) :: fmt_code
69 INTEGER :: ivar
70 TYPE(dft_control_type), POINTER :: dft_control
71 TYPE(qs_scf_env_type), POINTER :: scf_env
72 TYPE(scf_control_type), POINTER :: scf_control
73
74 NULLIFY (scf_env, scf_control, dft_control)
75
76 cpassert(ASSOCIATED(qs_env))
77 CALL get_qs_env(qs_env, scf_env=scf_env, &
78 scf_control=scf_control, &
79 dft_control=dft_control)
80
81 IF (SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) /= 1 .AND. &
82 SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) /= SIZE(scf_env%outer_scf%variables, 1)) THEN
83 CALL cp_abort(__location__, &
84 cp_to_string(SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step))// &
85 " values passed to keyword JACOBIAN_STEP, expected 1 or "// &
86 cp_to_string(SIZE(scf_env%outer_scf%variables, 1)))
87 END IF
88
89 ALLOCATE (dh(SIZE(scf_env%outer_scf%variables, 1)))
90 IF (SIZE(dh) /= SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step)) THEN
91 DO ivar = 1, SIZE(dh)
92 dh(ivar) = scf_control%outer_scf%cdft_opt_control%jacobian_step(1)
93 END DO
94 ELSE
95 dh(:) = scf_control%outer_scf%cdft_opt_control%jacobian_step
96 END IF
97
98 SELECT CASE (scf_control%outer_scf%cdft_opt_control%jacobian_type)
99 CASE DEFAULT
100 CALL cp_abort(__location__, &
101 "Unknown Jacobian type: "// &
102 cp_to_string(scf_control%outer_scf%cdft_opt_control%jacobian_type))
103 CASE (jacobian_fd1)
104 ! f'(x0) = [ f(x0+h) - f(x0) ] / h
105 nwork = 0
106 pwork = 1
107 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
108 coeff(nwork) = -1.0_dp
109 coeff(pwork) = 1.0_dp
110 step_multiplier = 1.0_dp
112 ! f'(x0) = [ f(x0) - f(x0-h) ] / h
113 nwork = -1
114 pwork = 0
115 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
116 coeff(nwork) = -1.0_dp
117 coeff(pwork) = 1.0_dp
118 step_multiplier = -1.0_dp
119 CASE (jacobian_fd2)
120 ! f'(x0) = [ -f(x0+2h) + 4f(x0+h) - 3f(x0) ] / 2h
121 nwork = 0
122 pwork = 2
123 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
124 coeff(0) = -3.0_dp
125 coeff(1) = 4.0_dp
126 coeff(2) = -1.0_dp
127 step_multiplier(0) = 0.0_dp
128 step_multiplier(1) = 1.0_dp
129 step_multiplier(2) = 2.0_dp
130 dh(:) = 2.0_dp*dh(:)
132 ! f'(x0) = [ 3f(x0) - 4f(x0-h) + f(x0-2h) ] / 2h
133 nwork = -2
134 pwork = 0
135 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
136 coeff(0) = 3.0_dp
137 coeff(-1) = -4.0_dp
138 coeff(-2) = 1.0_dp
139 step_multiplier(0) = 0.0_dp
140 step_multiplier(-1) = -1.0_dp
141 step_multiplier(-2) = -2.0_dp
142 dh(:) = 2.0_dp*dh(:)
144 ! f'(x0) = [ f(x0+h) - f(x0-h) ] / 2h
145 nwork = -1
146 pwork = 1
147 ALLOCATE (coeff(nwork:pwork), step_multiplier(nwork:pwork))
148 coeff(0) = 0.0_dp
149 coeff(nwork) = -1.0_dp
150 coeff(pwork) = 1.0_dp
151 step_multiplier(0) = 0.0_dp
152 step_multiplier(nwork) = -1.0_dp
153 step_multiplier(pwork) = 1.0_dp
154 dh(:) = 2.0_dp*dh(:)
155 END SELECT
156 ! Print some info
157 IF (output_unit > 0) THEN
158 WRITE (output_unit, fmt="(/,A)") &
159 " ================================== JACOBIAN CALCULATION ================================="
160 WRITE (output_unit, fmt="(A)") &
161 " Evaluating inverse Jacobian using finite differences"
162 WRITE (output_unit, '(A,I10,A,I10)') &
163 " Energy evaluation: ", dft_control%qs_control%cdft_control%ienergy, &
164 ", CDFT SCF iteration: ", scf_env%outer_scf%iter_count
165 SELECT CASE (scf_control%outer_scf%cdft_opt_control%jacobian_type)
166 CASE (jacobian_fd1)
167 WRITE (output_unit, '(A)') " Type : First order forward difference"
169 WRITE (output_unit, '(A)') " Type : First order backward difference"
170 CASE (jacobian_fd2)
171 WRITE (output_unit, '(A)') " Type : Second order forward difference"
173 WRITE (output_unit, '(A)') " Type : Second order backward difference"
175 WRITE (output_unit, '(A)') " Type : First order central difference"
176 CASE DEFAULT
177 CALL cp_abort(__location__, "Unknown Jacobian type: "// &
178 cp_to_string(scf_control%outer_scf%cdft_opt_control%jacobian_type))
179 END SELECT
180 IF (SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) == 1) THEN
181 WRITE (output_unit, '(A,ES12.4)') " Step size : ", scf_control%outer_scf%cdft_opt_control%jacobian_step
182 ELSE
183 WRITE (output_unit, '(A,ES12.4,A)') &
184 " Step sizes : ", scf_control%outer_scf%cdft_opt_control%jacobian_step(1), ' (constraint 1)'
185 IF (SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) < 10) THEN
186 fmt_code = '(ES34.4,A,I2,A)'
187 ELSE
188 fmt_code = '(ES34.4,A,I3,A)'
189 END IF
190 DO ivar = 2, SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step)
191 WRITE (output_unit, fmt_code) scf_control%outer_scf%cdft_opt_control%jacobian_step(ivar), " (constraint", ivar, ")"
192 END DO
193 END IF
194 END IF
195
196 END SUBROUTINE prepare_jacobian_stencil
197! **************************************************************************************************
198!> \brief Builds a strictly diagonal inverse Jacobian from MD/SCF history.
199!> \param qs_env the qs_environment_type where to compute the Jacobian
200!> \param used_history flag that determines if history was actually used to prepare the Jacobian
201!> \par History
202!> 03.2018 created [Nico Holmberg]
203! **************************************************************************************************
204 SUBROUTINE build_diagonal_jacobian(qs_env, used_history)
205 TYPE(qs_environment_type), POINTER :: qs_env
206 LOGICAL :: used_history
207
208 INTEGER :: i, ihistory, nvar, outer_scf_ihistory
209 LOGICAL :: use_md_history
210 REAL(kind=dp) :: inv_error
211 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: jacobian
212 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient_history, inv_jacobian, &
213 variable_history
214 TYPE(qs_scf_env_type), POINTER :: scf_env
215 TYPE(scf_control_type), POINTER :: scf_control
216
217 NULLIFY (scf_control, scf_env)
218
219 CALL get_qs_env(qs_env, scf_env=scf_env, &
220 scf_control=scf_control, &
221 outer_scf_ihistory=outer_scf_ihistory)
222 ihistory = scf_env%outer_scf%iter_count
223
224 IF (outer_scf_ihistory >= 3 .AND. .NOT. used_history) THEN
225 ! First, lets try using the history from previous energy evaluations
226 CALL get_qs_env(qs_env, gradient_history=gradient_history, &
227 variable_history=variable_history)
228 nvar = SIZE(scf_env%outer_scf%variables, 1)
229 use_md_history = .true.
230 ! Check that none of the history values are identical in which case we should try something different
231 DO i = 1, nvar
232 IF (abs(variable_history(i, 2) - variable_history(i, 1)) < 1.0e-12_dp) THEN
233 use_md_history = .false.
234 END IF
235 END DO
236 IF (use_md_history) THEN
237 ALLOCATE (jacobian(nvar, nvar))
238 jacobian = 0.0_dp
239 DO i = 1, nvar
240 jacobian(i, i) = (gradient_history(i, 2) - gradient_history(i, 1))/ &
241 (variable_history(i, 2) - variable_history(i, 1))
242 END DO
243 IF (.NOT. ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
244 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
245 END IF
246 inv_jacobian => scf_env%outer_scf%inv_jacobian
247 CALL invert_matrix(jacobian, inv_jacobian, inv_error)
248 DEALLOCATE (jacobian)
249 ! Mark that an inverse Jacobian was just built and the next outer_loop_optimize should not perform
250 ! a Broyden update of it
251 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
252 ! Mark that the MD history has been used and should not be reused anymore on this energy evaluation
253 used_history = .true.
254 END IF
255 END IF
256 IF (ihistory >= 2 .AND. .NOT. ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
257 ! Next, try history from current SCF procedure
258 nvar = SIZE(scf_env%outer_scf%variables, 1)
259 IF (SIZE(scf_env%outer_scf%gradient, 2) < 3) THEN
260 CALL cp_abort(__location__, &
261 "Keyword EXTRAPOLATION_ORDER in section OUTER_SCF must be greater than or equal "// &
262 "to 3 for optimizers that build the Jacobian from SCF history.")
263 END IF
264 ALLOCATE (jacobian(nvar, nvar))
265 jacobian = 0.0_dp
266 DO i = 1, nvar
267 jacobian(i, i) = (scf_env%outer_scf%gradient(i, ihistory) - scf_env%outer_scf%gradient(i, ihistory - 1))/ &
268 (scf_env%outer_scf%variables(i, ihistory) - scf_env%outer_scf%variables(i, ihistory - 1))
269 END DO
270 IF (.NOT. ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
271 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
272 END IF
273 inv_jacobian => scf_env%outer_scf%inv_jacobian
274 CALL invert_matrix(jacobian, inv_jacobian, inv_error)
275 DEALLOCATE (jacobian)
276 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
277 ELSE
278 ! No history => will fall back to SD optimizer in outer_loop_optimize
279 END IF
280
281 END SUBROUTINE build_diagonal_jacobian
282
283! **************************************************************************************************
284!> \brief Restarts the finite difference inverse Jacobian.
285!> \param qs_env the qs_environment_type where to compute the Jacobian
286!> \par History
287!> 03.2018 created [Nico Holmberg]
288! **************************************************************************************************
289 SUBROUTINE restart_inverse_jacobian(qs_env)
290 TYPE(qs_environment_type), POINTER :: qs_env
291
292 INTEGER :: i, iwork, j, nvar
293 REAL(kind=dp), DIMENSION(:, :), POINTER :: inv_jacobian
294 TYPE(qs_scf_env_type), POINTER :: scf_env
295 TYPE(scf_control_type), POINTER :: scf_control
296
297 NULLIFY (scf_env, scf_control)
298 cpassert(ASSOCIATED(qs_env))
299 CALL get_qs_env(qs_env, scf_env=scf_env, scf_control=scf_control)
300
301 cpassert(ASSOCIATED(scf_control%outer_scf%cdft_opt_control%jacobian_vector))
302 nvar = SIZE(scf_env%outer_scf%variables, 1)
303 IF (SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_vector) /= nvar**2) THEN
304 CALL cp_abort(__location__, &
305 "Too many or too few values defined for restarting inverse Jacobian.")
306 END IF
307 IF (.NOT. ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
308 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
309 END IF
310 inv_jacobian => scf_env%outer_scf%inv_jacobian
311 iwork = 1
312 DO i = 1, nvar
313 DO j = 1, nvar
314 inv_jacobian(i, j) = scf_control%outer_scf%cdft_opt_control%jacobian_vector(iwork)
315 iwork = iwork + 1
316 END DO
317 END DO
318 DEALLOCATE (scf_control%outer_scf%cdft_opt_control%jacobian_vector)
319 scf_control%outer_scf%cdft_opt_control%jacobian_restart = .false.
320 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
321 scf_env%outer_scf%deallocate_jacobian = .false.
322
323 END SUBROUTINE restart_inverse_jacobian
324
325! **************************************************************************************************
326!> \brief Prints the finite difference inverse Jacobian to file
327!> \param logger the default IO logger
328!> \param inv_jacobian the inverse Jacobian matrix
329!> \param iter_count the iteration number
330!> \par History
331!> 03.2018 created [Nico Holmberg]
332! **************************************************************************************************
333 SUBROUTINE print_inverse_jacobian(logger, inv_jacobian, iter_count)
334 TYPE(cp_logger_type), POINTER :: logger
335 REAL(kind=dp), DIMENSION(:, :), INTENT(IN), &
336 POINTER :: inv_jacobian
337 INTEGER :: iter_count
338
339 CHARACTER(len=default_path_length) :: project_name
340 INTEGER :: i, j, lp, nvar, output_unit
341
342 nvar = SIZE(inv_jacobian, 1)
343 project_name = logger%iter_info%project_name
344 lp = len_trim(project_name)
345 project_name(lp + 1:len(project_name)) = ".inverseJacobian"
346 CALL open_file(file_name=project_name, &
347 file_status="UNKNOWN", &
348 file_action="WRITE", &
349 file_position="APPEND", &
350 unit_number=output_unit)
351 WRITE (output_unit, fmt="(/,A)") "Inverse Jacobian matrix in row major order"
352 WRITE (output_unit, fmt="(A,I10)") "Iteration: ", iter_count
353 DO i = 1, nvar
354 DO j = 1, nvar
355 WRITE (output_unit, *) inv_jacobian(i, j)
356 END DO
357 END DO
358 CALL close_file(unit_number=output_unit)
359
360 END SUBROUTINE print_inverse_jacobian
361
362! **************************************************************************************************
363!> \brief Creates a temporary logger for redirecting output to a new file
364!> \param para_env the para_env
365!> \param project_name the project basename
366!> \param suffix the suffix
367!> \param output_unit the default unit number for the newly created temporary logger
368!> \param tmp_logger pointer to the newly created temporary logger
369!> \par History
370!> 03.2018 created [Nico Holmberg]
371! **************************************************************************************************
372 SUBROUTINE create_tmp_logger(para_env, project_name, suffix, output_unit, tmp_logger)
373 TYPE(mp_para_env_type), POINTER :: para_env
374 CHARACTER(len=*) :: project_name, suffix
375 INTEGER, INTENT(OUT) :: output_unit
376 TYPE(cp_logger_type), INTENT(OUT), POINTER :: tmp_logger
377
378 INTEGER :: lp
379
380 IF (para_env%is_source()) THEN
381 lp = len_trim(project_name)
382 project_name(lp + 1:len(project_name)) = suffix
383 CALL open_file(file_name=project_name, file_status="UNKNOWN", &
384 file_action="WRITE", file_position="APPEND", &
385 unit_number=output_unit)
386 ELSE
387 output_unit = -1
388 END IF
389 CALL cp_logger_create(tmp_logger, &
390 para_env=para_env, &
391 default_global_unit_nr=output_unit, &
392 close_global_unit_on_dealloc=.false.)
393
394 END SUBROUTINE create_tmp_logger
395
396! **************************************************************************************************
397!> \brief Checks if the inverse Jacobian should be calculated and initializes the calculation
398!> \param scf_control the scf_control that holds the Jacobian settings
399!> \param scf_env the scf_env that holds the CDFT iteration information
400!> \param explicit_jacobian flag that determines if the finite difference Jacobian is needed
401!> \param should_build flag that determines if the Jacobian should be built
402!> \param used_history flag that determines if SCF history has been used to build a Jacobian
403!> \par History
404!> 03.2018 created [Nico Holmberg]
405! **************************************************************************************************
406 SUBROUTINE initialize_inverse_jacobian(scf_control, scf_env, explicit_jacobian, &
407 should_build, used_history)
408 TYPE(scf_control_type), POINTER :: scf_control
409 TYPE(qs_scf_env_type), POINTER :: scf_env
410 LOGICAL :: explicit_jacobian, should_build, &
411 used_history
412
413 cpassert(ASSOCIATED(scf_control))
414 cpassert(ASSOCIATED(scf_env))
415
416 SELECT CASE (scf_control%outer_scf%optimizer)
417 CASE DEFAULT
418 cpabort("Noncompatible optimizer requested.")
420 cpassert(ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
421 scf_control%outer_scf%cdft_opt_control%build_jacobian = .true.
422 explicit_jacobian = .true.
424 cpassert(ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
425 SELECT CASE (scf_control%outer_scf%cdft_opt_control%broyden_type)
427 scf_control%outer_scf%cdft_opt_control%build_jacobian = .true.
428 explicit_jacobian = .false.
430 scf_control%outer_scf%cdft_opt_control%build_jacobian = .true.
431 explicit_jacobian = .true.
432 END SELECT
433 END SELECT
434 IF (scf_control%outer_scf%cdft_opt_control%build_jacobian) THEN
435 ! Reset counter
436 IF (scf_env%outer_scf%iter_count == 1) scf_control%outer_scf%cdft_opt_control%ijacobian(1) = 0
437 ! Check if an old Jacobian can be reused avoiding a rebuild
438 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
439 ! Rebuild if number of previous energy evaluations exceeds limit
440 IF (scf_control%outer_scf%cdft_opt_control%ijacobian(2) >= &
441 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) .AND. .NOT. used_history .AND. &
442 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) > 0) THEN
443 should_build = .true.
444 ! Zero the corresponding counters
445 scf_control%outer_scf%cdft_opt_control%ijacobian(:) = 0
446 ! Rebuild if number of previous SCF iterations exceeds limit (on this energy eval)
447 ELSE IF (scf_control%outer_scf%cdft_opt_control%ijacobian(1) >= &
448 scf_control%outer_scf%cdft_opt_control%jacobian_freq(1) .AND. &
449 scf_control%outer_scf%cdft_opt_control%jacobian_freq(1) > 0) THEN
450 should_build = .true.
451 ! Zero the corresponding counter
452 scf_control%outer_scf%cdft_opt_control%ijacobian(1) = 0
453 END IF
454 IF (should_build) DEALLOCATE (scf_env%outer_scf%inv_jacobian)
455 ELSE
456 should_build = .true.
457 ! Zero the counter
458 scf_control%outer_scf%cdft_opt_control%ijacobian(:) = 0
459 END IF
460 END IF
461
462 END SUBROUTINE initialize_inverse_jacobian
463
464END MODULE qs_cdft_scf_utils
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Utility routines to open and close files.
Definition cp_files.F:22
subroutine, public open_file(file_name, unit_number, file_status, file_form, file_action, file_position, file_pad, file_access, debug)
Opens a file and returns its logical unit number.
Definition cp_files.F:197
subroutine, public close_file(unit_number, file_status)
Closes an open file given by its logical unit number.
Definition cp_files.F:64
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_logger_create(logger, para_env, print_level, default_global_unit_nr, default_local_unit_nr, global_filename, local_filename, close_global_unit_on_dealloc, iter_info, close_local_unit_on_dealloc, suffix, template_logger)
initializes a logger
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public jacobian_fd1_central
integer, parameter, public broyden_type_2_explicit_ls
integer, parameter, public broyden_type_1_explicit
integer, parameter, public broyden_type_2_ls
integer, parameter, public jacobian_fd2
integer, parameter, public broyden_type_1
integer, parameter, public outer_scf_optimizer_broyden
integer, parameter, public broyden_type_1_explicit_ls
integer, parameter, public broyden_type_2_explicit
integer, parameter, public jacobian_fd1
integer, parameter, public broyden_type_2
integer, parameter, public jacobian_fd1_backward
integer, parameter, public jacobian_fd2_backward
integer, parameter, public outer_scf_optimizer_newton_ls
integer, parameter, public outer_scf_optimizer_newton
integer, parameter, public broyden_type_1_ls
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_path_length
Definition kinds.F:58
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
Interface to the message passing library MPI.
Auxiliary routines for performing a constrained DFT SCF run with Quickstep.
subroutine, public prepare_jacobian_stencil(qs_env, output_unit, nwork, pwork, coeff, step_multiplier, dh)
Prepares the finite difference stencil for computing the Jacobian. The constraints are re-evaluated b...
subroutine, public build_diagonal_jacobian(qs_env, used_history)
Builds a strictly diagonal inverse Jacobian from MD/SCF history.
subroutine, public print_inverse_jacobian(logger, inv_jacobian, iter_count)
Prints the finite difference inverse Jacobian to file.
subroutine, public create_tmp_logger(para_env, project_name, suffix, output_unit, tmp_logger)
Creates a temporary logger for redirecting output to a new file.
subroutine, public restart_inverse_jacobian(qs_env)
Restarts the finite difference inverse Jacobian.
subroutine, public initialize_inverse_jacobian(scf_control, scf_env, explicit_jacobian, should_build, used_history)
Checks if the inverse Jacobian should be calculated and initializes the calculation.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
module that contains the definitions of the scf types
parameters that control an scf iteration
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment