LCOV - code coverage report
Current view: top level - src - pao_input.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:a43c040) Lines: 100.0 % 255 255
Test Date: 2026-02-12 06:45:40 Functions: 100.0 % 3 3

            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              : MODULE pao_input
       9              :    USE bibliography,                    ONLY: Berghold2011,&
      10              :                                               Schuett2018,&
      11              :                                               Zhu2016
      12              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      13              :                                               cp_logger_type
      14              :    USE cp_output_handling,              ONLY: add_last_numeric,&
      15              :                                               cp_print_key_section_create,&
      16              :                                               cp_print_key_unit_nr,&
      17              :                                               high_print_level,&
      18              :                                               low_print_level
      19              :    USE input_keyword_types,             ONLY: keyword_create,&
      20              :                                               keyword_release,&
      21              :                                               keyword_type
      22              :    USE input_section_types,             ONLY: section_add_keyword,&
      23              :                                               section_add_subsection,&
      24              :                                               section_create,&
      25              :                                               section_release,&
      26              :                                               section_type,&
      27              :                                               section_vals_get_subs_vals,&
      28              :                                               section_vals_type,&
      29              :                                               section_vals_val_get
      30              :    USE input_val_types,                 ONLY: lchar_t,&
      31              :                                               real_t
      32              :    USE kinds,                           ONLY: dp
      33              :    USE linesearch,                      ONLY: linesearch_create_section
      34              :    USE pao_types,                       ONLY: pao_env_type
      35              :    USE string_utilities,                ONLY: s2a
      36              : #include "./base/base_uses.f90"
      37              : 
      38              :    IMPLICIT NONE
      39              :    PRIVATE
      40              : 
      41              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pao_input'
      42              : 
      43              :    PUBLIC :: create_pao_section, parse_pao_section, id2str
      44              : 
      45              :    INTEGER, PARAMETER, PUBLIC               :: pao_rotinv_param = 101, &
      46              :                                                pao_fock_param = 102, &
      47              :                                                pao_exp_param = 103, &
      48              :                                                pao_gth_param = 104, &
      49              :                                                pao_equi_param = 105, &
      50              :                                                pao_opt_cg = 301, &
      51              :                                                pao_opt_bfgs = 302, &
      52              :                                                pao_ml_gp = 401, &
      53              :                                                pao_ml_nn = 402, &
      54              :                                                pao_ml_lazy = 403, &
      55              :                                                pao_ml_prior_zero = 501, &
      56              :                                                pao_ml_prior_mean = 502, &
      57              :                                                pao_ml_desc_pot = 601, &
      58              :                                                pao_ml_desc_overlap = 602, &
      59              :                                                pao_ml_desc_r12 = 603
      60              : 
      61              : CONTAINS
      62              : 
      63              : ! **************************************************************************************************
      64              : !> \brief Declare the PAO input section
      65              : !> \param pao ...
      66              : !> \param input ...
      67              : ! **************************************************************************************************
      68           98 :    SUBROUTINE parse_pao_section(pao, input)
      69              :       TYPE(pao_env_type), POINTER                        :: pao
      70              :       TYPE(section_vals_type), POINTER                   :: input
      71              : 
      72              :       INTEGER                                            :: i, n_rep, ntrainfiles
      73              :       TYPE(cp_logger_type), POINTER                      :: logger
      74              :       TYPE(section_vals_type), POINTER                   :: pao_section, training_set_section
      75              : 
      76           98 :       pao_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%PAO")
      77              : 
      78              :       ! open main logger
      79           98 :       logger => cp_get_default_logger()
      80           98 :       pao%iw = cp_print_key_unit_nr(logger, pao_section, "PRINT%RUN_INFO", extension=".paolog")
      81           98 :       pao%iw_atoms = cp_print_key_unit_nr(logger, pao_section, "PRINT%ATOM_INFO", extension=".paolog")
      82           98 :       pao%iw_gap = cp_print_key_unit_nr(logger, pao_section, "PRINT%FOCK_GAP", extension=".paolog")
      83           98 :       pao%iw_fockev = cp_print_key_unit_nr(logger, pao_section, "PRINT%FOCK_EIGENVALUES", extension=".paolog")
      84           98 :       pao%iw_opt = cp_print_key_unit_nr(logger, pao_section, "PRINT%OPT_INFO", extension=".paolog")
      85           98 :       pao%iw_mlvar = cp_print_key_unit_nr(logger, pao_section, "PRINT%ML_VARIANCE", extension=".paolog")
      86           98 :       pao%iw_mldata = cp_print_key_unit_nr(logger, pao_section, "PRINT%ML_TRAINING_DATA", extension=".paolog")
      87              : 
      88           98 :       IF (pao%iw > 0) WRITE (pao%iw, *) "" ! an empty separator line
      89              : 
      90              :       ! parse input and print
      91              : 
      92           98 :       CALL section_vals_val_get(pao_section, "EPS_PAO", r_val=pao%eps_pao)
      93           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "EPS_PAO", pao%eps_pao
      94              : 
      95           98 :       CALL section_vals_val_get(pao_section, "MIXING", r_val=pao%mixing)
      96           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "MIXING", pao%mixing
      97              : 
      98           98 :       CALL section_vals_val_get(pao_section, "MAX_PAO", i_val=pao%max_pao)
      99           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "MAX_PAO", pao%max_pao
     100              : 
     101           98 :       CALL section_vals_val_get(pao_section, "MAX_CYCLES", i_val=pao%max_cycles)
     102           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "MAX_CYCLES", pao%max_cycles
     103              : 
     104           98 :       CALL section_vals_val_get(pao_section, "IGNORE_CONVERGENCE_FAILURE", l_val=pao%ignore_convergence_failure)
     105           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,L11)") " PAO|", "IGNORE_CONVERGENCE_FAILURE", pao%ignore_convergence_failure
     106              : 
     107           98 :       CALL section_vals_val_get(pao_section, "PARAMETERIZATION", i_val=pao%parameterization)
     108           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "PARAMETERIZATION", id2str(pao%parameterization)
     109              : 
     110           98 :       CALL section_vals_val_get(pao_section, "PRECONDITION", l_val=pao%precondition)
     111           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,L11)") " PAO|", "PRECONDITION", pao%precondition
     112              : 
     113           98 :       CALL section_vals_val_get(pao_section, "REGULARIZATION", r_val=pao%regularization)
     114           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "REGULARIZATION", pao%regularization
     115           98 :       IF (pao%regularization < 0.0_dp) CPABORT("PAO: REGULARIZATION < 0")
     116              : 
     117           98 :       CALL section_vals_val_get(input, "DFT%QS%EPS_DEFAULT", r_val=pao%eps_pgf) ! default value
     118           98 :       CALL section_vals_val_get(pao_section, "EPS_PGF", n_rep_val=n_rep)
     119           98 :       IF (n_rep /= 0) CALL section_vals_val_get(pao_section, "EPS_PGF", r_val=pao%eps_pgf)
     120           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "EPS_PGF", pao%eps_pgf
     121           98 :       IF (pao%eps_pgf < 0.0_dp) CPABORT("PAO: EPS_PGF < 0")
     122              : 
     123           98 :       CALL section_vals_val_get(pao_section, "PENALTY_DISTANCE", r_val=pao%penalty_dist)
     124           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "PENALTY_DISTANCE", pao%penalty_dist
     125           98 :       IF (pao%penalty_dist < 0.0_dp) CPABORT("PAO: PENALTY_DISTANCE < 0")
     126              : 
     127           98 :       CALL section_vals_val_get(pao_section, "PENALTY_STRENGTH", r_val=pao%penalty_strength)
     128           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "PENALTY_STRENGTH", pao%penalty_strength
     129           98 :       IF (pao%penalty_strength < 0.0_dp) CPABORT("PAO: PENALTY_STRENGTH < 0")
     130              : 
     131           98 :       CALL section_vals_val_get(pao_section, "LINPOT_PRECONDITION_DELTA", r_val=pao%linpot_precon_delta)
     132           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "LINPOT_PRECONDITION_DELTA", pao%linpot_precon_delta
     133           98 :       IF (pao%linpot_precon_delta < 0.0_dp) CPABORT("PAO: LINPOT_PRECONDITION_DELTA < 0")
     134              : 
     135           98 :       CALL section_vals_val_get(pao_section, "LINPOT_INITGUESS_DELTA", r_val=pao%linpot_init_delta)
     136           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "LINPOT_INITGUESS_DELT", pao%linpot_init_delta
     137           98 :       IF (pao%linpot_init_delta < 0.0_dp) CPABORT("PAO: LINPOT_INITGUESS_DELTA < 0")
     138              : 
     139           98 :       CALL section_vals_val_get(pao_section, "LINPOT_REGULARIZATION_DELTA", r_val=pao%linpot_regu_delta)
     140           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "LINPOT_REGULARIZATION_DELTA", pao%linpot_regu_delta
     141           98 :       IF (pao%linpot_regu_delta < 0.0_dp) CPABORT("PAO: LINPOT_REGULARIZATION_DELTA < 0")
     142              : 
     143           98 :       CALL section_vals_val_get(pao_section, "LINPOT_REGULARIZATION_STRENGTH", r_val=pao%linpot_regu_strength)
     144           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "LINPOT_REGULARIZATION_STRENGTH", pao%linpot_regu_strength
     145           98 :       IF (pao%linpot_regu_strength < 0.0_dp) CPABORT("PAO: LINPOT_REGULARIZATION_STRENGTH < 0")
     146              : 
     147           98 :       CALL section_vals_val_get(pao_section, "OPTIMIZER", i_val=pao%optimizer)
     148           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "OPTIMIZER", id2str(pao%optimizer)
     149              : 
     150           98 :       CALL section_vals_val_get(pao_section, "CG_INIT_STEPS", i_val=pao%cg_init_steps)
     151           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "CG_INIT_STEPS", pao%cg_init_steps
     152           98 :       IF (pao%cg_init_steps < 1) CPABORT("PAO: CG_INIT_STEPS < 1")
     153              : 
     154           98 :       CALL section_vals_val_get(pao_section, "CG_RESET_LIMIT", r_val=pao%cg_reset_limit)
     155           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "CG_RESET_LIMIT", pao%cg_reset_limit
     156           98 :       IF (pao%cg_reset_limit < 0.0_dp) CPABORT("PAO: CG_RESET_LIMIT < 0")
     157              : 
     158           98 :       CALL section_vals_val_get(pao_section, "CHECK_UNITARY_TOL", r_val=pao%check_unitary_tol)
     159           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "CHECK_UNITARY_TOL", pao%check_unitary_tol
     160              : 
     161           98 :       CALL section_vals_val_get(pao_section, "CHECK_GRADIENT_TOL", r_val=pao%check_grad_tol)
     162           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "CHECK_GRADIENT_TOL", pao%check_grad_tol
     163              : 
     164           98 :       CALL section_vals_val_get(pao_section, "NUM_GRADIENT_ORDER", i_val=pao%num_grad_order)
     165           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "NUM_GRADIENT_ORDER", pao%num_grad_order
     166              : 
     167           98 :       CALL section_vals_val_get(pao_section, "NUM_GRADIENT_EPS", r_val=pao%num_grad_eps)
     168           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "NUM_GRADIENT_EPS", pao%num_grad_eps
     169           98 :       IF (pao%num_grad_eps < 0.0_dp) CPABORT("PAO: NUM_GRADIENT_EPS < 0")
     170              : 
     171           98 :       CALL section_vals_val_get(pao_section, "PRINT%RESTART%WRITE_CYCLES", i_val=pao%write_cycles)
     172           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "PRINT%RESTART%WRITE_CYCLES", pao%write_cycles
     173              : 
     174           98 :       CALL section_vals_val_get(pao_section, "RESTART_FILE", c_val=pao%restart_file)
     175           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,A)") " PAO|", "RESTART_FILE ", TRIM(pao%restart_file)
     176              : 
     177           98 :       CALL section_vals_val_get(pao_section, "PREOPT_DM_FILE", c_val=pao%preopt_dm_file)
     178           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,A)") " PAO|", "PREOPT_DM_FILE ", TRIM(pao%preopt_dm_file)
     179              : 
     180           98 :       CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%METHOD", i_val=pao%ml_method)
     181           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "MACHINE_LEARNING%METHOD", id2str(pao%ml_method)
     182              : 
     183           98 :       CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%PRIOR", i_val=pao%ml_prior)
     184           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "MACHINE_LEARNING%PRIOR", id2str(pao%ml_prior)
     185              : 
     186           98 :       CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%DESCRIPTOR", i_val=pao%ml_descriptor)
     187           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "MACHINE_LEARNING%DESCRIPTOR", id2str(pao%ml_descriptor)
     188              : 
     189           98 :       CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%TOLERANCE", r_val=pao%ml_tolerance)
     190           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "MACHINE_LEARNING%TOLERANCE", pao%ml_tolerance
     191              : 
     192           98 :       CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%GP_NOISE_VAR", r_val=pao%gp_noise_var)
     193           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "MACHINE_LEARNING%GP_NOISE_VAR", pao%gp_noise_var
     194              : 
     195           98 :       CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%GP_SCALE", r_val=pao%gp_scale)
     196           98 :       IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "MACHINE_LEARNING%GP_SCALE", pao%gp_scale
     197              : 
     198              :       ! parse MACHINE_LEARNING%TRAINING_SET section
     199           98 :       training_set_section => section_vals_get_subs_vals(pao_section, "MACHINE_LEARNING%TRAINING_SET")
     200           98 :       CALL section_vals_val_get(training_set_section, "_DEFAULT_KEYWORD_", n_rep_val=ntrainfiles)
     201          248 :       ALLOCATE (pao%ml_training_set(ntrainfiles))
     202          132 :       DO i = 1, ntrainfiles
     203              :          CALL section_vals_val_get(training_set_section, "_DEFAULT_KEYWORD_", &
     204           34 :                                    i_rep_val=i, c_val=pao%ml_training_set(i)%fn)
     205           51 :          IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A)") " PAO|", "MACHINE_LEARNING%TRAINING_SET", &
     206          132 :             TRIM(pao%ml_training_set(i)%fn)
     207              :       END DO
     208              : 
     209           98 :       IF (pao%iw > 0) WRITE (pao%iw, *) "" ! an empty separator line
     210              : 
     211          196 :    END SUBROUTINE parse_pao_section
     212              : 
     213              : ! **************************************************************************************************
     214              : !> \brief Helper routine
     215              : !> \param id ...
     216              : !> \return ...
     217              : ! **************************************************************************************************
     218          318 :    FUNCTION id2str(id) RESULT(s)
     219              :       INTEGER                                            :: id
     220              :       CHARACTER(LEN=20)                                  :: s
     221              : 
     222          323 :       SELECT CASE (id)
     223              :       CASE (pao_gth_param)
     224            5 :          s = "GTH"
     225              :       CASE (pao_rotinv_param)
     226           79 :          s = "ROTINV"
     227              :       CASE (pao_fock_param)
     228            8 :          s = "FOCK"
     229              :       CASE (pao_exp_param)
     230           18 :          s = "EXP"
     231              :       CASE (pao_equi_param)
     232           12 :          s = "EQUIVARIANT"
     233              :       CASE (pao_opt_cg)
     234           47 :          s = "CG"
     235              :       CASE (pao_opt_bfgs)
     236            2 :          s = "BFGS"
     237              :       CASE (pao_ml_gp)
     238           45 :          s = "GAUSSIAN_PROCESS"
     239              :       CASE (pao_ml_nn)
     240            2 :          s = "NEURAL_NETWORK"
     241              :       CASE (pao_ml_lazy)
     242            2 :          s = "LAZY"
     243              :       CASE (pao_ml_prior_zero)
     244           46 :          s = "ZERO"
     245              :       CASE (pao_ml_prior_mean)
     246            3 :          s = "MEAN"
     247              :       CASE (pao_ml_desc_pot)
     248           43 :          s = "POTENTIAL"
     249              :       CASE (pao_ml_desc_overlap)
     250            2 :          s = "OVERLAP"
     251              :       CASE (pao_ml_desc_r12)
     252            4 :          s = "R12"
     253              :       CASE DEFAULT
     254          318 :          CPABORT("PAO: unknown id")
     255              :       END SELECT
     256          318 :       s = ADJUSTR(s)
     257          318 :    END FUNCTION id2str
     258              : 
     259              : ! **************************************************************************************************
     260              : !> \brief Creates the PAO subsection of the linear scaling section.
     261              : !> \param section ...
     262              : !> \author Ole Schuett
     263              : ! **************************************************************************************************
     264         9530 :    SUBROUTINE create_pao_section(section)
     265              :       TYPE(section_type), POINTER                        :: section
     266              : 
     267              :       TYPE(keyword_type), POINTER                        :: keyword
     268              :       TYPE(section_type), POINTER                        :: printkey, subsection, subsubsection
     269              : 
     270         9530 :       NULLIFY (keyword, subsection, subsubsection, printkey)
     271              : 
     272         9530 :       CPASSERT(.NOT. ASSOCIATED(section))
     273              :       CALL section_create(section, __LOCATION__, name="PAO", repeats=.FALSE., &
     274              :                           description="Polarized Atomic Orbital Method", &
     275        28590 :                           citations=[Schuett2018, Berghold2011])
     276              : 
     277              :       ! Convergence Criteria *****************************************************
     278              :       CALL keyword_create(keyword, __LOCATION__, name="EPS_PAO", &
     279              :                           description="Convergence criteria for PAO optimization.", &
     280         9530 :                           default_r_val=1.e-5_dp)
     281         9530 :       CALL section_add_keyword(section, keyword)
     282         9530 :       CALL keyword_release(keyword)
     283              : 
     284              :       CALL keyword_create(keyword, __LOCATION__, name="MIXING", &
     285              :                           description="Mixing fraction of new and old optimizied solutions.", &
     286         9530 :                           default_r_val=0.5_dp)
     287         9530 :       CALL section_add_keyword(section, keyword)
     288         9530 :       CALL keyword_release(keyword)
     289              : 
     290              :       CALL keyword_create(keyword, __LOCATION__, name="MAX_PAO", &
     291              :                           description="Maximum number of PAO basis optimization steps.", &
     292         9530 :                           default_i_val=1000)
     293         9530 :       CALL section_add_keyword(section, keyword)
     294         9530 :       CALL keyword_release(keyword)
     295              : 
     296              :       CALL keyword_create(keyword, __LOCATION__, name="MAX_CYCLES", &
     297              :                           description="Maximum number of PAO line search cycles for a given hamiltonian.", &
     298         9530 :                           default_i_val=75)
     299         9530 :       CALL section_add_keyword(section, keyword)
     300         9530 :       CALL keyword_release(keyword)
     301              : 
     302              :       CALL keyword_create(keyword, __LOCATION__, name="IGNORE_CONVERGENCE_FAILURE", &
     303              :                           description="If true, only a warning is issued if a PAO "// &
     304              :                           "optimization has not converged. By default, a run is aborted "// &
     305              :                           "if the required convergence criteria have not been achieved.", &
     306              :                           usage="IGNORE_CONVERGENCE_FAILURE logical_value", &
     307         9530 :                           default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
     308         9530 :       CALL section_add_keyword(section, keyword)
     309         9530 :       CALL keyword_release(keyword)
     310              : 
     311              :       ! Parametrization **********************************************************
     312              :       CALL keyword_create(keyword, __LOCATION__, name="PARAMETERIZATION", &
     313              :                           description="Parametrization of the mapping between the primary and the PAO basis.", &
     314              :                           enum_c_vals=s2a("ROTINV", "FOCK", "GTH", "EXP", "EQUIVARIANT"), &
     315              :                           enum_i_vals=[pao_rotinv_param, pao_fock_param, pao_gth_param, pao_exp_param, pao_equi_param], &
     316              :                           enum_desc=s2a("Rotational invariant parametrization (machine learnable)", &
     317              :                                         "Fock matrix parametrization", &
     318              :                                         "Parametrization based on GTH pseudo potentials", &
     319              :                                         "Original matrix exponential parametrization", &
     320              :                                         "Equivariant parametrization"), &
     321         9530 :                           default_i_val=pao_rotinv_param)
     322         9530 :       CALL section_add_keyword(section, keyword)
     323         9530 :       CALL keyword_release(keyword)
     324              : 
     325              :       CALL keyword_create(keyword, __LOCATION__, name="REGULARIZATION", &
     326              :                           description="Strength of regularization term which ensures parameters remain small.", &
     327         9530 :                           default_r_val=0.0_dp)
     328         9530 :       CALL section_add_keyword(section, keyword)
     329         9530 :       CALL keyword_release(keyword)
     330              : 
     331              :       CALL keyword_create(keyword, __LOCATION__, name="PENALTY_DISTANCE", &
     332              :                           description="Distance at which approaching eigenvalues are penalized to prevent degeneration.", &
     333         9530 :                           default_r_val=0.1_dp)
     334         9530 :       CALL section_add_keyword(section, keyword)
     335         9530 :       CALL keyword_release(keyword)
     336              : 
     337              :       CALL keyword_create(keyword, __LOCATION__, name="PENALTY_STRENGTH", &
     338              :                           description="Strength of the penalty term which prevents degenerate eigenvalues.", &
     339         9530 :                           default_r_val=0.005_dp)
     340         9530 :       CALL section_add_keyword(section, keyword)
     341         9530 :       CALL keyword_release(keyword)
     342              : 
     343              :       CALL keyword_create(keyword, __LOCATION__, name="PRECONDITION", &
     344              :                           description="Apply a preconditioner to the parametrization.", &
     345         9530 :                           default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
     346         9530 :       CALL section_add_keyword(section, keyword)
     347         9530 :       CALL keyword_release(keyword)
     348              : 
     349              :       CALL keyword_create(keyword, __LOCATION__, name="EPS_PGF", &
     350              :                           description="Sets precision for potential and descriptor matrix elements. "// &
     351         9530 :                           "Overrides DFT/QS/EPS_DEFAULT value.", type_of_var=real_t)
     352         9530 :       CALL section_add_keyword(section, keyword)
     353         9530 :       CALL keyword_release(keyword)
     354              : 
     355              :       ! Preopt  ******************************************************************
     356              :       CALL keyword_create(keyword, __LOCATION__, name="PREOPT_DM_FILE", &
     357              :                           description="Read pre-optimized density matrix from given file.", &
     358         9530 :                           repeats=.FALSE., default_c_val="")
     359         9530 :       CALL section_add_keyword(section, keyword)
     360         9530 :       CALL keyword_release(keyword)
     361              : 
     362              :       ! Misc ********************************************************************
     363              :       CALL keyword_create(keyword, __LOCATION__, name="RESTART_FILE", &
     364              :                           description="Reads given files as restart for PAO basis", &
     365         9530 :                           repeats=.FALSE., default_c_val="")
     366         9530 :       CALL section_add_keyword(section, keyword)
     367         9530 :       CALL keyword_release(keyword)
     368              : 
     369              :       CALL keyword_create(keyword, __LOCATION__, name="CHECK_GRADIENT_TOL", &
     370              :                           description="Tolerance for check of full analytic gradient against the numeric one."// &
     371              :                           " Negative values mean don't check at all.", &
     372         9530 :                           default_r_val=-1.0_dp)
     373         9530 :       CALL section_add_keyword(section, keyword)
     374         9530 :       CALL keyword_release(keyword)
     375              : 
     376              :       CALL keyword_create(keyword, __LOCATION__, name="NUM_GRADIENT_EPS", &
     377              :                           description="Step length used for the numeric derivative when checking the gradient.", &
     378         9530 :                           default_r_val=1e-8_dp)
     379         9530 :       CALL section_add_keyword(section, keyword)
     380         9530 :       CALL keyword_release(keyword)
     381              : 
     382              :       CALL keyword_create(keyword, __LOCATION__, name="NUM_GRADIENT_ORDER", &
     383              :                           description="Order of the numeric derivative when checking the gradient. "// &
     384              :                           "Possible values are 2, 4, and 6.", &
     385         9530 :                           default_i_val=2)
     386         9530 :       CALL section_add_keyword(section, keyword)
     387         9530 :       CALL keyword_release(keyword)
     388              : 
     389              :       CALL keyword_create(keyword, __LOCATION__, name="CHECK_UNITARY_TOL", &
     390              :                           description="Check if rotation matrix is unitary."// &
     391              :                           " Negative values mean don't check at all.", &
     392         9530 :                           default_r_val=-1.0_dp)
     393         9530 :       CALL section_add_keyword(section, keyword)
     394         9530 :       CALL keyword_release(keyword)
     395              : 
     396              :       ! Linpot settings  *********************************************************
     397              :       CALL keyword_create(keyword, __LOCATION__, name="LINPOT_PRECONDITION_DELTA", &
     398              :                           description="Eigenvalue threshold used for preconditioning.", &
     399         9530 :                           default_r_val=0.0_dp)
     400         9530 :       CALL section_add_keyword(section, keyword)
     401         9530 :       CALL keyword_release(keyword)
     402              : 
     403              :       CALL keyword_create(keyword, __LOCATION__, name="LINPOT_INITGUESS_DELTA", &
     404              :                           description="Eigenvalue threshold used for calculating initial guess.", &
     405         9530 :                           default_r_val=0.0_dp)
     406         9530 :       CALL section_add_keyword(section, keyword)
     407         9530 :       CALL keyword_release(keyword)
     408              : 
     409              :       CALL keyword_create(keyword, __LOCATION__, name="LINPOT_REGULARIZATION_DELTA", &
     410              :                           description="Eigenvalue threshold used for regularization.", &
     411         9530 :                           default_r_val=0.0_dp)
     412         9530 :       CALL section_add_keyword(section, keyword)
     413         9530 :       CALL keyword_release(keyword)
     414              : 
     415              :       CALL keyword_create(keyword, __LOCATION__, name="LINPOT_REGULARIZATION_STRENGTH", &
     416              :                           description="Strength of regularization on linpot layer.", &
     417         9530 :                           default_r_val=0.0_dp)
     418         9530 :       CALL section_add_keyword(section, keyword)
     419         9530 :       CALL keyword_release(keyword)
     420              : 
     421              :       ! Machine Learning *********************************************************
     422         9530 :       CALL section_create(subsection, __LOCATION__, name="MACHINE_LEARNING", description="Machine learning section")
     423              : 
     424              :       CALL keyword_create(keyword, __LOCATION__, name="METHOD", &
     425              :                           description="Machine learning scheme used to predict PAO basis sets.", &
     426              :                           enum_c_vals=s2a("GAUSSIAN_PROCESS", "NEURAL_NETWORK", "LAZY"), &
     427              :                           enum_i_vals=[pao_ml_gp, pao_ml_nn, pao_ml_lazy], &
     428              :                           enum_desc=s2a("Gaussian Process", "Neural Network", "Just rely on prior"), &
     429         9530 :                           default_i_val=pao_ml_gp)
     430         9530 :       CALL section_add_keyword(subsection, keyword)
     431         9530 :       CALL keyword_release(keyword)
     432              : 
     433              :       CALL keyword_create(keyword, __LOCATION__, name="PRIOR", &
     434              :                           description="Prior used for predictions.", &
     435              :                           enum_c_vals=s2a("ZERO", "MEAN"), &
     436              :                           enum_i_vals=[pao_ml_prior_zero, pao_ml_prior_mean], &
     437              :                           enum_desc=s2a("Simply use zero", "Use average of training-set"), &
     438         9530 :                           default_i_val=pao_ml_prior_zero)
     439         9530 :       CALL section_add_keyword(subsection, keyword)
     440         9530 :       CALL keyword_release(keyword)
     441              : 
     442              :       CALL keyword_create(keyword, __LOCATION__, name="DESCRIPTOR", &
     443              :                           description="Descriptor used as input for machine learning.", &
     444              :                           enum_c_vals=s2a("POTENTIAL", "OVERLAP", "R12"), &
     445              :                           enum_i_vals=[pao_ml_desc_pot, pao_ml_desc_overlap, pao_ml_desc_r12], &
     446              :                           enum_desc=s2a("Eigenvalues of local potential matrix", &
     447              :                                         "Eigenvalues of local overlap matrix", &
     448              :                                         "Distance between two atoms (just for testing)"), &
     449              :                           citations=[Zhu2016], &
     450        19060 :                           default_i_val=pao_ml_desc_pot)
     451         9530 :       CALL section_add_keyword(subsection, keyword)
     452         9530 :       CALL keyword_release(keyword)
     453              : 
     454              :       CALL keyword_create(keyword, __LOCATION__, name="TOLERANCE", &
     455              :                           description="Maximum variance tolerated when making predictions.", &
     456         9530 :                           default_r_val=1.0E-2_dp)
     457         9530 :       CALL section_add_keyword(subsection, keyword)
     458         9530 :       CALL keyword_release(keyword)
     459              : 
     460              :       CALL keyword_create(keyword, __LOCATION__, name="GP_NOISE_VAR", &
     461              :                           description="Variance of noise used for Gaussian Process machine learning.", &
     462         9530 :                           default_r_val=0.1_dp)
     463         9530 :       CALL section_add_keyword(subsection, keyword)
     464         9530 :       CALL keyword_release(keyword)
     465              : 
     466              :       CALL keyword_create(keyword, __LOCATION__, name="GP_SCALE", &
     467              :                           description="Length scale used for Gaussian Process machine learning.", &
     468         9530 :                           default_r_val=0.05_dp)
     469         9530 :       CALL section_add_keyword(subsection, keyword)
     470         9530 :       CALL keyword_release(keyword)
     471              : 
     472              :       ! special free-text section similar to SUBSYS%COORD
     473              :       CALL section_create(subsubsection, __LOCATION__, name="TRAINING_SET", &
     474         9530 :                           description="Lists PAO-restart file used for training")
     475              :       CALL keyword_create(keyword, __LOCATION__, name="_DEFAULT_KEYWORD_", &
     476              :                           description="One file name per line.", &
     477         9530 :                           repeats=.TRUE., type_of_var=lchar_t)
     478         9530 :       CALL section_add_keyword(subsubsection, keyword)
     479         9530 :       CALL keyword_release(keyword)
     480         9530 :       CALL section_add_subsection(subsection, subsubsection)
     481         9530 :       CALL section_release(subsubsection)
     482              : 
     483         9530 :       CALL section_add_subsection(section, subsection)
     484         9530 :       CALL section_release(subsection)
     485              : 
     486              :       ! Output *******************************************************************
     487              :       CALL section_create(subsection, __LOCATION__, name="PRINT", &
     488              :                           description="Printkey section", &
     489         9530 :                           n_keywords=0, n_subsections=1, repeats=.TRUE.)
     490              : 
     491              :       CALL cp_print_key_section_create(printkey, __LOCATION__, "RUN_INFO", &
     492              :                                        description="Normal output by PAO", &
     493         9530 :                                        print_level=low_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     494         9530 :       CALL section_add_subsection(subsection, printkey)
     495         9530 :       CALL section_release(printkey)
     496              : 
     497              :       CALL cp_print_key_section_create(printkey, __LOCATION__, "ATOM_INFO", &
     498              :                                        description="One line summary for each atom", &
     499         9530 :                                        print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     500         9530 :       CALL section_add_subsection(subsection, printkey)
     501         9530 :       CALL section_release(printkey)
     502              : 
     503              :       CALL cp_print_key_section_create(printkey, __LOCATION__, "FOCK_GAP", &
     504              :                                        description="Gap of the fock matrix for each atom", &
     505         9530 :                                        print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     506         9530 :       CALL section_add_subsection(subsection, printkey)
     507         9530 :       CALL section_release(printkey)
     508              : 
     509              :       CALL cp_print_key_section_create(printkey, __LOCATION__, "FOCK_EIGENVALUES", &
     510              :                                        description="Eigenvalues of the fock matrix for each atom", &
     511         9530 :                                        print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     512         9530 :       CALL section_add_subsection(subsection, printkey)
     513         9530 :       CALL section_release(printkey)
     514              : 
     515              :       CALL cp_print_key_section_create(printkey, __LOCATION__, "ML_VARIANCE", &
     516              :                                        description="Variances of machine learning predictions for each atom", &
     517         9530 :                                        print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     518         9530 :       CALL section_add_subsection(subsection, printkey)
     519         9530 :       CALL section_release(printkey)
     520              : 
     521              :       CALL cp_print_key_section_create(printkey, __LOCATION__, "ML_TRAINING_DATA", &
     522              :                                        description="Dumps training data used for machine learning", &
     523         9530 :                                        print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     524         9530 :       CALL section_add_subsection(subsection, printkey)
     525         9530 :       CALL section_release(printkey)
     526              : 
     527              :       CALL cp_print_key_section_create(printkey, __LOCATION__, "OPT_INFO", &
     528              :                                        description="Output by the optimizer", &
     529         9530 :                                        print_level=low_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     530         9530 :       CALL section_add_subsection(subsection, printkey)
     531         9530 :       CALL section_release(printkey)
     532              : 
     533              :       CALL cp_print_key_section_create(printkey, __LOCATION__, "RESTART", &
     534              :                                        description="Restart file of PAO basis", &
     535         9530 :                                        print_level=high_print_level, add_last=add_last_numeric, filename="")
     536              : 
     537              :       CALL keyword_create(keyword, __LOCATION__, name="BACKUP_COPIES", &
     538              :                           description="Specifies the maximum number of backup copies.", &
     539              :                           usage="BACKUP_COPIES {int}", &
     540         9530 :                           default_i_val=1)
     541         9530 :       CALL section_add_keyword(printkey, keyword)
     542         9530 :       CALL keyword_release(keyword)
     543              : 
     544              :       CALL keyword_create(keyword, __LOCATION__, name="WRITE_CYCLES", &
     545              :                           description="Maximum number of PAO line search cycles until a restart is written.", &
     546         9530 :                           default_i_val=100)
     547         9530 :       CALL section_add_keyword(printkey, keyword)
     548         9530 :       CALL keyword_release(keyword)
     549              : 
     550         9530 :       CALL section_add_subsection(subsection, printkey)
     551         9530 :       CALL section_release(printkey)
     552              : 
     553         9530 :       CALL section_add_subsection(section, subsection)
     554         9530 :       CALL section_release(subsection)
     555              : 
     556              :       ! OPT stuff ****************************************************************
     557              :       CALL keyword_create(keyword, __LOCATION__, name="OPTIMIZER", &
     558              :                           description="Optimizer used to find PAO basis.", &
     559              :                           enum_c_vals=s2a("CG", "BFGS"), &
     560              :                           enum_i_vals=[pao_opt_cg, pao_opt_bfgs], &
     561              :                           enum_desc=s2a("Conjugate gradient algorithm", &
     562              :                                         "Broyden-Fletcher-Goldfarb-Shanno algorithm"), &
     563         9530 :                           default_i_val=pao_opt_cg)
     564         9530 :       CALL section_add_keyword(section, keyword)
     565         9530 :       CALL keyword_release(keyword)
     566              : 
     567              :       CALL keyword_create(keyword, __LOCATION__, name="CG_INIT_STEPS", &
     568              :                           description="Number of steepest descent steps before starting the"// &
     569              :                           " conjugate gradients optimization.", &
     570         9530 :                           default_i_val=2)
     571         9530 :       CALL section_add_keyword(section, keyword)
     572         9530 :       CALL keyword_release(keyword)
     573              : 
     574              :       CALL keyword_create(keyword, __LOCATION__, name="CG_RESET_LIMIT", &
     575              :                           description="The CG is reseted if the cosine of the angle between the last "// &
     576              :                           "search direction and the new gradient is larger that the limit.", &
     577         9530 :                           default_r_val=0.1_dp)
     578         9530 :       CALL section_add_keyword(section, keyword)
     579         9530 :       CALL keyword_release(keyword)
     580              : 
     581         9530 :       CALL linesearch_create_section(subsection)
     582         9530 :       CALL section_add_subsection(section, subsection)
     583              : 
     584         9530 :       CALL section_release(subsection)
     585         9530 :    END SUBROUTINE create_pao_section
     586              : 
     587              : END MODULE pao_input
        

Generated by: LCOV version 2.0-1