(git:b279b6b)
input_cp2k_almo.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief input for the ALMO SCF section
10 !> \author Rustam Khaliullin
11 ! **************************************************************************************************
13  USE bibliography, ONLY: khaliullin2007,&
19  USE input_constants, ONLY: &
31  keyword_type
36  section_type
37  USE kinds, ONLY: dp
38  USE string_utilities, ONLY: s2a
39 #include "./base/base_uses.f90"
40 
41  IMPLICIT NONE
42  PRIVATE
43 
44  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'input_cp2k_almo'
45 
46  INTEGER, PARAMETER, PRIVATE :: optimizer_block_diagonal_diis = 1
47  INTEGER, PARAMETER, PRIVATE :: optimizer_block_diagonal_pcg = 2
48  INTEGER, PARAMETER, PRIVATE :: optimizer_xalmo_pcg = 3
49  INTEGER, PARAMETER, PRIVATE :: optimizer_xalmo_trustr = 4
50  INTEGER, PARAMETER, PRIVATE :: optimizer_newton_pcg_solver = 5
51  INTEGER, PARAMETER, PRIVATE :: optimizer_nlmo_pcg = 6
52  INTEGER, PARAMETER, PRIVATE :: optimizer_block_diagonal_trustr = 7
53 
54  PUBLIC :: create_almo_scf_section
55 
56 CONTAINS
57 
58 ! **************************************************************************************************
59 !> \brief create the almo scf section
60 !> \param section ...
61 !> \par History
62 !> 2011.05 created [Rustam Z Khaliullin]
63 !> \author Rustam Z Khaliullin
64 ! **************************************************************************************************
65  SUBROUTINE create_almo_scf_section(section)
66  TYPE(section_type), POINTER :: section
67 
68  TYPE(keyword_type), POINTER :: keyword
69  TYPE(section_type), POINTER :: subsection
70 
71  cpassert(.NOT. ASSOCIATED(section))
72  CALL section_create(section, __location__, name="ALMO_SCF", &
73  description="Settings for a class of efficient linear scaling methods based "// &
74  "on absolutely localized orbitals"// &
75  " (ALMOs). ALMO methods are currently restricted to closed-shell molecular systems.", &
76  n_keywords=10, n_subsections=6, repeats=.false., &
77  citations=(/khaliullin2013, scheiber2018/))
78 
79  NULLIFY (keyword)
80 
81  CALL keyword_create(keyword, __location__, name="EPS_FILTER", &
82  description="Threshold for the matrix sparsity filter", &
83  usage="EPS_FILTER 1.e-6", default_r_val=1.e-7_dp)
84  CALL section_add_keyword(section, keyword)
85  CALL keyword_release(keyword)
86 
87  CALL keyword_create(keyword, __location__, name="ALMO_SCF_GUESS", &
88  description="The method to generate initial ALMOs.", &
89  usage="ALMO_SCF_GUESS MOLECULAR", &
90  default_i_val=atomic_guess, &
91  enum_c_vals=s2a("MOLECULAR", "ATOMIC"), &
92  enum_desc=s2a("SCF calculations on single molecules controlled by the regular SCF "// &
93  "keywords outside ALMO options. This kind of calculation is expensive "// &
94  "and only recommended if ALMO SCF does not converge from the ATOMIC guess.", &
95  "Superposition of atomic densities."), &
96  enum_i_vals=(/molecular_guess, atomic_guess/))
97  CALL section_add_keyword(section, keyword)
98  CALL keyword_release(keyword)
99 
100  CALL keyword_create(keyword, __location__, name="MO_OVERLAP_INV_ALG", &
101  description="Algorithm to invert MO overlap matrix.", &
102  usage="MO_OVERLAP_INV_ALG LS_HOTELLING", &
103  default_i_val=spd_inversion_ls_hotelling, &
104  enum_c_vals=s2a("LS_HOTELLING", "LS_TAYLOR", "DENSE_CHOLESKY"), &
105  enum_desc=s2a("Linear scaling iterative Hotelling algorithm. Fast for large sparse matrices.", &
106  "Linear scaling algorithm based on Taylor expansion of (A+B)^(-1).", &
107  "Stable but dense Cholesky algorithm. Cubically scaling."), &
109  CALL section_add_keyword(section, keyword)
110  CALL keyword_release(keyword)
111 
112  !CALL keyword_create(keyword, __LOCATION__, name="STOP_SCF_EARLY",&
113  ! description="Stops SCF using EPS_ERROR_EARLY or MAX_ITER_EARLY", &
114  ! usage="STOP_SCF_EARLY .TRUE.", default_l_val=.FALSE.,&
115  ! lone_keyword_l_val=.TRUE.)
116  !CALL section_add_keyword(section,keyword)
117  !CALL keyword_release(keyword)
118 
119  CALL keyword_create(keyword, __location__, name="ALMO_EXTRAPOLATION_ORDER", &
120  description="Number of previous states used for the ASPC extrapolation of the ALMO "// &
121  "initial guess. 0 implies that the guess is given by ALMO_SCF_GUESS at each step.", &
122  usage="ALMO_EXTRAPOLATION_ORDER 3", default_i_val=3)
123  CALL section_add_keyword(section, keyword)
124  CALL keyword_release(keyword)
125 
126  CALL keyword_create(keyword, __location__, name="XALMO_EXTRAPOLATION_ORDER", &
127  description="Number of previous states used for the ASPC extrapolation of the initial guess "// &
128  "for the delocalization correction.", &
129  usage="XALMO_EXTRAPOLATION_ORDER 1", default_i_val=0)
130  CALL section_add_keyword(section, keyword)
131  CALL keyword_release(keyword)
132 
133  CALL keyword_create(keyword, __location__, name="ALMO_ALGORITHM", &
134  description="Specifies the algorithm to update block-diagonal ALMOs during the SCF procedure.", &
135  usage="ALMO_ALGORITHM DIAG", &
136  default_i_val=almo_scf_diag, &
137  !enum_c_vals=s2a("DIAG", "DM_SIGN","PCG"),&
138  enum_c_vals=s2a("DIAG", "PCG", "TRUST_REGION", "SKIP"), &
139  enum_desc=s2a("DIIS-accelerated diagonalization controlled by ALMO_OPTIMIZER_DIIS. "// &
140  "Recommended for large systems containing small fragments.", &
141  !"Update the density matrix using linear scaling routines. "//&
142  !"Recommended if large fragments are present.",&
143  "Energy minimization with a PCG algorithm controlled by ALMO_OPTIMIZER_PCG.", &
144  "Trust-region optimizer is recommended if PCG has difficulty converging. "// &
145  "It is controlled by ALMO_OPTIMIZER_TRUSTR", &
146  "Skip optimization of block-diagonal ALMOs."), &
147  !enum_i_vals=(/almo_scf_diag,almo_scf_dm_sign,almo_scf_pcg/),&
149  CALL section_add_keyword(section, keyword)
150  CALL keyword_release(keyword)
151 
152  CALL keyword_create(keyword, __location__, name="XALMO_ALGORITHM", &
153  description="Specifies the algorithm to update ALMOs on eXtended domains (XALMOs).", &
154  usage="XALMO_ALGORITHM TRUST_REGION", &
155  default_i_val=almo_scf_pcg, &
156  enum_c_vals=s2a("DIAG", "PCG", "TRUST_REGION"), &
157  enum_desc=s2a("DIIS-accelerated diagonalization.", &
158  "PCG algorithm controlled by XALMO_OPTIMIZER_PCG.", &
159  "Trust-region optimizer controlled by XALMO_OPTIMIZER_TRUSTR"), &
160  enum_i_vals=(/almo_scf_diag, almo_scf_pcg, almo_scf_trustr/))
161  CALL section_add_keyword(section, keyword)
162  CALL keyword_release(keyword)
163 
164  CALL keyword_create(keyword, __location__, name="XALMO_TRIAL_WF", &
165  description="Determines the form of the trial XALMOs.", &
166  usage="XALMO_TRIAL_WF SIMPLE", &
167  default_i_val=xalmo_trial_r0_out, &
168  enum_c_vals=s2a("SIMPLE", "PROJECT_R0_OUT"), &
169  enum_desc=s2a("Straightforward AO-basis expansion.", &
170  "Block-diagonal ALMOs plus the XALMO term projected onto the unoccupied "// &
171  "ALMO-subspace."), &
172  enum_i_vals=(/xalmo_trial_simplex, xalmo_trial_r0_out/))
173  CALL section_add_keyword(section, keyword)
174  CALL keyword_release(keyword)
175 
176  CALL keyword_create( &
177  keyword, __location__, name="DELOCALIZE_METHOD", &
178  description="Methods to reintroduce electron delocalization, which is excluded "// &
179  "with the block-diagonal ALMO reference. Electron delocalization can "// &
180  "be computed using either fully delocalized MOs or spatially restricted "// &
181  "ALMOs (called eXtended ALMOs or XALMOs). All methods below use either a PCG or trust-region "// &
182  "optimizers controlled by XALMO_OPTIMIZER_* subsections. The only exception is "// &
183  "the non-iterative XALMO_1DIAG.", &
184  usage="DELOCALIZE_METHOD XALMO_X", &
185  default_i_val=almo_deloc_xalmo_x, &
186  enum_c_vals=s2a("NONE", "XALMO_1DIAG", "XALMO_X", "XALMO_SCF", "FULL_X", "FULL_SCF", "FULL_X_THEN_SCF"), &
187  enum_desc=s2a("Neglect electron delocalization", &
188  "Correction based on one diagonalization of the spatially projected Hamiltonian (XALMO)", &
189  "Single excitation correction (no Hamiltonian re-build) with spatial restrictions (XALMO)", &
190  "Self-consistent treatment of delocalization with spatial restrictions (XALMO)", &
191  "Single excitation correction (no Hamiltonian re-build) without spatial restrictions", &
192  "Self-consistent treatment of delocalization without spatial restrictions", &
193  "Single excitation correction followed by full SCF procedure, both without spatial restrictions"), &
196  CALL section_add_keyword(section, keyword)
197  CALL keyword_release(keyword)
198 
199  CALL keyword_create(keyword, __location__, name="XALMO_R_CUTOFF_FACTOR", &
200  description="Controls the localization radius of XALMOs: "// &
201  !"r0 = r0_factor*(radius(at1)+radius(at2)) + r0_shift",&
202  "R_cutoff = XALMO_R_CUTOFF_FACTOR*(radius(at1)+radius(at2))", &
203  usage="XALMO_R_CUTOFF_FACTOR 1.6", default_r_val=1.50_dp)
204  CALL section_add_keyword(section, keyword)
205  CALL keyword_release(keyword)
206 
207  CALL keyword_create(keyword, __location__, name="RETURN_ORTHOGONALIZED_MOS", &
208  description="Orthogonalize final ALMOs before they are returned "// &
209  "to Quickstep (i.e. for calculation of properties)", &
210  usage="RETURN_ORTHOGONALIZED_MOS .TRUE.", default_l_val=.true., &
211  lone_keyword_l_val=.true.)
212  CALL section_add_keyword(section, keyword)
213  CALL keyword_release(keyword)
214 
215  CALL keyword_create(keyword, __location__, name="CONSTRUCT_NLMOS", &
216  description="Turns on post-SCF construction of NLMOs", &
217  usage="CONSTRUCT_NLMOS .TRUE.", default_l_val=.false.)
218  CALL section_add_keyword(section, keyword)
219  CALL keyword_release(keyword)
220 
221  !CALL keyword_create(keyword, __LOCATION__, name="DOMAIN_LAYOUT_MOS",&
222  ! description="Each electron in the system is constrained to its own delocalization domain."//&
223  ! " This keyword creates groups of electrons that share the same domain.",&
224  ! usage="DOMAIN_LAYOUT_MOS MOLECULAR",&
225  ! default_i_val=almo_domain_layout_molecular,&
226  ! enum_c_vals=s2a( "ORBITAL", "ATOMIC", "MOLECULAR"),&
227  ! enum_desc=s2a("Each electron can have its own delocalization domain",&
228  ! "All electrons of an atom are delocalized over the same domain",&
229  ! "All electrons of a molecule are delocalized over the same domain."//&
230  ! " This is the only implemented option"),&
231  ! enum_i_vals=(/almo_domain_layout_orbital,almo_domain_layout_atomic,almo_domain_layout_molecular/))
232  !CALL section_add_keyword(section,keyword)
233  !CALL keyword_release(keyword)
234 
235  !CALL keyword_create(keyword, __LOCATION__, name="DOMAIN_LAYOUT_AOS",&
236  ! description="Atomic orbitals or groups of atomic orbitals represent domains over which electrons "//&
237  ! "can be delocalized. This keyword imposes constraints on the structure of domains",&
238  ! usage="DOMAIN_LAYOUT_MOS MOLECULAR",&
239  ! default_i_val=almo_domain_layout_molecular,&
240  ! enum_c_vals=s2a("ATOMIC", "MOLECULAR"),&
241  ! enum_desc=s2a("Atomic blocks represent domains. That is, if a basis function on an atom is in"//&
242  ! " domain A then all basis functions on this atom are in domain A.",&
243  ! "Molecular subsets represent domains. That is, if a basis function on a molecule is"//&
244  ! " in domain A then all basis functions on this molecule are in domain A. "//&
245  ! "This is the only implemented option"),&
246  ! enum_i_vals=(/almo_domain_layout_atomic,almo_domain_layout_molecular/))
247  !CALL section_add_keyword(section,keyword)
248  !CALL keyword_release(keyword)
249 
250  !CALL keyword_create(keyword, __LOCATION__, name="MATRIX_CLUSTERING_MOS",&
251  ! description="Blocks of matrices in the MO basis set are distributed for parallel computations. "//&
252  ! "This keywords specifies the type of matrix blocks.",&
253  ! usage="MATRIX_CLUSTERING_MOS MOLECULAR",&
254  ! default_i_val=almo_mat_distr_molecular,&
255  ! enum_c_vals=s2a("ATOMIC", "MOLECULAR"),&
256  ! enum_desc=s2a("Not recommended. ZZZ Maybe used for the PAO-based methods in the future",&
257  ! "All molecular orbitals of a molecule belong to the same block."),&
258  ! enum_i_vals=(/almo_mat_distr_atomic,almo_mat_distr_molecular/))
259  !CALL section_add_keyword(section,keyword)
260  !CALL keyword_release(keyword)
261 
262  !CALL keyword_create(keyword, __LOCATION__, name="MATRIX_CLUSTERING_AOS",&
263  ! description="Blocks of matrices in the AO basis set are distributed for parallel computations."//&
264  ! " This keywords specifies the type of matrix blocks.",&
265  ! usage="MATRIX_CLUSTERING_AOS MOLECULAR",&
266  ! default_i_val=almo_mat_distr_molecular,&
267  ! enum_c_vals=s2a("ATOMIC", "MOLECULAR"),&
268  ! enum_desc=s2a("All atomic orbitals of an atom belong to the "//&
269  ! "same block. Use only if there are very large molecules in the system. "//&
270  ! "ZZZ Maybe used for the PAO-based methods in the future",&
271  ! "All atomic orbitals of a molecule belong to the same block."),&
272  ! enum_i_vals=(/almo_mat_distr_atomic,almo_mat_distr_molecular/))
273  !CALL section_add_keyword(section,keyword)
274  !CALL keyword_release(keyword)
275 
276  !CALL keyword_create(keyword, __LOCATION__, name="CONSTRAINT_TYPE",&
277  ! description="Determines the type of ALMO constraints",&
278  ! usage="CONSTRAINT_TYPE BLOCK_DIAGONAL",&
279  ! default_i_val=almo_constraint_block_diagonal,&
280  ! enum_c_vals=s2a("BLOCK_DIAGONAL", "DISTANCE", "AO_OVERLAP"),&
281  ! enum_desc=s2a("MO coefficient matrix is block-diagonal",&
282  ! "MO coefficients are quenched according to the distance criterion",&
283  ! "MO coefficients are quenched according to the AO overlap criterion"),&
284  ! enum_i_vals=(/almo_constraint_block_diagonal,almo_constraint_distance,&
285  ! almo_constraint_ao_overlap/))
286  !CALL section_add_keyword(section,keyword)
287  !CALL keyword_release(keyword)
288 
289  !CALL keyword_create(keyword, __LOCATION__, name="QUENCHER_RADIUS_TYPE",&
290  ! description="Determines the type of atomic radii used for imposing the ALMO constraints",&
291  ! usage="QUENCHER_RADIUS_TYPE VDW",&
292  ! default_i_val=do_bondparm_vdw,&
293  ! enum_c_vals=s2a("COVALENT", "VDW"),&
294  ! enum_desc=s2a("Covalent atomic radii",&
295  ! "Van der Waals atomic radii"),&
296  ! enum_i_vals=(/do_bondparm_covalent,do_bondparm_vdw/))
297  !CALL section_add_keyword(section,keyword)
298  !CALL keyword_release(keyword)
299 
300  !CALL keyword_create(keyword, __LOCATION__, name="QUENCHER_R0_FACTOR",&
301  ! description="Parameter to calculate the inner soft cutoff radius: "//&
302  ! !"r0 = r0_factor*(radius(at1)+radius(at2)) + r0_shift",&
303  ! "r0 = r0_factor*(radius(at1)+radius(at2))",&
304  ! usage="QUENCHER_R0_FACTOR 1.05", default_r_val=1.05_dp)
305  !CALL section_add_keyword(section,keyword)
306  !CALL keyword_release(keyword)
307 
308  !!CALL keyword_create(keyword, __LOCATION__, name="QUENCHER_R0_SHIFT",&
309  !! description="Parameter to calculate the inner soft cutoff radius (in Angstrom): "//&
310  !! "r0 = r0_factor*(radius(at1)+radius(at2)) + r0_shift",&
311  !! usage="QUENCHER_R0_SHIFT 0.0", default_r_val=0.0_dp)
312  !!
313  !!CALL section_add_keyword(section,keyword)
314  !!CALL keyword_release(keyword)
315 
316  !CALL keyword_create(keyword, __LOCATION__, name="QUENCHER_R1_FACTOR",&
317  ! description="Parameter to calculate the outer soft cutoff radius: "//&
318  ! !"r1 = r1_factor*(radius(at1)+radius(at2)) + r1_shift",&
319  ! "r1 = r1_factor*(radius(at1)+radius(at2))",&
320  ! usage="QUENCHER_R1_FACTOR 1.55", default_r_val=1.55_dp)
321  !CALL section_add_keyword(section,keyword)
322  !CALL keyword_release(keyword)
323 
324  !!CALL keyword_create(keyword, __LOCATION__, name="QUENCHER_R1_SHIFT",&
325  !! description="Parameter to calculate the outer soft cutoff radius (in Angstrom): "//&
326  !! "r1 = r1_factor*(radius(at1)+radius(at2)) + r1_shift",&
327  !! usage="QUENCHER_R1_SHIFT 0.0", default_r_val=0.0_dp)
328  !!
329  !!CALL section_add_keyword(section,keyword)
330  !!CALL keyword_release(keyword)
331 
332  !CALL keyword_create(keyword, __LOCATION__, name="QUENCHER_AO_OVERLAP_0",&
333  ! description="Overlap value of the inner soft cutoff",&
334  ! usage="QUENCHER_AO_OVERLAP_0 1.0E-4", default_r_val=1.0E-4_dp)
335  !CALL section_add_keyword(section,keyword)
336  !CALL keyword_release(keyword)
337 
338  !CALL keyword_create(keyword, __LOCATION__, name="QUENCHER_AO_OVERLAP_1",&
339  ! description="Overlap value of the outer soft cutoff",&
340  ! usage="QUENCHER_AO_OVERLAP_1 1.0E-6", default_r_val=1.0E-6_dp)
341  !CALL section_add_keyword(section,keyword)
342  !CALL keyword_release(keyword)
343 
344  !CALL keyword_create(keyword, __LOCATION__, name="ENVELOPE_AMPLITUDE",&
345  ! description="Defines an upper bound on the maximum norm of the MO coefficients",&
346  ! usage="ENVELOPE_AMPLITUDE 1.0", default_r_val=1.0_dp)
347  !CALL section_add_keyword(section,keyword)
348  !CALL keyword_release(keyword)
349 
350  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_CAYLEY_TENSOR_TYPE",&
351  ! description="Tensor properties of occupied and virtual indices",&
352  ! usage="DELOC_CAYLEY_TENSOR_TYPE ORTHOGONAL",&
353  ! default_i_val=tensor_orthogonal,&
354  ! enum_c_vals=s2a("ORTHOGONAL", "BIORTHOGONAL"),&
355  ! enum_desc=s2a("Orthogonalize both occupied and virtual orbitals",&
356  ! "Contravariant virtual (MOs or AOs) and covariant occupied orbitals"),&
357  ! enum_i_vals=(/tensor_orthogonal,tensor_up_down/))
358  !CALL section_add_keyword(section,keyword)
359  !CALL keyword_release(keyword)
360 
361  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_CAYLEY_CONJUGATOR",&
362  ! description="Various methods to compute step directions in the CG algorithm",&
363  ! usage="DELOC_CAYLEY_CONJUGATOR POLAK_RIBIERE",&
364  ! default_i_val=cg_hager_zhang,&
365  ! enum_c_vals=s2a("ZERO", "POLAK_RIBIERE", "FLETCHER_REEVES",&
366  ! "HESTENES_STIEFEL", "FLETCHER", "LIU_STOREY", "DAI_YUAN","HAGER_ZHANG"),&
367  ! enum_desc=s2a("Steepest descent","Polak and Ribiere",&
368  ! "Fletcher and Reeves","Hestenes and Stiefel",&
369  ! "Fletcher (Conjugate descent)","Liu and Storey",&
370  ! "Dai and Yuan","Hager and Zhang"),&
371  ! enum_i_vals=(/cg_zero,cg_polak_ribiere,cg_fletcher_reeves,&
372  ! cg_hestenes_stiefel,cg_fletcher,cg_liu_storey,&
373  ! cg_dai_yuan,cg_hager_zhang/))
374  !CALL section_add_keyword(section,keyword)
375  !CALL keyword_release(keyword)
376 
377  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_CAYLEY_MAX_ITER",&
378  ! description="Maximum number of CG iterations to solve Ricatti equations",&
379  ! usage="DELOC_CAYLEY_MAX_ITER 100",default_i_val=50)
380  !CALL section_add_keyword(section,keyword)
381  !CALL keyword_release(keyword)
382 
383  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_CAYLEY_EPS_CONVERGENCE",&
384  ! description="Convergence criterion of the CG algorithm",&
385  ! usage="DELOC_CAYLEY_EPS_CONVERGENCE 1.e-6", default_r_val=1.e-7_dp)
386  !CALL section_add_keyword(section,keyword)
387  !CALL keyword_release(keyword)
388 
389  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_CAYLEY_VIR_PRECOND",&
390  ! description="Use preconditioner for the virtual subspace",&
391  ! usage="DELOC_CAYLEY_VIR_PRECOND .TRUE.", default_l_val=.TRUE.,&
392  ! lone_keyword_l_val=.TRUE.)
393  !CALL section_add_keyword(section,keyword)
394  !CALL keyword_release(keyword)
395 
396  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_CAYLEY_OCC_PRECOND",&
397  ! description="Use preconditioner for the occupied subspace",&
398  ! usage="DELOC_CAYLEY_OCC_PRECOND .TRUE.", default_l_val=.TRUE.,&
399  ! lone_keyword_l_val=.TRUE.)
400  !CALL section_add_keyword(section,keyword)
401  !CALL keyword_release(keyword)
402 
403  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_TRUNCATE_VIRTUALS",&
404  ! description="Truncation of the virtual subspace",&
405  ! usage="DELOC_TRUNCATE_VIRTUALS MINIMAL",&
406  ! default_i_val=virt_full,&
407  ! enum_c_vals=s2a("FULL", "MINIMAL","OCC_SIZE", "EXACT_NUMBER_PER_DOMAIN"),&
408  ! enum_desc=s2a("Keep all virtual orbitals","Retained virtuals "//&
409  ! "complement occupied orbitals to form the minimal basis set",&
410  ! "Number of virtuals is equal to the number of occupied orbitals",&
411  ! "Specify exact number of virtuals per domain with DELOC_VIRT_PER_DOMAIN"),&
412  ! enum_i_vals=(/virt_full,virt_minimal,virt_occ_size,&
413  ! virt_number/))
414  !CALL section_add_keyword(section,keyword)
415  !CALL keyword_release(keyword)
416 
417  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_VIRT_PER_DOMAIN",&
418  ! description="Number of virtual orbitals (per domain, atom or molecule) "//&
419  ! "retained to obtain the delocalization correction",&
420  ! usage="DELOC_VIRT_PER_DOMAIN",default_i_val=-1)
421  !CALL section_add_keyword(section,keyword)
422  !CALL keyword_release(keyword)
423 
424  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_USE_OCC_ORBS",&
425  ! description="Use occupied orbitals (as opposed to density matrix) "//&
426  ! "to calculate correction for electron delocalization",&
427  ! usage="DELOC_USE_OCC_ORBS .TRUE.", default_l_val=.TRUE.,&
428  ! lone_keyword_l_val=.TRUE.)
429  !CALL section_add_keyword(section,keyword)
430  !CALL keyword_release(keyword)
431 
432  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_CAYLEY_USE_VIRT_ORBS",&
433  ! description="Use virtual orbitals (as opposed to the 1-P projector) "//&
434  ! "to calculate correction for electron delocalization. Works only if "//&
435  ! "DELOC_USE_OCC_ORBS is set to TRUE",&
436  ! usage="DELOC_CAYLEY_USE_VIRT_ORBS .TRUE.", default_l_val=.FALSE.,&
437  ! lone_keyword_l_val=.TRUE.)
438  !CALL section_add_keyword(section,keyword)
439  !CALL keyword_release(keyword)
440 
441  !CALL keyword_create(keyword, __LOCATION__, name="DELOC_CAYLEY_LINEAR",&
442  ! description="Neglect the quadratic term in the Riccati equations. "//&
443  ! "Equivalent to the first order correction to the occupied orbitals "//&
444  ! "(second order correction to the energy)",&
445  ! usage="DELOC_CAYLEY_LINEAR .FALSE.", default_l_val=.FALSE.,&
446  ! lone_keyword_l_val=.TRUE.)
447  !CALL section_add_keyword(section,keyword)
448  !CALL keyword_release(keyword)
449 
450  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_OUTER_MAX_ITER",&
451  ! description="Maximum number of outer loop iterations to optimize retained virtual orbitals",&
452  ! usage="OPT_K_OUTER_MAX_ITER 10",default_i_val=1)
453  !CALL section_add_keyword(section,keyword)
454  !CALL keyword_release(keyword)
455 
456  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_MAX_ITER",&
457  ! description="Maximum number of iterations to optimize retained virtual orbitals",&
458  ! usage="OPT_K_MAX_ITER 100",default_i_val=100)
459  !CALL section_add_keyword(section,keyword)
460  !CALL keyword_release(keyword)
461 
462  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_EPS_CONVERGENCE",&
463  ! description="Convergence criterion of the optimization algorithm",&
464  ! usage="OPT_K_EPS_CONVERGENCE 1.e-5", default_r_val=1.e-5_dp)
465  !CALL section_add_keyword(section,keyword)
466  !CALL keyword_release(keyword)
467 
468  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_TRIAL_STEP_SIZE",&
469  ! description="Size of the trial step along the gradient",&
470  ! usage="OPT_K_TRIAL_STEP_SIZE 0.05", default_r_val=0.05_dp)
471  !CALL section_add_keyword(section,keyword)
472  !CALL keyword_release(keyword)
473 
474  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_TRIAL_STEP_SIZE_MULTIPLIER",&
475  ! description="The trial step size is obtained by multiplying the optimal step size "//&
476  ! "from the previous iteration",&
477  ! usage="OPT_K_TRIAL_STEP_SIZE_multiplier 1.0", default_r_val=1.4_dp)
478  !CALL section_add_keyword(section,keyword)
479  !CALL keyword_release(keyword)
480 
481  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_CONJ_ITER_START",&
482  ! description="Iteration for switching from the steepest descent algorithm "//&
483  ! "to conjugate gradient",&
484  ! usage="OPT_K_CONJ_ITER_START 5",default_i_val=0)
485  !CALL section_add_keyword(section,keyword)
486  !CALL keyword_release(keyword)
487 
488  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_CONJ_ITER_FREQ_RESET",&
489  ! description="Reset frequency of the conjugate gradient direction",&
490  ! usage="OPT_K_CONJ_ITER_FREQ_RESET 20",default_i_val=1000000)
491  !CALL section_add_keyword(section,keyword)
492  !CALL keyword_release(keyword)
493 
494  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_CONJUGATOR",&
495  ! description="Various methods to compute step directions in the CG algorithm",&
496  ! usage="OPT_K_CONJUGATOR POLAK_RIBIERE",&
497  ! default_i_val=cg_hager_zhang,&
498  ! enum_c_vals=s2a("ZERO", "POLAK_RIBIERE", "FLETCHER_REEVES",&
499  ! "HESTENES_STIEFEL", "FLETCHER", "LIU_STOREY", "DAI_YUAN","HAGER_ZHANG"),&
500  ! enum_desc=s2a("Steepest descent","Polak and Ribiere",&
501  ! "Fletcher and Reeves","Hestenes and Stiefel",&
502  ! "Fletcher (Conjugate descent)","Liu and Storey",&
503  ! "Dai and Yuan","Hager and Zhang"),&
504  ! enum_i_vals=(/cg_zero,cg_polak_ribiere,cg_fletcher_reeves,&
505  ! cg_hestenes_stiefel,cg_fletcher,cg_liu_storey,&
506  ! cg_dai_yuan,cg_hager_zhang/))
507  !CALL section_add_keyword(section,keyword)
508  !CALL keyword_release(keyword)
509 
510  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_PREC_ITER_START",&
511  ! description="Start using the preconditioner (approximate preconditioners "//&
512  ! "might not be valid on early iterations)",&
513  ! usage="OPT_K_PREC_ITER_START 2",default_i_val=0)
514  !CALL section_add_keyword(section,keyword)
515  !CALL keyword_release(keyword)
516 
517  !CALL keyword_create(keyword, __LOCATION__, name="OPT_K_PREC_ITER_FREQ_UPDATE",&
518  ! description="Frequency for updating the preconditioner",&
519  ! usage="OPT_K_PREC_ITER_FREQ_UPDATE 10",default_i_val=1)
520  !CALL section_add_keyword(section,keyword)
521  !CALL keyword_release(keyword)
522 
523  NULLIFY (subsection)
524  CALL create_optimizer_section(subsection, optimizer_block_diagonal_diis)
525  CALL section_add_subsection(section, subsection)
526  CALL section_release(subsection)
527 
528  NULLIFY (subsection)
529  CALL create_optimizer_section(subsection, optimizer_block_diagonal_pcg)
530  CALL section_add_subsection(section, subsection)
531  CALL section_release(subsection)
532 
533  NULLIFY (subsection)
534  CALL create_optimizer_section(subsection, optimizer_block_diagonal_trustr)
535  CALL section_add_subsection(section, subsection)
536  CALL section_release(subsection)
537 
538  NULLIFY (subsection)
539  CALL create_optimizer_section(subsection, optimizer_xalmo_pcg)
540  CALL section_add_subsection(section, subsection)
541  CALL section_release(subsection)
542 
543  NULLIFY (subsection)
544  CALL create_optimizer_section(subsection, optimizer_xalmo_trustr)
545  CALL section_add_subsection(section, subsection)
546  CALL section_release(subsection)
547 
548  NULLIFY (subsection)
549  CALL create_optimizer_section(subsection, optimizer_nlmo_pcg)
550  CALL section_add_subsection(section, subsection)
551  CALL section_release(subsection)
552 
553  NULLIFY (subsection)
554  CALL create_matrix_iterate_section(subsection)
555  CALL section_add_subsection(section, subsection)
556  CALL section_release(subsection)
557 
558  NULLIFY (subsection)
559  CALL create_almo_analysis_section(subsection)
560  CALL section_add_subsection(section, subsection)
561  CALL section_release(subsection)
562 
563  END SUBROUTINE create_almo_scf_section
564 
565 ! **************************************************************************************************
566 !> \brief The optimizer section is a collection of keywords that are similar
567 !> to all optimization methods (e.g. target error, number of iterations)
568 !> \param section ...
569 !> \param optimizer_id allows to adapt the standard section for specific needs
570 !> \par History
571 !> 2012.03 created [Rustam Z Khaliullin]
572 !> 2014.10 fully integrated [Rustam Z Khaliullin]
573 !> \author Rustam Z Khaliullin
574 ! **************************************************************************************************
575  RECURSIVE SUBROUTINE create_optimizer_section(section, optimizer_id)
576 
577  TYPE(section_type), POINTER :: section
578  INTEGER, INTENT(IN) :: optimizer_id
579 
580  INTEGER :: optimizer_type
581  TYPE(keyword_type), POINTER :: keyword
582  TYPE(section_type), POINTER :: subsection
583 
584  cpassert(.NOT. ASSOCIATED(section))
585  NULLIFY (section)
586 
587  ! choose the name of the section
588  SELECT CASE (optimizer_id)
589  CASE (optimizer_block_diagonal_diis)
590  CALL section_create(section, __location__, name="ALMO_OPTIMIZER_DIIS", &
591  description="Controls the iterative DIIS-accelerated optimization of block-diagonal ALMOs.", &
592  n_keywords=5, n_subsections=0, repeats=.false.)
593  optimizer_type = optimizer_diis
594  CASE (optimizer_block_diagonal_pcg)
595  CALL section_create(section, __location__, name="ALMO_OPTIMIZER_PCG", &
596  description="Controls the PCG optimization of block-diagonal ALMOs.", &
597  n_keywords=9, n_subsections=1, repeats=.false.)
598  optimizer_type = optimizer_pcg
599  CASE (optimizer_nlmo_pcg)
600  CALL section_create(section, __location__, name="NLMO_OPTIMIZER_PCG", &
601  description="Controls the PCG optimization of nonorthogonal localized MOs.", &
602  n_keywords=9, n_subsections=1, repeats=.false.)
603  optimizer_type = optimizer_pcg
604  NULLIFY (subsection)
605  CALL create_penalty_section(subsection)
606  CALL section_add_subsection(section, subsection)
607  CALL section_release(subsection)
608  CASE (optimizer_xalmo_pcg)
609  CALL section_create(section, __location__, name="XALMO_OPTIMIZER_PCG", &
610  description="Controls the PCG optimization of extended ALMOs.", &
611  n_keywords=10, n_subsections=2, repeats=.false.)
612  NULLIFY (subsection)
613  CALL create_optimizer_section(subsection, optimizer_newton_pcg_solver)
614  CALL section_add_subsection(section, subsection)
615  CALL section_release(subsection)
616  optimizer_type = optimizer_pcg
617  CASE (optimizer_xalmo_trustr)
618  CALL section_create(section, __location__, name="XALMO_OPTIMIZER_TRUSTR", &
619  description="Controls the trust-region optimization of extended ALMOs. "// &
620  "Trust radius is varied in the outer loop. Once the trust radius is "// &
621  "chosen (and fixed) the model function can be minized using various "// &
622  "approaches. Currently, an iterative conjugate-gradient approach is "// &
623  "used and controlled by the inner loop", &
624  n_keywords=10, n_subsections=0, repeats=.false.)
625  optimizer_type = optimizer_trustr
626  CASE (optimizer_block_diagonal_trustr)
627  CALL section_create(section, __location__, name="ALMO_OPTIMIZER_TRUSTR", &
628  description="Controls the trust-region optimization of block-diagonal ALMOs. "// &
629  "See XALMO_OPTIMIZER_TRUSTR section for brief explanations.", &
630  n_keywords=10, n_subsections=0, repeats=.false.)
631  optimizer_type = optimizer_trustr
632  CASE (optimizer_newton_pcg_solver)
633  CALL section_create(section, __location__, name="XALMO_NEWTON_PCG_SOLVER", &
634  description="Controls an iterative solver of the Newton-Raphson linear equation.", &
635  n_keywords=4, n_subsections=0, repeats=.false.)
636  optimizer_type = optimizer_lin_eq_pcg
637  CASE DEFAULT
638  cpabort("No default values allowed")
639  END SELECT
640 
641  NULLIFY (keyword)
642 
643  ! add common keywords
644  CALL keyword_create(keyword, __location__, name="MAX_ITER", &
645  description="Maximum number of iterations", &
646  usage="MAX_ITER 100", default_i_val=20)
647  CALL section_add_keyword(section, keyword)
648  CALL keyword_release(keyword)
649 
650  CALL keyword_create(keyword, __location__, name="EPS_ERROR", &
651  description="Target value of the MAX norm of the error", &
652  usage="EPS_ERROR 1.E-6", default_r_val=1.0e-5_dp)
653  CALL section_add_keyword(section, keyword)
654  CALL keyword_release(keyword)
655 
656  ! add common keywords
657  CALL keyword_create(keyword, __location__, name="MAX_ITER_EARLY", &
658  description="Maximum number of iterations for truncated SCF "// &
659  "(e.g. Langevin-corrected MD). Negative values mean that this keyword is not used.", &
660  usage="MAX_ITER_EARLY 5", default_i_val=-1)
661  CALL section_add_keyword(section, keyword)
662  CALL keyword_release(keyword)
663 
664  CALL keyword_create(keyword, __location__, name="EPS_ERROR_EARLY", &
665  description="Target value of the MAX norm of the error for truncated SCF "// &
666  "(e.g. Langevin-corrected MD). Negative values mean that this keyword is not used.", &
667  usage="EPS_ERROR_EARLY 1.E-2", default_r_val=-1.0_dp)
668  CALL section_add_keyword(section, keyword)
669  CALL keyword_release(keyword)
670 
671  ! add keywords specific to each type
672  IF (optimizer_type .EQ. optimizer_diis) THEN
673 
674  CALL keyword_create(keyword, __location__, name="N_DIIS", &
675  description="Number of error vectors to be used in the DIIS "// &
676  "optimization procedure", &
677  usage="N_DIIS 5", default_i_val=6)
678  CALL section_add_keyword(section, keyword)
679  CALL keyword_release(keyword)
680 
681  END IF
682 
683  IF (optimizer_type .EQ. optimizer_pcg .OR. &
684  optimizer_type .EQ. optimizer_lin_eq_pcg .OR. &
685  optimizer_type .EQ. optimizer_trustr) THEN
686 
687  CALL keyword_create(keyword, __location__, name="MAX_ITER_OUTER_LOOP", &
688  description="Maximum number of iterations in the outer loop. "// &
689  "Use the outer loop to update the preconditioner and reset the conjugator. "// &
690  "This can speed up convergence significantly.", &
691  usage="MAX_ITER 10", default_i_val=0)
692  CALL section_add_keyword(section, keyword)
693  CALL keyword_release(keyword)
694 
695  CALL keyword_create(keyword, __location__, name="PRECONDITIONER", &
696  description="Select a preconditioner for the conjugate gradient optimization", &
697  usage="PRECONDITIONER DOMAIN", &
698  default_i_val=xalmo_prec_domain, &
699  enum_c_vals=s2a("NONE", "DEFAULT", "DOMAIN", "FULL"), &
700  enum_desc=s2a("Do not use preconditioner", &
701  "Same as DOMAIN preconditioner", &
702  "Invert preconditioner domain-by-domain."// &
703  " The main component of the linear scaling algorithm", &
704  "Solve linear equations step=-H.grad on the entire space"), &
705  enum_i_vals=(/xalmo_prec_zero, xalmo_prec_domain, &
707  CALL section_add_keyword(section, keyword)
708  CALL keyword_release(keyword)
709 
710  END IF
711 
712  IF (optimizer_type .EQ. optimizer_pcg) THEN
713 
714  CALL keyword_create(keyword, __location__, name="LIN_SEARCH_EPS_ERROR", &
715  description="Target value of the gradient norm during the linear search", &
716  usage="LIN_SEARCH_EPS_ERROR 1.E-2", default_r_val=1.0e-3_dp)
717  CALL section_add_keyword(section, keyword)
718  CALL keyword_release(keyword)
719 
720  CALL keyword_create(keyword, __location__, name="LIN_SEARCH_STEP_SIZE_GUESS", &
721  description="The size of the first step in the linear search", &
722  usage="LIN_SEARCH_STEP_SIZE_GUESS 0.1", default_r_val=1.0_dp)
723  CALL section_add_keyword(section, keyword)
724  CALL keyword_release(keyword)
725 
726  CALL keyword_create(keyword, __location__, name="PRECOND_FILTER_THRESHOLD", &
727  description="Select eigenvalues of the preconditioner "// &
728  "that are smaller than the threshold and project out the "// &
729  "corresponding eigenvectors from the gradient. No matter "// &
730  "how large the threshold is the maximum number of projected "// &
731  "eienvectors for a fragment equals to the number of occupied "// &
732  "orbitals of fragment's neighbors.", &
733  usage="PRECOND_FILTER_THRESHOLD 0.1", default_r_val=-1.0_dp)
734  CALL section_add_keyword(section, keyword)
735  CALL keyword_release(keyword)
736 
737  END IF
738 
739  IF (optimizer_type .EQ. optimizer_pcg .OR. &
740  optimizer_type .EQ. optimizer_trustr) THEN
741 
742  CALL keyword_create(keyword, __location__, name="CONJUGATOR", &
743  description="Various methods to compute step directions in the PCG optimization", &
744  usage="CONJUGATOR POLAK_RIBIERE", &
745  default_i_val=cg_hager_zhang, &
746  enum_c_vals=s2a("ZERO", "POLAK_RIBIERE", "FLETCHER_REEVES", &
747  "HESTENES_STIEFEL", "FLETCHER", "LIU_STOREY", "DAI_YUAN", "HAGER_ZHANG"), &
748  enum_desc=s2a("Steepest descent", "Polak and Ribiere", &
749  "Fletcher and Reeves", "Hestenes and Stiefel", &
750  "Fletcher (Conjugate descent)", "Liu and Storey", &
751  "Dai and Yuan", "Hager and Zhang"), &
752  enum_i_vals=(/cg_zero, cg_polak_ribiere, cg_fletcher_reeves, &
755  CALL section_add_keyword(section, keyword)
756  CALL keyword_release(keyword)
757 
758  END IF
759 
760  IF (optimizer_type .EQ. optimizer_trustr) THEN
761 
762  CALL keyword_create(keyword, __location__, name="ALGORITHM", &
763  description="Selects an algorithm to solve the fixed-radius subproblem", &
764  usage="ALGORITHM CG", &
765  default_i_val=trustr_cauchy, &
766  enum_c_vals=s2a("CG", "CAUCHY", "DOGLEG"), &
767  enum_desc=s2a("Steihaug's iterative CG algorithm that does not invert model Hessian", &
768  "Compute simple Cauchy point", &
769  "Dogleg optimizer"), &
770  enum_i_vals=(/trustr_steihaug, trustr_cauchy, trustr_dogleg/))
771  CALL section_add_keyword(section, keyword)
772  CALL keyword_release(keyword)
773 
774  CALL keyword_create(keyword, __location__, name="ETA", &
775  description="Must be between 0.0 and 0.25. Rho value below which the "// &
776  "optimization of the model function is not accepted and the "// &
777  "optimization is restarted from the same point but decreased "// &
778  "trust radius. Rho is the ratio of the actual over predicted "// &
779  "change in the objective function", &
780  usage="ETA 0.1", default_r_val=0.25_dp)
781  CALL section_add_keyword(section, keyword)
782  CALL keyword_release(keyword)
783 
784  CALL keyword_create(keyword, __location__, name="MODEL_GRAD_NORM_RATIO", &
785  description="Stop the fixed-trust-radius (inner) loop optimization "// &
786  "once the ratio of the current norm of the model gradient over the "// &
787  "initial norm drops below this threshold", &
788  usage="MODEL_GRAD_NORM_RATIO 1.E-2", default_r_val=0.01_dp)
789  CALL section_add_keyword(section, keyword)
790  CALL keyword_release(keyword)
791 
792  CALL keyword_create(keyword, __location__, name="INITIAL_TRUST_RADIUS", &
793  description="Initial trust radius", &
794  usage="INITIAL_TRUST_RADIUS 0.1", default_r_val=0.1_dp)
795  CALL section_add_keyword(section, keyword)
796  CALL keyword_release(keyword)
797 
798  CALL keyword_create(keyword, __location__, name="MAX_TRUST_RADIUS", &
799  description="Maximum allowed trust radius", &
800  usage="MAX_TRUST_RADIUS 1.0", default_r_val=2.0_dp)
801  CALL section_add_keyword(section, keyword)
802  CALL keyword_release(keyword)
803 
804  END IF
805 
806  END SUBROUTINE create_optimizer_section
807 
808 ! **************************************************************************************************
809 !> \brief The section controls iterative matrix operations like SQRT or inverse
810 !> \param section ...
811 !> \par History
812 !> 2017.05 created [Rustam Z Khaliullin]
813 !> \author Rustam Z Khaliullin
814 ! **************************************************************************************************
815  SUBROUTINE create_matrix_iterate_section(section)
816 
817  TYPE(section_type), POINTER :: section
818 
819  TYPE(keyword_type), POINTER :: keyword
820 
821  cpassert(.NOT. ASSOCIATED(section))
822  NULLIFY (section)
823 
824  CALL section_create(section, __location__, name="MATRIX_ITERATE", &
825  description="Controls linear scaling iterative procedure on matrices: inversion, sqrti, etc. "// &
826  "High-order Lanczos accelerates convergence provided it can estimate the eigenspectrum correctly.", &
827  n_keywords=4, n_subsections=0, repeats=.false.)
828 
829  NULLIFY (keyword)
830 
831  CALL keyword_create(keyword, __location__, name="EPS_TARGET_FACTOR", &
832  description="Multiplication factor that determines acceptable error in the iterative procedure. "// &
833  "Acceptable error = EPS_TARGET_FACTOR * EPS_FILTER", &
834  usage="EPS_TARGET_FACTOR 100.0", default_r_val=10.0_dp)
835  CALL section_add_keyword(section, keyword)
836  CALL keyword_release(keyword)
837 
838  CALL keyword_create(keyword, __location__, name="EPS_LANCZOS", &
839  description="Threshold for Lanczos eigenvalue estimation.", &
840  usage="EPS_LANCZOS 1.0E-4", default_r_val=1.0e-3_dp)
841  CALL section_add_keyword(section, keyword)
842  CALL keyword_release(keyword)
843 
844  CALL keyword_create(keyword, __location__, name="ORDER_LANCZOS", &
845  description="Order of the Lanczos estimator. Use 0 to turn off. Do not use 1.", &
846  usage="ORDER_LANCZOS 5", default_i_val=3)
847  CALL section_add_keyword(section, keyword)
848  CALL keyword_release(keyword)
849 
850  CALL keyword_create(keyword, __location__, name="MAX_ITER_LANCZOS", &
851  description="Maximum number of Lanczos iterations.", &
852  usage="MAX_ITER_LANCZOS 64", default_i_val=128)
853  CALL section_add_keyword(section, keyword)
854  CALL keyword_release(keyword)
855 
856  END SUBROUTINE create_matrix_iterate_section
857 
858 ! **************************************************************************************************
859 !> \brief The section controls penalty methods
860 !> \param section ...
861 !> \par History
862 !> 2018.01 created [Rustam Z Khaliullin]
863 !> \author Rustam Z Khaliullin
864 ! **************************************************************************************************
865  SUBROUTINE create_penalty_section(section)
866 
867  TYPE(section_type), POINTER :: section
868 
869  TYPE(keyword_type), POINTER :: keyword
870 
871  cpassert(.NOT. ASSOCIATED(section))
872  NULLIFY (section)
873 
874  CALL section_create(section, __location__, name="PENALTY", &
875  description="Add penalty terms to the energy functional.", &
876  n_keywords=3, n_subsections=0, repeats=.false.)
877 
878  NULLIFY (keyword)
879 
880  CALL keyword_create( &
881  keyword, __location__, name="OPERATOR", &
882  description="Type of opertator which defines the spread functional", &
883  usage="OPERATOR PIPEK", &
884  enum_c_vals=s2a("BERRY", "PIPEK"), &
885  enum_i_vals=(/op_loc_berry, op_loc_pipek/), &
886  default_i_val=op_loc_berry)
887  CALL section_add_keyword(section, keyword)
888  CALL keyword_release(keyword)
889 
890  CALL keyword_create(keyword, __location__, name="PENALTY_STRENGTH", &
891  description="Strength of the orthogonalization penalty", &
892  usage="PENALTY_STRENGTH 1.1", default_r_val=1.1_dp)
893  CALL section_add_keyword(section, keyword)
894  CALL keyword_release(keyword)
895 
896  CALL keyword_create(keyword, __location__, name="PENALTY_STRENGTH_DECREASE_FACTOR", &
897  description="Factor that decreases the strength of the orthogonalization penalty.", &
898  usage="PENALTY_STRENGTH_DECREASE_FACTOR 1.1", default_r_val=1.1_dp)
899  CALL section_add_keyword(section, keyword)
900  CALL keyword_release(keyword)
901 
902  CALL keyword_create(keyword, __location__, name="DETERMINANT_TOLERANCE", &
903  description="Stop the optimization of the penalty strength if the determinant of the overlap "// &
904  "changes less than this tolerance threshold.", &
905  usage="DETERMINANT_TOLERANCE 1.0E-4", default_r_val=1.0e-3_dp)
906  CALL section_add_keyword(section, keyword)
907  CALL keyword_release(keyword)
908 
909  CALL keyword_create(keyword, __location__, name="FINAL_DETERMINANT", &
910  description="The final determinant that obtained after optimization.", &
911  usage="FINAL_DETERMINANT 0.1", default_r_val=0.1_dp)
912  CALL section_add_keyword(section, keyword)
913  CALL keyword_release(keyword)
914 
915  CALL keyword_create(keyword, __location__, name="COMPACTIFICATION_FILTER_START", &
916  description="Set orbital coefficients with absolute value smaller than this value to zero.", &
917  usage="COMPACTIFICATION_FILTER_START 1.e-6", default_r_val=-1.0_dp)
918  CALL section_add_keyword(section, keyword)
919  CALL keyword_release(keyword)
920 
921  CALL keyword_create(keyword, __location__, name="VIRTUAL_NLMOS", &
922  description="Localize virtual oribtals", &
923  usage="VIRTUAL_NLMOS .TRUE.", default_l_val=.false.)
924  CALL section_add_keyword(section, keyword)
925  CALL keyword_release(keyword)
926 
927  END SUBROUTINE create_penalty_section
928 
929 ! **************************************************************************************************
930 !> \brief The section controls electronic structure analysis based on ALMOs
931 !> \param section ...
932 !> \par History
933 !> 2014.10 created [Rustam Z Khaliullin]
934 !> \author Rustam Z Khaliullin
935 ! **************************************************************************************************
936  SUBROUTINE create_almo_analysis_section(section)
937 
938  TYPE(section_type), POINTER :: section
939 
940  TYPE(keyword_type), POINTER :: keyword
941  TYPE(section_type), POINTER :: subsection
942 
943  cpassert(.NOT. ASSOCIATED(section))
944  NULLIFY (section)
945 
946  CALL section_create(section, __location__, name="ANALYSIS", &
947  description="Controls electronic structure analysis based on ALMOs and XALMOs.", &
948  n_keywords=2, n_subsections=1, repeats=.false., &
949  citations=(/khaliullin2007, khaliullin2008/))
950 
951  NULLIFY (keyword)
952 
953  CALL keyword_create(keyword, __location__, name="_SECTION_PARAMETERS_", &
954  description="Activation of ALMO-based electronic structure analysis.", &
955  usage="&ANALYSIS T", &
956  default_l_val=.false., &
957  lone_keyword_l_val=.true.)
958  CALL section_add_keyword(section, keyword)
959  CALL keyword_release(keyword)
960 
961  CALL keyword_create(keyword, __location__, name="FROZEN_MO_ENERGY_TERM", &
962  description="Perform calculations on single molecules to compute the frozen density term", &
963  usage="FROZEN_MO_ENERGY_TERM SUBLATTICE", default_i_val=almo_frz_none, &
964  !enum_c_vals=s2a("SKIP", "ISOLATED", "SUBLATTICE"),&
965  enum_c_vals=s2a("SKIP", "SUBLATTICE"), &
966  enum_desc=s2a("Do not compute the frozen MO energy term.", &
967  !"Use isolated gas-phase molecules as the reference.",&
968  "Use energies of single molecules in their positions in the crystal "// &
969  "cell as the reference. "// &
970  "This term does not have an interpretation if fragmetns are charged."), &
971  enum_i_vals=(/almo_frz_none, &
972  !almo_frz_isolated,&
974  CALL section_add_keyword(section, keyword)
975  CALL keyword_release(keyword)
976 
977  NULLIFY (subsection)
978  CALL create_almo_print_section(subsection)
979  CALL section_add_subsection(section, subsection)
980  CALL section_release(subsection)
981 
982  END SUBROUTINE create_almo_analysis_section
983 
984 ! *****************************************************************************
985 !> \brief Create a section with all print keys for ALMO methods
986 !> \param section ...
987 !> \par History
988 !> 2016.05 created [Rustam Z Khaliullin]
989 !> \author Rustam Z Khaliullin
990 ! **************************************************************************************************
991  SUBROUTINE create_almo_print_section(section)
992 
993  TYPE(section_type), POINTER :: section
994 
995  TYPE(section_type), POINTER :: print_key
996 
997  cpassert(.NOT. ASSOCIATED(section))
998  NULLIFY (section, print_key)
999 
1000  CALL section_create(section, __location__, name="PRINT", &
1001  description="Controls printing of detailed ALMO decomosition analysis results", &
1002  n_keywords=0, n_subsections=2, repeats=.true.)
1003 
1004  ! create print keys within this subsection
1005  CALL cp_print_key_section_create(print_key, __location__, "ALMO_EDA_CT", &
1006  description="Controls printing of the electron transfer terms in "// &
1007  "ALMO energy decomposition analysis. "// &
1008  "File format: first column is the index of the electron acceptor "// &
1009  "fragment, second -- is the index of the electron donor fragment, "// &
1010  "third - the energy change (a.u.) associated with the electron transfer.", &
1011  print_level=low_print_level, common_iter_levels=1, &
1012  filename="EDA")
1013  CALL section_add_subsection(section, print_key)
1014  CALL section_release(print_key)
1015 
1016  CALL cp_print_key_section_create(print_key, __location__, "ALMO_CTA", &
1017  description="Controls printing of the electron transfer terms in "// &
1018  "ALMO charge transfer analysis. "// &
1019  "File format: first column is the index of the electron acceptor "// &
1020  "fragment, second -- is the index of the electron donor fragment, "// &
1021  "third - the change (a.u.) transferred between the two fragments.", &
1022  print_level=low_print_level, common_iter_levels=1, &
1023  filename="CTA")
1024  CALL section_add_subsection(section, print_key)
1025  CALL section_release(print_key)
1026 
1027  END SUBROUTINE create_almo_print_section
1028 
1029 END MODULE input_cp2k_almo
collects all references to literature in CP2K as new algorithms / method are included from literature...
Definition: bibliography.F:28
integer, save, public scheiber2018
Definition: bibliography.F:43
integer, save, public khaliullin2008
Definition: bibliography.F:43
integer, save, public khaliullin2007
Definition: bibliography.F:43
integer, save, public khaliullin2013
Definition: bibliography.F:43
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer, parameter, public low_print_level
subroutine, public cp_print_key_section_create(print_key_section, location, name, description, print_level, each_iter_names, each_iter_values, add_last, filename, common_iter_levels, citations, unit_str)
creates a print_key section
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public op_loc_pipek
integer, parameter, public xalmo_trial_r0_out
integer, parameter, public molecular_guess
integer, parameter, public almo_deloc_scf
integer, parameter, public spd_inversion_dense_cholesky
integer, parameter, public cg_hestenes_stiefel
integer, parameter, public op_loc_berry
integer, parameter, public atomic_guess
integer, parameter, public trustr_dogleg
integer, parameter, public almo_scf_diag
integer, parameter, public optimizer_diis
integer, parameter, public almo_frz_crystal
integer, parameter, public almo_scf_skip
integer, parameter, public xalmo_trial_simplex
integer, parameter, public cg_fletcher
integer, parameter, public cg_fletcher_reeves
integer, parameter, public xalmo_prec_domain
integer, parameter, public optimizer_lin_eq_pcg
integer, parameter, public almo_deloc_xalmo_x
integer, parameter, public almo_frz_none
integer, parameter, public almo_scf_trustr
integer, parameter, public almo_deloc_x
integer, parameter, public almo_scf_pcg
integer, parameter, public trustr_cauchy
integer, parameter, public almo_deloc_xalmo_scf
integer, parameter, public spd_inversion_ls_taylor
integer, parameter, public cg_dai_yuan
integer, parameter, public cg_liu_storey
integer, parameter, public almo_deloc_xalmo_1diag
integer, parameter, public trustr_steihaug
integer, parameter, public xalmo_prec_zero
integer, parameter, public almo_deloc_none
integer, parameter, public spd_inversion_ls_hotelling
integer, parameter, public cg_hager_zhang
integer, parameter, public optimizer_trustr
integer, parameter, public almo_deloc_x_then_scf
integer, parameter, public optimizer_pcg
integer, parameter, public cg_zero
integer, parameter, public cg_polak_ribiere
integer, parameter, public xalmo_prec_full
input for the ALMO SCF section
subroutine, public create_almo_scf_section(section)
create the almo scf section
represents keywords in an input
subroutine, public keyword_release(keyword)
releases the given keyword (see doc/ReferenceCounting.html)
subroutine, public keyword_create(keyword, location, name, description, usage, type_of_var, n_var, repeats, variants, default_val, default_l_val, default_r_val, default_lc_val, default_c_val, default_i_val, default_l_vals, default_r_vals, default_c_vals, default_i_vals, lone_keyword_val, lone_keyword_l_val, lone_keyword_r_val, lone_keyword_c_val, lone_keyword_i_val, lone_keyword_l_vals, lone_keyword_r_vals, lone_keyword_c_vals, lone_keyword_i_vals, enum_c_vals, enum_i_vals, enum, enum_strict, enum_desc, unit_str, citations, deprecation_notice, removed)
creates a keyword object
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_create(section, location, name, description, n_keywords, n_subsections, repeats, citations)
creates a list of keywords
subroutine, public section_add_keyword(section, keyword)
adds a keyword to the given section
subroutine, public section_add_subsection(section, subsection)
adds a subsection to the given section
recursive subroutine, public section_release(section)
releases the given keyword list (see doc/ReferenceCounting.html)
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Utilities for string manipulations.