(git:2dab80f)
Loading...
Searching...
No Matches
pao_main.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 Main module for the PAO method
10!> \author Ole Schuett
11! **************************************************************************************************
13 USE bibliography, ONLY: schuett2018,&
14 cite_reference
15 USE cp_dbcsr_api, ONLY: dbcsr_add,&
20 dbcsr_set,&
28 USE kinds, ONLY: dp
33 USE machine, ONLY: m_walltime
35 USE pao_io, ONLY: pao_read_restart,&
41 USE pao_methods, ONLY: &
46 USE pao_ml, ONLY: pao_ml_init,&
52 USE pao_param, ONLY: pao_calc_ab,&
56 USE pao_types, ONLY: pao_env_type
59#include "./base/base_uses.f90"
60
61 IMPLICIT NONE
62
63 PRIVATE
64
65 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pao_main'
66
68
69CONTAINS
70
71! **************************************************************************************************
72!> \brief Initialize the PAO environment
73!> \param qs_env ...
74!> \param ls_scf_env ...
75! **************************************************************************************************
76 SUBROUTINE pao_init(qs_env, ls_scf_env)
77 TYPE(qs_environment_type), POINTER :: qs_env
78 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
79
80 CHARACTER(len=*), PARAMETER :: routinen = 'pao_init'
81
82 INTEGER :: handle
83 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
84 TYPE(pao_env_type), POINTER :: pao
85 TYPE(section_vals_type), POINTER :: input
86
87 IF (.NOT. ls_scf_env%do_pao) RETURN
88
89 CALL timeset(routinen, handle)
90 CALL cite_reference(schuett2018)
91 pao => ls_scf_env%pao_env
92 CALL get_qs_env(qs_env=qs_env, input=input, matrix_s=matrix_s)
93
94 ! parse input
95 CALL parse_pao_section(pao, input)
96
97 CALL pao_init_kinds(pao, qs_env)
98
99 ! train machine learning
100 CALL pao_ml_init(pao, qs_env)
101
102 CALL timestop(handle)
103 END SUBROUTINE pao_init
104
105! **************************************************************************************************
106!> \brief Start a PAO optimization run.
107!> \param qs_env ...
108!> \param ls_scf_env ...
109! **************************************************************************************************
110 SUBROUTINE pao_optimization_start(qs_env, ls_scf_env)
111 TYPE(qs_environment_type), POINTER :: qs_env
112 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
113
114 CHARACTER(len=*), PARAMETER :: routinen = 'pao_optimization_start'
115
116 INTEGER :: handle
117 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
118 TYPE(pao_env_type), POINTER :: pao
119 TYPE(section_vals_type), POINTER :: input, section
120
121 IF (.NOT. ls_scf_env%do_pao) RETURN
122
123 CALL timeset(routinen, handle)
124 CALL get_qs_env(qs_env, input=input)
125 pao => ls_scf_env%pao_env
126 ls_mstruct => ls_scf_env%ls_mstruct
127
128 ! reset state
129 pao%step_start_time = m_walltime()
130 pao%istep = 0
131 pao%matrix_P_ready = .false.
132
133 ! ready stuff that does not depend on atom positions
134 IF (.NOT. pao%constants_ready) THEN
135 CALL pao_build_diag_distribution(pao, qs_env)
136 CALL pao_build_orthogonalizer(pao, qs_env)
137 CALL pao_build_selector(pao, qs_env)
138 CALL pao_build_core_hamiltonian(pao, qs_env)
139 pao%constants_ready = .true.
140 END IF
141
142 CALL pao_param_init(pao, qs_env)
143
144 ! ready PAO parameter matrix_X
145 IF (.NOT. pao%matrix_X_ready) THEN
146 CALL pao_build_matrix_x(pao, qs_env)
147 CALL pao_print_atom_info(pao)
148 IF (len_trim(pao%restart_file) > 0) THEN
149 CALL pao_read_restart(pao, qs_env)
150 ELSE IF (SIZE(pao%ml_training_set) > 0) THEN
151 CALL pao_ml_predict(pao, qs_env)
152 ELSE IF (ALLOCATED(pao%models)) THEN
153 CALL pao_model_predict(pao, qs_env)
154 ELSE
155 CALL pao_param_initial_guess(pao, qs_env)
156 END IF
157 pao%matrix_X_ready = .true.
158 ELSE IF (SIZE(pao%ml_training_set) > 0) THEN
159 CALL pao_ml_predict(pao, qs_env)
160 ELSE IF (ALLOCATED(pao%models)) THEN
161 CALL pao_model_predict(pao, qs_env)
162 ELSE
163 IF (pao%iw > 0) WRITE (pao%iw, *) "PAO| reusing matrix_X from previous optimization"
164 END IF
165
166 ! init line-search
167 section => section_vals_get_subs_vals(input, "DFT%LS_SCF%PAO%LINE_SEARCH")
168 CALL linesearch_init(pao%linesearch, section, "PAO|")
169
170 ! create some more matrices
171 CALL dbcsr_copy(pao%matrix_G, pao%matrix_X)
172 CALL dbcsr_set(pao%matrix_G, 0.0_dp)
173
174 CALL dbcsr_create(ls_mstruct%matrix_A, template=pao%matrix_Y)
175 CALL dbcsr_reserve_diag_blocks(ls_mstruct%matrix_A)
176 CALL dbcsr_create(ls_mstruct%matrix_B, template=pao%matrix_Y)
177 CALL dbcsr_reserve_diag_blocks(ls_mstruct%matrix_B)
178
179 ! fill PAO transformation matrices
180 CALL pao_calc_ab(pao, qs_env, ls_scf_env, gradient=.false.)
181
182 CALL timestop(handle)
183 END SUBROUTINE pao_optimization_start
184
185! **************************************************************************************************
186!> \brief Called after the SCF optimization, updates the PAO basis.
187!> \param qs_env ...
188!> \param ls_scf_env ...
189!> \param pao_is_done ...
190! **************************************************************************************************
191 SUBROUTINE pao_update(qs_env, ls_scf_env, pao_is_done)
192 TYPE(qs_environment_type), POINTER :: qs_env
193 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
194 LOGICAL, INTENT(OUT) :: pao_is_done
195
196 CHARACTER(len=*), PARAMETER :: routinen = 'pao_update'
197
198 INTEGER :: handle, icycle
199 LOGICAL :: cycle_converged, do_mixing, should_stop
200 REAL(kind=dp) :: energy, penalty
201 TYPE(dbcsr_type) :: matrix_x_mixing
202 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
203 TYPE(pao_env_type), POINTER :: pao
204
205 IF (.NOT. ls_scf_env%do_pao) THEN
206 pao_is_done = .true.
207 RETURN
208 END IF
209
210 ls_mstruct => ls_scf_env%ls_mstruct
211 pao => ls_scf_env%pao_env
212
213 IF (.NOT. pao%matrix_P_ready) THEN
214 CALL pao_guess_initial_p(pao, qs_env, ls_scf_env)
215 pao%matrix_P_ready = .true.
216 END IF
217
218 IF (pao%max_pao == 0) THEN
219 pao_is_done = .true.
220 RETURN
221 END IF
222
223 IF (pao%need_initial_scf) THEN
224 pao_is_done = .false.
225 pao%need_initial_scf = .false.
226 IF (pao%iw > 0) WRITE (pao%iw, *) "PAO| Performing initial SCF optimization."
227 RETURN
228 END IF
229
230 CALL timeset(routinen, handle)
231
232 ! perform mixing once we are well into the optimization
233 do_mixing = pao%mixing /= 1.0_dp .AND. pao%istep > 1
234 IF (do_mixing) THEN
235 CALL dbcsr_copy(matrix_x_mixing, pao%matrix_X)
236 END IF
237
238 cycle_converged = .false.
239 icycle = 0
240 CALL linesearch_reset(pao%linesearch)
241 CALL pao_opt_init(pao)
242
243 DO WHILE (.true.)
244 pao%istep = pao%istep + 1
245
246 IF (pao%iw > 0) WRITE (pao%iw, "(A,I9,A)") " PAO| ======================= Iteration: ", &
247 pao%istep, " ============================="
248
249 ! calc energy and check trace_PS
250 CALL pao_calc_energy(pao, qs_env, ls_scf_env, energy)
251 CALL pao_check_trace_ps(ls_scf_env)
252
253 IF (pao%linesearch%starts) THEN
254 icycle = icycle + 1
255 ! calc new gradient including penalty terms
256 CALL pao_calc_ab(pao, qs_env, ls_scf_env, gradient=.true., penalty=penalty)
257 CALL pao_check_grad(pao, qs_env, ls_scf_env)
258
259 ! calculate new direction for line-search
260 CALL pao_opt_new_dir(pao, icycle)
261
262 !backup X
263 CALL dbcsr_copy(pao%matrix_X_orig, pao%matrix_X)
264
265 ! print info and convergence test
266 CALL pao_test_convergence(pao, ls_scf_env, energy, cycle_converged)
267 IF (cycle_converged) THEN
268 pao_is_done = icycle < 3
269 IF (pao_is_done .AND. pao%iw > 0) WRITE (pao%iw, *) "PAO| converged after ", pao%istep, " steps :-)"
270 EXIT
271 END IF
272
273 ! if we have reached the maximum number of cycles exit in order
274 ! to restart with a fresh hamiltonian
275 IF (icycle >= pao%max_cycles) THEN
276 IF (pao%iw > 0) WRITE (pao%iw, *) "PAO| CG not yet converged after ", icycle, " cylces."
277 pao_is_done = .false.
278 EXIT
279 END IF
280
281 IF (mod(icycle, pao%write_cycles) == 0) &
282 CALL pao_write_restart(pao, qs_env, energy) ! write an intermediate restart file
283 END IF
284
285 ! check for early abort without convergence?
286 CALL external_control(should_stop, "PAO", start_time=qs_env%start_time, target_time=qs_env%target_time)
287 IF (should_stop .OR. pao%istep >= pao%max_pao) THEN
288 cpwarn("PAO not converged!")
289 pao_is_done = .true.
290 EXIT
291 END IF
292
293 ! perform line-search step
294 CALL linesearch_step(pao%linesearch, energy=energy, slope=pao%norm_G**2)
295
296 IF (pao%linesearch%step_size < 1e-9_dp) cpabort("PAO gradient is wrong.")
297
298 CALL dbcsr_copy(pao%matrix_X, pao%matrix_X_orig) !restore X
299 CALL dbcsr_add(pao%matrix_X, pao%matrix_D, 1.0_dp, pao%linesearch%step_size)
300 END DO
301
302 ! perform mixing of matrix_X
303 IF (do_mixing) THEN
304 CALL dbcsr_add(pao%matrix_X, matrix_x_mixing, pao%mixing, 1.0_dp - pao%mixing)
305 CALL dbcsr_release(matrix_x_mixing)
306 IF (pao%iw > 0) WRITE (pao%iw, *) "PAO| Recalculating energy after mixing."
307 CALL pao_calc_energy(pao, qs_env, ls_scf_env, energy)
308 END IF
309
310 CALL pao_write_restart(pao, qs_env, energy)
311 CALL pao_opt_finalize(pao)
312
313 CALL timestop(handle)
314 END SUBROUTINE pao_update
315
316! **************************************************************************************************
317!> \brief Calculate PAO forces and store density matrix for future ASPC extrapolations
318!> \param qs_env ...
319!> \param ls_scf_env ...
320!> \param pao_is_done ...
321! **************************************************************************************************
322 SUBROUTINE pao_post_scf(qs_env, ls_scf_env, pao_is_done)
323 TYPE(qs_environment_type), POINTER :: qs_env
324 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
325 LOGICAL, INTENT(IN) :: pao_is_done
326
327 CHARACTER(len=*), PARAMETER :: routinen = 'pao_post_scf'
328
329 INTEGER :: handle
330
331 IF (.NOT. ls_scf_env%do_pao) RETURN
332 IF (.NOT. pao_is_done) RETURN
333
334 CALL timeset(routinen, handle)
335
336 ! print out the matrices here before pao_store_P converts them back into matrices in
337 ! terms of the primary basis
338 CALL pao_write_ks_matrix_csr(qs_env, ls_scf_env)
339 CALL pao_write_s_matrix_csr(qs_env, ls_scf_env)
340 CALL pao_write_hcore_matrix_csr(qs_env, ls_scf_env)
341 CALL pao_write_p_matrix_csr(qs_env, ls_scf_env)
342
343 CALL pao_store_p(qs_env, ls_scf_env)
344 IF (ls_scf_env%calculate_forces) CALL pao_add_forces(qs_env, ls_scf_env)
345
346 CALL timestop(handle)
347 END SUBROUTINE pao_post_scf
348
349! **************************************************************************************************
350!> \brief Finish a PAO optimization run.
351!> \param ls_scf_env ...
352! **************************************************************************************************
353 SUBROUTINE pao_optimization_end(ls_scf_env)
354 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
355
356 CHARACTER(len=*), PARAMETER :: routinen = 'pao_optimization_end'
357
358 INTEGER :: handle
359 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
360 TYPE(pao_env_type), POINTER :: pao
361
362 IF (.NOT. ls_scf_env%do_pao) RETURN
363
364 pao => ls_scf_env%pao_env
365 ls_mstruct => ls_scf_env%ls_mstruct
366
367 CALL timeset(routinen, handle)
368
369 CALL pao_param_finalize(pao)
370
371 ! We keep pao%matrix_X for next scf-run, e.g. during MD or GEO-OPT
372 CALL dbcsr_release(pao%matrix_X_orig)
373 CALL dbcsr_release(pao%matrix_G)
374 CALL dbcsr_release(ls_mstruct%matrix_A)
375 CALL dbcsr_release(ls_mstruct%matrix_B)
376
377 CALL linesearch_finalize(pao%linesearch)
378
379 CALL timestop(handle)
380 END SUBROUTINE pao_optimization_end
381
382END MODULE pao_main
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public schuett2018
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_reserve_diag_blocks(matrix)
Reserves all diagonal blocks.
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
Types needed for a linear scaling quickstep SCF run based on the density matrix.
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
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
A generic framework to calculate step lengths for 1D line search.
Definition linesearch.F:12
subroutine, public linesearch_finalize(this)
Finzalize line search machinery.
Definition linesearch.F:259
subroutine, public linesearch_init(this, section, label)
Initialize linesearch from given input section.
Definition linesearch.F:195
subroutine, public linesearch_reset(this)
Reset line search to initial state.
Definition linesearch.F:285
subroutine, public linesearch_step(this, energy, slope)
Calculate step length of next line search step.
Definition linesearch.F:299
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:153
subroutine, public parse_pao_section(pao, input)
Declare the PAO input section.
Definition pao_input.F:69
Routines for reading and writing restart files.
Definition pao_io.F:12
subroutine, public pao_write_p_matrix_csr(qs_env, ls_scf_env)
writing the density matrix (NYA)
Definition pao_io.F:752
subroutine, public pao_write_hcore_matrix_csr(qs_env, ls_scf_env)
writing the core Hamiltonian matrix (NYA)
Definition pao_io.F:710
subroutine, public pao_write_restart(pao, qs_env, energy)
Writes restart file.
Definition pao_io.F:392
subroutine, public pao_write_ks_matrix_csr(qs_env, ls_scf_env)
writing the KS matrix (in terms of the PAO basis) in csr format into a file
Definition pao_io.F:563
subroutine, public pao_write_s_matrix_csr(qs_env, ls_scf_env)
writing the overlap matrix (in terms of the PAO basis) in csr format into a file
Definition pao_io.F:638
subroutine, public pao_read_restart(pao, qs_env)
Reads restart file.
Definition pao_io.F:88
Main module for the PAO method.
Definition pao_main.F:12
subroutine, public pao_post_scf(qs_env, ls_scf_env, pao_is_done)
Calculate PAO forces and store density matrix for future ASPC extrapolations.
Definition pao_main.F:323
subroutine, public pao_update(qs_env, ls_scf_env, pao_is_done)
Called after the SCF optimization, updates the PAO basis.
Definition pao_main.F:192
subroutine, public pao_init(qs_env, ls_scf_env)
Initialize the PAO environment.
Definition pao_main.F:77
subroutine, public pao_optimization_end(ls_scf_env)
Finish a PAO optimization run.
Definition pao_main.F:354
subroutine, public pao_optimization_start(qs_env, ls_scf_env)
Start a PAO optimization run.
Definition pao_main.F:111
Methods used by pao_main.F.
Definition pao_methods.F:12
subroutine, public pao_build_orthogonalizer(pao, qs_env)
Constructs matrix_N and its inverse.
subroutine, public pao_build_core_hamiltonian(pao, qs_env)
Creates the matrix_H0 which contains the core hamiltonian.
subroutine, public pao_guess_initial_p(pao, qs_env, ls_scf_env)
Provide an initial guess for the density matrix.
subroutine, public pao_test_convergence(pao, ls_scf_env, new_energy, is_converged)
Test whether the PAO optimization has reached convergence.
subroutine, public pao_add_forces(qs_env, ls_scf_env)
Calculate the forces contributed by PAO.
subroutine, public pao_check_trace_ps(ls_scf_env)
Ensure that the number of electrons is correct.
subroutine, public pao_init_kinds(pao, qs_env)
Initialize qs kinds.
Definition pao_methods.F:97
subroutine, public pao_build_matrix_x(pao, qs_env)
Creates the matrix_X.
subroutine, public pao_check_grad(pao, qs_env, ls_scf_env)
Debugging routine for checking the analytic gradient.
subroutine, public pao_print_atom_info(pao)
Prints a one line summary for each atom.
subroutine, public pao_store_p(qs_env, ls_scf_env)
Stores density matrix as initial guess for next SCF optimization.
subroutine, public pao_build_selector(pao, qs_env)
Build rectangular matrix to converert between primary and PAO basis.
subroutine, public pao_calc_energy(pao, qs_env, ls_scf_env, energy)
Calculate the pao energy.
subroutine, public pao_build_diag_distribution(pao, qs_env)
Creates new DBCSR distribution which spreads diagonal blocks evenly across ranks.
Main module for PAO Machine Learning.
Definition pao_ml.F:12
subroutine, public pao_ml_init(pao, qs_env)
Initializes the learning machinery.
Definition pao_ml.F:85
subroutine, public pao_ml_predict(pao, qs_env)
Fills paomatrix_X based on machine learning predictions.
Definition pao_ml.F:505
Module for equivariant PAO-ML based on PyTorch.
Definition pao_model.F:12
subroutine, public pao_model_predict(pao, qs_env)
Fills paomatrix_X based on machine learning predictions.
Definition pao_model.F:147
Optimizers used by pao_main.F.
subroutine, public pao_opt_init(pao)
Initialize the optimizer.
subroutine, public pao_opt_finalize(pao)
Finalize the optimizer.
subroutine, public pao_opt_new_dir(pao, icycle)
Calculates the new search direction.
Front-End for any PAO parametrization.
Definition pao_param.F:12
subroutine, public pao_param_initial_guess(pao, qs_env)
Fills matrix_X with an initial guess.
Definition pao_param.F:207
subroutine, public pao_param_init(pao, qs_env)
Initialize PAO parametrization.
Definition pao_param.F:109
subroutine, public pao_calc_ab(pao, qs_env, ls_scf_env, gradient, penalty, forces)
Takes current matrix_X and calculates the matrices A and B.
Definition pao_param.F:70
subroutine, public pao_param_finalize(pao)
Finalize PAO parametrization.
Definition pao_param.F:140
Types used by the PAO machinery.
Definition pao_types.F:12
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, 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, 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.