(git:374b731)
Loading...
Searching...
No Matches
pao_param.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 Front-End for any PAO parametrization
10!> \author Ole Schuett
11! **************************************************************************************************
13 USE dbcsr_api, ONLY: dbcsr_copy,&
14 dbcsr_frobenius_norm,&
15 dbcsr_multiply,&
16 dbcsr_release,&
17 dbcsr_type
19 USE kinds, ONLY: dp
20 USE pao_input, ONLY: pao_equi_param,&
45 USE pao_types, ONLY: pao_env_type
47#include "./base/base_uses.f90"
48
49 IMPLICIT NONE
50
51 PRIVATE
52
53 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pao_param'
54
57
58CONTAINS
59
60! **************************************************************************************************
61!> \brief Takes current matrix_X and calculates the matrices A and B.
62!> \param pao ...
63!> \param qs_env ...
64!> \param ls_scf_env ...
65!> \param gradient ...
66!> \param penalty ...
67!> \param forces ...
68! **************************************************************************************************
69 SUBROUTINE pao_calc_ab(pao, qs_env, ls_scf_env, gradient, penalty, forces)
70 TYPE(pao_env_type), POINTER :: pao
71 TYPE(qs_environment_type), POINTER :: qs_env
72 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
73 LOGICAL, INTENT(IN) :: gradient
74 REAL(dp), INTENT(OUT), OPTIONAL :: penalty
75 REAL(dp), DIMENSION(:, :), INTENT(OUT), OPTIONAL :: forces
76
77 CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_AB'
78
79 INTEGER :: handle
80
81 CALL timeset(routinen, handle)
82
83 IF (PRESENT(penalty)) penalty = 0.0_dp
84 IF (PRESENT(forces)) forces(:, :) = 0.0_dp
85
86 !calculate matrix_A/B = Function of matrix_X
87 SELECT CASE (pao%parameterization)
88 CASE (pao_exp_param)
89 CALL pao_calc_ab_exp(pao, qs_env, ls_scf_env, gradient)
91 CALL pao_calc_ab_linpot(pao, qs_env, ls_scf_env, gradient, penalty, forces)
92 CASE (pao_gth_param)
93 CALL pao_calc_ab_gth(pao, qs_env, ls_scf_env, gradient, penalty)
94 CASE (pao_equi_param)
95 CALL pao_calc_ab_equi(pao, qs_env, ls_scf_env, gradient, penalty)
96 CASE DEFAULT
97 cpabort("PAO: unkown parametrization")
98 END SELECT
99
100 CALL timestop(handle)
101 END SUBROUTINE pao_calc_ab
102
103! **************************************************************************************************
104!> \brief Initialize PAO parametrization
105!> \param pao ...
106!> \param qs_env ...
107! **************************************************************************************************
108 SUBROUTINE pao_param_init(pao, qs_env)
109 TYPE(pao_env_type), POINTER :: pao
110 TYPE(qs_environment_type), POINTER :: qs_env
111
112 CHARACTER(len=*), PARAMETER :: routinen = 'pao_param_init'
113
114 INTEGER :: handle
115
116 CALL timeset(routinen, handle)
117
118 SELECT CASE (pao%parameterization)
119 CASE (pao_exp_param)
120 CALL pao_param_init_exp(pao, qs_env)
122 CALL pao_param_init_linpot(pao, qs_env)
123 CASE (pao_gth_param)
124 CALL pao_param_init_gth(pao, qs_env)
125 CASE (pao_equi_param)
126 CALL pao_param_init_equi(pao)
127 CASE DEFAULT
128 cpabort("PAO: unknown parametrization")
129 END SELECT
130
131 CALL timestop(handle)
132
133 END SUBROUTINE pao_param_init
134
135! **************************************************************************************************
136!> \brief Finalize PAO parametrization
137!> \param pao ...
138! **************************************************************************************************
139 SUBROUTINE pao_param_finalize(pao)
140 TYPE(pao_env_type), POINTER :: pao
141
142 CHARACTER(len=*), PARAMETER :: routinen = 'pao_param_finalize'
143
144 INTEGER :: handle
145
146 CALL timeset(routinen, handle)
147
148 SELECT CASE (pao%parameterization)
149 CASE (pao_exp_param)
150 CALL pao_param_finalize_exp(pao)
153 CASE (pao_gth_param)
154 CALL pao_param_finalize_gth(pao)
155 CASE (pao_equi_param)
157 CASE DEFAULT
158 cpabort("PAO: unknown parametrization")
159 END SELECT
160
161 CALL timestop(handle)
162
163 END SUBROUTINE pao_param_finalize
164
165! **************************************************************************************************
166!> \brief Returns the number of parameters for given atomic kind
167!> \param pao ...
168!> \param qs_env ...
169!> \param ikind ...
170!> \param nparams ...
171! **************************************************************************************************
172 SUBROUTINE pao_param_count(pao, qs_env, ikind, nparams)
173 TYPE(pao_env_type), POINTER :: pao
174 TYPE(qs_environment_type), POINTER :: qs_env
175 INTEGER, INTENT(IN) :: ikind
176 INTEGER, INTENT(OUT) :: nparams
177
178 CHARACTER(len=*), PARAMETER :: routinen = 'pao_param_count'
179
180 INTEGER :: handle
181
182 CALL timeset(routinen, handle)
183
184 SELECT CASE (pao%parameterization)
185 CASE (pao_exp_param)
186 CALL pao_param_count_exp(qs_env, ikind=ikind, nparams=nparams)
188 CALL pao_param_count_linpot(pao, qs_env, ikind=ikind, nparams=nparams)
189 CASE (pao_gth_param)
190 CALL pao_param_count_gth(qs_env, ikind=ikind, nparams=nparams)
191 CASE (pao_equi_param)
192 CALL pao_param_count_equi(qs_env, ikind=ikind, nparams=nparams)
193 CASE DEFAULT
194 cpabort("PAO: unknown parametrization")
195 END SELECT
196
197 CALL timestop(handle)
198
199 END SUBROUTINE pao_param_count
200
201! **************************************************************************************************
202!> \brief Fills matrix_X with an initial guess
203!> \param pao ...
204!> \param qs_env ...
205! **************************************************************************************************
206 SUBROUTINE pao_param_initial_guess(pao, qs_env)
207 TYPE(pao_env_type), POINTER :: pao
208 TYPE(qs_environment_type), POINTER :: qs_env
209
210 CHARACTER(len=*), PARAMETER :: routinen = 'pao_param_initial_guess'
211
212 INTEGER :: handle
213 REAL(dp) :: norm
214 TYPE(dbcsr_type) :: matrix_tmp
215
216 CALL timeset(routinen, handle)
217
218 SELECT CASE (pao%parameterization)
219 CASE (pao_exp_param)
222 CALL pao_param_initguess_linpot(pao, qs_env)
223 CASE (pao_gth_param)
225 CASE (pao_equi_param)
226 CALL pao_param_initguess_equi(pao, qs_env)
227 CASE DEFAULT
228 cpabort("PAO: unknown parametrization")
229 END SELECT
230
231 norm = dbcsr_frobenius_norm(pao%matrix_X)
232 IF (pao%iw > 0) WRITE (pao%iw, *) "PAO| Made initial guess for matrix_X with norm:", norm
233
234 IF (pao%precondition) THEN
235 !TODO: multiplying a matrix into itself while retaining sparsity seems to be broken
236 CALL dbcsr_copy(matrix_tmp, pao%matrix_X)
237 CALL dbcsr_multiply("N", "N", 1.0_dp, pao%matrix_precon, matrix_tmp, &
238 0.0_dp, pao%matrix_X, retain_sparsity=.true.)
239 CALL dbcsr_release(matrix_tmp)
240 END IF
241
242 CALL timestop(handle)
243
244 END SUBROUTINE pao_param_initial_guess
245
246END MODULE pao_param
Types needed for a linear scaling quickstep SCF run based on the density matrix.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public pao_equi_param
Definition pao_input.F:45
integer, parameter, public pao_fock_param
Definition pao_input.F:45
integer, parameter, public pao_rotinv_param
Definition pao_input.F:45
integer, parameter, public pao_gth_param
Definition pao_input.F:45
integer, parameter, public pao_exp_param
Definition pao_input.F:45
Equivariant parametrization.
subroutine, public pao_param_count_equi(qs_env, ikind, nparams)
Returns the number of parameters for given atomic kind.
subroutine, public pao_param_finalize_equi()
Finalize equivariant parametrization.
subroutine, public pao_param_initguess_equi(pao, qs_env)
Fills matrix_X with an initial guess.
subroutine, public pao_param_init_equi(pao)
Initialize equivariant parametrization.
subroutine, public pao_calc_ab_equi(pao, qs_env, ls_scf_env, gradient, penalty)
Takes current matrix_X and calculates the matrices A and B.
Original matrix exponential parametrization.
subroutine, public pao_calc_ab_exp(pao, qs_env, ls_scf_env, gradient)
Takes current matrix_X and calculates the matrices A and B.
subroutine, public pao_param_finalize_exp(pao)
Finalize exponential parametrization.
subroutine, public pao_param_initguess_exp(pao)
Fills matrix_X with an initial guess.
subroutine, public pao_param_init_exp(pao, qs_env)
Initialize matrix exponential parametrization.
subroutine, public pao_param_count_exp(qs_env, ikind, nparams)
Returns the number of parameters for given atomic kind.
Parametrization based on GTH pseudo potentials.
subroutine, public pao_calc_ab_gth(pao, qs_env, ls_scf_env, gradient, penalty)
Takes current matrix_X and calculates the matrices A and B.
subroutine, public pao_param_initguess_gth(pao)
Calculate initial guess for matrix_X.
subroutine, public pao_param_count_gth(qs_env, ikind, nparams)
Returns the number of parameters for given atomic kind.
subroutine, public pao_param_init_gth(pao, qs_env)
Initialize the linear potential parametrization.
subroutine, public pao_param_finalize_gth(pao)
Finalize the GTH potential parametrization.
Common framework for a linear parametrization of the potential.
subroutine, public pao_param_finalize_linpot(pao)
Finalize the linear potential parametrization.
subroutine, public pao_param_init_linpot(pao, qs_env)
Initialize the linear potential parametrization.
subroutine, public pao_calc_ab_linpot(pao, qs_env, ls_scf_env, gradient, penalty, forces)
Takes current matrix_X and calculates the matrices A and B.
subroutine, public pao_param_count_linpot(pao, qs_env, ikind, nparams)
Returns the number of potential terms for given atomic kind.
subroutine, public pao_param_initguess_linpot(pao, qs_env)
Calculate initial guess for matrix_X.
Front-End for any PAO parametrization.
Definition pao_param.F:12
subroutine, public pao_param_initial_guess(pao, qs_env)
Fills matrix_X with an initial guess.
Definition pao_param.F:207
subroutine, public pao_param_init(pao, qs_env)
Initialize PAO parametrization.
Definition pao_param.F:109
subroutine, public pao_calc_ab(pao, qs_env, ls_scf_env, gradient, penalty, forces)
Takes current matrix_X and calculates the matrices A and B.
Definition pao_param.F:70
subroutine, public pao_param_count(pao, qs_env, ikind, nparams)
Returns the number of parameters for given atomic kind.
Definition pao_param.F:173
subroutine, public pao_param_finalize(pao)
Finalize PAO parametrization.
Definition pao_param.F:140
Types used by the PAO machinery.
Definition pao_types.F:12