Line data Source code
1 : !--------------------------------------------------------------------------------------------------! 2 : ! CP2K: A general program to perform molecular dynamics simulations ! 3 : ! Copyright 2000-2025 CP2K developers group <https://cp2k.org> ! 4 : ! ! 5 : ! SPDX-License-Identifier: GPL-2.0-or-later ! 6 : !--------------------------------------------------------------------------------------------------! 7 : 8 : ! ************************************************************************************************** 9 : !> \brief Types used by the PAO machinery 10 : !> \author Ole Schuett 11 : ! ************************************************************************************************** 12 : MODULE pao_types 13 : USE OMP_LIB, ONLY: omp_destroy_lock,& 14 : omp_lock_kind 15 : USE cp_dbcsr_api, ONLY: dbcsr_distribution_release,& 16 : dbcsr_distribution_type,& 17 : dbcsr_release,& 18 : dbcsr_type 19 : USE kinds, ONLY: default_path_length,& 20 : default_string_length,& 21 : dp 22 : USE linesearch, ONLY: linesearch_type 23 : USE torch_api, ONLY: torch_model_release,& 24 : torch_model_type 25 : #include "./base/base_uses.f90" 26 : 27 : IMPLICIT NONE 28 : 29 : PRIVATE 30 : 31 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pao_types' 32 : 33 : PUBLIC :: pao_env_type, training_matrix_type, pao_model_type, pao_finalize 34 : 35 : TYPE filename_type 36 : CHARACTER(LEN=default_path_length) :: fn = "" 37 : END TYPE filename_type 38 : 39 : ! ************************************************************************************************** 40 : !> \brief PAO machine learning data for one atomic kind 41 : !> \var kindname name of atomic kind 42 : !> \var inputs training points 43 : !> \var outputs training points 44 : !> \var prior constant prior which is added to prediction 45 : !> \var NN trained neural network 46 : !> \var GP trained gaussian process 47 : ! ************************************************************************************************** 48 : TYPE training_matrix_type 49 : CHARACTER(LEN=default_string_length) :: kindname = "" 50 : REAL(dp), DIMENSION(:, :), ALLOCATABLE :: inputs 51 : REAL(dp), DIMENSION(:, :), ALLOCATABLE :: outputs 52 : REAL(dp), DIMENSION(:), ALLOCATABLE :: prior 53 : REAL(dp), DIMENSION(:, :, :), ALLOCATABLE :: NN ! Neural Network 54 : REAL(dp), DIMENSION(:, :), ALLOCATABLE :: GP ! Gaussian Process 55 : END TYPE training_matrix_type 56 : 57 : ! ************************************************************************************************** 58 : !> \brief PAO-ML model for a single atomic kind. 59 : ! ************************************************************************************************** 60 : TYPE pao_model_type 61 : TYPE(torch_model_type) :: torch_model 62 : INTEGER :: version = -1 63 : CHARACTER(LEN=default_string_length) :: kind_name = "" 64 : INTEGER :: atomic_number = -1 65 : CHARACTER(LEN=default_string_length) :: prim_basis_name = "" 66 : INTEGER :: prim_basis_size = -1 67 : INTEGER :: pao_basis_size = -1 68 : INTEGER :: num_neighbors = -1 69 : REAL(dp) :: cutoff = 0.0_dp 70 : INTEGER, DIMENSION(:), ALLOCATABLE :: feature_kinds 71 : INTEGER(kind=omp_lock_kind) :: lock = -1 72 : END TYPE pao_model_type 73 : 74 : ! ************************************************************************************************** 75 : !> \brief The PAO environment type 76 : !> \var eps_pao parsed input parameter 77 : !> \var cg_reset_limit parsed input parameter 78 : !> \var mixing parsed input parameter 79 : !> \var regularization parsed input parameter 80 : !> \var penalty_dist parsed input parameter 81 : !> \var penalty_strength parsed input parameter 82 : !> \var check_unitary_tol parsed input parameter 83 : !> \var check_grad_tol parsed input parameter 84 : !> \var num_grad_eps parsed input parameter 85 : !> \var eps_pgf parsed input parameter 86 : !> \var linpot_precon_delta parsed input parameter 87 : !> \var linpot_init_delta parsed input parameter 88 : !> \var linpot_regu_delta parsed input parameter 89 : !> \var linpot_regu_strength parsed input parameter 90 : !> \var num_grad_order parsed input parameter 91 : !> \var max_pao parsed input parameter 92 : !> \var max_cycles parsed input parameter 93 : !> \var write_cycles parsed input parameter 94 : !> \var parameterization parsed input parameter 95 : !> \var optimizer parsed input parameter 96 : !> \var cg_init_steps parsed input parameter 97 : !> \var preopt_dm_file parsed input parameter 98 : !> \var restart_file parsed input parameter 99 : !> \var ml_training_set parsed input parameter 100 : !> \var ml_method parsed input parameter 101 : !> \var ml_prior parsed input parameter 102 : !> \var ml_descriptor parsed input parameter 103 : !> \var ml_tolerance parsed input parameter 104 : !> \var gp_noise_var parsed input parameter 105 : !> \var gp_scale parsed input parameter 106 : !> \var precondition parsed input parameter 107 : !> \var iw output unit for pao in general 108 : !> \var iw_atoms output unit for one line summary for each atom 109 : !> \var iw_gap output unit for gap of the fock matrix 110 : !> \var iw_fockev output unit for eigenvalues of the fock matrix 111 : !> \var iw_opt output unit for pao optimizer 112 : !> \var iw_mlvar output unit for variances of machine learning predictions 113 : !> \var iw_mldata output unit for dumping training data used for machine learning 114 : !> \var istep counts pao iterations, ie. number of pao energy evaluations 115 : !> \var energy_prev energy of previous pao step 116 : !> \var step_start_time timestamp of when current pao step started 117 : !> \var norm_G frobenius-norm of matrix_G or matrix_G_preconed 118 : !> \var linesearch holds linesearch state 119 : !> \var matrix_X_ready set when matrix_X is initialized 120 : !> \var matrix_P_ready set when density matrix is initialized 121 : !> \var constants_ready set when stuff, which does not depend of atomic positions is ready 122 : !> \var need_initial_scf set when the initial density matrix is not self-consistend 123 : !> \var matrix_X parameters of pao basis, which eventually determine matrix_U. Uses diag_distribution. 124 : !> \var matrix_U0 constant pre-rotation which serves as initial guess for exp-parametrization. Uses diag_distribution. 125 : !> \var matrix_H0 Diagonal blocks of core hamiltonian, uses diag_distribution 126 : !> \var matrix_Y selector matrix which translates between primary and pao basis. 127 : !> basically a block diagonal "rectangular identity matrix". Uses s_matrix-distribution. 128 : !> \var matrix_N diagonal matrix filled with 1/sqrt(S) from primary overlap matrix. Uses s_matrix-distribution. 129 : !> \var matrix_N_diag copy of matrix_N using diag_distribution 130 : !> \var matrix_N_inv diagonal matrix filled with sqrt(S) from primary overlap matrix. Uses s_matrix-distribution. 131 : !> \var matrix_N_inv_diag copy of matrix_N_inv using diag_distribution 132 : !> \var matrix_X_orig copy made of matrix_X at beginning of optimization cylce, used for mixing. Uses diag_distribution. 133 : !> \var matrix_G derivative of pao-energy wrt to matrix_X, ie. the pao-gradient. Uses diag_distribution. 134 : !> \var matrix_G_prev copy of gradient from previous step, used for conjugate gradient method. Uses diag_distribution. 135 : !> \var matrix_D Current line-search direction, used for conjugate gradient method. Uses diag_distribution. 136 : !> \var matrix_D_preconed Current line-search direction with preconditioner applied. 137 : !> This copy is keept, because application of inverse preconditioner 138 : !> introduces too much numeric noise. Uses diag_distribution. 139 : !> \var matrix_V_terms Potential terms, used by linpot and gth parametrization, Uses diag_distribution. 140 : !> \var matrix_BFGS Approximate inverse hessian, used by BFGS optimizer, Uses diag_distribution. 141 : !> \var matrix_precon preconditioner, uses diag_distribution. 142 : !> \var matrix_precon_inv inverse of matrix_precon, uses diag_distribution. 143 : !> \var matrix_R Rgularization, uses diag_distribution 144 : !> \var ml_training_matrices holds training data and trained machine learning model 145 : !> \var diag_distribution DBCSR distribution to spreads diagonal blocks evenly across ranks 146 : ! ************************************************************************************************** 147 : TYPE pao_env_type 148 : ! input values 149 : REAL(KIND=dp) :: eps_pao = 0.0_dp 150 : REAL(KIND=dp) :: cg_reset_limit = 0.1_dp 151 : REAL(KIND=dp) :: mixing = 0.0_dp 152 : REAL(KIND=dp) :: regularization = 0.0_dp 153 : REAL(KIND=dp) :: penalty_dist = 0.0_dp 154 : REAL(KIND=dp) :: penalty_strength = 0.0_dp 155 : REAL(KIND=dp) :: check_unitary_tol = 0.0_dp 156 : REAL(KIND=dp) :: check_grad_tol = 0.0_dp 157 : REAL(KIND=dp) :: num_grad_eps = 0.0_dp 158 : REAL(KIND=dp) :: eps_pgf = 0.0_dp 159 : REAL(KIND=dp) :: linpot_precon_delta = 0.0_dp 160 : REAL(KIND=dp) :: linpot_init_delta = 0.0_dp 161 : REAL(KIND=dp) :: linpot_regu_delta = 0.0_dp 162 : REAL(KIND=dp) :: linpot_regu_strength = 0.0_dp 163 : INTEGER :: num_grad_order = -1 164 : INTEGER :: max_pao = -1 165 : INTEGER :: max_cycles = -1 166 : INTEGER :: write_cycles = -1 167 : INTEGER :: parameterization = -1 168 : INTEGER :: optimizer = -1 169 : INTEGER :: cg_init_steps = -1 170 : LOGICAL :: precondition = .FALSE. 171 : CHARACTER(LEN=default_path_length) :: preopt_dm_file = "" 172 : CHARACTER(LEN=default_path_length) :: restart_file = "" 173 : TYPE(filename_type), DIMENSION(:), ALLOCATABLE :: ml_training_set 174 : 175 : INTEGER :: ml_method = -1 176 : INTEGER :: ml_prior = -1 177 : INTEGER :: ml_descriptor = -1 178 : REAL(KIND=dp) :: ml_tolerance = 0.0_dp 179 : REAL(KIND=dp) :: gp_noise_var = 0.0_dp 180 : REAL(KIND=dp) :: gp_scale = 0.0_dp 181 : 182 : ! output units 183 : INTEGER :: iw = -1 184 : INTEGER :: iw_atoms = -1 185 : INTEGER :: iw_gap = -1 186 : INTEGER :: iw_fockev = -1 187 : INTEGER :: iw_opt = -1 188 : INTEGER :: iw_mlvar = -1 189 : INTEGER :: iw_mldata = -1 190 : 191 : ! state variable 192 : INTEGER :: istep = -1 193 : REAL(KIND=dp) :: energy_prev = 0.0_dp 194 : REAL(KIND=dp) :: step_start_time = 0.0_dp 195 : REAL(KIND=dp) :: norm_G = 0.0_dp 196 : TYPE(linesearch_type) :: linesearch = linesearch_type() 197 : LOGICAL :: matrix_X_ready = .FALSE. 198 : LOGICAL :: matrix_P_ready = .FALSE. 199 : LOGICAL :: constants_ready = .FALSE. 200 : LOGICAL :: need_initial_scf = .FALSE. 201 : 202 : ! matrices 203 : TYPE(dbcsr_type) :: matrix_X 204 : TYPE(dbcsr_type) :: matrix_U0 205 : TYPE(dbcsr_type) :: matrix_H0 206 : TYPE(dbcsr_type) :: matrix_Y 207 : TYPE(dbcsr_type) :: matrix_N 208 : TYPE(dbcsr_type) :: matrix_N_diag 209 : TYPE(dbcsr_type) :: matrix_N_inv 210 : TYPE(dbcsr_type) :: matrix_N_inv_diag 211 : TYPE(dbcsr_type) :: matrix_X_orig 212 : TYPE(dbcsr_type) :: matrix_G 213 : TYPE(dbcsr_type) :: matrix_G_prev 214 : TYPE(dbcsr_type) :: matrix_D 215 : TYPE(dbcsr_type) :: matrix_D_preconed 216 : TYPE(dbcsr_type) :: matrix_V_terms 217 : TYPE(dbcsr_type) :: matrix_BFGS 218 : TYPE(dbcsr_type) :: matrix_precon 219 : TYPE(dbcsr_type) :: matrix_precon_inv 220 : TYPE(dbcsr_type) :: matrix_R 221 : 222 : TYPE(training_matrix_type), ALLOCATABLE, & 223 : DIMENSION(:) :: ml_training_matrices 224 : 225 : TYPE(pao_model_type), ALLOCATABLE, & 226 : DIMENSION(:) :: models 227 : 228 : TYPE(dbcsr_distribution_type) :: diag_distribution 229 : END TYPE 230 : 231 : CONTAINS 232 : 233 : ! ************************************************************************************************** 234 : !> \brief Finalize the PAO environment 235 : !> \param pao ... 236 : ! ************************************************************************************************** 237 98 : SUBROUTINE pao_finalize(pao) 238 : TYPE(pao_env_type) :: pao 239 : 240 : CHARACTER(len=*), PARAMETER :: routineN = 'pao_finalize' 241 : 242 : INTEGER :: handle, i 243 : 244 98 : CALL timeset(routineN, handle) 245 : 246 98 : CALL dbcsr_release(pao%matrix_X) 247 98 : CALL dbcsr_release(pao%matrix_Y) 248 98 : CALL dbcsr_release(pao%matrix_N) 249 98 : CALL dbcsr_release(pao%matrix_N_diag) 250 98 : CALL dbcsr_release(pao%matrix_N_inv) 251 98 : CALL dbcsr_release(pao%matrix_N_inv_diag) 252 98 : CALL dbcsr_release(pao%matrix_H0) 253 : 254 98 : DEALLOCATE (pao%ml_training_set) 255 98 : IF (ALLOCATED(pao%ml_training_matrices)) & 256 38 : DEALLOCATE (pao%ml_training_matrices) 257 : 258 98 : IF (ALLOCATED(pao%models)) THEN 259 12 : DO i = 1, SIZE(pao%models) 260 8 : IF (pao%models(i)%version > 0) THEN 261 8 : CALL torch_model_release(pao%models(i)%torch_model) 262 : END IF 263 12 : CALL omp_destroy_lock(pao%models(i)%lock) 264 : END DO 265 12 : DEALLOCATE (pao%models) 266 : END IF 267 : 268 98 : CALL dbcsr_distribution_release(pao%diag_distribution) 269 : 270 : !TODO: should finish printkey 271 : 272 98 : CALL timestop(handle) 273 : 274 98 : END SUBROUTINE pao_finalize 275 : 276 0 : END MODULE pao_types