(git:3add494)
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 ! **************************************************************************************************
12 MODULE pao_param
13  USE dbcsr_api, ONLY: dbcsr_copy,&
14  dbcsr_frobenius_norm,&
15  dbcsr_multiply,&
16  dbcsr_release,&
17  dbcsr_type
18  USE dm_ls_scf_types, ONLY: ls_scf_env_type
19  USE kinds, ONLY: dp
20  USE pao_input, ONLY: pao_equi_param,&
25  USE pao_param_equi, ONLY: pao_calc_ab_equi,&
30  USE pao_param_exp, ONLY: pao_calc_ab_exp,&
35  USE pao_param_gth, ONLY: pao_calc_ab_gth,&
45  USE pao_types, ONLY: pao_env_type
46  USE qs_environment_types, ONLY: qs_environment_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 
58 CONTAINS
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)
152  CALL pao_param_finalize_linpot(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)
220  CALL pao_param_initguess_exp(pao)
222  CALL pao_param_initguess_linpot(pao, qs_env)
223  CASE (pao_gth_param)
224  CALL pao_param_initguess_gth(pao)
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 
246 END 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.
Definition: pao_param_exp.F:12
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.
Definition: pao_param_exp.F:48
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.
Definition: pao_param_gth.F:12
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.
Definition: pao_param_gth.F:57
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