28#include "./base/base_uses.f90"
34 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'almo_scf_types'
51 REAL(kind=
dp) :: final_determinant = 0.0_dp, penalty_strength = 0.0_dp, &
52 determinant_tolerance = 0.0_dp, penalty_strength_dec_factor = 0.0_dp, &
53 compactification_filter_start = 0.0_dp
54 INTEGER :: operator_type = 0
55 LOGICAL :: virtual_nlmos = .false.
60 TYPE almo_analysis_type
63 LOGICAL :: do_analysis = .false.
65 INTEGER :: frozen_mo_energy_term = 0
67 END TYPE almo_analysis_type
71 REAL(kind=
dp) :: eps_error = 0.0_dp, &
72 eps_error_early = 0.0_dp, &
73 lin_search_eps_error = 0.0_dp, &
74 lin_search_step_size_guess = 0.0_dp, &
75 rho_do_not_update = 0.0_dp, &
76 model_grad_norm_ratio = 0.0_dp, &
77 initial_trust_radius = 0.0_dp, &
78 max_trust_radius = 0.0_dp, &
79 neglect_threshold = 0.0_dp
81 INTEGER :: optimizer_type = 0
82 TYPE(penalty_type) :: opt_penalty = penalty_type()
88 max_iter_outer_loop = 0, &
89 trustr_algorithm = 0, &
92 LOGICAL :: early_stopping_on = .false.
97 INTEGER :: istore = 0, nstore = 0
98 TYPE(
dbcsr_type),
DIMENSION(:, :),
ALLOCATABLE :: matrix_p_up_down
109 INTEGER :: nspins = 0, nelectrons_total = 0, naos = 0
110 INTEGER :: natoms = 0, nmolecules = 0
111 INTEGER,
DIMENSION(2) :: nelectrons_spin = 0
126 INTEGER :: ndomains = 0
140 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: nocc_of_domain
142 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nbasis_of_domain
144 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: nvirt_full_of_domain
146 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: nvirt_of_domain
148 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: nvirt_disc_of_domain
150 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: mu_of_domain
151 INTEGER,
DIMENSION(:),
ALLOCATABLE :: first_atom_of_domain
152 INTEGER,
DIMENSION(:),
ALLOCATABLE :: last_atom_of_domain
155 INTEGER,
DIMENSION(:),
ALLOCATABLE :: domain_index_of_ao
156 INTEGER,
DIMENSION(:),
ALLOCATABLE :: domain_index_of_atom
159 INTEGER,
DIMENSION(:),
ALLOCATABLE :: charge_of_domain
161 INTEGER,
DIMENSION(:),
ALLOCATABLE :: multiplicity_of_domain
180 INTEGER :: domain_layout_mos = 0, domain_layout_aos = 0
182 INTEGER :: constraint_type = 0
204 INTEGER :: mat_distr_aos = 0, mat_distr_mos = 0
206 INTEGER,
DIMENSION(:),
ALLOCATABLE :: domain_index_of_ao_block
207 INTEGER,
DIMENSION(:),
ALLOCATABLE :: domain_index_of_mo_block
209 LOGICAL :: need_previous_ks = .false.
210 LOGICAL :: need_virtuals = .false.
211 LOGICAL :: need_orbital_energies = .false.
212 LOGICAL :: s_inv_done = .false.
213 LOGICAL :: s_sqrt_done = .false.
214 REAL(kind=
dp) :: almo_scf_energy = 0.0_dp
215 LOGICAL :: orthogonal_basis = .false., fixed_mu = .false.
216 LOGICAL :: return_orthogonalized_mos = .false., construct_nlmos = .false.
220 LOGICAL :: smear = .false.
222 REAL(kind=
dp) :: smear_e_temp = 0.0_dp
223 REAL(kind=
dp),
DIMENSION(:),
ALLOCATABLE :: kts
225 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: mo_energies
228 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: real_ne_of_domain
231 REAL(kind=
dp) :: eps_filter = 0.0_dp
232 INTEGER :: xalmo_trial_wf = 0
234 REAL(kind=
dp) :: eps_prev_guess = 0.0_dp
235 INTEGER :: order_lanczos = 0
236 REAL(kind=
dp) :: matrix_iter_eps_error_factor = 0.0_dp
237 REAL(kind=
dp) :: eps_lanczos = 0.0_dp
238 INTEGER :: max_iter_lanczos = 0
239 REAL(kind=
dp) :: mixing_fraction = 0.0_dp
240 REAL(kind=
dp) :: mu = 0.0_dp
242 INTEGER :: almo_update_algorithm = 0
244 INTEGER :: xalmo_update_algorithm = 0
246 INTEGER :: sigma_inv_algorithm = 0
249 REAL(kind=
dp) :: overlap_determinant = 0.0_dp
252 LOGICAL :: perturbative_delocalization = .false.
253 INTEGER :: quencher_radius_type = 0
254 REAL(kind=
dp) :: quencher_r0_factor = 0.0_dp, &
255 quencher_r1_factor = 0.0_dp, &
258 quencher_s0 = 0.0_dp, &
259 quencher_s1 = 0.0_dp, &
260 envelope_amplitude = 0.0_dp
266 INTEGER :: almo_extrapolation_order = 0
267 INTEGER :: xalmo_extrapolation_order = 0
270 LOGICAL :: calc_forces = .false.
293 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_sigma, &
296 matrix_sigma_sqrt_inv, &
298 matrix_sigma_inv_0deloc
301 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_err_blk
305 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_sigma_vv, &
306 matrix_sigma_vv_blk, &
307 matrix_sigma_vv_sqrt, &
308 matrix_sigma_vv_sqrt_inv
311 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_vv_full_blk, &
312 matrix_vv_disc_blk, &
316 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_vo, matrix_ov
317 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_ov_full, &
325 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_k_blk_ones
328 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_v_blk, &
339 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_ks_0deloc
345 TYPE(
dbcsr_type),
DIMENSION(:),
ALLOCATABLE :: matrix_evv_full
363 INTEGER,
DIMENSION(:),
ALLOCATABLE :: cpu_of_domain
366 TYPE(almo_analysis_type) :: almo_analysis = almo_analysis_type()
382 INTEGER :: deloc_method = 0
383 LOGICAL :: deloc_use_occ_orbs = .false.
384 LOGICAL :: deloc_cayley_use_virt_orbs = .false.
385 INTEGER :: deloc_cayley_tensor_type = 0
386 LOGICAL :: deloc_cayley_linear = .false.
387 INTEGER :: deloc_cayley_conjugator = 0
388 REAL(kind=
dp) :: deloc_cayley_eps_convergence = 0.0_dp
389 INTEGER :: deloc_cayley_max_iter = 0
390 INTEGER :: deloc_truncate_virt = 0
391 INTEGER :: deloc_virt_per_domain = 0
392 LOGICAL :: deloc_cayley_occ_precond = .false.
393 LOGICAL :: deloc_cayley_vir_precond = .false.
396 INTEGER :: opt_k_conjugator = 0
397 REAL(kind=
dp) :: opt_k_eps_convergence = 0.0_dp
398 REAL(kind=
dp) :: opt_k_trial_step_size = 0.0_dp
399 INTEGER :: opt_k_max_iter = 0
400 INTEGER :: opt_k_outer_max_iter = 0
401 REAL(kind=
dp) :: opt_k_trial_step_size_multiplier = 0.0_dp
402 INTEGER :: opt_k_conj_iter_start = 0
403 INTEGER :: opt_k_prec_iter_start = 0
404 INTEGER :: opt_k_conj_iter_freq = 0
405 INTEGER :: opt_k_prec_iter_freq = 0
408 INTEGER :: integer01 = 0
409 INTEGER :: integer02 = 0
410 INTEGER :: integer03 = 0
411 INTEGER :: integer04 = 0
412 INTEGER :: integer05 = 0
413 REAL(kind=
dp) :: real01 = 0.0_dp
414 REAL(kind=
dp) :: real02 = 0.0_dp
415 REAL(kind=
dp) :: real03 = 0.0_dp
416 REAL(kind=
dp) :: real04 = 0.0_dp
417 REAL(kind=
dp) :: real05 = 0.0_dp
418 LOGICAL :: logical01 = .false.
419 LOGICAL :: logical02 = .false.
420 LOGICAL :: logical03 = .false.
421 LOGICAL :: logical04 = .false.
422 LOGICAL :: logical05 = .false.
439 INTEGER,
INTENT(IN) :: unit_nr
441 CHARACTER(33) :: conj_string, prec_string, type_string
443 IF (unit_nr .GT. 0)
THEN
445 SELECT CASE (optimizer%optimizer_type)
451 type_string =
"TRUST REGION"
454 WRITE (unit_nr,
'(T4,A,T48,A33)')
"optimizer type:", trim(type_string)
455 WRITE (unit_nr,
'(T4,A,T48,I33)')
"maximum iterations:", optimizer%max_iter
456 WRITE (unit_nr,
'(T4,A,T48,E33.3)')
"target error:", optimizer%eps_error
460 WRITE (unit_nr,
'(T4,A,T48,I33)')
"maximum DIIS history:", optimizer%ndiis
467 WRITE (unit_nr,
'(T4,A,T48,I33)')
"maximum outer loop iterations:", &
468 optimizer%max_iter_outer_loop
470 SELECT CASE (optimizer%preconditioner)
474 prec_string =
"0.5 KS + 0.5 S, DOMAINS"
476 prec_string =
"0.5 KS + 0.5 S, FULL"
478 WRITE (unit_nr,
'(T4,A,T48,A33)')
"preconditioner:", trim(prec_string)
480 SELECT CASE (optimizer%conjugator)
482 conj_string =
"Steepest descent"
484 conj_string =
"Polak-Ribiere"
486 conj_string =
"Fletcher-Reeves"
488 conj_string =
"Hestenes-Stiefel"
490 conj_string =
"Fletcher"
492 conj_string =
"Liu-Storey"
494 conj_string =
"Dai-Yuan"
496 conj_string =
"Hager-Zhang"
498 WRITE (unit_nr,
'(T4,A,T48,A33)')
"conjugator:", trim(conj_string)
504 WRITE (unit_nr,
'(T4,A,T48,E33.3)')
"line search step size guess:", &
505 optimizer%lin_search_step_size_guess
506 WRITE (unit_nr,
'(T4,A,T48,E33.3)')
"line search target error:", &
507 optimizer%lin_search_eps_error
508 IF (optimizer%neglect_threshold .GT. 0.0_dp)
THEN
509 WRITE (unit_nr,
'(T4,A,T48,E33.3)')
"low-curvature threshold:", &
510 optimizer%neglect_threshold
517 SELECT CASE (optimizer%trustr_algorithm)
519 conj_string =
"Steihaug's CG"
521 conj_string =
"Cauchy point"
523 conj_string =
"Dogleg"
525 WRITE (unit_nr,
'(T4,A,T48,A33)')
"Subproblem algorithm:", trim(conj_string)
527 WRITE (unit_nr,
'(T4,A,T48,E33.3)')
"gradient decrease accepted:", &
528 optimizer%model_grad_norm_ratio
529 WRITE (unit_nr,
'(T4,A,T48,E33.3)')
"initial trust radius:", &
530 optimizer%initial_trust_radius
531 WRITE (unit_nr,
'(T4,A,T48,E33.3)')
"max trust radius:", &
532 optimizer%max_trust_radius
533 WRITE (unit_nr,
'(T4,A,T48,E33.3)')
"rho of no update lies between .0 and .25:", &
534 optimizer%rho_do_not_update
552 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_env_release'
554 INTEGER :: handle, ispin, istore
556 CALL timeset(routinen, handle)
559 DO ispin = 1,
SIZE(almo_scf_env%almo_history%matrix_t)
560 DO istore = 1, min(almo_scf_env%almo_history%istore, almo_scf_env%almo_history%nstore)
561 CALL dbcsr_release(almo_scf_env%almo_history%matrix_p_up_down(ispin, istore))
563 IF (almo_scf_env%almo_history%istore .GT. 0) &
564 CALL dbcsr_release(almo_scf_env%almo_history%matrix_t(ispin))
566 DEALLOCATE (almo_scf_env%almo_history%matrix_p_up_down)
567 DEALLOCATE (almo_scf_env%almo_history%matrix_t)
569 DO ispin = 1,
SIZE(almo_scf_env%xalmo_history%matrix_t)
570 DO istore = 1, min(almo_scf_env%xalmo_history%istore, almo_scf_env%xalmo_history%nstore)
571 CALL dbcsr_release(almo_scf_env%xalmo_history%matrix_p_up_down(ispin, istore))
574 IF (almo_scf_env%xalmo_history%istore .GT. 0) &
575 CALL dbcsr_release(almo_scf_env%xalmo_history%matrix_t(ispin))
577 DEALLOCATE (almo_scf_env%xalmo_history%matrix_p_up_down)
579 DEALLOCATE (almo_scf_env%xalmo_history%matrix_t)
581 DEALLOCATE (almo_scf_env)
583 CALL timestop(handle)
Types for all ALMO-based methods.
real(kind=dp), parameter, public almo_max_cutoff_multiplier
integer, parameter, public almo_mat_dim_domains
integer, parameter, public almo_mat_dim_occ
integer, parameter, public almo_mat_dim_virt_full
integer, parameter, public almo_mat_dim_aobasis
subroutine, public print_optimizer_options(optimizer, unit_nr)
Prints out the options of an optimizer.
integer, parameter, public almo_mat_dim_virt
integer, parameter, public almo_mat_dim_virt_disc
subroutine, public almo_scf_env_release(almo_scf_env)
release the almo scf envirnoment
methods related to the blacs parallel environment
subroutine, public dbcsr_release(matrix)
...
Types to handle submatrices.
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
computes preconditioners, and implements methods to apply them currently used in qs_ot
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
stores all the informations relevant to an mpi environment