(git:e7e05ae)
pao_param_exp.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 Original matrix exponential parametrization
10 !> \author Ole Schuett
11 ! **************************************************************************************************
13  USE basis_set_types, ONLY: gto_basis_set_type
14  USE dbcsr_api, ONLY: &
15  dbcsr_create, dbcsr_get_block_p, dbcsr_get_info, dbcsr_iterator_blocks_left, &
16  dbcsr_iterator_next_block, dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, &
17  dbcsr_p_type, dbcsr_release, dbcsr_reserve_diag_blocks, dbcsr_set, dbcsr_type
18  USE dm_ls_scf_types, ONLY: ls_scf_env_type
19  USE kinds, ONLY: dp
20  USE mathlib, ONLY: diamat_all
24  USE pao_types, ONLY: pao_env_type
25  USE qs_environment_types, ONLY: get_qs_env,&
26  qs_environment_type
27  USE qs_kind_types, ONLY: get_qs_kind,&
28  qs_kind_type
29 #include "./base/base_uses.f90"
30 
31  IMPLICIT NONE
32 
33  PRIVATE
34 
35  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pao_param_exp'
36 
39 
40 CONTAINS
41 
42 ! **************************************************************************************************
43 !> \brief Initialize matrix exponential parametrization
44 !> \param pao ...
45 !> \param qs_env ...
46 ! **************************************************************************************************
47  SUBROUTINE pao_param_init_exp(pao, qs_env)
48  TYPE(pao_env_type), POINTER :: pao
49  TYPE(qs_environment_type), POINTER :: qs_env
50 
51  CHARACTER(len=*), PARAMETER :: routinen = 'pao_param_init_exp'
52 
53  INTEGER :: acol, arow, handle, iatom, n
54  LOGICAL :: found
55  REAL(dp), DIMENSION(:), POINTER :: h_evals
56  REAL(dp), DIMENSION(:, :), POINTER :: block_h, block_h0, block_n, block_u0, &
57  block_v0, h_evecs
58  TYPE(dbcsr_iterator_type) :: iter
59  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
60 
61  CALL timeset(routinen, handle)
62 
63  CALL get_qs_env(qs_env, matrix_s=matrix_s)
64 
65  ! allocate matrix_U0
66  CALL dbcsr_create(pao%matrix_U0, &
67  name="PAO matrix_U0", &
68  matrix_type="N", &
69  dist=pao%diag_distribution, &
70  template=matrix_s(1)%matrix)
71  CALL dbcsr_reserve_diag_blocks(pao%matrix_U0)
72 
73  ! diagonalize each block of H0 and store eigenvectors in U0
74 !$OMP PARALLEL DEFAULT(NONE) SHARED(pao,qs_env) &
75 !$OMP PRIVATE(iter,arow,acol,iatom,N,found,block_H0,block_V0,block_N,block_H,block_U0,H_evecs,H_evals)
76  CALL dbcsr_iterator_start(iter, pao%matrix_U0)
77  DO WHILE (dbcsr_iterator_blocks_left(iter))
78  CALL dbcsr_iterator_next_block(iter, arow, acol, block_u0)
79  iatom = arow; cpassert(arow == acol)
80  CALL dbcsr_get_block_p(matrix=pao%matrix_H0, row=iatom, col=iatom, block=block_h0, found=found)
81  CALL dbcsr_get_block_p(matrix=pao%matrix_N_diag, row=iatom, col=iatom, block=block_n, found=found)
82  cpassert(ASSOCIATED(block_h0) .AND. ASSOCIATED(block_n))
83  n = SIZE(block_u0, 1)
84 
85  ALLOCATE (block_v0(n, n))
86  CALL pao_guess_initial_potential(qs_env, iatom, block_v0)
87 
88  ! construct H
89  ALLOCATE (block_h(n, n))
90  block_h = matmul(matmul(block_n, block_h0 + block_v0), block_n) ! transform into orthonormal basis
91 
92  ! diagonalize H
93  ALLOCATE (h_evecs(n, n), h_evals(n))
94  h_evecs = block_h
95  CALL diamat_all(h_evecs, h_evals)
96 
97  ! use eigenvectors as initial guess
98  block_u0 = h_evecs
99 
100  DEALLOCATE (block_h, h_evecs, h_evals, block_v0)
101  END DO
102  CALL dbcsr_iterator_stop(iter)
103 !$OMP END PARALLEL
104 
105  IF (pao%precondition) &
106  cpabort("PAO preconditioning not supported for selected parametrization.")
107 
108  CALL timestop(handle)
109  END SUBROUTINE pao_param_init_exp
110 
111 ! **************************************************************************************************
112 !> \brief Finalize exponential parametrization
113 !> \param pao ...
114 ! **************************************************************************************************
115  SUBROUTINE pao_param_finalize_exp(pao)
116  TYPE(pao_env_type), POINTER :: pao
117 
118  CALL dbcsr_release(pao%matrix_U0)
119 
120  END SUBROUTINE pao_param_finalize_exp
121 
122 ! **************************************************************************************************
123 !> \brief Returns the number of parameters for given atomic kind
124 !> \param qs_env ...
125 !> \param ikind ...
126 !> \param nparams ...
127 ! **************************************************************************************************
128  SUBROUTINE pao_param_count_exp(qs_env, ikind, nparams)
129  TYPE(qs_environment_type), POINTER :: qs_env
130  INTEGER, INTENT(IN) :: ikind
131  INTEGER, INTENT(OUT) :: nparams
132 
133  INTEGER :: cols, pao_basis_size, pri_basis_size, &
134  rows
135  TYPE(gto_basis_set_type), POINTER :: basis_set
136  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
137 
138  CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
139  CALL get_qs_kind(qs_kind_set(ikind), &
140  basis_set=basis_set, &
141  pao_basis_size=pao_basis_size)
142  pri_basis_size = basis_set%nsgf
143 
144  ! we only consider rotations between occupied and virtuals
145  rows = pao_basis_size
146  cols = pri_basis_size - pao_basis_size
147  nparams = rows*cols
148 
149  END SUBROUTINE pao_param_count_exp
150 
151 ! **************************************************************************************************
152 !> \brief Fills matrix_X with an initial guess
153 !> \param pao ...
154 ! **************************************************************************************************
155  SUBROUTINE pao_param_initguess_exp(pao)
156  TYPE(pao_env_type), POINTER :: pao
157 
158  CALL dbcsr_set(pao%matrix_X, 0.0_dp) ! actual initial guess is matrix_U0
159 
160  END SUBROUTINE pao_param_initguess_exp
161 
162 ! **************************************************************************************************
163 !> \brief Takes current matrix_X and calculates the matrices A and B.
164 !> \param pao ...
165 !> \param qs_env ...
166 !> \param ls_scf_env ...
167 !> \param gradient ...
168 ! **************************************************************************************************
169  SUBROUTINE pao_calc_ab_exp(pao, qs_env, ls_scf_env, gradient)
170  TYPE(pao_env_type), POINTER :: pao
171  TYPE(qs_environment_type), POINTER :: qs_env
172  TYPE(ls_scf_env_type), TARGET :: ls_scf_env
173  LOGICAL, INTENT(IN) :: gradient
174 
175  CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_AB_exp'
176 
177  INTEGER :: handle
178  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
179  TYPE(dbcsr_type) :: matrix_m, matrix_u
180 
181  CALL timeset(routinen, handle)
182  CALL get_qs_env(qs_env, matrix_s=matrix_s)
183  CALL dbcsr_create(matrix_u, matrix_type="N", dist=pao%diag_distribution, template=matrix_s(1)%matrix)
184  CALL dbcsr_reserve_diag_blocks(matrix_u)
185 
186  !TODO: move this condition into pao_calc_U, use matrix_N as template
187  IF (gradient) THEN
188  CALL pao_calc_grad_lnv_wrt_u(qs_env, ls_scf_env, matrix_m)
189  CALL pao_calc_u_exp(pao, matrix_u, matrix_m, pao%matrix_G)
190  CALL dbcsr_release(matrix_m)
191  ELSE
192  CALL pao_calc_u_exp(pao, matrix_u)
193  END IF
194 
195  CALL pao_calc_ab_from_u(pao, qs_env, ls_scf_env, matrix_u)
196  CALL dbcsr_release(matrix_u)
197  CALL timestop(handle)
198  END SUBROUTINE pao_calc_ab_exp
199 
200 ! **************************************************************************************************
201 !> \brief Calculate new matrix U and optionally its gradient G
202 !> \param pao ...
203 !> \param matrix_U ...
204 !> \param matrix_M ...
205 !> \param matrix_G ...
206 ! **************************************************************************************************
207  SUBROUTINE pao_calc_u_exp(pao, matrix_U, matrix_M, matrix_G)
208  TYPE(pao_env_type), POINTER :: pao
209  TYPE(dbcsr_type) :: matrix_u
210  TYPE(dbcsr_type), OPTIONAL :: matrix_m, matrix_g
211 
212  CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_U_exp'
213 
214  COMPLEX(dp) :: denom
215  COMPLEX(dp), DIMENSION(:), POINTER :: evals
216  COMPLEX(dp), DIMENSION(:, :), POINTER :: block_d, evecs
217  INTEGER :: acol, arow, handle, i, iatom, j, k, m, &
218  n, nparams
219  INTEGER, DIMENSION(:), POINTER :: blk_sizes_pao, blk_sizes_pri
220  LOGICAL :: found
221  REAL(dp), DIMENSION(:, :), POINTER :: block_g, block_g_full, block_m, &
222  block_tmp, block_u, block_u0, block_x, &
223  block_x_full
224  TYPE(dbcsr_iterator_type) :: iter
225 
226  CALL timeset(routinen, handle)
227 
228  CALL dbcsr_get_info(pao%matrix_Y, row_blk_size=blk_sizes_pri, col_blk_size=blk_sizes_pao)
229 
230 !$OMP PARALLEL DEFAULT(NONE) SHARED(pao,matrix_U,matrix_M,matrix_G,blk_sizes_pri,blk_sizes_pao) &
231 !$OMP PRIVATE(iter,arow,acol,iatom,N,M,nparams,i,j,k,found) &
232 !$OMP PRIVATE(block_X,block_U,block_U0,block_X_full,evals,evecs) &
233 !$OMP PRIVATE(block_M,block_G,block_D,block_tmp,block_G_full,denom)
234  CALL dbcsr_iterator_start(iter, pao%matrix_X)
235  DO WHILE (dbcsr_iterator_blocks_left(iter))
236  CALL dbcsr_iterator_next_block(iter, arow, acol, block_x)
237  iatom = arow; cpassert(arow == acol)
238  CALL dbcsr_get_block_p(matrix=matrix_u, row=iatom, col=iatom, block=block_u, found=found)
239  cpassert(ASSOCIATED(block_u))
240  CALL dbcsr_get_block_p(matrix=pao%matrix_U0, row=iatom, col=iatom, block=block_u0, found=found)
241  cpassert(ASSOCIATED(block_u0))
242 
243  n = blk_sizes_pri(iatom) ! size of primary basis
244  m = blk_sizes_pao(iatom) ! size of pao basis
245  nparams = SIZE(block_x, 1)
246 
247  ! block_X stores only rotations between occupied and virtuals
248  ! hence, we first have to build the full anti-symmetric exponent block
249  ALLOCATE (block_x_full(n, n))
250  block_x_full(:, :) = 0.0_dp
251  DO i = 1, nparams
252  block_x_full(mod(i - 1, m) + 1, m + (i - 1)/m + 1) = +block_x(i, 1)
253  block_x_full(m + (i - 1)/m + 1, mod(i - 1, m) + 1) = -block_x(i, 1)
254  END DO
255 
256  ! diagonalize block_X_full
257  ALLOCATE (evals(n), evecs(n, n))
258  CALL diag_antisym(block_x_full, evecs, evals)
259 
260  ! construct rotation matrix
261  block_u(:, :) = 0.0_dp
262  DO k = 1, n
263  DO i = 1, n
264  DO j = 1, n
265  block_u(i, j) = block_u(i, j) + real(exp(evals(k))*evecs(i, k)*conjg(evecs(j, k)), dp)
266  END DO
267  END DO
268  END DO
269 
270  block_u = matmul(block_u0, block_u) ! prepend initial guess rotation
271 
272  ! TURNING POINT (if calc grad) ------------------------------------------
273  IF (PRESENT(matrix_g)) THEN
274  cpassert(PRESENT(matrix_m))
275 
276  CALL dbcsr_get_block_p(matrix=pao%matrix_G, row=iatom, col=iatom, block=block_g, found=found)
277  cpassert(ASSOCIATED(block_g))
278  CALL dbcsr_get_block_p(matrix=matrix_m, row=iatom, col=iatom, block=block_m, found=found)
279  ! don't check ASSOCIATED(block_M), it might have been filtered out.
280 
281  ALLOCATE (block_d(n, n), block_tmp(n, n), block_g_full(n, n))
282  DO i = 1, n
283  DO j = 1, n
284  denom = evals(i) - evals(j)
285  IF (i == j) THEN
286  block_d(i, i) = exp(evals(i)) ! diagonal elements
287  ELSE IF (abs(denom) > 1e-10_dp) THEN
288  block_d(i, j) = (exp(evals(i)) - exp(evals(j)))/denom
289  ELSE
290  block_d(i, j) = 1.0_dp ! limit according to L'Hospital's rule
291  END IF
292  END DO
293  END DO
294 
295  IF (ASSOCIATED(block_m)) THEN
296  block_tmp = matmul(transpose(block_u0), block_m)
297  ELSE
298  block_tmp = 0.0_dp
299  END IF
300  block_g_full = fold_derivatives(block_tmp, block_d, evecs)
301 
302  ! return only gradient for rotations between occupied and virtuals
303  DO i = 1, nparams
304  block_g(i, 1) = 2.0_dp*block_g_full(mod(i - 1, m) + 1, m + (i - 1)/m + 1)
305  END DO
306 
307  DEALLOCATE (block_d, block_tmp, block_g_full)
308  END IF
309 
310  DEALLOCATE (block_x_full, evals, evecs)
311 
312  END DO
313  CALL dbcsr_iterator_stop(iter)
314 !$OMP END PARALLEL
315 
316  CALL timestop(handle)
317  END SUBROUTINE pao_calc_u_exp
318 
319 ! **************************************************************************************************
320 !> \brief Helper routine, for calculating derivatives
321 !> \param M ...
322 !> \param D ...
323 !> \param R ...
324 !> \return ...
325 ! **************************************************************************************************
326  FUNCTION fold_derivatives(M, D, R) RESULT(G)
327  REAL(dp), DIMENSION(:, :), INTENT(IN) :: m
328  COMPLEX(dp), DIMENSION(:, :), INTENT(IN) :: d, r
329  REAL(dp), DIMENSION(SIZE(M, 1), SIZE(M, 1)) :: g
330 
331  COMPLEX(dp), DIMENSION(:, :), POINTER :: f, rf, rm, rmr
332  INTEGER :: n
333  REAL(dp), DIMENSION(:, :), POINTER :: rfr
334 
335  n = SIZE(m, 1)
336 
337  ALLOCATE (rm(n, n), rmr(n, n), f(n, n), rf(n, n), rfr(n, n))
338 
339  rm = matmul(transpose(conjg(r)), transpose(m))
340  rmr = matmul(rm, r)
341  f = rmr*d !Hadamard product
342  rf = matmul(r, f)
343  rfr = real(matmul(rf, transpose(conjg(r))), dp)
344 
345  ! gradient dE/dX has to be anti-symmetric
346  g = 0.5_dp*(transpose(rfr) - rfr)
347 
348  DEALLOCATE (rm, rmr, f, rf, rfr)
349  END FUNCTION fold_derivatives
350 
351 ! **************************************************************************************************
352 !> \brief Helper routine for diagonalizing anti symmetric matrices
353 !> \param matrix ...
354 !> \param evecs ...
355 !> \param evals ...
356 ! **************************************************************************************************
357  SUBROUTINE diag_antisym(matrix, evecs, evals)
358  REAL(dp), DIMENSION(:, :) :: matrix
359  COMPLEX(dp), DIMENSION(:, :) :: evecs
360  COMPLEX(dp), DIMENSION(:) :: evals
361 
362  COMPLEX(dp), DIMENSION(:, :), POINTER :: matrix_c
363  INTEGER :: n
364  REAL(dp), DIMENSION(:), POINTER :: evals_r
365 
366  IF (maxval(abs(matrix + transpose(matrix))) > 1e-14_dp) cpabort("Expected anti-symmetric matrix")
367  n = SIZE(matrix, 1)
368  ALLOCATE (matrix_c(n, n), evals_r(n))
369 
370  matrix_c = cmplx(0.0_dp, -matrix, kind=dp)
371  CALL zheevd_wrapper(matrix_c, evecs, evals_r)
372  evals = cmplx(0.0_dp, evals_r, kind=dp)
373 
374  DEALLOCATE (matrix_c, evals_r)
375  END SUBROUTINE diag_antisym
376 
377 ! **************************************************************************************************
378 !> \brief Helper routine for calling LAPACK zheevd
379 !> \param matrix ...
380 !> \param eigenvectors ...
381 !> \param eigenvalues ...
382 ! **************************************************************************************************
383  SUBROUTINE zheevd_wrapper(matrix, eigenvectors, eigenvalues)
384  COMPLEX(dp), DIMENSION(:, :) :: matrix, eigenvectors
385  REAL(dp), DIMENSION(:) :: eigenvalues
386 
387  CHARACTER(len=*), PARAMETER :: routinen = 'zheevd_wrapper'
388 
389  COMPLEX(KIND=dp), DIMENSION(:), POINTER :: work
390  COMPLEX(KIND=dp), DIMENSION(:, :), POINTER :: a
391  INTEGER :: handle, info, liwork, lrwork, lwork, n
392  INTEGER, DIMENSION(:), POINTER :: iwork
393  REAL(kind=dp), DIMENSION(:), POINTER :: rwork
394 
395  CALL timeset(routinen, handle)
396 
397  IF (SIZE(matrix, 1) /= SIZE(matrix, 2)) cpabort("expected square matrix")
398  IF (maxval(abs(matrix - conjg(transpose(matrix)))) > 1e-14_dp) cpabort("Expect hermitian matrix")
399 
400  n = SIZE(matrix, 1)
401  ALLOCATE (iwork(1), rwork(1), work(1), a(n, n))
402 
403  a(:, :) = matrix ! ZHEEVD will overwrite A
404  ! work space query
405  lwork = -1
406  lrwork = -1
407  liwork = -1
408 
409  CALL zheevd('V', 'U', n, a(1, 1), n, eigenvalues(1), &
410  work(1), lwork, rwork(1), lrwork, iwork(1), liwork, info)
411  lwork = int(real(work(1), dp))
412  lrwork = int(real(rwork(1), dp))
413  liwork = iwork(1)
414 
415  DEALLOCATE (iwork, rwork, work)
416  ALLOCATE (iwork(liwork))
417  iwork(:) = 0
418  ALLOCATE (rwork(lrwork))
419  rwork(:) = 0.0_dp
420  ALLOCATE (work(lwork))
421  work(:) = cmplx(0.0_dp, 0.0_dp, kind=dp)
422 
423  CALL zheevd('V', 'U', n, a(1, 1), n, eigenvalues(1), &
424  work(1), lwork, rwork(1), lrwork, iwork(1), liwork, info)
425 
426  eigenvectors = a
427 
428  IF (info /= 0) cpabort("diagonalization failed")
429 
430  DEALLOCATE (iwork, rwork, work, a)
431 
432  CALL timestop(handle)
433 
434  END SUBROUTINE zheevd_wrapper
435 
436 END MODULE pao_param_exp
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
Collection of simple mathematical functions and subroutines.
Definition: mathlib.F:15
subroutine, public diamat_all(a, eigval, dac)
Diagonalize the symmetric n by n matrix a using the LAPACK library. Only the upper triangle of matrix...
Definition: mathlib.F:376
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.
Common routines for PAO parametrizations.
subroutine, public pao_calc_grad_lnv_wrt_u(qs_env, ls_scf_env, matrix_M_diag)
Helper routine, calculates partial derivative dE/dU.
subroutine, public pao_calc_ab_from_u(pao, qs_env, ls_scf_env, matrix_U_diag)
Takes current matrix_X and calculates the matrices A and B.
Factory routines for potentials used e.g. by pao_param_exp and pao_ml.
subroutine, public pao_guess_initial_potential(qs_env, iatom, block_V)
Makes an educated guess for the initial potential based on positions of neighboring atoms.
Types used by the PAO machinery.
Definition: pao_types.F:12
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, WannierCentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
Definition: qs_kind_types.F:23
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_r3d_rs_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, U_of_dft_plus_u, J_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, J0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.