Line data Source code
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 Types for all ALMO-based methods
10 : !> \par History
11 : !> 2011.05 created [Rustam Z Khaliullin]
12 : !> 2018.09 smearing support [Ruben Staub]
13 : !> \author Rustam Z Khaliullin
14 : ! **************************************************************************************************
15 : MODULE almo_scf_types
16 : USE cp_blacs_env, ONLY: cp_blacs_env_type
17 : USE cp_dbcsr_api, ONLY: dbcsr_release,&
18 : dbcsr_type
19 : USE domain_submatrix_types, ONLY: domain_map_type,&
20 : domain_submatrix_type
21 : USE input_constants, ONLY: &
22 : cg_dai_yuan, cg_fletcher, cg_fletcher_reeves, cg_hager_zhang, cg_hestenes_stiefel, &
23 : cg_liu_storey, cg_polak_ribiere, cg_zero, optimizer_diis, optimizer_pcg, optimizer_trustr, &
24 : trustr_cauchy, trustr_dogleg, trustr_steihaug, xalmo_prec_domain, xalmo_prec_full, &
25 : xalmo_prec_zero
26 : USE kinds, ONLY: dp
27 : USE message_passing, ONLY: mp_para_env_type
28 : #include "./base/base_uses.f90"
29 :
30 : IMPLICIT NONE
31 :
32 : PRIVATE
33 :
34 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'almo_scf_types'
35 :
36 : INTEGER, PARAMETER, PUBLIC :: almo_mat_dim_aobasis = 1, &
37 : almo_mat_dim_occ = 2, &
38 : almo_mat_dim_virt = 3, &
39 : almo_mat_dim_virt_full = 4, &
40 : almo_mat_dim_domains = 5, &
41 : almo_mat_dim_virt_disc = 6
42 : REAL(KIND=dp), PARAMETER, PUBLIC :: almo_max_cutoff_multiplier = 2.2_dp
43 :
44 : PUBLIC :: almo_scf_env_type, optimizer_options_type, &
45 : print_optimizer_options, almo_scf_env_release, &
46 : almo_scf_history_type
47 :
48 : ! methods that add penalty terms to the energy functional
49 : TYPE penalty_type
50 :
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.
56 :
57 : END TYPE penalty_type
58 :
59 : TYPE fragment_type
60 :
61 : INTEGER :: fragment_parameters = 0, charge = 0, multiplicity = 1
62 :
63 : END TYPE fragment_type
64 :
65 : ! almo-based electronic structure analysis
66 : TYPE almo_analysis_type
67 :
68 : ! switch analysis on/off
69 : LOGICAL :: do_analysis = .FALSE.
70 :
71 : INTEGER :: frozen_mo_energy_term = 0
72 :
73 : END TYPE almo_analysis_type
74 :
75 : TYPE optimizer_options_type
76 :
77 : REAL(KIND=dp) :: eps_error = 0.0_dp, &
78 : eps_error_early = 0.0_dp, &
79 : lin_search_eps_error = 0.0_dp, &
80 : lin_search_step_size_guess = 0.0_dp, &
81 : rho_do_not_update = 0.0_dp, &
82 : model_grad_norm_ratio = 0.0_dp, &
83 : initial_trust_radius = 0.0_dp, &
84 : max_trust_radius = 0.0_dp, &
85 : neglect_threshold = 0.0_dp
86 :
87 : INTEGER :: optimizer_type = 0 ! diis, pcg, etc.
88 : TYPE(penalty_type) :: opt_penalty = penalty_type()
89 :
90 : INTEGER :: preconditioner = 0, & ! preconditioner type
91 : conjugator = 0, & ! conjugator type
92 : max_iter = 0, &
93 : max_iter_early = 0, &
94 : max_iter_outer_loop = 0, &
95 : trustr_algorithm = 0, &
96 : ndiis = 0 ! diis history length
97 :
98 : LOGICAL :: early_stopping_on = .FALSE.
99 :
100 : END TYPE optimizer_options_type
101 :
102 : TYPE almo_scf_history_type
103 : INTEGER :: istore = 0, nstore = 0
104 : TYPE(dbcsr_type), DIMENSION(:, :), ALLOCATABLE :: matrix_p_up_down
105 : !TYPE(dbcsr_type), DIMENSION(:, :), ALLOCATABLE :: matrix_x
106 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_t
107 : END TYPE almo_scf_history_type
108 :
109 : ! the structure contains general info about the system
110 : TYPE almo_scf_env_type
111 :
112 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
113 : TYPE(cp_blacs_env_type), POINTER :: blacs_env => NULL()
114 :
115 : INTEGER :: nspins = 0, nelectrons_total = 0, naos = 0
116 : INTEGER :: natoms = 0, nmolecules = 0
117 : INTEGER, DIMENSION(2) :: nelectrons_spin = 0
118 :
119 : ! Definitions:
120 : ! I. Domain - a subset of basis functions (e.g. AOs),
121 : ! II. Group - a subset of electrons delocalized within a domain.
122 : !
123 : ! The following variables specify the group-domain structure
124 : ! of the system. Several rules must be obeyed:
125 : ! 1. There should be no zero domains (i.e. domain contains at least one AO).
126 : ! 2. There should be no empty domains (i.e. all domains must be populated
127 : ! by at least one electron).
128 : ! 3. If two groups are localized within the same domain they are combined
129 : ! It follows that the number of domains is equal to the number of groups
130 : !
131 : ! Number of domains
132 : INTEGER :: ndomains = 0
133 :
134 : ! List of atoms, whose basis functions are included into the domain.
135 : ! It is assumed that:
136 : ! (a) basis functions are localized and atom-labeled,
137 : ! (b) basis functions are grouped into atomic sets (i.e. if a basis
138 : ! function on an atom is in domain A then all basis functions on
139 : ! this atom are in domain A)
140 : !TYPE(domain_list_type), DIMENSION(:), ALLOCATABLE :: atom_list_of_domain
141 : ! List of basis functions included into the domain
142 : !TYPE(domain_list_type), DIMENSION(:), ALLOCATABLE :: basis_list_of_domain
143 :
144 : ! Number of electrons of each spin for a given domain (second dim is spin).
145 : ! Note that some domains can be populated only with alpha or beta electrons.
146 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: nocc_of_domain
147 : ! Number of basis functions for a given domain
148 : INTEGER, DIMENSION(:), ALLOCATABLE :: nbasis_of_domain
149 : ! Define number of virtuals for a given domain: nvirt = nbasis - nocc
150 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: nvirt_full_of_domain
151 : ! Define the dimension of truncated virtual subspace for a given domain:
152 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: nvirt_of_domain
153 : ! Define the dimension of discarded virtual subspace for a given domain:
154 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: nvirt_disc_of_domain
155 : ! Each domain has its own mu - "fermi" level
156 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: mu_of_domain
157 : INTEGER, DIMENSION(:), ALLOCATABLE :: first_atom_of_domain
158 : INTEGER, DIMENSION(:), ALLOCATABLE :: last_atom_of_domain
159 : ! The following arrays are useful only with non-overlapping domains
160 : ! RZK-warning generalization is required
161 : INTEGER, DIMENSION(:), ALLOCATABLE :: domain_index_of_ao
162 : INTEGER, DIMENSION(:), ALLOCATABLE :: domain_index_of_atom
163 :
164 : ! Charge of domains
165 : INTEGER, DIMENSION(:), ALLOCATABLE :: charge_of_domain
166 : ! Charge of domains
167 : INTEGER, DIMENSION(:), ALLOCATABLE :: multiplicity_of_domain
168 : INTEGER, DIMENSION(:), ALLOCATABLE :: activate
169 : ! The matrix contains information about the delocalization of
170 : ! alpha and beta electrons.
171 : ! Rows denote basis function, columns denote electrons.
172 : ! Non-zero (j,i) entry means that electron j can delocalize over
173 : ! basis function i. 0.0 means no delocalization
174 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: quench_t
175 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: quench_t_blk
176 : ! Local array for a compact description of quench_t
177 : TYPE(domain_map_type), DIMENSION(:), ALLOCATABLE :: domain_map
178 :
179 : ! Several special cases for the structure of the group-domain matrix:
180 : ! 1. The basis functions can be grouped into:
181 : ! a. molecular sets
182 : ! b. atomic sets
183 : ! 2. Electrons can be grouped into:
184 : ! a. molecular sets
185 : ! b. atomic sets
186 : INTEGER :: domain_layout_mos = 0, domain_layout_aos = 0
187 : ! ALMO constraint type.
188 : INTEGER :: constraint_type = 0
189 :
190 : ! Desciptors of molecules
191 : !INTEGER, DIMENSION(:), ALLOCATABLE :: molecule_index_of_atom
192 : !INTEGER, DIMENSION(:), ALLOCATABLE :: first_atom_of_molecule
193 : !INTEGER, DIMENSION(:), ALLOCATABLE :: nbasis_of_molecule
194 : !INTEGER, DIMENSION(:,:), ALLOCATABLE :: nocc_of_molecule
195 : !INTEGER, DIMENSION(:,:), ALLOCATABLE :: nvirt_of_molecule
196 : !REAL(KIND=dp),DIMENSION(:,:), ALLOCATABLE :: mu_of_molecule
197 :
198 : ! Descriptors of atoms
199 : !INTEGER, DIMENSION(:), ALLOCATABLE :: nbasis_of_atom
200 : !INTEGER, DIMENSION(:,:), ALLOCATABLE :: nocc_of_atom
201 : !INTEGER, DIMENSION(:,:), ALLOCATABLE :: nvirt_of_atom
202 : !REAL(KIND=dp),DIMENSION(:,:), ALLOCATABLE :: mu_of_atom
203 :
204 : ! All AO and MO matrices are distributed for parallel computations.
205 : ! The following flags specify what constitues a block for a parallel
206 : ! distribution. Both AOs and MOs can be divided into atomic or
207 : ! molecular blocks. Domain blocks should be equal or larger than
208 : ! the distribution blocks (otherwise retain_sparsity does not work).
209 : ! Possible values: almo_mat_distr_atomic, almo_mat_distr_molecular
210 : INTEGER :: mat_distr_aos = 0, mat_distr_mos = 0
211 : ! Define mappping from a distribution block to a domain
212 : INTEGER, DIMENSION(:), ALLOCATABLE :: domain_index_of_ao_block
213 : INTEGER, DIMENSION(:), ALLOCATABLE :: domain_index_of_mo_block
214 :
215 : LOGICAL :: need_previous_ks = .FALSE.
216 : LOGICAL :: need_virtuals = .FALSE.
217 : LOGICAL :: need_orbital_energies = .FALSE.
218 : LOGICAL :: s_inv_done = .FALSE.
219 : LOGICAL :: s_sqrt_done = .FALSE.
220 : REAL(KIND=dp) :: almo_scf_energy = 0.0_dp
221 : LOGICAL :: orthogonal_basis = .FALSE., fixed_mu = .FALSE.
222 : LOGICAL :: return_orthogonalized_mos = .FALSE., construct_nlmos = .FALSE.
223 :
224 : !! Smearing control
225 : !! smear flag allow to retrieve eigenvalues in almo_scf with diag algorithm and create occupation-scaled ALMO orbitals
226 : LOGICAL :: smear = .FALSE.
227 : !! store relevant smearing parameters
228 : REAL(KIND=dp) :: smear_e_temp = 0.0_dp !! electronic temperature, required for Fermi-Dirac
229 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: kTS !! electronic entropy contribution of each spin system
230 : !! mo_energies(imo, ispin) stores the eigenvalue corresponding to the orbital imo with spin ispin
231 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: mo_energies
232 : !! since S-ALMO creates partially occupied orbitals, there is a need to store the real number of electron-pairs
233 : !! of each spin and for each fragment
234 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: real_ne_of_domain
235 :
236 : ! Controls for the SCF procedure
237 : REAL(KIND=dp) :: eps_filter = 0.0_dp
238 : INTEGER :: xalmo_trial_wf = 0
239 : INTEGER :: almo_scf_guess = 0
240 : REAL(KIND=dp) :: eps_prev_guess = 0.0_dp
241 : INTEGER :: order_lanczos = 0
242 : REAL(KIND=dp) :: matrix_iter_eps_error_factor = 0.0_dp
243 : REAL(KIND=dp) :: eps_lanczos = 0.0_dp
244 : INTEGER :: max_iter_lanczos = 0
245 : REAL(KIND=dp) :: mixing_fraction = 0.0_dp
246 : REAL(KIND=dp) :: mu = 0.0_dp
247 : ! SCF procedure for the block-diagonal ALMOs
248 : INTEGER :: almo_update_algorithm = 0
249 : ! SCF procedure for the quenched ALMOs (xALMOs)
250 : INTEGER :: xalmo_update_algorithm = 0
251 : ! mo overlap inversion algorithm
252 : INTEGER :: sigma_inv_algorithm = 0
253 :
254 : ! Determinant of the ALMO overlap matrix
255 : REAL(KIND=dp) :: overlap_determinant = 0.0_dp
256 :
257 : ! ALMO SCF delocalization control
258 : LOGICAL :: perturbative_delocalization = .FALSE.
259 : INTEGER :: quencher_radius_type = 0
260 : REAL(KIND=dp) :: quencher_r0_factor = 0.0_dp, &
261 : quencher_r1_factor = 0.0_dp, &
262 : !quencher_r0_shift,&
263 : !quencher_r1_shift,&
264 : quencher_s0 = 0.0_dp, &
265 : quencher_s1 = 0.0_dp, &
266 : envelope_amplitude = 0.0_dp
267 :
268 : ! guess options
269 : ! This prevents a bug in GCC 8/9
270 : TYPE(almo_scf_history_type) :: almo_history = almo_scf_history_type(matrix_p_up_down=null(), matrix_t=null())
271 : TYPE(almo_scf_history_type) :: xalmo_history = almo_scf_history_type(matrix_p_up_down=null(), matrix_t=null())
272 : INTEGER :: almo_extrapolation_order = 0
273 : INTEGER :: xalmo_extrapolation_order = 0
274 :
275 : ! forces
276 : LOGICAL :: calc_forces = .FALSE.
277 :
278 : !!!!!!!!!!!!!!!!!!!!!!!
279 : !!!!!! MATRICES !!!!!!!
280 : !!!!!!!!!!!!!!!!!!!!!!!
281 :
282 : ! AO overlap NxN
283 : TYPE(dbcsr_type), DIMENSION(1) :: matrix_s
284 : TYPE(dbcsr_type), DIMENSION(1) :: matrix_s_inv
285 : TYPE(dbcsr_type), DIMENSION(1) :: matrix_s_sqrt
286 : TYPE(dbcsr_type), DIMENSION(1) :: matrix_s_sqrt_inv
287 : ! block-diagonal AO overlap NxN
288 : TYPE(dbcsr_type), DIMENSION(1) :: matrix_s_blk
289 : TYPE(dbcsr_type), DIMENSION(1) :: matrix_s_blk_inv
290 : TYPE(dbcsr_type), DIMENSION(1) :: matrix_s_blk_sqrt
291 : TYPE(dbcsr_type), DIMENSION(1) :: matrix_s_blk_sqrt_inv
292 :
293 : ! occupied ALMO coeff NxOCC (alpha,beta - if necessary)
294 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_t_blk
295 : ! occupied MO coeff NxOCC (alpha,beta - if necessary)
296 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_t
297 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_t_tr
298 : ! MO overlap OCCxOCC and its inverse (alpha, beta - if necessary)
299 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_sigma, &
300 : matrix_sigma_inv, &
301 : matrix_sigma_sqrt, &
302 : matrix_sigma_sqrt_inv, &
303 : matrix_sigma_blk, &
304 : matrix_sigma_inv_0deloc
305 :
306 : ! error vector (alpha,beta - if necessary)
307 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_err_blk
308 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_err_xx
309 :
310 : ! MO overlap VIRTxVIRT and its derivatives
311 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_sigma_vv, &
312 : matrix_sigma_vv_blk, &
313 : matrix_sigma_vv_sqrt, &
314 : matrix_sigma_vv_sqrt_inv
315 :
316 : ! template of various VIRT x VIR matrices
317 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_vv_full_blk, &
318 : matrix_vv_disc_blk, &
319 : matrix_vv_disc
320 :
321 : ! VIRT-OCC MO overlap
322 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_vo, matrix_ov
323 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_ov_full, &
324 : matrix_ov_disc
325 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_x
326 :
327 : ! VIRT_DISC x VIRT_RETAINED
328 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_k_blk
329 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_k_tr
330 : ! matrix_k_blk_ones is blocked with all elements equal to 1.0
331 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_k_blk_ones
332 :
333 : ! virtual ALMO coeff NxV
334 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_v_blk, &
335 : matrix_v, &
336 : matrix_v_full_blk, &
337 : matrix_v_disc, &
338 : matrix_v_disc_blk
339 :
340 : ! kohn-sham matrix (alpha,beta - if necessary)
341 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_ks
342 : ! the diff between ks_blk and ks_0deloc is that blk is a blocked matrix
343 : ! 0deloc stores the matrix that correponds to zero-delocalization state
344 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_ks_blk
345 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_ks_0deloc
346 : ! density NxN (alpha,beta - if necessary)
347 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_p
348 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_p_blk
349 :
350 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_eoo
351 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_evv_full
352 :
353 : ! preconditioner for k-optimization
354 : ! RZK-warning: do they have to be stored?
355 : TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: opt_k_t_rr, &
356 : opt_k_t_dd, &
357 : opt_k_denom
358 :
359 : ! second dimension is spin
360 : TYPE(domain_submatrix_type), DIMENSION(:, :), ALLOCATABLE :: domain_preconditioner
361 : TYPE(domain_submatrix_type), DIMENSION(:, :), ALLOCATABLE :: domain_s_inv
362 : TYPE(domain_submatrix_type), DIMENSION(:, :), ALLOCATABLE :: domain_s_sqrt
363 : TYPE(domain_submatrix_type), DIMENSION(:, :), ALLOCATABLE :: domain_s_sqrt_inv
364 : TYPE(domain_submatrix_type), DIMENSION(:, :), ALLOCATABLE :: domain_ks_xx
365 : TYPE(domain_submatrix_type), DIMENSION(:, :), ALLOCATABLE :: domain_t
366 : TYPE(domain_submatrix_type), DIMENSION(:, :), ALLOCATABLE :: domain_err
367 : TYPE(domain_submatrix_type), DIMENSION(:, :), ALLOCATABLE :: domain_r_down_up
368 :
369 : INTEGER, DIMENSION(:), ALLOCATABLE :: cpu_of_domain
370 :
371 : ! Options for various subsection options collected neatly
372 : TYPE(almo_analysis_type) :: almo_analysis = almo_analysis_type()
373 :
374 : ! Options for various optimizers collected neatly
375 : TYPE(optimizer_options_type) :: opt_block_diag_diis = optimizer_options_type()
376 : TYPE(optimizer_options_type) :: opt_block_diag_pcg = optimizer_options_type()
377 : TYPE(optimizer_options_type) :: opt_xalmo_diis = optimizer_options_type()
378 : TYPE(optimizer_options_type) :: opt_xalmo_pcg = optimizer_options_type()
379 : TYPE(optimizer_options_type) :: opt_xalmo_trustr = optimizer_options_type()
380 : TYPE(optimizer_options_type) :: opt_nlmo_pcg = optimizer_options_type()
381 : TYPE(optimizer_options_type) :: opt_block_diag_trustr = optimizer_options_type()
382 : TYPE(optimizer_options_type) :: opt_xalmo_newton_pcg_solver = optimizer_options_type()
383 : TYPE(optimizer_options_type) :: opt_k_pcg = optimizer_options_type()
384 :
385 : ! Option for fragment section
386 : TYPE(fragment_type) :: fragment = fragment_type()
387 :
388 : ! keywords that control electron delocalization treatment
389 : ! RZK-warning: many of these varibles should be collected
390 : ! into an optimizer_options_type variable
391 : INTEGER :: deloc_method = 0
392 : LOGICAL :: deloc_use_occ_orbs = .FALSE.
393 : LOGICAL :: deloc_cayley_use_virt_orbs = .FALSE.
394 : INTEGER :: deloc_cayley_tensor_type = 0
395 : LOGICAL :: deloc_cayley_linear = .FALSE.
396 : INTEGER :: deloc_cayley_conjugator = 0
397 : REAL(KIND=dp) :: deloc_cayley_eps_convergence = 0.0_dp
398 : INTEGER :: deloc_cayley_max_iter = 0
399 : INTEGER :: deloc_truncate_virt = 0
400 : INTEGER :: deloc_virt_per_domain = 0
401 : LOGICAL :: deloc_cayley_occ_precond = .FALSE.
402 : LOGICAL :: deloc_cayley_vir_precond = .FALSE.
403 :
404 : !! keywords that control optimization of retained orbitals
405 : INTEGER :: opt_k_conjugator = 0 !-> conjugartor
406 : REAL(KIND=dp) :: opt_k_eps_convergence = 0.0_dp !-> eps_error
407 : REAL(KIND=dp) :: opt_k_trial_step_size = 0.0_dp !-> lin_search_step_size_guess
408 : INTEGER :: opt_k_max_iter = 0 !-> max_iter
409 : INTEGER :: opt_k_outer_max_iter = 0 !-> max_iter for a separate 'outer' optimizer
410 : REAL(KIND=dp) :: opt_k_trial_step_size_multiplier = 0.0_dp !-> ?
411 : INTEGER :: opt_k_conj_iter_start = 0 !-> ?
412 : INTEGER :: opt_k_prec_iter_start = 0 !-> ?
413 : INTEGER :: opt_k_conj_iter_freq = 0 !-> ?
414 : INTEGER :: opt_k_prec_iter_freq = 0 !-> ?
415 :
416 : ! development keywords
417 : INTEGER :: integer01 = 0
418 : INTEGER :: integer02 = 0
419 : INTEGER :: integer03 = 0
420 : INTEGER :: integer04 = 0
421 : INTEGER :: integer05 = 0
422 : REAL(KIND=dp) :: real01 = 0.0_dp
423 : REAL(KIND=dp) :: real02 = 0.0_dp
424 : REAL(KIND=dp) :: real03 = 0.0_dp
425 : REAL(KIND=dp) :: real04 = 0.0_dp
426 : REAL(KIND=dp) :: real05 = 0.0_dp
427 : LOGICAL :: logical01 = .FALSE.
428 : LOGICAL :: logical02 = .FALSE.
429 : LOGICAL :: logical03 = .FALSE.
430 : LOGICAL :: logical04 = .FALSE.
431 : LOGICAL :: logical05 = .FALSE.
432 :
433 : END TYPE almo_scf_env_type
434 :
435 : CONTAINS
436 :
437 : ! **************************************************************************************************
438 : !> \brief Prints out the options of an optimizer
439 : !> \param optimizer options to print
440 : !> \param unit_nr output stream
441 : !> \par History
442 : !> 2014.10 created [Rustam Z Khaliullin]
443 : !> \author Rustam Z Khaliullin
444 : ! **************************************************************************************************
445 86 : SUBROUTINE print_optimizer_options(optimizer, unit_nr)
446 :
447 : TYPE(optimizer_options_type), INTENT(IN) :: optimizer
448 : INTEGER, INTENT(IN) :: unit_nr
449 :
450 : CHARACTER(33) :: conj_string, prec_string, type_string
451 :
452 86 : IF (unit_nr > 0) THEN
453 :
454 124 : SELECT CASE (optimizer%optimizer_type)
455 : CASE (optimizer_diis)
456 38 : type_string = "DIIS"
457 : CASE (optimizer_pcg)
458 39 : type_string = "PCG"
459 : CASE (optimizer_trustr)
460 86 : type_string = "TRUST REGION"
461 : END SELECT
462 :
463 86 : WRITE (unit_nr, '(T4,A,T48,A33)') "optimizer type:", TRIM(type_string)
464 86 : WRITE (unit_nr, '(T4,A,T48,I33)') "maximum iterations:", optimizer%max_iter
465 86 : WRITE (unit_nr, '(T4,A,T48,E33.3)') "target error:", optimizer%eps_error
466 :
467 86 : IF (optimizer%optimizer_type == optimizer_diis) THEN
468 :
469 38 : WRITE (unit_nr, '(T4,A,T48,I33)') "maximum DIIS history:", optimizer%ndiis
470 :
471 : END IF
472 :
473 86 : IF (optimizer%optimizer_type == optimizer_trustr .OR. &
474 : optimizer%optimizer_type == optimizer_pcg) THEN
475 :
476 48 : WRITE (unit_nr, '(T4,A,T48,I33)') "maximum outer loop iterations:", &
477 96 : optimizer%max_iter_outer_loop
478 :
479 48 : SELECT CASE (optimizer%preconditioner)
480 : CASE (xalmo_prec_zero)
481 0 : prec_string = "NONE"
482 : CASE (xalmo_prec_domain)
483 48 : prec_string = "0.5 KS + 0.5 S, DOMAINS"
484 : CASE (xalmo_prec_full)
485 48 : prec_string = "0.5 KS + 0.5 S, FULL"
486 : END SELECT
487 48 : WRITE (unit_nr, '(T4,A,T48,A33)') "preconditioner:", TRIM(prec_string)
488 :
489 48 : SELECT CASE (optimizer%conjugator)
490 : CASE (cg_zero)
491 0 : conj_string = "Steepest descent"
492 : CASE (cg_polak_ribiere)
493 6 : conj_string = "Polak-Ribiere"
494 : CASE (cg_fletcher_reeves)
495 8 : conj_string = "Fletcher-Reeves"
496 : CASE (cg_hestenes_stiefel)
497 4 : conj_string = "Hestenes-Stiefel"
498 : CASE (cg_fletcher)
499 15 : conj_string = "Fletcher"
500 : CASE (cg_liu_storey)
501 3 : conj_string = "Liu-Storey"
502 : CASE (cg_dai_yuan)
503 4 : conj_string = "Dai-Yuan"
504 : CASE (cg_hager_zhang)
505 48 : conj_string = "Hager-Zhang"
506 : END SELECT
507 48 : WRITE (unit_nr, '(T4,A,T48,A33)') "conjugator:", TRIM(conj_string)
508 :
509 : END IF
510 :
511 86 : IF (optimizer%optimizer_type == optimizer_pcg) THEN
512 :
513 39 : WRITE (unit_nr, '(T4,A,T48,E33.3)') "line search step size guess:", &
514 78 : optimizer%lin_search_step_size_guess
515 39 : WRITE (unit_nr, '(T4,A,T48,E33.3)') "line search target error:", &
516 78 : optimizer%lin_search_eps_error
517 39 : IF (optimizer%neglect_threshold > 0.0_dp) THEN
518 7 : WRITE (unit_nr, '(T4,A,T48,E33.3)') "low-curvature threshold:", &
519 14 : optimizer%neglect_threshold
520 : END IF
521 :
522 : END IF
523 :
524 86 : IF (optimizer%optimizer_type == optimizer_trustr) THEN
525 :
526 10 : SELECT CASE (optimizer%trustr_algorithm)
527 : CASE (trustr_steihaug)
528 1 : conj_string = "Steihaug's CG"
529 : CASE (trustr_cauchy)
530 6 : conj_string = "Cauchy point"
531 : CASE (trustr_dogleg)
532 9 : conj_string = "Dogleg"
533 : END SELECT
534 9 : WRITE (unit_nr, '(T4,A,T48,A33)') "Subproblem algorithm:", TRIM(conj_string)
535 :
536 9 : WRITE (unit_nr, '(T4,A,T48,E33.3)') "gradient decrease accepted:", &
537 18 : optimizer%model_grad_norm_ratio
538 9 : WRITE (unit_nr, '(T4,A,T48,E33.3)') "initial trust radius:", &
539 18 : optimizer%initial_trust_radius
540 9 : WRITE (unit_nr, '(T4,A,T48,E33.3)') "max trust radius:", &
541 18 : optimizer%max_trust_radius
542 9 : WRITE (unit_nr, '(T4,A,T48,E33.3)') "rho of no update lies between .0 and .25:", &
543 18 : optimizer%rho_do_not_update
544 :
545 : END IF
546 :
547 : END IF
548 :
549 86 : END SUBROUTINE print_optimizer_options
550 :
551 : ! **************************************************************************************************
552 : !> \brief release the almo scf envirnoment
553 : !> \param almo_scf_env ...
554 : !> \par History
555 : !> 2016.11 created [Rustam Z Khaliullin]
556 : !> \author Rustam Z Khaliullin
557 : ! **************************************************************************************************
558 72 : SUBROUTINE almo_scf_env_release(almo_scf_env)
559 : TYPE(almo_scf_env_type), POINTER :: almo_scf_env
560 :
561 : CHARACTER(len=*), PARAMETER :: routineN = 'almo_scf_env_release'
562 :
563 : INTEGER :: handle, ispin, istore
564 :
565 72 : CALL timeset(routineN, handle)
566 :
567 : ! delete history
568 150 : DO ispin = 1, SIZE(almo_scf_env%almo_history%matrix_t)
569 178 : DO istore = 1, MIN(almo_scf_env%almo_history%istore, almo_scf_env%almo_history%nstore)
570 178 : CALL dbcsr_release(almo_scf_env%almo_history%matrix_p_up_down(ispin, istore))
571 : END DO
572 78 : IF (almo_scf_env%almo_history%istore > 0) &
573 148 : CALL dbcsr_release(almo_scf_env%almo_history%matrix_t(ispin))
574 : END DO
575 72 : DEALLOCATE (almo_scf_env%almo_history%matrix_p_up_down)
576 72 : DEALLOCATE (almo_scf_env%almo_history%matrix_t)
577 : ! delete xalmo history
578 150 : DO ispin = 1, SIZE(almo_scf_env%xalmo_history%matrix_t)
579 102 : DO istore = 1, MIN(almo_scf_env%xalmo_history%istore, almo_scf_env%xalmo_history%nstore)
580 102 : CALL dbcsr_release(almo_scf_env%xalmo_history%matrix_p_up_down(ispin, istore))
581 : !CALL dbcsr_release(almo_scf_env%xalmo_history%matrix_x(ispin, istore))
582 : END DO
583 78 : IF (almo_scf_env%xalmo_history%istore > 0) &
584 82 : CALL dbcsr_release(almo_scf_env%xalmo_history%matrix_t(ispin))
585 : END DO
586 72 : DEALLOCATE (almo_scf_env%xalmo_history%matrix_p_up_down)
587 : !DEALLOCATE (almo_scf_env%xalmo_history%matrix_x)
588 72 : DEALLOCATE (almo_scf_env%xalmo_history%matrix_t)
589 :
590 72 : DEALLOCATE (almo_scf_env)
591 :
592 72 : CALL timestop(handle)
593 :
594 72 : END SUBROUTINE almo_scf_env_release
595 :
596 0 : END MODULE almo_scf_types
597 :
|