(git:b2ae3e3)
Loading...
Searching...
No Matches
optimize_basis.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!--------------------------------------------------------------------------------------------------!
14 USE cp_fm_types, ONLY: cp_fm_release,&
27 USE input_cp2k_read, ONLY: empty_initial_variables,&
32 USE kinds, ONLY: default_path_length,&
33 dp
34 USE machine, ONLY: m_chdir,&
35 m_getcwd,&
37 USE message_passing, ONLY: mp_comm_type,&
54 USE powell, ONLY: powell_optimize
60 USE qs_ks_types, ONLY: get_ks_env,&
63 USE qs_mo_types, ONLY: allocate_mo_set,&
72#include "./base/base_uses.f90"
73
74 IMPLICIT NONE
75 PRIVATE
76
77 PUBLIC :: run_optimize_basis
78
79 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'optimize_basis'
80
81CONTAINS
82
83! **************************************************************************************************
84!> \brief main entry point for methods aimed at optimizing basis sets
85!> \param input_declaration ...
86!> \param root_section ...
87!> \param para_env ...
88!> \author Florian Schiffmann
89! **************************************************************************************************
90 SUBROUTINE run_optimize_basis(input_declaration, root_section, para_env)
91 TYPE(section_type), POINTER :: input_declaration
92 TYPE(section_vals_type), POINTER :: root_section
93 TYPE(mp_para_env_type), POINTER :: para_env
94
95 CHARACTER(len=*), PARAMETER :: routinen = 'run_optimize_basis'
96
97 INTEGER :: handle
98 TYPE(basis_optimization_type) :: opt_bas
99
100 CALL timeset(routinen, handle)
101
102 CALL optimize_basis_init_read_input(opt_bas, root_section, para_env)
103
104 CALL driver_para_opt_basis(opt_bas, input_declaration, para_env)
105
107 CALL timestop(handle)
108
109 END SUBROUTINE run_optimize_basis
110
111! **************************************************************************************************
112!> \brief driver routine for the parallel part of the method
113!> \param opt_bas ...
114!> \param input_declaration ...
115!> \param para_env ...
116!> \author Florian Schiffmann
117! **************************************************************************************************
118
119 SUBROUTINE driver_para_opt_basis(opt_bas, input_declaration, para_env)
120 TYPE(basis_optimization_type) :: opt_bas
121 TYPE(section_type), POINTER :: input_declaration
122 TYPE(mp_para_env_type), POINTER :: para_env
123
124 CHARACTER(len=*), PARAMETER :: routinen = 'driver_para_opt_basis'
125
126 INTEGER :: handle, n_groups_created
127 TYPE(mp_comm_type) :: opt_group
128 INTEGER, DIMENSION(:), POINTER :: group_distribution_p
129 INTEGER, DIMENSION(0:para_env%num_pe-1), TARGET :: group_distribution
130
131 CALL timeset(routinen, handle)
132 group_distribution_p => group_distribution
133 CALL opt_group%from_split(para_env, n_groups_created, group_distribution_p, &
134 n_subgroups=SIZE(opt_bas%group_partition), group_partition=opt_bas%group_partition)
135 opt_bas%opt_id = group_distribution(para_env%mepos) + 1
136 opt_bas%n_groups_created = n_groups_created
137 ALLOCATE (opt_bas%sub_sources(0:para_env%num_pe - 1))
138
139 CALL driver_optimization_para_low(opt_bas, input_declaration, para_env, opt_group)
140
141 CALL opt_group%free()
142 CALL timestop(handle)
143
144 END SUBROUTINE driver_para_opt_basis
145
146! **************************************************************************************************
147!> \brief low level optimization routine includes initialization of the subsytems
148!> powell optimizer and deallocation of the various force envs
149!> \param opt_bas ...
150!> \param input_declaration ...
151!> \param para_env_top ...
152!> \param mpi_comm_opt ...
153!> \author Florian Schiffmann
154! **************************************************************************************************
155
156 SUBROUTINE driver_optimization_para_low(opt_bas, input_declaration, para_env_top, mpi_comm_opt)
157 TYPE(basis_optimization_type) :: opt_bas
158 TYPE(section_type), POINTER :: input_declaration
159 TYPE(mp_para_env_type), POINTER :: para_env_top
160 TYPE(mp_comm_type), INTENT(IN) :: mpi_comm_opt
161
162 CHARACTER(len=*), PARAMETER :: routinen = 'driver_optimization_para_low'
163
164 INTEGER :: handle, icalc, iopt, is, mp_id, stat
165 INTEGER, ALLOCATABLE, DIMENSION(:) :: f_env_id
166 LOGICAL :: write_basis
167 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: tot_time
168 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: matrix_s_inv
169 TYPE(f_env_type), POINTER :: f_env
170 TYPE(mp_para_env_type), POINTER :: para_env
171
172 NULLIFY (f_env)
173
174 CALL timeset(routinen, handle)
175
176 ! ====== initialize the f_env and precompute some matrices =====
177 mp_id = opt_bas%opt_id
178 NULLIFY (para_env, f_env)
179 ALLOCATE (f_env_id(SIZE(opt_bas%comp_group(mp_id)%member_list)))
180 ALLOCATE (tot_time(opt_bas%ncombinations*opt_bas%ntraining_sets))
181 ALLOCATE (matrix_s_inv(SIZE(opt_bas%comp_group(mp_id)%member_list)))
182
183 ALLOCATE (para_env)
184 para_env = mpi_comm_opt
185
186 is = -1
187 IF (para_env%is_source()) is = para_env_top%mepos
188 CALL para_env_top%allgather(is, opt_bas%sub_sources)
189
190 CALL init_training_force_envs(opt_bas, f_env_id, input_declaration, matrix_s_inv, para_env, mpi_comm_opt)
191
192 CALL init_free_vars(opt_bas)
193 tot_time = 0.0_dp
194
195 ! ======= The real optimization loop =======
196 DO iopt = 0, opt_bas%powell_param%maxfun
197 CALL compute_residuum_vectors(opt_bas, f_env_id, matrix_s_inv, tot_time, &
198 para_env_top, para_env, iopt)
199 IF (para_env_top%is_source()) THEN
200 CALL powell_optimize(opt_bas%powell_param%nvar, opt_bas%x_opt, opt_bas%powell_param)
201 END IF
202 CALL para_env_top%bcast(opt_bas%powell_param%state)
203 CALL para_env_top%bcast(opt_bas%x_opt)
204 CALL update_free_vars(opt_bas)
205 write_basis = mod(iopt, opt_bas%write_frequency) == 0
206 CALL update_derived_basis_sets(opt_bas, write_basis, opt_bas%output_basis_file, &
207 para_env_top)
208 IF (opt_bas%powell_param%state == -1) EXIT
209 END DO
210
211 ! ======= Update the basis set and print the final basis =======
212 IF (para_env_top%is_source()) THEN
213 opt_bas%powell_param%state = 8
214 CALL powell_optimize(opt_bas%powell_param%nvar, opt_bas%x_opt, opt_bas%powell_param)
215 END IF
216
217 CALL para_env_top%bcast(opt_bas%x_opt)
218 CALL update_free_vars(opt_bas)
219 CALL update_derived_basis_sets(opt_bas, .true., opt_bas%output_basis_file, &
220 para_env_top)
221
222 ! ====== get rid of the f_env again =====
223
224 DO icalc = SIZE(opt_bas%comp_group(mp_id)%member_list), 1, -1
225 CALL f_env_get_from_id(f_env_id(icalc), f_env)
226 CALL destroy_force_env(f_env_id(icalc), stat)
227 END DO
228 DEALLOCATE (f_env_id); DEALLOCATE (tot_time)
229 CALL cp_fm_release(matrix_s_inv)
230 CALL mp_para_env_release(para_env)
231 CALL timestop(handle)
232
233 END SUBROUTINE driver_optimization_para_low
234
235! **************************************************************************************************
236!> \brief compute all ingredients for powell optimizer. Rho_diff,
237!> condition number, energy,... for all ttraining sets in
238!> the computational group
239!> \param opt_bas ...
240!> \param f_env_id ...
241!> \param matrix_S_inv ...
242!> \param tot_time ...
243!> \param para_env_top ...
244!> \param para_env ...
245!> \param iopt ...
246! **************************************************************************************************
247
248 SUBROUTINE compute_residuum_vectors(opt_bas, f_env_id, matrix_S_inv, tot_time, &
249 para_env_top, para_env, iopt)
250 TYPE(basis_optimization_type) :: opt_bas
251 INTEGER, ALLOCATABLE, DIMENSION(:) :: f_env_id
252 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: matrix_s_inv
253 REAL(kind=dp), DIMENSION(:) :: tot_time
254 TYPE(mp_para_env_type), POINTER :: para_env_top, para_env
255 INTEGER :: iopt
256
257 CHARACTER(len=*), PARAMETER :: routinen = 'compute_residuum_vectors'
258
259 CHARACTER(len=8) :: basis_type
260 INTEGER :: bas_id, handle, icalc, icomb, ispin, &
261 mp_id, my_id, nao, ncalc, nelectron, &
262 nmo, nspins, set_id
263 REAL(kind=dp) :: flexible_electron_count, maxocc, n_el_f
264 REAL(kind=dp), DIMENSION(:), POINTER :: cond_vec, energy, f_vec, my_time, &
265 start_time
266 REAL(kind=dp), DIMENSION(:, :), POINTER :: gdata
267 TYPE(cp_fm_struct_type), POINTER :: fm_struct
268 TYPE(cp_fm_type), POINTER :: mo_coeff
269 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s_aux, matrix_s_aux_orb
270 TYPE(f_env_type), POINTER :: f_env
271 TYPE(force_env_type), POINTER :: force_env
272 TYPE(mo_set_type), ALLOCATABLE, DIMENSION(:) :: mos_aux
273 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
274 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
275 POINTER :: sab_aux, sab_aux_orb
276 TYPE(qs_environment_type), POINTER :: qs_env
277 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
278 TYPE(qs_ks_env_type), POINTER :: ks_env
279
280 CALL timeset(routinen, handle)
281
282 basis_type = "AUX_OPT"
283 !
284 ncalc = opt_bas%ncombinations*opt_bas%ntraining_sets
285 ALLOCATE (gdata(ncalc, 4))
286 f_vec => gdata(:, 1)
287 my_time => gdata(:, 2)
288 cond_vec => gdata(:, 3)
289 energy => gdata(:, 4)
290 !
291 f_vec = 0.0_dp; cond_vec = 0.0_dp; my_time = 0.0_dp; energy = 0.0_dp
292 mp_id = opt_bas%opt_id
293 ALLOCATE (start_time(SIZE(opt_bas%comp_group(mp_id)%member_list)))
294 !
295 DO icalc = 1, SIZE(opt_bas%comp_group(mp_id)%member_list)
296 my_id = opt_bas%comp_group(mp_id)%member_list(icalc) + 1
297 ! setup timings
298 start_time(icalc) = m_walltime()
299
300 NULLIFY (matrix_s_aux_orb, matrix_s_aux)
301 CALL get_set_and_basis_id(opt_bas%comp_group(mp_id)%member_list(icalc), opt_bas, set_id, bas_id)
302 CALL f_env_get_from_id(f_env_id(icalc), f_env)
303 force_env => f_env%force_env
304 CALL force_env_get(force_env, qs_env=qs_env)
305 CALL get_qs_env(qs_env, ks_env=ks_env)
306 CALL update_basis_set(opt_bas, bas_id, basis_type, qs_env)
307 NULLIFY (sab_aux, sab_aux_orb)
308 CALL optbas_build_neighborlist(qs_env, sab_aux, sab_aux_orb, basis_type)
309 CALL build_overlap_matrix(ks_env, matrix_s=matrix_s_aux, &
310 basis_type_a=basis_type, &
311 basis_type_b=basis_type, &
312 sab_nl=sab_aux)
313 CALL build_overlap_matrix(ks_env, matrix_s=matrix_s_aux_orb, &
314 basis_type_a=basis_type, &
315 basis_type_b="ORB", &
316 sab_nl=sab_aux_orb)
317 CALL release_neighbor_list_sets(sab_aux)
318 CALL release_neighbor_list_sets(sab_aux_orb)
319 CALL get_qs_env(qs_env, mos=mos, matrix_ks=matrix_ks)
320
321 nspins = SIZE(mos)
322 ALLOCATE (mos_aux(nspins))
323 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
324 CALL get_qs_kind_set(qs_kind_set, nsgf=nao, basis_type=basis_type)
325 DO ispin = 1, nspins
326 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, maxocc=maxocc, nelectron=nelectron, &
327 n_el_f=n_el_f, nmo=nmo, flexible_electron_count=flexible_electron_count)
328 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nmo, &
329 context=mo_coeff%matrix_struct%context, &
330 para_env=mo_coeff%matrix_struct%para_env)
331 CALL allocate_mo_set(mos_aux(ispin), nao, nmo, nelectron, &
332 n_el_f, maxocc, flexible_electron_count)
333 CALL init_mo_set(mo_set=mos_aux(ispin), fm_struct=fm_struct, name="MO_AUX")
334 CALL cp_fm_struct_release(fm_struct)
335 END DO
336
337 CALL fit_mo_coeffs(matrix_s_aux, matrix_s_aux_orb, mos, mos_aux)
338 CALL evaluate_optvals(mos, mos_aux, matrix_ks, matrix_s_aux_orb(1)%matrix, &
339 matrix_s_aux(1)%matrix, matrix_s_inv(icalc), &
340 f_vec(my_id), energy(my_id), cond_vec(my_id))
341
342 DO ispin = 1, nspins
343 CALL deallocate_mo_set(mos_aux(ispin))
344 END DO
345 DEALLOCATE (mos_aux)
346 IF (ASSOCIATED(matrix_s_aux)) CALL dbcsr_deallocate_matrix_set(matrix_s_aux)
347 IF (ASSOCIATED(matrix_s_aux_orb)) CALL dbcsr_deallocate_matrix_set(matrix_s_aux_orb)
348
349 my_time(my_id) = m_walltime() - start_time(icalc)
350 END DO
351
352 DEALLOCATE (start_time)
353
354 IF (.NOT. para_env%is_source()) THEN
355 f_vec = 0.0_dp; cond_vec = 0.0_dp; my_time = 0.0_dp; energy = 0.0_dp
356 END IF
357 ! collect date from all subgroup ionodes on the main ionode
358 CALL para_env_top%sum(gdata)
359
360 opt_bas%powell_param%f = 0.0_dp
361 IF (para_env_top%is_source()) THEN
362 DO icalc = 1, SIZE(f_vec)
363 icomb = mod(icalc - 1, opt_bas%ncombinations)
364 opt_bas%powell_param%f = opt_bas%powell_param%f + &
365 (f_vec(icalc) + energy(icalc))*opt_bas%fval_weight(icomb)
366 IF (opt_bas%use_condition_number) THEN
367 opt_bas%powell_param%f = opt_bas%powell_param%f + &
368 log(cond_vec(icalc))*opt_bas%condition_weight(icomb)
369 END IF
370 END DO
371 ELSE
372 f_vec = 0.0_dp; cond_vec = 0.0_dp; my_time = 0.0_dp; energy = 0.0_dp
373 END IF
374 CALL para_env_top%bcast(opt_bas%powell_param%f)
375
376 ! output info if required
377 CALL output_opt_info(f_vec, cond_vec, my_time, tot_time, opt_bas, iopt, para_env_top)
378 DEALLOCATE (gdata)
379
380 CALL para_env_top%sync()
381
382 CALL timestop(handle)
383
384 END SUBROUTINE compute_residuum_vectors
385
386! **************************************************************************************************
387!> \brief create the force_envs for every input in the computational group
388!> \param opt_bas ...
389!> \param f_env_id ...
390!> \param input_declaration ...
391!> \param matrix_s_inv ...
392!> \param para_env ...
393!> \param mpi_comm_opt ...
394! **************************************************************************************************
395
396 SUBROUTINE init_training_force_envs(opt_bas, f_env_id, input_declaration, matrix_s_inv, para_env, mpi_comm_opt)
397
398 TYPE(basis_optimization_type) :: opt_bas
399 INTEGER, ALLOCATABLE, DIMENSION(:) :: f_env_id
400 TYPE(section_type), POINTER :: input_declaration
401 TYPE(cp_fm_type), DIMENSION(:), INTENT(OUT) :: matrix_s_inv
402 TYPE(mp_para_env_type), POINTER :: para_env
403 TYPE(mp_comm_type) :: mpi_comm_opt
404
405 CHARACTER(len=*), PARAMETER :: routinen = 'init_training_force_envs'
406
407 CHARACTER(len=default_path_length) :: main_dir
408 INTEGER :: bas_id, handle, icalc, ierr, mp_id, &
409 set_id, stat
410 TYPE(cp_blacs_env_type), POINTER :: blacs_env
411 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
412 TYPE(f_env_type), POINTER :: f_env
413 TYPE(force_env_type), POINTER :: force_env
414 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
415 POINTER :: sab_orb
416 TYPE(qs_environment_type), POINTER :: qs_env
417 TYPE(qs_ks_env_type), POINTER :: ks_env
418 TYPE(section_vals_type), POINTER :: input_file
419
420 CALL timeset(routinen, handle)
421
422 NULLIFY (matrix_s, blacs_env, ks_env)
423
424 mp_id = opt_bas%opt_id
425 CALL m_getcwd(main_dir)
426
427 ! ======= Create f_env for all calculations in MPI group =======
428 DO icalc = 1, SIZE(opt_bas%comp_group(mp_id)%member_list)
429 NULLIFY (input_file)
430 ! parse the input of the training sets
431 CALL get_set_and_basis_id(opt_bas%comp_group(mp_id)%member_list(icalc), opt_bas, set_id, bas_id)
432 CALL m_chdir(trim(opt_bas%training_dir(set_id)), ierr)
433 IF (ierr /= 0) THEN
434 CALL cp_abort(__location__, &
435 "Could not change to directory <"//trim(opt_bas%training_dir(set_id))//">")
436 END IF
437 input_file => read_input(input_declaration, &
438 opt_bas%training_input(set_id), &
439 initial_variables=empty_initial_variables, &
440 para_env=para_env)
441
442 CALL modify_input_settings(opt_bas, bas_id, input_file)
443 CALL create_force_env(f_env_id(icalc), &
444 input_declaration=input_declaration, &
445 input_path=opt_bas%training_input(set_id), &
446 input=input_file, &
447 output_path="scrap_information", &
448 mpi_comm=mpi_comm_opt, &
449 ierr=stat)
450
451 ! some weirdness with the default stacks defaults have to be addded to get the
452 ! correct default program name this causes trouble with the timer stack if kept
453 CALL f_env_add_defaults(f_env_id(icalc), f_env)
454 force_env => f_env%force_env
455 CALL force_env_get(force_env, qs_env=qs_env)
456 CALL allocate_mo_sets(qs_env)
457 CALL f_env_rm_defaults(f_env, stat)
458 CALL get_qs_env(qs_env, ks_env=ks_env)
459 CALL build_qs_neighbor_lists(qs_env, para_env, molecular=.false., &
460 force_env_section=qs_env%input)
461 CALL get_ks_env(ks_env, &
462 matrix_s=matrix_s, &
463 sab_orb=sab_orb)
464 CALL build_overlap_matrix(ks_env, matrix_s=matrix_s, &
465 matrix_name="OVERLAP", &
466 basis_type_a="ORB", &
467 basis_type_b="ORB", &
468 sab_nl=sab_orb)
469 CALL set_ks_env(ks_env, matrix_s=matrix_s)
470 CALL get_qs_env(qs_env, matrix_s=matrix_s, blacs_env=blacs_env)
471 CALL calculate_overlap_inverse(matrix_s(1)%matrix, matrix_s_inv(icalc), &
472 para_env, blacs_env)
473 CALL calculate_ks_matrix(qs_env)
474
475 CALL section_vals_release(input_file)
476
477 CALL qs_env_part_release(qs_env)
478
479 CALL m_chdir(trim(adjustl(main_dir)), ierr)
480 END DO
481
482 CALL timestop(handle)
483
484 END SUBROUTINE init_training_force_envs
485
486! **************************************************************************************************
487!> \brief variable update from the powell vector for all sets
488!> \param opt_bas ...
489!> \author Florian Schiffmann
490! **************************************************************************************************
491
492 SUBROUTINE update_free_vars(opt_bas)
493 TYPE(basis_optimization_type) :: opt_bas
494
495 CHARACTER(len=*), PARAMETER :: routinen = 'update_free_vars'
496
497 INTEGER :: handle, ikind, iset, ix
498
499 CALL timeset(routinen, handle)
500 ix = 0
501 DO ikind = 1, opt_bas%nkind
502 DO iset = 1, opt_bas%kind_basis(ikind)%flex_basis(0)%nsets
503 CALL update_subset_freevars(opt_bas%kind_basis(ikind)%flex_basis(0)%subset(iset), ix, opt_bas%x_opt)
504 END DO
505 END DO
506 CALL timestop(handle)
507
508 END SUBROUTINE update_free_vars
509
510! **************************************************************************************************
511!> \brief low level update for the basis sets. Exponents are transformed according to constraint
512!> \param subset ...
513!> \param ix ...
514!> \param x ...
515!> \author Florian Schiffmann
516! **************************************************************************************************
517
518 SUBROUTINE update_subset_freevars(subset, ix, x)
519 TYPE(subset_type) :: subset
520 INTEGER :: ix
521 REAL(kind=dp), DIMENSION(:) :: x
522
523 CHARACTER(len=*), PARAMETER :: routinen = 'update_subset_freevars'
524
525 INTEGER :: handle, icon1, icon2, icont, iexp, il, &
526 istart
527 REAL(kind=dp) :: fermi_f, gs_scale
528
529 CALL timeset(routinen, handle)
530 DO iexp = 1, subset%nexp
531 IF (subset%opt_exps(iexp)) THEN
532 ix = ix + 1
533 subset%exps(iexp) = abs(x(ix))
534 IF (subset%exp_has_const(iexp)) THEN
535 !use a fermi function to keep exponents in a given range around their initial value
536 fermi_f = 1.0_dp/(exp((x(ix) - 1.0_dp)/0.5_dp) + 1.0_dp)
537 subset%exps(iexp) = (2.0_dp*fermi_f - 1.0_dp)*subset%exp_const(iexp)%var_fac*subset%exp_const(iexp)%init + &
538 subset%exp_const(iexp)%init
539 ELSE
540
541 END IF
542 END IF
543 DO icont = 1, subset%ncon_tot
544 IF (subset%opt_coeff(iexp, icont)) THEN
545 ix = ix + 1
546 subset%coeff(iexp, icont) = x(ix)
547 END IF
548 END DO
549 END DO
550
551 ! orthonormalize contraction coefficients using gram schmidt
552 istart = 1
553 DO il = 1, subset%nl
554 DO icon1 = istart, istart + subset%l(il) - 2
555 DO icon2 = icon1 + 1, istart + subset%l(il) - 1
556 gs_scale = dot_product(subset%coeff(:, icon2), subset%coeff(:, icon1))/ &
557 dot_product(subset%coeff(:, icon1), subset%coeff(:, icon1))
558 subset%coeff(:, icon2) = subset%coeff(:, icon2) - gs_scale*subset%coeff(:, icon1)
559 END DO
560 END DO
561 istart = istart + subset%l(il)
562 END DO
563
564 DO icon1 = 1, subset%ncon_tot
565 subset%coeff(:, icon1) = subset%coeff(:, icon1)/norm2(subset%coeff(:, icon1))
566 END DO
567 CALL timestop(handle)
568
569 END SUBROUTINE update_subset_freevars
570
571! **************************************************************************************************
572!> \brief variable initialization for the powell vector for all sets
573!> \param opt_bas ...
574!> \author Florian Schiffmann
575! **************************************************************************************************
576
577 SUBROUTINE init_free_vars(opt_bas)
578 TYPE(basis_optimization_type) :: opt_bas
579
580 CHARACTER(len=*), PARAMETER :: routinen = 'init_free_vars'
581
582 INTEGER :: handle, ikind, iset, ix
583
584 CALL timeset(routinen, handle)
585 ix = 0
586 DO ikind = 1, opt_bas%nkind
587 DO iset = 1, opt_bas%kind_basis(ikind)%flex_basis(0)%nsets
588 CALL init_subset_freevars(opt_bas%kind_basis(ikind)%flex_basis(0)%subset(iset), ix, opt_bas%x_opt)
589 END DO
590 END DO
591 CALL timestop(handle)
592
593 END SUBROUTINE init_free_vars
594
595! **************************************************************************************************
596!> \brief variable initialization for the powell vector from low level informations
597!> constraint exponents will be mapped on a fermi function
598!> \param subset ...
599!> \param ix ...
600!> \param x ...
601!> \author Florian Schiffmann
602! **************************************************************************************************
603
604 SUBROUTINE init_subset_freevars(subset, ix, x)
605 TYPE(subset_type) :: subset
606 INTEGER :: ix
607 REAL(kind=dp), DIMENSION(:) :: x
608
609 CHARACTER(len=*), PARAMETER :: routinen = 'init_subset_freevars'
610
611 INTEGER :: handle, icont, iexp
612 REAL(kind=dp) :: fract
613
614 CALL timeset(routinen, handle)
615
616 DO iexp = 1, subset%nexp
617 IF (subset%opt_exps(iexp)) THEN
618 ix = ix + 1
619 x(ix) = subset%exps(iexp)
620 IF (subset%exp_has_const(iexp)) THEN
621 IF (subset%exp_const(iexp)%const_type == 0) THEN
622 fract = 1.0_dp + (subset%exps(iexp) - subset%exp_const(iexp)%init)/ &
623 (subset%exp_const(iexp)%init*subset%exp_const(iexp)%var_fac)
624 x(ix) = 0.5_dp*log((2.0_dp/fract - 1.0_dp)) + 1.0_dp
625 END IF
626 IF (subset%exp_const(iexp)%const_type == 1) THEN
627 x(ix) = 1.0_dp
628 END IF
629 END IF
630 END IF
631 DO icont = 1, subset%ncon_tot
632 IF (subset%opt_coeff(iexp, icont)) THEN
633 ix = ix + 1
634 x(ix) = subset%coeff(iexp, icont)
635 END IF
636 END DO
637 END DO
638 CALL timestop(handle)
639
640 END SUBROUTINE init_subset_freevars
641
642! **************************************************************************************************
643!> \brief commuticates all info to the master and assembles the output
644!> \param f_vec ...
645!> \param cond_vec ...
646!> \param my_time ...
647!> \param tot_time ...
648!> \param opt_bas ...
649!> \param iopt ...
650!> \param para_env_top ...
651!> \author Florian Schiffmann
652! **************************************************************************************************
653
654 SUBROUTINE output_opt_info(f_vec, cond_vec, my_time, tot_time, opt_bas, iopt, para_env_top)
655 REAL(kind=dp), DIMENSION(:) :: f_vec, cond_vec, my_time, tot_time
656 TYPE(basis_optimization_type) :: opt_bas
657 INTEGER :: iopt
658 TYPE(mp_para_env_type), POINTER :: para_env_top
659
660 CHARACTER(len=*), PARAMETER :: routinen = 'output_opt_info'
661
662 INTEGER :: handle, ibasis, icalc, iset, unit_nr
663 TYPE(cp_logger_type), POINTER :: logger
664
665 CALL timeset(routinen, handle)
666 logger => cp_get_default_logger()
667
668 tot_time = tot_time + my_time
669
670 unit_nr = -1
671 IF (para_env_top%is_source() .AND. (mod(iopt, opt_bas%write_frequency) == 0 .OR. iopt == opt_bas%powell_param%maxfun)) THEN
672 unit_nr = cp_logger_get_default_unit_nr(logger)
673 END IF
674
675 IF (unit_nr > 0) THEN
676 WRITE (unit_nr, '(1X,A,I8)') "BASOPT| Information at iteration number:", iopt
677 WRITE (unit_nr, '(1X,A)') "BASOPT| Training set | Combination | Rho difference | Condition num. | Time"
678 WRITE (unit_nr, '(1X,A)') "BASOPT| -----------------------------------------------------------------------"
679 icalc = 0
680 DO iset = 1, opt_bas%ntraining_sets
681 DO ibasis = 1, opt_bas%ncombinations
682 icalc = icalc + 1
683 WRITE (unit_nr, '(1X,A,2(5X,I3,5X,A),2(1X,E14.8,1X,A),1X,F8.1)') &
684 'BASOPT| ', iset, "|", ibasis, "|", f_vec(icalc), "|", cond_vec(icalc), "|", tot_time(icalc)
685 END DO
686 END DO
687 WRITE (unit_nr, '(1X,A)') "BASOPT| -----------------------------------------------------------------------"
688 WRITE (unit_nr, '(1X,A,E14.8)') "BASOPT| Total residuum value: ", opt_bas%powell_param%f
689 WRITE (unit_nr, '(A)') ""
690 END IF
691 CALL timestop(handle)
692 END SUBROUTINE output_opt_info
693
694END MODULE optimize_basis
695
void update_basis_set(const int nkinds, const grid_basis_set **const basis_sets, grid_context *data)
methods related to the blacs parallel environment
DBCSR operations in CP2K.
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
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 ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
interface to use cp2k as library
recursive subroutine, public destroy_force_env(env_id, ierr, q_finalize)
deallocates the force_env with the given id
subroutine, public f_env_get_from_id(f_env_id, f_env)
...
subroutine, public f_env_add_defaults(f_env_id, f_env, handle)
adds the default environments of the f_env to the stack of the defaults, and returns a new error and ...
recursive subroutine, public create_force_env(new_env_id, input_declaration, input_path, output_path, mpi_comm, output_unit, owns_out_unit, input, ierr, work_dir, initial_variables)
creates a new force environment using the given input, and writing the output to the given output uni...
subroutine, public f_env_rm_defaults(f_env, ierr, handle)
removes the default environments of the f_env to the stack of the defaults, and sets ierr accordingly...
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
parse cp2k input files
type(section_vals_type) function, pointer, public read_input(input_declaration, file_path, initial_variables, para_env)
reads the cp2k input from the given filepath and returns a section_vals containing the input
objects that represent the structure of input sections and the data contained in an input section
recursive subroutine, public section_vals_release(section_vals)
releases the given object
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
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_getcwd(curdir)
...
Definition machine.F:607
subroutine, public m_chdir(dir, ierror)
...
Definition machine.F:636
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:141
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)
subroutine, public modify_input_settings(basis_optimization, bas_id, input_file)
change settings in the training input files to initialize all needed structures and adjust settings t...
subroutine, public calculate_ks_matrix(qs_env)
...
subroutine, public calculate_overlap_inverse(matrix_s, matrix_s_inv, para_env, context)
...
subroutine, public allocate_mo_sets(qs_env)
...
subroutine, public optbas_build_neighborlist(qs_env, sab_aux, sab_aux_orb, basis_type)
rebuilds neighborlist for absis sets
subroutine, public evaluate_optvals(mos, mos_aux_fit, matrix_ks, q, snew, s_inv_orb, fval, energy, s_cond_number)
...
subroutine, public fit_mo_coeffs(saux, sauxorb, mos, mosaux)
...
subroutine, public deallocate_basis_optimization_type(opt_bas)
Deallocate everything which was allocated before. Note not all arrays are used depending on the type ...
subroutine, public get_set_and_basis_id(calc_id, opt_bas, set_id, bas_id)
returns a mapping from the calculation id to the trainings set id and basis combination id
subroutine, public optimize_basis_init_read_input(opt_bas, root_section, para_env)
initialize all parts of the optimization type and read input settings
subroutine, public update_derived_basis_sets(opt_bas, write_it, output_file, para_env)
Regenerate the basis sets from reference 0 after an update from the optimizer to reference was perfor...
subroutine, public run_optimize_basis(input_declaration, root_section, para_env)
main entry point for methods aimed at optimizing basis sets
Definition powell.F:9
subroutine, public powell_optimize(n, x, optstate)
...
Definition powell.F:55
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, 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.
subroutine, public qs_env_part_release(qs_env)
releases part of the given qs_env in order to save memory
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name, counter)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
subroutine, public allocate_mo_set(mo_set, nao, nmo, nelectron, n_el_f, maxocc, flexible_electron_count)
Allocates a mo set and partially initializes it (nao,nmo,nelectron, and flexible_electron_count are v...
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
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)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Generate the atomic neighbor lists.
subroutine, public build_qs_neighbor_lists(qs_env, para_env, molecular, force_env_section)
Build all the required neighbor lists for Quickstep.
Calculation of overlap matrix, its derivatives and forces.
Definition qs_overlap.F:19
subroutine, public build_overlap_matrix(ks_env, matrix_s, matrixkp_s, matrix_name, nderivative, basis_type_a, basis_type_b, sab_nl, calculate_forces, matrix_p, matrixkp_p, ext_kpoints)
Calculation of the overlap matrix over Cartesian Gaussian functions.
Definition qs_overlap.F:121
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
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...
wrapper to abstract the force evaluation of the various methods
represent a section of the input file
stores all the informations relevant to an mpi environment
type containing all information needed for basis matching
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...