(git:e5b1968)
Loading...
Searching...
No Matches
qs_kind_types.F
Go to the documentation of this file.
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 Define the quickstep kind type and their sub types
10!> \author Ole Schuett
11!>
12!> <b>Modification history:</b>
13!> - 01.2002 creation [MK]
14!> - 04.2002 added pao [fawzi]
15!> - 09.2002 adapted for POL/KG use [GT]
16!> - 02.2004 flexible normalization of basis sets [jgh]
17!> - 03.2004 attach/detach routines [jgh]
18!> - 10.2004 removed pao [fawzi]
19!> - 08.2014 separated qs-related stuff from atomic_kind_types.F [Ole Schuett]
20!> - 07.2015 new container for basis sets [jgh]
21!> - 04.2021 init dft_plus_u_type [MK]
22! **************************************************************************************************
27 USE atom_types, ONLY: atom_ecppot_type,&
28 lmat,&
30 USE atom_upf, ONLY: atom_read_upf,&
40 USE basis_set_types, ONLY: &
51 USE cp_output_handling, ONLY: cp_p_file,&
55 USE external_potential_types, ONLY: &
60 USE input_constants, ONLY: &
69 USE kinds, ONLY: default_path_length,&
71 dp
72 USE mathconstants, ONLY: pi
75 nco,&
76 ncoset
83 ptable
84 USE physcon, ONLY: angstrom,&
85 bohr,&
86 evolt
106 USE string_utilities, ONLY: uppercase
107 USE xtb_parameters, ONLY: xtb_set_kab
112#include "./base/base_uses.f90"
113
114 IMPLICIT NONE
115
116 PRIVATE
117
118 ! Global parameters (only in this module)
119
120 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_kind_types'
121
122! **************************************************************************************************
123!> \brief Input parameters for the DFT+U method
124! **************************************************************************************************
125 TYPE dft_plus_u_type
126 INTEGER :: l = -1
127 INTEGER :: n = -1
128 INTEGER :: max_scf = -1
129 REAL(KIND=dp) :: eps_u_ramping = 0.0_dp
130 REAL(KIND=dp) :: eps_scf = huge(0.0_dp)
131 REAL(KIND=dp) :: u_minus_j_target = 0.0_dp
132 REAL(KIND=dp) :: u_minus_j = 0.0_dp
133 REAL(KIND=dp) :: u_ramping = 0.0_dp
134 REAL(KIND=dp) :: u = 0.0_dp
135 REAL(KIND=dp) :: j = 0.0_dp
136 REAL(KIND=dp) :: alpha = 0.0_dp
137 REAL(KIND=dp) :: beta = 0.0_dp
138 REAL(KIND=dp) :: j0 = 0.0_dp
139 REAL(KIND=dp) :: occupation = -1.0_dp
140 INTEGER, DIMENSION(:), POINTER :: orbitals => null()
141 LOGICAL :: init_u_ramping_each_scf = .false.
142 LOGICAL :: smear = .false.
143 REAL(KIND=dp), DIMENSION(:), POINTER :: nelec => null()
144 END TYPE dft_plus_u_type
145
146! **************************************************************************************************
147!> \brief Holds information about a PAO potential
148! **************************************************************************************************
150 INTEGER :: maxl = -1
151 REAL(kind=dp) :: beta = 0.0_dp
152 REAL(kind=dp) :: weight = 0.0_dp
153 INTEGER :: max_projector = -1
154 REAL(kind=dp) :: beta_radius = huge(dp)
155 END TYPE pao_potential_type
156
157! **************************************************************************************************
158!> \brief Holds information about a PAO descriptor
159! **************************************************************************************************
161 REAL(kind=dp) :: beta = 0.0_dp
162 REAL(kind=dp) :: beta_radius = huge(dp)
163 REAL(kind=dp) :: weight = 0.0_dp
164 REAL(kind=dp) :: screening = 0.0_dp
165 REAL(kind=dp) :: screening_radius = huge(dp)
166 END TYPE pao_descriptor_type
167
168! **************************************************************************************************
169!> \brief Provides all information about a quickstep kind
170! **************************************************************************************************
172 CHARACTER(LEN=default_string_length) :: name = ""
173 CHARACTER(LEN=2) :: element_symbol = ""
174 INTEGER :: natom = -1
175 TYPE(all_potential_type), POINTER :: all_potential => null()
176 TYPE(local_potential_type), POINTER :: tnadd_potential => null()
177 TYPE(gth_potential_type), POINTER :: gth_potential => null()
178 TYPE(sgp_potential_type), POINTER :: sgp_potential => null()
179 TYPE(semi_empirical_type), POINTER :: se_parameter => null()
180 TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter => null()
181 TYPE(xtb_atom_type), POINTER :: xtb_parameter => null()
182 !
183 TYPE(atom_upfpot_type), POINTER :: upf_potential => null()
184 !
186 DIMENSION(20) :: basis_sets = basis_set_container_type()
187 ! Atomic radii
188 REAL(kind=dp) :: covalent_radius = 0.0_dp
189 REAL(kind=dp) :: vdw_radius = 0.0_dp
190 ! GAPW specific data
191 TYPE(paw_proj_set_type), POINTER :: paw_proj_set => null()
192 REAL(kind=dp) :: hard_radius = 0.8_dp*bohr ! for hard and soft exp
193 REAL(kind=dp) :: hard0_radius = 0.8_dp*bohr ! for hard exp of rho0
194 REAL(kind=dp) :: max_rad_local = 13.2_dp*bohr ! max GTO radius used in GAPW
195 LOGICAL :: paw_atom = .false. ! needs atomic rho1
196 LOGICAL :: gpw_type_forced = .false. ! gpw atom even if with hard exponents
197 !
198 LOGICAL :: ghost = .false.
199 LOGICAL :: floating = .false.
200 INTEGER :: lmax_dftb = -1
201 REAL(kind=dp) :: dudq_dftb3 = 0.0_dp
202 REAL(kind=dp) :: magnetization = 0.0_dp
203 INTEGER, DIMENSION(:, :), POINTER :: addel => null()
204 INTEGER, DIMENSION(:, :), POINTER :: laddel => null()
205 INTEGER, DIMENSION(:, :), POINTER :: naddel => null()
206 TYPE(harmonics_atom_type), POINTER :: harmonics => null()
207 TYPE(grid_atom_type), POINTER :: grid_atom => null()
208 INTEGER :: ngrid_rad = 50
209 INTEGER :: ngrid_ang = 50
210 INTEGER :: lmax_rho0 = 0
211 INTEGER :: mao = -1
212 INTEGER, DIMENSION(:), POINTER :: elec_conf => null() ! used to set up the initial atomic guess
213 LOGICAL :: bs_occupation = .false.
214 TYPE(dft_plus_u_type), POINTER :: dft_plus_u => null()
215 LOGICAL :: no_optimize = .true.
216 !
217 REAL(kind=dp), DIMENSION(:, :), POINTER :: nlcc_pot => null()
218 !
219 TYPE(qs_atom_dispersion_type), POINTER :: dispersion => null()
220 REAL(kind=dp), DIMENSION(:, :), POINTER :: reltmat => null()
221 INTEGER :: pao_basis_size = -1
222 CHARACTER(LEN=default_path_length) :: pao_model_file = ""
223 TYPE(pao_potential_type), DIMENSION(:), POINTER :: pao_potentials => null()
224 TYPE(pao_descriptor_type), DIMENSION(:), POINTER :: pao_descriptors => null()
225 END TYPE qs_kind_type
226
227! **************************************************************************************************
228!> \brief Provides a vector of pointers of type qs_kind_type
229! **************************************************************************************************
230 TYPE qs_kind_p_type
231 TYPE(qs_kind_type), DIMENSION(:), &
232 POINTER :: qs_kind_set => null()
233 END TYPE qs_kind_p_type
234
235 ! Public subroutines
236
237 PUBLIC :: check_qs_kind_set, &
239 get_qs_kind, &
241 has_nlcc, &
246 set_qs_kind, &
250
251 ! Public data types
253
254CONTAINS
255
256! **************************************************************************************************
257!> \brief Destructor routine for a set of qs kinds
258!> \param qs_kind_set ...
259!> \date 02.01.2002
260!> \author Matthias Krack (MK)
261!> \version 2.0
262! **************************************************************************************************
263 SUBROUTINE deallocate_qs_kind_set(qs_kind_set)
264
265 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
266
267 INTEGER :: ikind, nkind
268
269 IF (ASSOCIATED(qs_kind_set)) THEN
270
271 nkind = SIZE(qs_kind_set)
272
273 DO ikind = 1, nkind
274 IF (ASSOCIATED(qs_kind_set(ikind)%all_potential)) THEN
275 CALL deallocate_potential(qs_kind_set(ikind)%all_potential)
276 END IF
277 IF (ASSOCIATED(qs_kind_set(ikind)%tnadd_potential)) THEN
278 CALL deallocate_potential(qs_kind_set(ikind)%tnadd_potential)
279 END IF
280 IF (ASSOCIATED(qs_kind_set(ikind)%gth_potential)) THEN
281 CALL deallocate_potential(qs_kind_set(ikind)%gth_potential)
282 END IF
283 IF (ASSOCIATED(qs_kind_set(ikind)%sgp_potential)) THEN
284 CALL deallocate_potential(qs_kind_set(ikind)%sgp_potential)
285 END IF
286 IF (ASSOCIATED(qs_kind_set(ikind)%upf_potential)) THEN
287 CALL atom_release_upf(qs_kind_set(ikind)%upf_potential)
288 DEALLOCATE (qs_kind_set(ikind)%upf_potential)
289 END IF
290 IF (ASSOCIATED(qs_kind_set(ikind)%se_parameter)) THEN
291 CALL semi_empirical_release(qs_kind_set(ikind)%se_parameter)
292 END IF
293 IF (ASSOCIATED(qs_kind_set(ikind)%dftb_parameter)) THEN
294 CALL deallocate_dftb_atom_param(qs_kind_set(ikind)%dftb_parameter)
295 END IF
296 IF (ASSOCIATED(qs_kind_set(ikind)%xtb_parameter)) THEN
297 CALL deallocate_xtb_atom_param(qs_kind_set(ikind)%xtb_parameter)
298 END IF
299 IF (ASSOCIATED(qs_kind_set(ikind)%paw_proj_set)) THEN
300 CALL deallocate_paw_proj_set(qs_kind_set(ikind)%paw_proj_set)
301 END IF
302 IF (ASSOCIATED(qs_kind_set(ikind)%harmonics)) THEN
303 CALL deallocate_harmonics_atom(qs_kind_set(ikind)%harmonics)
304 END IF
305 IF (ASSOCIATED(qs_kind_set(ikind)%grid_atom)) THEN
306 CALL deallocate_grid_atom(qs_kind_set(ikind)%grid_atom)
307 END IF
308 IF (ASSOCIATED(qs_kind_set(ikind)%elec_conf)) THEN
309 DEALLOCATE (qs_kind_set(ikind)%elec_conf)
310 END IF
311
312 IF (ASSOCIATED(qs_kind_set(ikind)%dft_plus_u)) THEN
313 IF (ASSOCIATED(qs_kind_set(ikind)%dft_plus_u%orbitals)) THEN
314 DEALLOCATE (qs_kind_set(ikind)%dft_plus_u%orbitals)
315 END IF
316 IF (ASSOCIATED(qs_kind_set(ikind)%dft_plus_u%nelec)) THEN
317 DEALLOCATE (qs_kind_set(ikind)%dft_plus_u%nelec)
318 END IF
319 DEALLOCATE (qs_kind_set(ikind)%dft_plus_u)
320 END IF
321
322 IF (ASSOCIATED(qs_kind_set(ikind)%nlcc_pot)) THEN
323 DEALLOCATE (qs_kind_set(ikind)%nlcc_pot)
324 END IF
325
326 IF (ASSOCIATED(qs_kind_set(ikind)%dispersion)) THEN
327 DEALLOCATE (qs_kind_set(ikind)%dispersion)
328 END IF
329 IF (ASSOCIATED(qs_kind_set(ikind)%addel)) THEN
330 DEALLOCATE (qs_kind_set(ikind)%addel)
331 END IF
332 IF (ASSOCIATED(qs_kind_set(ikind)%naddel)) THEN
333 DEALLOCATE (qs_kind_set(ikind)%naddel)
334 END IF
335 IF (ASSOCIATED(qs_kind_set(ikind)%laddel)) THEN
336 DEALLOCATE (qs_kind_set(ikind)%laddel)
337 END IF
338 IF (ASSOCIATED(qs_kind_set(ikind)%reltmat)) THEN
339 DEALLOCATE (qs_kind_set(ikind)%reltmat)
340 END IF
341
342 IF (ASSOCIATED(qs_kind_set(ikind)%pao_potentials)) THEN
343 DEALLOCATE (qs_kind_set(ikind)%pao_potentials)
344 END IF
345 IF (ASSOCIATED(qs_kind_set(ikind)%pao_descriptors)) THEN
346 DEALLOCATE (qs_kind_set(ikind)%pao_descriptors)
347 END IF
348
349 CALL remove_basis_set_container(qs_kind_set(ikind)%basis_sets)
350
351 END DO
352 DEALLOCATE (qs_kind_set)
353 ELSE
354 CALL cp_abort(__location__, &
355 "The pointer qs_kind_set is not associated and "// &
356 "cannot be deallocated")
357 END IF
358
359 END SUBROUTINE deallocate_qs_kind_set
360
361! **************************************************************************************************
362!> \brief Get attributes of an atomic kind.
363!> \param qs_kind ...
364!> \param basis_set ...
365!> \param basis_type ...
366!> \param ncgf ...
367!> \param nsgf ...
368!> \param all_potential ...
369!> \param tnadd_potential ...
370!> \param gth_potential ...
371!> \param sgp_potential ...
372!> \param upf_potential ...
373!> \param se_parameter ...
374!> \param dftb_parameter ...
375!> \param xtb_parameter ...
376!> \param dftb3_param ...
377!> \param zatom ...
378!> \param zeff ...
379!> \param elec_conf ...
380!> \param mao ...
381!> \param lmax_dftb ...
382!> \param alpha_core_charge ...
383!> \param ccore_charge ...
384!> \param core_charge ...
385!> \param core_charge_radius ...
386!> \param paw_proj_set ...
387!> \param paw_atom ...
388!> \param hard_radius ...
389!> \param hard0_radius ...
390!> \param max_rad_local ...
391!> \param covalent_radius ...
392!> \param vdw_radius ...
393!> \param gpw_type_forced ...
394!> \param harmonics ...
395!> \param max_iso_not0 ...
396!> \param max_s_harm ...
397!> \param grid_atom ...
398!> \param ngrid_ang ...
399!> \param ngrid_rad ...
400!> \param lmax_rho0 ...
401!> \param dft_plus_u_atom ...
402!> \param l_of_dft_plus_u ...
403!> \param n_of_dft_plus_u ...
404!> \param u_minus_j ...
405!> \param U_of_dft_plus_u ...
406!> \param J_of_dft_plus_u ...
407!> \param alpha_of_dft_plus_u ...
408!> \param beta_of_dft_plus_u ...
409!> \param J0_of_dft_plus_u ...
410!> \param occupation_of_dft_plus_u ...
411!> \param dispersion ...
412!> \param bs_occupation ...
413!> \param magnetization ...
414!> \param no_optimize ...
415!> \param addel ...
416!> \param laddel ...
417!> \param naddel ...
418!> \param orbitals ...
419!> \param max_scf ...
420!> \param eps_scf ...
421!> \param smear ...
422!> \param u_ramping ...
423!> \param u_minus_j_target ...
424!> \param eps_u_ramping ...
425!> \param init_u_ramping_each_scf ...
426!> \param reltmat ...
427!> \param ghost ...
428!> \param floating ...
429!> \param name ...
430!> \param element_symbol ...
431!> \param pao_basis_size ...
432!> \param pao_model_file ...
433!> \param pao_potentials ...
434!> \param pao_descriptors ...
435!> \param nelec ...
436! **************************************************************************************************
437 SUBROUTINE get_qs_kind(qs_kind, &
438 basis_set, basis_type, ncgf, nsgf, &
439 all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, &
440 se_parameter, dftb_parameter, xtb_parameter, &
441 dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, &
442 alpha_core_charge, ccore_charge, core_charge, core_charge_radius, &
443 paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, &
444 covalent_radius, vdw_radius, &
445 gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, &
446 ngrid_ang, ngrid_rad, lmax_rho0, &
447 dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, &
448 u_minus_j, U_of_dft_plus_u, J_of_dft_plus_u, &
449 alpha_of_dft_plus_u, beta_of_dft_plus_u, J0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, &
450 bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, &
451 max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, &
452 init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, &
453 pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
454
455 TYPE(qs_kind_type) :: qs_kind
456 TYPE(gto_basis_set_type), OPTIONAL, POINTER :: basis_set
457 CHARACTER(len=*), OPTIONAL :: basis_type
458 INTEGER, INTENT(OUT), OPTIONAL :: ncgf, nsgf
459 TYPE(all_potential_type), OPTIONAL, POINTER :: all_potential
460 TYPE(local_potential_type), OPTIONAL, POINTER :: tnadd_potential
461 TYPE(gth_potential_type), OPTIONAL, POINTER :: gth_potential
462 TYPE(sgp_potential_type), OPTIONAL, POINTER :: sgp_potential
463 TYPE(atom_upfpot_type), OPTIONAL, POINTER :: upf_potential
464 TYPE(semi_empirical_type), OPTIONAL, POINTER :: se_parameter
465 TYPE(qs_dftb_atom_type), OPTIONAL, POINTER :: dftb_parameter
466 TYPE(xtb_atom_type), OPTIONAL, POINTER :: xtb_parameter
467 REAL(kind=dp), INTENT(OUT), OPTIONAL :: dftb3_param
468 INTEGER, INTENT(OUT), OPTIONAL :: zatom
469 REAL(kind=dp), INTENT(OUT), OPTIONAL :: zeff
470 INTEGER, DIMENSION(:), OPTIONAL, POINTER :: elec_conf
471 INTEGER, INTENT(OUT), OPTIONAL :: mao, lmax_dftb
472 REAL(kind=dp), INTENT(OUT), OPTIONAL :: alpha_core_charge, ccore_charge, &
473 core_charge, core_charge_radius
474 TYPE(paw_proj_set_type), OPTIONAL, POINTER :: paw_proj_set
475 LOGICAL, INTENT(OUT), OPTIONAL :: paw_atom
476 REAL(kind=dp), INTENT(OUT), OPTIONAL :: hard_radius, hard0_radius, &
477 max_rad_local, covalent_radius, &
478 vdw_radius
479 LOGICAL, INTENT(OUT), OPTIONAL :: gpw_type_forced
480 TYPE(harmonics_atom_type), OPTIONAL, POINTER :: harmonics
481 INTEGER, INTENT(OUT), OPTIONAL :: max_iso_not0, max_s_harm
482 TYPE(grid_atom_type), OPTIONAL, POINTER :: grid_atom
483 INTEGER, INTENT(OUT), OPTIONAL :: ngrid_ang, ngrid_rad, lmax_rho0
484 LOGICAL, INTENT(OUT), OPTIONAL :: dft_plus_u_atom
485 INTEGER, INTENT(OUT), OPTIONAL :: l_of_dft_plus_u, n_of_dft_plus_u
486 REAL(kind=dp), INTENT(OUT), OPTIONAL :: u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, &
487 alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u
488 TYPE(qs_atom_dispersion_type), OPTIONAL, POINTER :: dispersion
489 LOGICAL, INTENT(OUT), OPTIONAL :: bs_occupation
490 REAL(kind=dp), INTENT(OUT), OPTIONAL :: magnetization
491 LOGICAL, INTENT(OUT), OPTIONAL :: no_optimize
492 INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: addel, laddel, naddel
493 INTEGER, DIMENSION(:), OPTIONAL, POINTER :: orbitals
494 INTEGER, OPTIONAL :: max_scf
495 REAL(kind=dp), OPTIONAL :: eps_scf
496 LOGICAL, OPTIONAL :: smear
497 REAL(kind=dp), INTENT(OUT), OPTIONAL :: u_ramping, u_minus_j_target, &
498 eps_u_ramping
499 LOGICAL, OPTIONAL :: init_u_ramping_each_scf
500 REAL(kind=dp), DIMENSION(:, :), OPTIONAL, POINTER :: reltmat
501 LOGICAL, OPTIONAL :: ghost, floating
502 CHARACTER(LEN=default_string_length), &
503 INTENT(OUT), OPTIONAL :: name
504 CHARACTER(LEN=2), INTENT(OUT), OPTIONAL :: element_symbol
505 INTEGER, INTENT(OUT), OPTIONAL :: pao_basis_size
506 CHARACTER(LEN=default_path_length), INTENT(OUT), &
507 OPTIONAL :: pao_model_file
508 TYPE(pao_potential_type), DIMENSION(:), OPTIONAL, &
509 POINTER :: pao_potentials
510 TYPE(pao_descriptor_type), DIMENSION(:), &
511 OPTIONAL, POINTER :: pao_descriptors
512 REAL(kind=dp), DIMENSION(:), OPTIONAL, POINTER :: nelec
513
514 CHARACTER(LEN=default_string_length) :: my_basis_type
515 INTEGER :: l
516 LOGICAL :: found
517 TYPE(gto_basis_set_type), POINTER :: tmp_basis_set
518
519 ! Retrieve basis set from the kind container
520 IF (PRESENT(basis_type)) THEN
521 my_basis_type = basis_type
522 ELSE
523 my_basis_type = "ORB"
524 END IF
525
526 IF (PRESENT(basis_set)) THEN
527 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=basis_set, &
528 basis_type=my_basis_type)
529 END IF
530
531 IF (PRESENT(ncgf)) THEN
532 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis_set, &
533 basis_type=my_basis_type)
534 IF (ASSOCIATED(tmp_basis_set)) THEN
535 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, ncgf=ncgf)
536 ELSE IF (ASSOCIATED(qs_kind%dftb_parameter)) THEN
537 l = qs_kind%dftb_parameter%lmax
538 ncgf = ((l + 1)*(l + 2)*(l + 3))/6
539 ELSE
540 ncgf = 0
541 END IF
542 END IF
543
544 IF (PRESENT(nsgf)) THEN
545 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis_set, &
546 basis_type=my_basis_type)
547 IF (ASSOCIATED(tmp_basis_set)) THEN
548 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, nsgf=nsgf)
549 ELSE IF (ASSOCIATED(qs_kind%dftb_parameter)) THEN
550 nsgf = qs_kind%dftb_parameter%natorb
551 ELSE
552 nsgf = 0
553 END IF
554 END IF
555
556 IF (PRESENT(all_potential)) all_potential => qs_kind%all_potential
557 IF (PRESENT(tnadd_potential)) tnadd_potential => qs_kind%tnadd_potential
558 IF (PRESENT(gth_potential)) gth_potential => qs_kind%gth_potential
559 IF (PRESENT(sgp_potential)) sgp_potential => qs_kind%sgp_potential
560 IF (PRESENT(upf_potential)) upf_potential => qs_kind%upf_potential
561 IF (PRESENT(se_parameter)) se_parameter => qs_kind%se_parameter
562 IF (PRESENT(dftb_parameter)) dftb_parameter => qs_kind%dftb_parameter
563 IF (PRESENT(xtb_parameter)) xtb_parameter => qs_kind%xtb_parameter
564 IF (PRESENT(element_symbol)) element_symbol = qs_kind%element_symbol
565 IF (PRESENT(name)) name = qs_kind%name
566 IF (PRESENT(dftb3_param)) dftb3_param = qs_kind%dudq_dftb3
567 IF (PRESENT(elec_conf)) elec_conf => qs_kind%elec_conf
568 IF (PRESENT(alpha_core_charge)) THEN
569 IF (ASSOCIATED(qs_kind%all_potential)) THEN
570 CALL get_potential(potential=qs_kind%all_potential, &
571 alpha_core_charge=alpha_core_charge)
572 ELSE IF (ASSOCIATED(qs_kind%gth_potential)) THEN
573 CALL get_potential(potential=qs_kind%gth_potential, &
574 alpha_core_charge=alpha_core_charge)
575 ELSE IF (ASSOCIATED(qs_kind%sgp_potential)) THEN
576 CALL get_potential(potential=qs_kind%sgp_potential, &
577 alpha_core_charge=alpha_core_charge)
578 ELSE
579 alpha_core_charge = 1.0_dp
580 END IF
581 END IF
582 IF (PRESENT(ccore_charge)) THEN
583 IF (ASSOCIATED(qs_kind%all_potential)) THEN
584 CALL get_potential(potential=qs_kind%all_potential, &
585 ccore_charge=ccore_charge)
586 ELSE IF (ASSOCIATED(qs_kind%gth_potential)) THEN
587 CALL get_potential(potential=qs_kind%gth_potential, &
588 ccore_charge=ccore_charge)
589 ELSE IF (ASSOCIATED(qs_kind%sgp_potential)) THEN
590 CALL get_potential(potential=qs_kind%sgp_potential, &
591 ccore_charge=ccore_charge)
592 ELSE IF (ASSOCIATED(qs_kind%upf_potential)) THEN
593 cpabort("UPF CCORE CHARGE RADIUS NOT AVAILABLE")
594 ELSE
595 ccore_charge = 0.0_dp
596 END IF
597 END IF
598 IF (PRESENT(core_charge_radius)) THEN
599 IF (ASSOCIATED(qs_kind%all_potential)) THEN
600 CALL get_potential(potential=qs_kind%all_potential, &
601 core_charge_radius=core_charge_radius)
602 ELSE IF (ASSOCIATED(qs_kind%gth_potential)) THEN
603 CALL get_potential(potential=qs_kind%gth_potential, &
604 core_charge_radius=core_charge_radius)
605 ELSE IF (ASSOCIATED(qs_kind%sgp_potential)) THEN
606 CALL get_potential(potential=qs_kind%sgp_potential, &
607 core_charge_radius=core_charge_radius)
608 ELSE IF (ASSOCIATED(qs_kind%upf_potential)) THEN
609 cpabort("UPF CORE CHARGE RADIUS NOT AVAILABLE")
610 ELSE
611 core_charge_radius = 0.0_dp
612 END IF
613 END IF
614 IF (PRESENT(core_charge)) THEN
615 IF (ASSOCIATED(qs_kind%all_potential)) THEN
616 CALL get_potential(potential=qs_kind%all_potential, &
617 zeff=core_charge)
618 ELSE IF (ASSOCIATED(qs_kind%gth_potential)) THEN
619 CALL get_potential(potential=qs_kind%gth_potential, &
620 zeff=core_charge)
621 ELSE IF (ASSOCIATED(qs_kind%sgp_potential)) THEN
622 CALL get_potential(potential=qs_kind%sgp_potential, &
623 zeff=core_charge)
624 ELSE IF (ASSOCIATED(qs_kind%upf_potential)) THEN
625 cpabort("UPF CORE CHARGE NOT AVAILABLE")
626 ELSE
627 core_charge = 0.0_dp
628 END IF
629 END IF
630
631 IF (PRESENT(zatom)) THEN
632 ! Retrieve information on element
633 CALL get_ptable_info(qs_kind%element_symbol, ielement=zatom, found=found)
634 cpassert(found)
635 END IF
636
637 IF (PRESENT(zeff)) THEN
638 IF (ASSOCIATED(qs_kind%all_potential)) THEN
639 CALL get_potential(potential=qs_kind%all_potential, zeff=zeff)
640 ELSE IF (ASSOCIATED(qs_kind%gth_potential)) THEN
641 CALL get_potential(potential=qs_kind%gth_potential, zeff=zeff)
642 ELSE IF (ASSOCIATED(qs_kind%sgp_potential)) THEN
643 CALL get_potential(potential=qs_kind%sgp_potential, zeff=zeff)
644 ELSE IF (ASSOCIATED(qs_kind%upf_potential)) THEN
645 zeff = qs_kind%upf_potential%zion
646 ELSE
647 zeff = 0.0_dp
648 END IF
649 END IF
650
651 IF (PRESENT(covalent_radius)) covalent_radius = qs_kind%covalent_radius
652 IF (PRESENT(vdw_radius)) vdw_radius = qs_kind%vdw_radius
653
654 IF (PRESENT(paw_proj_set)) paw_proj_set => qs_kind%paw_proj_set
655 IF (PRESENT(paw_atom)) paw_atom = qs_kind%paw_atom
656 IF (PRESENT(gpw_type_forced)) gpw_type_forced = qs_kind%gpw_type_forced
657 IF (PRESENT(hard_radius)) hard_radius = qs_kind%hard_radius
658 IF (PRESENT(hard0_radius)) hard0_radius = qs_kind%hard0_radius
659 IF (PRESENT(max_rad_local)) max_rad_local = qs_kind%max_rad_local
660 IF (PRESENT(harmonics)) harmonics => qs_kind%harmonics
661 IF (PRESENT(max_s_harm)) THEN
662 IF (ASSOCIATED(qs_kind%harmonics)) THEN
663 max_s_harm = qs_kind%harmonics%max_s_harm
664 ELSE
665 max_s_harm = 0
666 END IF
667 END IF
668 IF (PRESENT(max_iso_not0)) THEN
669 IF (ASSOCIATED(qs_kind%harmonics)) THEN
670 max_iso_not0 = qs_kind%harmonics%max_iso_not0
671 ELSE
672 max_iso_not0 = 0
673 END IF
674 END IF
675 IF (PRESENT(grid_atom)) grid_atom => qs_kind%grid_atom
676 IF (PRESENT(ngrid_ang)) ngrid_ang = qs_kind%ngrid_ang
677 IF (PRESENT(ngrid_rad)) ngrid_rad = qs_kind%ngrid_rad
678 IF (PRESENT(lmax_rho0)) lmax_rho0 = qs_kind%lmax_rho0
679 IF (PRESENT(ghost)) ghost = qs_kind%ghost
680 IF (PRESENT(floating)) floating = qs_kind%floating
681 IF (PRESENT(dft_plus_u_atom)) dft_plus_u_atom = ASSOCIATED(qs_kind%dft_plus_u)
682 IF (PRESENT(l_of_dft_plus_u)) THEN
683 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
684 l_of_dft_plus_u = qs_kind%dft_plus_u%l
685 ELSE
686 l_of_dft_plus_u = -1
687 END IF
688 END IF
689 IF (PRESENT(n_of_dft_plus_u)) THEN
690 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
691 n_of_dft_plus_u = qs_kind%dft_plus_u%n
692 ELSE
693 n_of_dft_plus_u = -1
694 END IF
695 END IF
696 IF (PRESENT(u_minus_j)) THEN
697 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
698 u_minus_j = qs_kind%dft_plus_u%u_minus_j
699 ELSE
700 u_minus_j = 0.0_dp
701 END IF
702 END IF
703 IF (PRESENT(u_minus_j_target)) THEN
704 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
705 u_minus_j_target = qs_kind%dft_plus_u%u_minus_j_target
706 ELSE
707 u_minus_j_target = 0.0_dp
708 END IF
709 END IF
710 IF (PRESENT(u_of_dft_plus_u)) THEN
711 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
712 u_of_dft_plus_u = qs_kind%dft_plus_u%U
713 ELSE
714 u_of_dft_plus_u = 0.0_dp
715 END IF
716 END IF
717 IF (PRESENT(j_of_dft_plus_u)) THEN
718 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
719 j_of_dft_plus_u = qs_kind%dft_plus_u%J
720 ELSE
721 j_of_dft_plus_u = 0.0_dp
722 END IF
723 END IF
724 IF (PRESENT(alpha_of_dft_plus_u)) THEN
725 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
726 alpha_of_dft_plus_u = qs_kind%dft_plus_u%alpha
727 ELSE
728 alpha_of_dft_plus_u = 0.0_dp
729 END IF
730 END IF
731 IF (PRESENT(beta_of_dft_plus_u)) THEN
732 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
733 beta_of_dft_plus_u = qs_kind%dft_plus_u%beta
734 ELSE
735 beta_of_dft_plus_u = 0.0_dp
736 END IF
737 END IF
738 IF (PRESENT(j0_of_dft_plus_u)) THEN
739 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
740 j0_of_dft_plus_u = qs_kind%dft_plus_u%J0
741 ELSE
742 j0_of_dft_plus_u = 0.0_dp
743 END IF
744 END IF
745 IF (PRESENT(occupation_of_dft_plus_u)) THEN
746 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
747 occupation_of_dft_plus_u = qs_kind%dft_plus_u%occupation
748 ELSE
749 occupation_of_dft_plus_u = -1.0_dp
750 END IF
751 END IF
752
753 IF (PRESENT(init_u_ramping_each_scf)) THEN
754 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
755 init_u_ramping_each_scf = qs_kind%dft_plus_u%init_u_ramping_each_scf
756 ELSE
757 init_u_ramping_each_scf = .false.
758 END IF
759 END IF
760 IF (PRESENT(u_ramping)) THEN
761 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
762 u_ramping = qs_kind%dft_plus_u%u_ramping
763 ELSE
764 u_ramping = 0.0_dp
765 END IF
766 END IF
767 IF (PRESENT(eps_u_ramping)) THEN
768 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
769 eps_u_ramping = qs_kind%dft_plus_u%eps_u_ramping
770 ELSE
771 eps_u_ramping = 1.0e-5_dp
772 END IF
773 END IF
774 IF (PRESENT(nelec)) THEN
775 NULLIFY (nelec)
776 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
777 IF (ASSOCIATED(qs_kind%dft_plus_u%nelec)) THEN
778 nelec => qs_kind%dft_plus_u%nelec
779 END IF
780 END IF
781 END IF
782 IF (PRESENT(orbitals)) THEN
783 NULLIFY (orbitals)
784 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
785 IF (ASSOCIATED(qs_kind%dft_plus_u%orbitals)) THEN
786 orbitals => qs_kind%dft_plus_u%orbitals
787 END IF
788 END IF
789 END IF
790 IF (PRESENT(eps_scf)) THEN
791 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
792 eps_scf = qs_kind%dft_plus_u%eps_scf
793 ELSE
794 eps_scf = 1.0e30_dp
795 END IF
796 END IF
797 IF (PRESENT(max_scf)) THEN
798 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
799 max_scf = qs_kind%dft_plus_u%max_scf
800 ELSE
801 max_scf = -1
802 END IF
803 END IF
804 IF (PRESENT(smear)) THEN
805 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
806 smear = qs_kind%dft_plus_u%smear
807 ELSE
808 smear = .false.
809 END IF
810 END IF
811 IF (PRESENT(dispersion)) dispersion => qs_kind%dispersion
812 IF (PRESENT(bs_occupation)) bs_occupation = qs_kind%bs_occupation
813 IF (PRESENT(addel)) addel => qs_kind%addel
814 IF (PRESENT(laddel)) laddel => qs_kind%laddel
815 IF (PRESENT(naddel)) naddel => qs_kind%naddel
816
817 IF (PRESENT(magnetization)) magnetization = qs_kind%magnetization
818
819 IF (PRESENT(no_optimize)) no_optimize = qs_kind%no_optimize
820
821 IF (PRESENT(reltmat)) reltmat => qs_kind%reltmat
822
823 IF (PRESENT(mao)) mao = qs_kind%mao
824
825 IF (PRESENT(lmax_dftb)) lmax_dftb = qs_kind%lmax_dftb
826
827 IF (PRESENT(pao_basis_size)) pao_basis_size = qs_kind%pao_basis_size
828 IF (PRESENT(pao_model_file)) pao_model_file = qs_kind%pao_model_file
829 IF (PRESENT(pao_potentials)) pao_potentials => qs_kind%pao_potentials
830 IF (PRESENT(pao_descriptors)) pao_descriptors => qs_kind%pao_descriptors
831 END SUBROUTINE get_qs_kind
832
833! **************************************************************************************************
834!> \brief Get attributes of an atomic kind set.
835!> \param qs_kind_set ...
836!> \param all_potential_present ...
837!> \param tnadd_potential_present ...
838!> \param gth_potential_present ...
839!> \param sgp_potential_present ...
840!> \param paw_atom_present ...
841!> \param dft_plus_u_atom_present ...
842!> \param maxcgf ...
843!> \param maxsgf ...
844!> \param maxco ...
845!> \param maxco_proj ...
846!> \param maxgtops ...
847!> \param maxlgto ...
848!> \param maxlprj ...
849!> \param maxnset ...
850!> \param maxsgf_set ...
851!> \param ncgf ...
852!> \param npgf ...
853!> \param nset ...
854!> \param nsgf ...
855!> \param nshell ...
856!> \param maxpol ...
857!> \param maxlppl ...
858!> \param maxlppnl ...
859!> \param maxppnl ...
860!> \param nelectron ...
861!> \param maxder ...
862!> \param max_ngrid_rad ...
863!> \param max_sph_harm ...
864!> \param maxg_iso_not0 ...
865!> \param lmax_rho0 ...
866!> \param basis_rcut ...
867!> \param basis_type ...
868!> \param total_zeff_corr ... [SGh]
869!> \param npgf_seg total number of primitive GTOs in "segmented contraction format"
870! **************************************************************************************************
871 SUBROUTINE get_qs_kind_set(qs_kind_set, &
872 all_potential_present, tnadd_potential_present, gth_potential_present, &
873 sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, &
874 maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, &
875 ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, &
876 nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, &
877 basis_rcut, &
878 basis_type, total_zeff_corr, npgf_seg)
879
880 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
881 LOGICAL, INTENT(OUT), OPTIONAL :: all_potential_present, tnadd_potential_present, &
882 gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present
883 INTEGER, INTENT(OUT), OPTIONAL :: maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, &
884 maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, &
885 maxppnl, nelectron
886 INTEGER, INTENT(IN), OPTIONAL :: maxder
887 INTEGER, INTENT(OUT), OPTIONAL :: max_ngrid_rad, max_sph_harm, &
888 maxg_iso_not0, lmax_rho0
889 REAL(kind=dp), INTENT(OUT), OPTIONAL :: basis_rcut
890 CHARACTER(len=*), OPTIONAL :: basis_type
891 REAL(kind=dp), INTENT(OUT), OPTIONAL :: total_zeff_corr
892 INTEGER, INTENT(OUT), OPTIONAL :: npgf_seg
893
894 CHARACTER(len=default_string_length) :: my_basis_type
895 INTEGER :: ikind, imax, lmax_rho0_kind, &
896 max_iso_not0, max_s_harm, n, &
897 ngrid_rad, nkind, nrloc(10), &
898 nrpot(1:15, 0:10)
899 LOGICAL :: dft_plus_u_atom, ecp_semi_local, paw_atom
900 REAL(kind=dp) :: brcut, zeff, zeff_correction
901 TYPE(all_potential_type), POINTER :: all_potential
902 TYPE(gth_potential_type), POINTER :: gth_potential
903 TYPE(gto_basis_set_type), POINTER :: tmp_basis_set
904 TYPE(local_potential_type), POINTER :: tnadd_potential
905 TYPE(paw_proj_set_type), POINTER :: paw_proj_set
906 TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter
907 TYPE(qs_kind_type), POINTER :: qs_kind
908 TYPE(sgp_potential_type), POINTER :: sgp_potential
909
910 IF (PRESENT(basis_type)) THEN
911 my_basis_type = basis_type
912 ELSE
913 my_basis_type = "ORB"
914 END IF
915
916 IF (ASSOCIATED(qs_kind_set)) THEN
917
918 IF (PRESENT(maxcgf)) maxcgf = 0
919 IF (PRESENT(maxco)) maxco = 0
920 IF (PRESENT(maxco_proj)) maxco_proj = 0
921 IF (PRESENT(maxg_iso_not0)) maxg_iso_not0 = 0
922 IF (PRESENT(maxgtops)) maxgtops = 0
923 IF (PRESENT(maxlgto)) maxlgto = -1
924 IF (PRESENT(maxlppl)) maxlppl = -1
925 IF (PRESENT(maxlppnl)) maxlppnl = -1
926 IF (PRESENT(maxpol)) maxpol = -1
927 IF (PRESENT(maxlprj)) maxlprj = -1
928 IF (PRESENT(maxnset)) maxnset = 0
929 IF (PRESENT(maxppnl)) maxppnl = 0
930 IF (PRESENT(maxsgf)) maxsgf = 0
931 IF (PRESENT(maxsgf_set)) maxsgf_set = 0
932 IF (PRESENT(ncgf)) ncgf = 0
933 IF (PRESENT(nelectron)) nelectron = 0
934 IF (PRESENT(npgf)) npgf = 0
935 IF (PRESENT(nset)) nset = 0
936 IF (PRESENT(nsgf)) nsgf = 0
937 IF (PRESENT(nshell)) nshell = 0
938 IF (PRESENT(all_potential_present)) all_potential_present = .false.
939 IF (PRESENT(tnadd_potential_present)) tnadd_potential_present = .false.
940 IF (PRESENT(gth_potential_present)) gth_potential_present = .false.
941 IF (PRESENT(sgp_potential_present)) sgp_potential_present = .false.
942 IF (PRESENT(paw_atom_present)) paw_atom_present = .false.
943 IF (PRESENT(max_ngrid_rad)) max_ngrid_rad = 0
944 IF (PRESENT(max_sph_harm)) max_sph_harm = 0
945 IF (PRESENT(lmax_rho0)) lmax_rho0 = 0
946 IF (PRESENT(basis_rcut)) basis_rcut = 0.0_dp
947 IF (PRESENT(total_zeff_corr)) total_zeff_corr = 0.0_dp
948 IF (PRESENT(npgf_seg)) npgf_seg = 0
949
950 nkind = SIZE(qs_kind_set)
951 DO ikind = 1, nkind
952 qs_kind => qs_kind_set(ikind)
953 CALL get_qs_kind(qs_kind=qs_kind, &
954 all_potential=all_potential, &
955 tnadd_potential=tnadd_potential, &
956 gth_potential=gth_potential, &
957 sgp_potential=sgp_potential, &
958 paw_proj_set=paw_proj_set, &
959 dftb_parameter=dftb_parameter, &
960 ngrid_rad=ngrid_rad, &
961 max_s_harm=max_s_harm, &
962 max_iso_not0=max_iso_not0, &
963 paw_atom=paw_atom, &
964 dft_plus_u_atom=dft_plus_u_atom, &
965 lmax_rho0=lmax_rho0_kind)
966
967 IF (PRESENT(maxlppl) .AND. ASSOCIATED(gth_potential)) THEN
968 CALL get_potential(potential=gth_potential, nexp_ppl=n)
969 maxlppl = max(maxlppl, 2*(n - 1))
970 ELSEIF (PRESENT(maxlppl) .AND. ASSOCIATED(sgp_potential)) THEN
971 CALL get_potential(potential=sgp_potential, nrloc=nrloc, ecp_semi_local=ecp_semi_local)
972 n = maxval(nrloc) - 2
973 maxlppl = max(maxlppl, 2*(n - 1))
974 IF (ecp_semi_local) THEN
975 CALL get_potential(potential=sgp_potential, sl_lmax=imax, nrpot=nrpot)
976 n = maxval(nrpot) - 2
977 n = 2*(n - 1) + imax
978 maxlppl = max(maxlppl, n)
979 END IF
980 END IF
981
982 IF (PRESENT(maxlppnl) .AND. ASSOCIATED(gth_potential)) THEN
983 CALL get_potential(potential=gth_potential, lprj_ppnl_max=imax)
984 maxlppnl = max(maxlppnl, imax)
985 ELSEIF (PRESENT(maxlppnl) .AND. ASSOCIATED(sgp_potential)) THEN
986 CALL get_potential(potential=sgp_potential, lmax=imax)
987 maxlppnl = max(maxlppnl, imax)
988 END IF
989
990 IF (PRESENT(maxpol) .AND. ASSOCIATED(tnadd_potential)) THEN
991 CALL get_potential(potential=tnadd_potential, npol=n)
992 maxpol = max(maxpol, 2*(n - 1))
993 END IF
994
995 IF (PRESENT(maxco_proj) .AND. ASSOCIATED(paw_proj_set)) THEN
996 CALL get_paw_proj_set(paw_proj_set=paw_proj_set, ncgauprj=imax)
997 maxco_proj = max(maxco_proj, imax)
998 END IF
999
1000 IF (PRESENT(maxlprj) .AND. ASSOCIATED(paw_proj_set)) THEN
1001 CALL get_paw_proj_set(paw_proj_set=paw_proj_set, maxl=imax)
1002 maxlprj = max(maxlprj, imax)
1003 END IF
1004
1005 IF (PRESENT(maxppnl) .AND. ASSOCIATED(gth_potential)) THEN
1006 CALL get_potential(potential=gth_potential, nppnl=imax)
1007 maxppnl = max(maxppnl, imax)
1008 ELSEIF (PRESENT(maxppnl) .AND. ASSOCIATED(sgp_potential)) THEN
1009 CALL get_potential(potential=sgp_potential, nppnl=imax)
1010 maxppnl = max(maxppnl, imax)
1011 END IF
1012
1013 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis_set, &
1014 basis_type=my_basis_type)
1015
1016 IF (PRESENT(maxcgf)) THEN
1017 IF (ASSOCIATED(tmp_basis_set)) THEN
1018 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, ncgf=imax)
1019 maxcgf = max(maxcgf, imax)
1020 ELSE IF (ASSOCIATED(qs_kind%dftb_parameter)) THEN
1021 CALL get_dftb_atom_param(dftb_parameter=dftb_parameter, lmax=imax)
1022 imax = ((imax + 1)*(imax + 2)*(imax + 3))/6
1023 maxcgf = max(maxcgf, imax)
1024 END IF
1025 END IF
1026
1027 IF (PRESENT(maxco)) THEN
1028 IF (ASSOCIATED(tmp_basis_set)) THEN
1029 IF (PRESENT(maxder)) THEN
1030 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, &
1031 maxco=imax, maxder=maxder)
1032 ELSE
1033 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, maxco=imax)
1034 END IF
1035 maxco = max(maxco, imax)
1036 END IF
1037 IF (ASSOCIATED(gth_potential)) THEN
1038 CALL get_potential(potential=gth_potential, lprj_ppnl_max=imax)
1039 maxco = max(maxco, ncoset(imax))
1040 END IF
1041 IF (ASSOCIATED(sgp_potential)) THEN
1042 CALL get_potential(potential=sgp_potential, lmax=imax)
1043 maxco = max(maxco, ncoset(imax))
1044 CALL get_potential(potential=sgp_potential, sl_lmax=imax)
1045 maxco = max(maxco, ncoset(imax))
1046 END IF
1047 END IF
1048
1049 IF (PRESENT(maxgtops)) THEN
1050 IF (ASSOCIATED(tmp_basis_set)) THEN
1051 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, maxso=imax, nset=n)
1052 maxgtops = max(maxgtops, n*imax)
1053 END IF
1054 END IF
1055
1056 IF (PRESENT(maxlgto)) THEN
1057 IF (ASSOCIATED(tmp_basis_set)) THEN
1058 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, maxl=imax)
1059 maxlgto = max(maxlgto, imax)
1060 ELSE IF (ASSOCIATED(qs_kind%dftb_parameter)) THEN
1061 CALL get_dftb_atom_param(dftb_parameter=dftb_parameter, lmax=imax)
1062 maxlgto = max(maxlgto, imax)
1063 END IF
1064 END IF
1065
1066 IF (PRESENT(maxnset)) THEN
1067 IF (ASSOCIATED(tmp_basis_set)) THEN
1068 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, nset=n)
1069 maxnset = max(maxnset, n)
1070 END IF
1071 END IF
1072
1073 IF (PRESENT(maxsgf)) THEN
1074 IF (ASSOCIATED(tmp_basis_set)) THEN
1075 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, nsgf=imax)
1076 maxsgf = max(maxsgf, imax)
1077 END IF
1078 END IF
1079
1080 IF (PRESENT(maxsgf_set)) THEN
1081 IF (ASSOCIATED(tmp_basis_set)) THEN
1082 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, maxsgf_set=imax)
1083 maxsgf_set = max(maxsgf_set, imax)
1084 END IF
1085 END IF
1086
1087 IF (PRESENT(ncgf)) THEN
1088 IF (ASSOCIATED(tmp_basis_set)) THEN
1089 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, ncgf=n)
1090 ncgf = ncgf + n*qs_kind_set(ikind)%natom
1091 ELSE IF (ASSOCIATED(qs_kind%dftb_parameter)) THEN
1092 CALL get_dftb_atom_param(dftb_parameter=dftb_parameter, lmax=imax)
1093 n = ((imax + 1)*(imax + 2)*(imax + 3))/6
1094 ncgf = ncgf + n*qs_kind_set(ikind)%natom
1095 END IF
1096 END IF
1097
1098 IF (PRESENT(npgf)) THEN
1099 IF (ASSOCIATED(tmp_basis_set)) THEN
1100 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, npgf_sum=n)
1101 npgf = npgf + n*qs_kind_set(ikind)%natom
1102 END IF
1103 END IF
1104
1105 IF (PRESENT(nset)) THEN
1106 IF (ASSOCIATED(tmp_basis_set)) THEN
1107 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, nset=n)
1108 nset = nset + n*qs_kind_set(ikind)%natom
1109 END IF
1110 END IF
1111
1112 IF (PRESENT(nsgf)) THEN
1113 IF (ASSOCIATED(tmp_basis_set)) THEN
1114 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, nsgf=n)
1115 nsgf = nsgf + n*qs_kind_set(ikind)%natom
1116 ELSE IF (ASSOCIATED(qs_kind%dftb_parameter)) THEN
1117 CALL get_dftb_atom_param(dftb_parameter=dftb_parameter, natorb=n)
1118 nsgf = nsgf + n*qs_kind_set(ikind)%natom
1119 END IF
1120 END IF
1121
1122 IF (PRESENT(nshell)) THEN
1123 IF (ASSOCIATED(tmp_basis_set)) THEN
1124 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, nshell_sum=n)
1125 nshell = nshell + n*qs_kind_set(ikind)%natom
1126 ELSE IF (ASSOCIATED(qs_kind%dftb_parameter)) THEN
1127 CALL get_dftb_atom_param(dftb_parameter=dftb_parameter, lmax=n)
1128 nshell = nshell + (n + 1)*qs_kind_set(ikind)%natom
1129 END IF
1130 END IF
1131
1132 IF (PRESENT(nelectron)) THEN
1133 IF (ASSOCIATED(qs_kind%all_potential)) THEN
1134 CALL get_potential(potential=qs_kind%all_potential, &
1135 zeff=zeff, zeff_correction=zeff_correction)
1136 ELSE IF (ASSOCIATED(qs_kind%gth_potential)) THEN
1137 CALL get_potential(potential=qs_kind%gth_potential, &
1138 zeff=zeff, zeff_correction=zeff_correction)
1139 ELSE IF (ASSOCIATED(qs_kind%sgp_potential)) THEN
1140 CALL get_potential(potential=qs_kind%sgp_potential, &
1141 zeff=zeff, zeff_correction=zeff_correction)
1142 ELSE
1143 zeff = 0.0_dp
1144 zeff_correction = 0.0_dp
1145 END IF
1146 nelectron = nelectron + qs_kind_set(ikind)%natom*nint(zeff - zeff_correction)
1147 END IF
1148
1149 IF (PRESENT(basis_rcut)) THEN
1150 IF (ASSOCIATED(tmp_basis_set)) THEN
1151 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, kind_radius=brcut)
1152 basis_rcut = max(basis_rcut, brcut)
1153 ELSE IF (ASSOCIATED(qs_kind%dftb_parameter)) THEN
1154 CALL get_dftb_atom_param(dftb_parameter=dftb_parameter, cutoff=brcut)
1155 basis_rcut = max(basis_rcut, brcut)
1156 END IF
1157 END IF
1158
1159 IF (PRESENT(total_zeff_corr)) THEN
1160 IF (ASSOCIATED(qs_kind%all_potential)) THEN
1161 CALL get_potential(potential=qs_kind%all_potential, &
1162 zeff=zeff, zeff_correction=zeff_correction)
1163 ELSE IF (ASSOCIATED(qs_kind%gth_potential)) THEN
1164 CALL get_potential(potential=qs_kind%gth_potential, &
1165 zeff=zeff, zeff_correction=zeff_correction)
1166 ELSE IF (ASSOCIATED(qs_kind%sgp_potential)) THEN
1167 CALL get_potential(potential=qs_kind%sgp_potential, &
1168 zeff=zeff, zeff_correction=zeff_correction)
1169 ELSE
1170 zeff = 0.0_dp
1171 zeff_correction = 0.0_dp
1172 END IF
1173 total_zeff_corr = total_zeff_corr + qs_kind_set(ikind)%natom*zeff_correction
1174 END IF
1175
1176 IF (PRESENT(all_potential_present)) THEN
1177 IF (ASSOCIATED(all_potential)) THEN
1178 all_potential_present = .true.
1179 END IF
1180 END IF
1181
1182 IF (PRESENT(tnadd_potential_present)) THEN
1183 IF (ASSOCIATED(tnadd_potential)) THEN
1184 tnadd_potential_present = .true.
1185 END IF
1186 END IF
1187
1188 IF (PRESENT(gth_potential_present)) THEN
1189 IF (ASSOCIATED(gth_potential)) THEN
1190 gth_potential_present = .true.
1191 END IF
1192 END IF
1193
1194 IF (PRESENT(sgp_potential_present)) THEN
1195 IF (ASSOCIATED(sgp_potential)) THEN
1196 sgp_potential_present = .true.
1197 END IF
1198 END IF
1199
1200 IF (PRESENT(paw_atom_present)) THEN
1201 IF (paw_atom) THEN
1202 paw_atom_present = .true.
1203 END IF
1204 END IF
1205
1206 IF (PRESENT(dft_plus_u_atom_present)) THEN
1207 IF (dft_plus_u_atom) THEN
1208 dft_plus_u_atom_present = .true.
1209 END IF
1210 END IF
1211
1212 IF (PRESENT(max_ngrid_rad)) THEN
1213 max_ngrid_rad = max(max_ngrid_rad, ngrid_rad)
1214 END IF
1215
1216 IF (PRESENT(max_sph_harm)) THEN
1217 max_sph_harm = max(max_sph_harm, max_s_harm)
1218 END IF
1219
1220 IF (PRESENT(maxg_iso_not0)) THEN
1221 maxg_iso_not0 = max(maxg_iso_not0, max_iso_not0)
1222 END IF
1223
1224 IF (PRESENT(lmax_rho0)) THEN
1225 lmax_rho0 = max(lmax_rho0, lmax_rho0_kind)
1226 END IF
1227
1228 IF (PRESENT(npgf_seg)) THEN
1229 IF (ASSOCIATED(tmp_basis_set)) THEN
1230 CALL get_gto_basis_set(gto_basis_set=tmp_basis_set, npgf_seg_sum=n)
1231 npgf_seg = npgf_seg + n*qs_kind_set(ikind)%natom
1232 END IF
1233 END IF
1234
1235 END DO
1236 ELSE
1237 cpabort("The pointer qs_kind_set is not associated")
1238 END IF
1239
1240 END SUBROUTINE get_qs_kind_set
1241
1242! **************************************************************************************************
1243!> \brief Initialise an atomic kind data set.
1244!> \param qs_kind ...
1245!> \author Creation (11.01.2002,MK)
1246!> 20.09.2002 adapted for pol/kg use, gtb
1247! **************************************************************************************************
1248 SUBROUTINE init_qs_kind(qs_kind)
1249 TYPE(qs_kind_type), POINTER :: qs_kind
1250
1251 CHARACTER(len=*), PARAMETER :: routinen = 'init_qs_kind'
1252
1253 CHARACTER(LEN=default_string_length) :: basis_type
1254 INTEGER :: handle, i
1255 TYPE(gto_basis_set_type), POINTER :: tmp_basis_set
1256
1257 CALL timeset(routinen, handle)
1258
1259 cpassert(ASSOCIATED(qs_kind))
1260
1261 IF (ASSOCIATED(qs_kind%gth_potential)) THEN
1262 CALL init_potential(qs_kind%gth_potential)
1263 ELSEIF (ASSOCIATED(qs_kind%sgp_potential)) THEN
1264 CALL init_potential(qs_kind%sgp_potential)
1265 END IF
1266
1267 DO i = 1, SIZE(qs_kind%basis_sets, 1)
1268 NULLIFY (tmp_basis_set)
1269 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis_set, &
1270 inumbas=i, basis_type=basis_type)
1271 IF (basis_type == "") cycle
1272 IF (basis_type == "AUX") THEN
1273 IF (tmp_basis_set%norm_type < 0) tmp_basis_set%norm_type = 1
1274 CALL init_aux_basis_set(tmp_basis_set)
1275 ELSE
1276 IF (tmp_basis_set%norm_type < 0) tmp_basis_set%norm_type = 2
1277 CALL init_orb_basis_set(tmp_basis_set)
1278 END IF
1279 END DO
1280
1281 CALL timestop(handle)
1282
1283 END SUBROUTINE init_qs_kind
1284
1285! **************************************************************************************************
1286!> \brief Initialise an atomic kind set data set.
1287!> \param qs_kind_set ...
1288!> \author - Creation (17.01.2002,MK)
1289!> - 20.09.2002 para_env passed (gt)
1290! **************************************************************************************************
1291 SUBROUTINE init_qs_kind_set(qs_kind_set)
1292
1293 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1294
1295 CHARACTER(len=*), PARAMETER :: routinen = 'init_qs_kind_set'
1296
1297 INTEGER :: handle, ikind
1298 TYPE(qs_kind_type), POINTER :: qs_kind
1299
1300 CALL timeset(routinen, handle)
1301
1302 IF (.NOT. ASSOCIATED(qs_kind_set)) THEN
1303 cpabort("init_qs_kind_set: The pointer qs_kind_set is not associated")
1304 END IF
1305
1306 DO ikind = 1, SIZE(qs_kind_set)
1307 qs_kind => qs_kind_set(ikind)
1308 CALL init_qs_kind(qs_kind)
1309 END DO
1310
1311 CALL timestop(handle)
1312
1313 END SUBROUTINE init_qs_kind_set
1314
1315! **************************************************************************************************
1316!> \brief ...
1317!> \param qs_kind_set ...
1318!> \param qs_control ...
1319!> \param force_env_section ...
1320!> \param modify_qs_control whether the qs_control should be modified
1321! **************************************************************************************************
1322 SUBROUTINE init_gapw_basis_set(qs_kind_set, qs_control, force_env_section, modify_qs_control)
1323
1324 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1325 TYPE(qs_control_type), POINTER :: qs_control
1326 TYPE(section_vals_type), POINTER :: force_env_section
1327 LOGICAL, OPTIONAL :: modify_qs_control
1328
1329 CHARACTER(LEN=default_string_length) :: bsname
1330 INTEGER :: bas1c, ikind, ilevel, nkind
1331 LOGICAL :: gpw, my_mod_control, paw_atom
1332 REAL(dp) :: max_rad_local_type, rc
1333 TYPE(gto_basis_set_type), POINTER :: basis_1c, orb_basis, soft_basis
1334 TYPE(paw_proj_set_type), POINTER :: paw_proj
1335 TYPE(qs_kind_type), POINTER :: qs_kind
1336
1337 my_mod_control = .true.
1338 IF (PRESENT(modify_qs_control)) THEN
1339 my_mod_control = modify_qs_control
1340 END IF
1341
1342 IF (ASSOCIATED(qs_kind_set)) THEN
1343
1344 IF (my_mod_control) qs_control%gapw_control%non_paw_atoms = .false.
1345 nkind = SIZE(qs_kind_set)
1346
1347 DO ikind = 1, nkind
1348
1349 qs_kind => qs_kind_set(ikind)
1350
1351 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
1352 CALL get_qs_kind(qs_kind=qs_kind, hard_radius=rc, &
1353 max_rad_local=max_rad_local_type, gpw_type_forced=gpw)
1354
1355 NULLIFY (soft_basis)
1356 CALL allocate_gto_basis_set(soft_basis)
1357 CALL create_soft_basis(orb_basis, soft_basis, &
1358 qs_control%gapw_control%eps_fit, rc, paw_atom, &
1359 qs_control%gapw_control%force_paw, gpw)
1360 CALL add_basis_set_to_container(qs_kind%basis_sets, soft_basis, "ORB_SOFT")
1361 CALL set_qs_kind(qs_kind=qs_kind, paw_atom=paw_atom)
1362
1363 bas1c = qs_control%gapw_control%basis_1c
1364 NULLIFY (basis_1c)
1365 SELECT CASE (bas1c)
1366 CASE (gapw_1c_orb)
1367 ilevel = 0
1368 CASE (gapw_1c_small)
1369 ilevel = 1
1370 CASE (gapw_1c_medium)
1371 ilevel = 2
1372 CASE (gapw_1c_large)
1373 ilevel = 3
1374 CASE (gapw_1c_very_large)
1375 ilevel = 4
1376 CASE DEFAULT
1377 cpabort("basis_1c type")
1378 END SELECT
1379 CALL remove_basis_from_container(qs_kind%basis_sets, basis_type="GAPW_1C")
1380 CALL create_1c_basis(orb_basis, soft_basis, basis_1c, ilevel)
1381 CALL get_gto_basis_set(gto_basis_set=orb_basis, name=bsname)
1382 basis_1c%name = trim(bsname)//"_1c"
1383 CALL add_basis_set_to_container(qs_kind%basis_sets, basis_1c, "GAPW_1C")
1384 IF (paw_atom) THEN
1385 CALL allocate_paw_proj_set(qs_kind%paw_proj_set)
1386 CALL get_qs_kind(qs_kind=qs_kind, paw_proj_set=paw_proj)
1387 CALL projectors(paw_proj, basis_1c, orb_basis, rc, qs_control, &
1388 max_rad_local_type, force_env_section)
1389 ELSE
1390 IF (my_mod_control) qs_control%gapw_control%non_paw_atoms = .true.
1391 END IF
1392
1393 ! grid_atom and harmonics are allocated even if NOT PAW_ATOM
1394 NULLIFY (qs_kind%grid_atom, qs_kind%harmonics)
1395 CALL allocate_grid_atom(qs_kind%grid_atom)
1396 CALL allocate_harmonics_atom(qs_kind%harmonics)
1397
1398 END DO
1399
1400 IF (my_mod_control) THEN
1401 IF (qs_control%gapw_control%non_paw_atoms) THEN
1402 qs_control%gapw_control%nopaw_as_gpw = .true.
1403 ELSE
1404 qs_control%gapw_control%nopaw_as_gpw = .false.
1405 END IF
1406 END IF
1407 ELSE
1408 cpabort("The pointer qs_kind_set is not associated")
1409 END IF
1410
1411 END SUBROUTINE init_gapw_basis_set
1412! **************************************************************************************************
1413!> \brief ...
1414!> \param qs_kind_set ...
1415! **************************************************************************************************
1416 SUBROUTINE init_gapw_nlcc(qs_kind_set)
1417
1418 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1419
1420 INTEGER :: i, ic, ikind, n_nlcc, nc, nexp_nlcc, &
1421 nkind, nr
1422 INTEGER, DIMENSION(:), POINTER :: nct_nlcc
1423 LOGICAL :: nlcc, nlcc_type, paw_atom
1424 REAL(dp) :: alpha, coa, cval
1425 REAL(kind=dp), DIMENSION(:), POINTER :: a_nlcc, alpha_nlcc, c_nlcc, fe, rc, rr
1426 REAL(kind=dp), DIMENSION(:, :), POINTER :: cval_nlcc, den
1427 TYPE(gth_potential_type), POINTER :: gth_potential
1428 TYPE(qs_kind_type), POINTER :: qs_kind
1429 TYPE(sgp_potential_type), POINTER :: sgp_potential
1430
1431 IF (ASSOCIATED(qs_kind_set)) THEN
1432 nlcc = has_nlcc(qs_kind_set)
1433 IF (nlcc) THEN
1434 nkind = SIZE(qs_kind_set)
1435 DO ikind = 1, nkind
1436 qs_kind => qs_kind_set(ikind)
1437 CALL get_qs_kind(qs_kind, paw_atom=paw_atom)
1438 IF (paw_atom) THEN
1439 CALL get_qs_kind(qs_kind, gth_potential=gth_potential)
1440 CALL get_qs_kind(qs_kind, sgp_potential=sgp_potential)
1441 IF (ASSOCIATED(gth_potential)) THEN
1442 CALL get_potential(potential=gth_potential, nlcc_present=nlcc_type, &
1443 nexp_nlcc=nexp_nlcc, alpha_nlcc=alpha_nlcc, nct_nlcc=nct_nlcc, cval_nlcc=cval_nlcc)
1444 IF (nlcc_type) THEN
1445 nr = qs_kind%grid_atom%nr
1446 rr => qs_kind%grid_atom%rad
1447 ALLOCATE (qs_kind%nlcc_pot(nr, 2), rc(nr), fe(nr))
1448 den => qs_kind%nlcc_pot
1449 den = 0.0_dp
1450 DO i = 1, nexp_nlcc
1451 alpha = alpha_nlcc(i)
1452 rc(:) = rr(:)/alpha
1453 fe(:) = exp(-0.5_dp*rc(:)*rc(:))
1454 nc = nct_nlcc(i)
1455 DO ic = 1, nc
1456 cval = cval_nlcc(ic, i)
1457 coa = cval/alpha
1458 den(:, 1) = den(:, 1) + fe(:)*rc**(2*ic - 2)*cval
1459 den(:, 2) = den(:, 2) - fe(:)*rc**(2*ic - 1)*coa
1460 IF (ic > 1) THEN
1461 den(:, 2) = den(:, 2) + real(2*ic - 2, dp)*fe(:)*rc**(2*ic - 3)*coa
1462 END IF
1463 END DO
1464 END DO
1465 DEALLOCATE (rc, fe)
1466 END IF
1467 ELSE IF (ASSOCIATED(sgp_potential)) THEN
1468 CALL get_potential(potential=sgp_potential, has_nlcc=nlcc_type, &
1469 n_nlcc=n_nlcc, a_nlcc=a_nlcc, c_nlcc=c_nlcc)
1470 IF (nlcc_type) THEN
1471 nr = qs_kind%grid_atom%nr
1472 rr => qs_kind%grid_atom%rad
1473 ALLOCATE (qs_kind%nlcc_pot(nr, 2), rc(nr), fe(nr))
1474 den => qs_kind%nlcc_pot
1475 den = 0.0_dp
1476 DO i = 1, n_nlcc
1477 alpha = a_nlcc(i)
1478 fe(:) = exp(-alpha*rr(:)*rr(:))
1479 cval = c_nlcc(i)
1480 den(:, 1) = den(:, 1) + cval*fe(:)
1481 den(:, 2) = den(:, 2) - 2.0_dp*alpha*cval*rr(:)*fe(:)
1482 END DO
1483 DEALLOCATE (rc, fe)
1484 END IF
1485 ELSE
1486 ! skip
1487 END IF
1488 END IF
1489 END DO
1490 END IF
1491 ELSE
1492 cpabort("The pointer qs_kind_set is not associated")
1493 END IF
1494
1495 END SUBROUTINE init_gapw_nlcc
1496
1497! **************************************************************************************************
1498!> \brief Read an atomic kind data set from the input file.
1499!> \param qs_kind ...
1500!> \param kind_section ...
1501!> \param para_env ...
1502!> \param force_env_section ...
1503!> \param no_fail ...
1504!> \param method_id ...
1505!> \param silent ...
1506!> \par History
1507!> - Creation (09.02.2002,MK)
1508!> - 20.09.2002,gt: adapted for POL/KG use (elp_potential)
1509!> - 05.03.2010: split elp_potential into fist_potential and kg_potential
1510! **************************************************************************************************
1511 SUBROUTINE read_qs_kind(qs_kind, kind_section, para_env, force_env_section, &
1512 no_fail, method_id, silent)
1513
1514 TYPE(qs_kind_type), INTENT(INOUT) :: qs_kind
1515 TYPE(section_vals_type), POINTER :: kind_section
1516 TYPE(mp_para_env_type), POINTER :: para_env
1517 TYPE(section_vals_type), POINTER :: force_env_section
1518 LOGICAL, INTENT(IN) :: no_fail
1519 INTEGER, INTENT(IN) :: method_id
1520 LOGICAL, INTENT(IN) :: silent
1521
1522 CHARACTER(LEN=*), PARAMETER :: routinen = 'read_qs_kind'
1523 INTEGER, PARAMETER :: maxbas = 20
1524
1525 CHARACTER(LEN=2) :: element_symbol
1526 CHARACTER(len=default_path_length) :: kg_potential_fn_kind, &
1527 potential_file_name, potential_fn_kind
1528 CHARACTER(LEN=default_string_length) :: akind_name, basis_type, keyword, &
1529 kgpot_name, kgpot_type, &
1530 potential_name, potential_type, tmp
1531 CHARACTER(LEN=default_string_length), DIMENSION(4) :: description
1532 CHARACTER(LEN=default_string_length), &
1533 DIMENSION(:), POINTER :: tmpstringlist
1534 CHARACTER(LEN=default_string_length), &
1535 DIMENSION(maxbas) :: basis_set_form, basis_set_name, &
1536 basis_set_type
1537 INTEGER :: handle, i, i_rep, iounit, ipaodesc, ipaopot, ipos, j, jj, k_rep, l, m, n_rep, &
1538 nb_rep, nexp, ngauss, nlcc, nloc, nnl, norbitals, npaodesc, npaopot, nppnl, nspin, nu, z
1539 INTEGER, DIMENSION(:), POINTER :: add_el, elec_conf, orbitals
1540 LOGICAL :: check, ecp_semi_local, explicit, explicit_basis, explicit_j, explicit_kgpot, &
1541 explicit_potential, explicit_u, explicit_u_m_j, nobasis, section_enabled, &
1542 subsection_enabled, update_input
1543 REAL(kind=dp) :: alpha, ccore, r, rc, zeff_correction
1544 REAL(kind=dp), DIMENSION(6) :: error
1545 REAL(kind=dp), DIMENSION(:), POINTER :: a_nl, aloc, anlcc, cloc, cnlcc, nelec
1546 REAL(kind=dp), DIMENSION(:, :), POINTER :: h_nl
1547 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: c_nl
1548 TYPE(atom_ecppot_type) :: ecppot
1549 TYPE(atom_sgp_potential_type) :: sgppot
1550 TYPE(atom_upfpot_type) :: upfpot
1551 TYPE(cp_logger_type), POINTER :: logger
1552 TYPE(gto_basis_set_type), POINTER :: orb_basis_set, sup_basis_set, &
1553 tmp_basis_set
1554 TYPE(section_vals_type), POINTER :: basis_section, bs_section, dft_plus_u_section, &
1555 dft_section, enforce_occupation_section, kgpot_section, pao_desc_section, &
1556 pao_pot_section, potential_section, spin_section
1557 TYPE(sto_basis_set_type), POINTER :: sto_basis_set
1558
1559 CALL timeset(routinen, handle)
1560
1561 NULLIFY (logger)
1562 logger => cp_get_default_logger()
1563 iounit = cp_logger_get_default_io_unit(logger)
1564
1565 NULLIFY (elec_conf)
1566
1567 update_input = .true.
1568 basis_set_name(:) = ""
1569 basis_set_type(:) = ""
1570 basis_set_form(:) = ""
1571 potential_name = ""
1572 potential_type = ""
1573 kgpot_name = ""
1574 kgpot_type = ""
1575 z = -1
1576 zeff_correction = 0.0_dp
1577 explicit = .false.
1578 explicit_basis = .false.
1579 explicit_j = .false.
1580 explicit_kgpot = .false.
1581 explicit_potential = .false.
1582 explicit_u = .false.
1583 explicit_u_m_j = .false.
1584
1585 dft_section => section_vals_get_subs_vals(force_env_section, "DFT")
1586 CALL section_vals_get(kind_section, n_repetition=n_rep)
1587 k_rep = -1
1588 akind_name = qs_kind%name
1589 CALL uppercase(akind_name)
1590 ! First we use the atom_name to find out the proper KIND section
1591 DO i_rep = 1, n_rep
1592 CALL section_vals_val_get(kind_section, "_SECTION_PARAMETERS_", &
1593 c_val=keyword, i_rep_section=i_rep)
1594 CALL uppercase(keyword)
1595 IF (keyword == akind_name) THEN
1596 k_rep = i_rep
1597 EXIT
1598 END IF
1599 END DO
1600 ! The search for the KIND section failed.. check for a QM/MM link atom
1601 IF (k_rep < 1) THEN
1602 ipos = index(qs_kind%name, "_")
1603 IF (((ipos == 2) .OR. (ipos == 3)) .AND. (index(qs_kind%name, "_ghost") == 0)) THEN
1604 ! If the atm_name could not match any KIND section it maybe be a QM/MM link atom.
1605 ! ghost atoms will be treated differently.
1606 akind_name = qs_kind%name(1:ipos - 1)
1607 CALL uppercase(akind_name)
1608 DO i_rep = 1, n_rep
1609 CALL section_vals_val_get(kind_section, "_SECTION_PARAMETERS_", &
1610 c_val=keyword, i_rep_section=i_rep)
1611 CALL uppercase(keyword)
1612 IF (keyword == akind_name) THEN
1613 k_rep = i_rep
1614 EXIT
1615 END IF
1616 END DO
1617 END IF
1618 END IF
1619 ! The search for the KIND section failed.. check element_symbol
1620 IF (k_rep < 1) THEN
1621 ! If it's not a link atom let's check for the element and map
1622 ! the KIND section to the element.
1623 element_symbol = qs_kind%element_symbol(1:2)
1624 CALL uppercase(element_symbol)
1625 DO i_rep = 1, n_rep
1626 CALL section_vals_val_get(kind_section, "_SECTION_PARAMETERS_", &
1627 c_val=keyword, i_rep_section=i_rep)
1628 CALL uppercase(keyword)
1629 IF (keyword == element_symbol) THEN
1630 k_rep = i_rep
1631 EXIT
1632 END IF
1633 END DO
1634 END IF
1635 ! In case it should not really match any possible KIND section
1636 ! let's look if a default one is defined..
1637 IF (k_rep < 1) THEN
1638 DO i_rep = 1, n_rep
1639 CALL section_vals_val_get(kind_section, "_SECTION_PARAMETERS_", &
1640 c_val=keyword, i_rep_section=i_rep)
1641 CALL uppercase(keyword)
1642 IF (keyword == "DEFAULT") THEN
1643 update_input = .false.
1644 k_rep = i_rep
1645 EXIT
1646 END IF
1647 END DO
1648 END IF
1649 IF (k_rep < 0 .AND. (.NOT. no_fail)) THEN
1650 CALL cp_abort(__location__, &
1651 "No &KIND section was possible to associate to the atomic kind <"// &
1652 trim(akind_name)//">. The KIND section were also scanned for the"// &
1653 " corresponding element <"//trim(qs_kind%element_symbol)//">"// &
1654 " and for the DEFAULT section but no match was found. Check your input file!")
1655 END IF
1656 ! Retrieve information on element
1657 CALL get_ptable_info(qs_kind%element_symbol, ielement=z)
1658
1659 ! Normal parsing of the KIND section
1660 IF (k_rep > 0) THEN
1661 ! new style basis set input
1662 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1663 keyword_name="BASIS_SET", &
1664 explicit=explicit, &
1665 n_rep_val=nb_rep)
1666 IF (.NOT. explicit) nb_rep = 0
1667 cpassert(nb_rep <= maxbas)
1668 DO i = 1, nb_rep
1669 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1670 keyword_name="BASIS_SET", i_rep_val=i, c_vals=tmpstringlist)
1671 IF (SIZE(tmpstringlist) == 1) THEN
1672 ! default is orbital type and GTO
1673 basis_set_type(i) = "ORB"
1674 basis_set_form(i) = "GTO"
1675 basis_set_name(i) = tmpstringlist(1)
1676 ELSEIF (SIZE(tmpstringlist) == 2) THEN
1677 ! default is GTO
1678 basis_set_type(i) = tmpstringlist(1)
1679 basis_set_form(i) = "GTO"
1680 basis_set_name(i) = tmpstringlist(2)
1681 ELSEIF (SIZE(tmpstringlist) == 3) THEN
1682 basis_set_type(i) = tmpstringlist(1)
1683 basis_set_form(i) = tmpstringlist(2)
1684 basis_set_name(i) = tmpstringlist(3)
1685 ELSE
1686 CALL cp_abort(__location__, &
1687 "invalid number of BASIS_SET keyword parameters: BASIS_SET [<TYPE>] [<FORM>] <NAME>")
1688 END IF
1689 ! check that we have a valid basis set form
1690 IF (basis_set_form(i) /= "GTO" .AND. basis_set_form(i) /= "STO") THEN
1691 cpabort("invalid BASIS_SET FORM parameter")
1692 END IF
1693 END DO
1694
1695 ! parse PAO keywords
1696 CALL section_vals_val_get(kind_section, keyword_name="PAO_BASIS_SIZE", i_rep_section=k_rep, &
1697 i_val=qs_kind%pao_basis_size)
1698 CALL section_vals_val_get(kind_section, keyword_name="PAO_MODEL_FILE", i_rep_section=k_rep, &
1699 explicit=explicit)
1700 IF (explicit) THEN
1701 CALL section_vals_val_get(kind_section, keyword_name="PAO_MODEL_FILE", i_rep_section=k_rep, &
1702 c_val=qs_kind%pao_model_file)
1703 END IF
1704
1705 ! parse PAO_POTENTIAL sections
1706 pao_pot_section => section_vals_get_subs_vals(kind_section, "PAO_POTENTIAL", i_rep_section=k_rep)
1707 CALL section_vals_get(pao_pot_section, n_repetition=npaopot)
1708 ALLOCATE (qs_kind%pao_potentials(npaopot))
1709 DO ipaopot = 1, npaopot
1710 CALL section_vals_val_get(pao_pot_section, keyword_name="MAXL", i_rep_section=ipaopot, &
1711 i_val=qs_kind%pao_potentials(ipaopot)%maxl)
1712 CALL section_vals_val_get(pao_pot_section, keyword_name="MAX_PROJECTOR", i_rep_section=ipaopot, &
1713 i_val=qs_kind%pao_potentials(ipaopot)%max_projector)
1714 CALL section_vals_val_get(pao_pot_section, keyword_name="BETA", i_rep_section=ipaopot, &
1715 r_val=qs_kind%pao_potentials(ipaopot)%beta)
1716 CALL section_vals_val_get(pao_pot_section, keyword_name="WEIGHT", i_rep_section=ipaopot, &
1717 r_val=qs_kind%pao_potentials(ipaopot)%weight)
1718 END DO
1719
1720 ! parse PAO_DESCRIPTOR sections
1721 pao_desc_section => section_vals_get_subs_vals(kind_section, "PAO_DESCRIPTOR", i_rep_section=k_rep)
1722 CALL section_vals_get(pao_desc_section, n_repetition=npaodesc)
1723 ALLOCATE (qs_kind%pao_descriptors(npaodesc))
1724 DO ipaodesc = 1, npaodesc
1725 CALL section_vals_val_get(pao_desc_section, keyword_name="BETA", i_rep_section=ipaodesc, &
1726 r_val=qs_kind%pao_descriptors(ipaodesc)%beta)
1727 CALL section_vals_val_get(pao_desc_section, keyword_name="SCREENING", i_rep_section=ipaodesc, &
1728 r_val=qs_kind%pao_descriptors(ipaodesc)%screening)
1729 CALL section_vals_val_get(pao_desc_section, keyword_name="WEIGHT", i_rep_section=ipaodesc, &
1730 r_val=qs_kind%pao_descriptors(ipaodesc)%weight)
1731 END DO
1732
1733 ! parse ELEC_CONF
1734 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1735 keyword_name="ELEC_CONF", n_rep_val=i)
1736 IF (i > 0) THEN
1737 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1738 keyword_name="ELEC_CONF", i_vals=elec_conf)
1739 CALL set_qs_kind(qs_kind, elec_conf=elec_conf)
1740 END IF
1741 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1742 keyword_name="CORE_CORRECTION", r_val=zeff_correction)
1743 ! parse POTENTIAL
1744 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1745 keyword_name="POTENTIAL_FILE_NAME", c_val=potential_fn_kind)
1746 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1747 keyword_name="POTENTIAL_TYPE", c_val=potential_type)
1748 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1749 explicit=explicit, keyword_name="POTENTIAL", c_vals=tmpstringlist)
1750 IF (explicit) THEN
1751 IF (SIZE(tmpstringlist) == 1) THEN
1752 ! old type of input: start of name defines type
1753 potential_name = tmpstringlist(1)
1754 IF (potential_type == "") THEN
1755 ipos = index(potential_name, "-")
1756 IF (ipos > 1) THEN
1757 potential_type = potential_name(:ipos - 1)
1758 ELSE
1759 potential_type = potential_name
1760 END IF
1761 END IF
1762 ELSEIF (SIZE(tmpstringlist) == 2) THEN
1763 potential_type = tmpstringlist(1)
1764 potential_name = tmpstringlist(2)
1765 ELSE
1766 cpabort("POTENTIAL input list is not correct")
1767 END IF
1768 END IF
1769 CALL uppercase(potential_type)
1770
1771 ! Parse KG POTENTIAL
1772 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1773 keyword_name="KG_POTENTIAL_FILE_NAME", c_val=kg_potential_fn_kind)
1774 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1775 keyword_name="KG_POTENTIAL", c_val=kgpot_name)
1776
1777 ! Semi-local vs. full nonlocal form of ECPs
1778 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1779 keyword_name="ECP_SEMI_LOCAL", l_val=ecp_semi_local)
1780
1781 ! Assign atomic covalent radius
1782 qs_kind%covalent_radius = ptable(z)%covalent_radius*bohr
1783 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1784 keyword_name="COVALENT_RADIUS", r_val=r)
1785 IF (r > 0.0_dp) qs_kind%covalent_radius = r
1786
1787 ! Assign atomic van der Waals radius
1788 qs_kind%vdw_radius = ptable(z)%vdw_radius*bohr
1789 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1790 keyword_name="VDW_RADIUS", r_val=r)
1791 IF (r > 0.0_dp) qs_kind%vdw_radius = r
1792
1793 ! Assign atom dependent defaults, only H special case
1794 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, n_rep_val=i, &
1795 keyword_name="HARD_EXP_RADIUS")
1796 IF (i == 0) THEN
1797 IF (z == 1) THEN
1798 qs_kind%hard_radius = 1.2_dp
1799 ELSE
1800 qs_kind%hard_radius = 0.8_dp*bohr
1801 END IF
1802 ELSE
1803 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1804 keyword_name="HARD_EXP_RADIUS", r_val=qs_kind%hard_radius)
1805 END IF
1806
1807 ! assign atom dependent defaults, only H special case
1808 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, n_rep_val=i, &
1809 keyword_name="RHO0_EXP_RADIUS")
1810 IF (i == 0) THEN
1811 qs_kind%hard0_radius = qs_kind%hard_radius
1812 ELSE
1813 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1814 keyword_name="RHO0_EXP_RADIUS", r_val=qs_kind%hard0_radius)
1815 END IF
1816 IF (qs_kind%hard_radius < qs_kind%hard0_radius) &
1817 cpabort("rc0 should be <= rc")
1818
1819 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1820 keyword_name="MAX_RAD_LOCAL", r_val=qs_kind%max_rad_local)
1821 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1822 keyword_name="LEBEDEV_GRID", i_val=qs_kind%ngrid_ang)
1823 IF (qs_kind%ngrid_ang <= 0) &
1824 cpabort("# point lebedev grid < 0")
1825 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1826 keyword_name="RADIAL_GRID", i_val=qs_kind%ngrid_rad)
1827 IF (qs_kind%ngrid_rad <= 0) &
1828 cpabort("# point radial grid < 0")
1829 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1830 keyword_name="GPW_TYPE", l_val=qs_kind%gpw_type_forced)
1831 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1832 keyword_name="GHOST", l_val=qs_kind%ghost)
1833 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1834 keyword_name="FLOATING_BASIS_CENTER", l_val=qs_kind%floating)
1835 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1836 keyword_name="NO_OPTIMIZE", l_val=qs_kind%no_optimize)
1837
1838 ! Magnetization
1839 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1840 keyword_name="MAGNETIZATION", r_val=qs_kind%magnetization)
1841 ! DFTB3 param
1842 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1843 keyword_name="DFTB3_PARAM", r_val=qs_kind%dudq_dftb3)
1844 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1845 keyword_name="LMAX_DFTB", i_val=qs_kind%lmax_dftb)
1846
1847 ! MAOS
1848 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
1849 keyword_name="MAO", i_val=qs_kind%mao)
1850
1851 ! Read the BS subsection of the current atomic kind, if enabled
1852 NULLIFY (bs_section)
1853 bs_section => section_vals_get_subs_vals(kind_section, "BS", &
1854 i_rep_section=k_rep)
1855 section_enabled = .false.
1856 CALL section_vals_val_get(bs_section, "_SECTION_PARAMETERS_", &
1857 l_val=section_enabled)
1858 IF (section_enabled) THEN
1859 ! test for conflict with magnetization
1860 IF (qs_kind%magnetization /= 0.0_dp) THEN
1861 CALL cp_abort(__location__, "BS Section is in conflict with non-zero magnetization "// &
1862 "for this atom kind.")
1863 END IF
1864 qs_kind%bs_occupation = .true.
1865 !Alpha spin
1866 NULLIFY (spin_section)
1867 spin_section => section_vals_get_subs_vals(bs_section, "ALPHA")
1868 CALL section_vals_get(spin_section, explicit=explicit)
1869 IF (explicit) THEN
1870 NULLIFY (add_el)
1871 CALL section_vals_val_get(spin_section, &
1872 keyword_name="NEL", i_vals=add_el)
1873 cpassert(ASSOCIATED(add_el))
1874 ALLOCATE (qs_kind%addel(SIZE(add_el), 2))
1875 qs_kind%addel = 0
1876 qs_kind%addel(1:SIZE(add_el), 1) = add_el(1:SIZE(add_el))
1877 NULLIFY (add_el)
1878 CALL section_vals_val_get(spin_section, &
1879 keyword_name="L", i_vals=add_el)
1880 cpassert(ASSOCIATED(add_el))
1881 cpassert(SIZE(add_el) == SIZE(qs_kind%addel, 1))
1882 ALLOCATE (qs_kind%laddel(SIZE(add_el), 2))
1883 qs_kind%laddel = 0
1884 qs_kind%laddel(1:SIZE(add_el), 1) = add_el(1:SIZE(add_el))
1885 ALLOCATE (qs_kind%naddel(SIZE(add_el), 2))
1886 qs_kind%naddel = 0
1887 NULLIFY (add_el)
1888 CALL section_vals_val_get(spin_section, &
1889 keyword_name="N", n_rep_val=i)
1890 IF (i > 0) THEN
1891 CALL section_vals_val_get(spin_section, &
1892 keyword_name="N", i_vals=add_el)
1893 IF (SIZE(add_el) == SIZE(qs_kind%addel, 1)) THEN
1894 qs_kind%naddel(1:SIZE(add_el), 1) = add_el(1:SIZE(add_el))
1895 END IF
1896 END IF
1897 END IF
1898 ! Beta spin
1899 NULLIFY (spin_section)
1900 spin_section => section_vals_get_subs_vals(bs_section, "BETA")
1901 CALL section_vals_get(spin_section, explicit=explicit)
1902 IF (explicit) THEN
1903 NULLIFY (add_el)
1904 CALL section_vals_val_get(spin_section, &
1905 keyword_name="NEL", i_vals=add_el)
1906 cpassert(SIZE(add_el) == SIZE(qs_kind%addel, 1))
1907 qs_kind%addel(1:SIZE(add_el), 2) = add_el(1:SIZE(add_el))
1908 qs_kind%addel(:, :) = qs_kind%addel(:, :)
1909 NULLIFY (add_el)
1910 CALL section_vals_val_get(spin_section, &
1911 keyword_name="L", i_vals=add_el)
1912 cpassert(SIZE(add_el) == SIZE(qs_kind%addel, 1))
1913 qs_kind%laddel(1:SIZE(add_el), 2) = add_el(1:SIZE(add_el))
1914
1915 CALL section_vals_val_get(spin_section, &
1916 keyword_name="N", n_rep_val=i)
1917 IF (i > 0) THEN
1918 NULLIFY (add_el)
1919 CALL section_vals_val_get(spin_section, &
1920 keyword_name="N", i_vals=add_el)
1921 IF (SIZE(add_el) == SIZE(qs_kind%addel, 1)) THEN
1922 qs_kind%naddel(1:SIZE(add_el), 2) = add_el(1:SIZE(add_el))
1923 END IF
1924 END IF
1925 END IF
1926 END IF
1927
1928 ! Read the DFT+U subsection of the current atomic kind, if enabled
1929
1930 NULLIFY (dft_plus_u_section)
1931 dft_plus_u_section => section_vals_get_subs_vals(kind_section, &
1932 subsection_name="DFT_PLUS_U", &
1933 i_rep_section=k_rep)
1934 section_enabled = .false.
1935 CALL section_vals_val_get(dft_plus_u_section, &
1936 keyword_name="_SECTION_PARAMETERS_", &
1937 l_val=section_enabled)
1938 IF (section_enabled) THEN
1939 ALLOCATE (qs_kind%dft_plus_u)
1940 NULLIFY (qs_kind%dft_plus_u%nelec)
1941 NULLIFY (qs_kind%dft_plus_u%orbitals)
1942 CALL section_vals_val_get(dft_plus_u_section, &
1943 keyword_name="L", &
1944 i_val=l)
1945 qs_kind%dft_plus_u%l = l
1946#if defined(__SIRIUS)
1947 CALL section_vals_val_get(dft_plus_u_section, &
1948 keyword_name="N", &
1949 i_val=nu)
1950 qs_kind%dft_plus_u%n = nu
1951
1952 CALL section_vals_val_get(dft_plus_u_section, &
1953 keyword_name="U", &
1954 r_val=qs_kind%dft_plus_u%U, &
1955 explicit=explicit_u)
1956
1957 CALL section_vals_val_get(dft_plus_u_section, &
1958 keyword_name="J", &
1959 r_val=qs_kind%dft_plus_u%J, &
1960 explicit=explicit_j)
1961
1962 CALL section_vals_val_get(dft_plus_u_section, &
1963 keyword_name="alpha", &
1964 r_val=qs_kind%dft_plus_u%alpha)
1965
1966 CALL section_vals_val_get(dft_plus_u_section, &
1967 keyword_name="beta", &
1968 r_val=qs_kind%dft_plus_u%beta)
1969
1970 CALL section_vals_val_get(dft_plus_u_section, &
1971 keyword_name="J0", &
1972 r_val=qs_kind%dft_plus_u%J0)
1973
1974 CALL section_vals_val_get(dft_plus_u_section, &
1975 keyword_name="occupation", &
1976 r_val=qs_kind%dft_plus_u%occupation)
1977#else
1978 nu = 0
1979#endif
1980
1981 CALL section_vals_val_get(dft_plus_u_section, &
1982 keyword_name="U_MINUS_J", &
1983 r_val=qs_kind%dft_plus_u%u_minus_j_target, &
1984 explicit=explicit_u_m_j)
1985
1986 IF ((explicit_u .OR. explicit_j) .AND. explicit_u_m_j) THEN
1987 cpabort("DFT+U| specifying U or J and U_MINUS_J parameters are mutually exclusive.")
1988 END IF
1989
1990 CALL section_vals_val_get(dft_plus_u_section, &
1991 keyword_name="U_RAMPING", &
1992 r_val=qs_kind%dft_plus_u%u_ramping)
1993 CALL section_vals_val_get(dft_plus_u_section, &
1994 keyword_name="INIT_U_RAMPING_EACH_SCF", &
1995 l_val=qs_kind%dft_plus_u%init_u_ramping_each_scf)
1996 IF (qs_kind%dft_plus_u%u_ramping > 0.0_dp) THEN
1997 qs_kind%dft_plus_u%u_minus_j = 0.0_dp
1998 ELSE
1999 qs_kind%dft_plus_u%u_minus_j = qs_kind%dft_plus_u%u_minus_j_target
2000 END IF
2001 CALL section_vals_val_get(dft_plus_u_section, &
2002 keyword_name="EPS_U_RAMPING", &
2003 r_val=qs_kind%dft_plus_u%eps_u_ramping)
2004
2005 NULLIFY (enforce_occupation_section)
2006 enforce_occupation_section => section_vals_get_subs_vals(dft_plus_u_section, &
2007 subsection_name="ENFORCE_OCCUPATION")
2008 subsection_enabled = .false.
2009 CALL section_vals_val_get(enforce_occupation_section, &
2010 keyword_name="_SECTION_PARAMETERS_", &
2011 l_val=subsection_enabled)
2012 IF (subsection_enabled) THEN
2013 NULLIFY (nelec)
2014 CALL section_vals_val_get(enforce_occupation_section, &
2015 keyword_name="NELEC", &
2016 r_vals=nelec)
2017 nspin = SIZE(nelec)
2018 ALLOCATE (qs_kind%dft_plus_u%nelec(nspin))
2019 qs_kind%dft_plus_u%nelec(:) = nelec(:)
2020 NULLIFY (orbitals)
2021 CALL section_vals_val_get(enforce_occupation_section, &
2022 keyword_name="ORBITALS", &
2023 i_vals=orbitals)
2024 norbitals = SIZE(orbitals)
2025 IF (norbitals <= 0 .OR. norbitals > 2*l + 1) &
2026 CALL cp_abort(__location__, "DFT+U| Invalid number of ORBITALS specified: "// &
2027 "1 to 2*L+1 integer numbers are expected")
2028 ALLOCATE (qs_kind%dft_plus_u%orbitals(norbitals))
2029 qs_kind%dft_plus_u%orbitals(:) = orbitals(:)
2030 NULLIFY (orbitals)
2031 DO m = 1, norbitals
2032 IF (qs_kind%dft_plus_u%orbitals(m) > l) &
2033 cpabort("DFT+U| Invalid orbital magnetic quantum number specified: m > l")
2034 IF (qs_kind%dft_plus_u%orbitals(m) < -l) &
2035 cpabort("DFT+U| Invalid orbital magnetic quantum number specified: m < -l")
2036 DO j = 1, norbitals
2037 IF (j /= m) THEN
2038 IF (qs_kind%dft_plus_u%orbitals(j) == qs_kind%dft_plus_u%orbitals(m)) &
2039 cpabort("DFT+U| An orbital magnetic quantum number was specified twice")
2040 END IF
2041 END DO
2042 END DO
2043 CALL section_vals_val_get(enforce_occupation_section, &
2044 keyword_name="EPS_SCF", &
2045 r_val=qs_kind%dft_plus_u%eps_scf)
2046 CALL section_vals_val_get(enforce_occupation_section, &
2047 keyword_name="MAX_SCF", &
2048 i_val=i)
2049 qs_kind%dft_plus_u%max_scf = max(-1, i)
2050 CALL section_vals_val_get(enforce_occupation_section, &
2051 keyword_name="SMEAR", &
2052 l_val=qs_kind%dft_plus_u%smear)
2053 END IF ! subsection enabled
2054 END IF ! section enabled
2055
2056 END IF
2057
2058 ! Allocate and initialise the orbital basis set data set structure
2059 CALL init_orbital_pointers(5) ! debug the SUN optimizer
2060
2061 ! BASIS and POTENTIAL read only when strictly necessary otherwise, even if not used
2062 ! we just print misleading informations
2063 explicit_basis = .false.
2064 IF (k_rep > 0) THEN
2065 basis_section => section_vals_get_subs_vals(kind_section, "BASIS", i_rep_section=k_rep, &
2066 can_return_null=.true.)
2067 CALL section_vals_get(basis_section, explicit=explicit_basis)
2068 END IF
2069
2070 explicit_potential = .false.
2071 IF (k_rep > 0) THEN
2072 potential_section => section_vals_get_subs_vals(kind_section, "POTENTIAL", &
2073 i_rep_section=k_rep, can_return_null=.true.)
2074 CALL section_vals_get(potential_section, explicit=explicit_potential)
2075 END IF
2076
2077 explicit_kgpot = .false.
2078 IF (k_rep > 0) THEN
2079 kgpot_section => section_vals_get_subs_vals(kind_section, "KG_POTENTIAL", &
2080 i_rep_section=k_rep, can_return_null=.true.)
2081 CALL section_vals_get(kgpot_section, explicit=explicit_kgpot)
2082 END IF
2083
2084 SELECT CASE (method_id)
2087 ! Allocate all_potential
2088 CALL allocate_potential(qs_kind%all_potential)
2089 CALL set_default_all_potential(qs_kind%all_potential, z, zeff_correction)
2090 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2091 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2092 CALL get_potential(potential=qs_kind%all_potential, elec_conf=elec_conf)
2093 CALL set_qs_kind(qs_kind, elec_conf=elec_conf)
2094 END IF
2095 cpassert(.NOT. qs_kind%floating)
2096 IF (qs_kind%ghost) THEN
2097 CALL get_qs_kind(qs_kind=qs_kind, elec_conf=elec_conf)
2098 elec_conf(:) = 0
2099 CALL get_potential(potential=qs_kind%all_potential, &
2100 elec_conf=elec_conf)
2101 elec_conf(:) = 0
2102 CALL set_potential(potential=qs_kind%all_potential, &
2103 zeff=0.0_dp, &
2104 zeff_correction=0.0_dp)
2105 END IF
2106
2107 ! Basis set (Parameters)
2108 ! Setup proper semiempirical parameters
2109 check = .NOT. ASSOCIATED(qs_kind%se_parameter)
2110 cpassert(check)
2111 CALL semi_empirical_create(qs_kind%se_parameter)
2112 ! Check if we allow p-orbitals on H
2113 SELECT CASE (z)
2114 CASE (1)
2115 IF (k_rep > 0) THEN
2116 CALL section_vals_val_get(kind_section, i_rep_section=k_rep, &
2117 keyword_name="SE_P_ORBITALS_ON_H", l_val=qs_kind%se_parameter%p_orbitals_on_h)
2118 END IF
2119 CASE DEFAULT
2120 ! No special cases for other elements..
2121 END SELECT
2122 ! Set default parameters
2123 CALL section_vals_val_get(dft_section, "QS%SE%STO_NG", i_val=ngauss)
2124 CALL se_param_set_default(qs_kind%se_parameter, z, method_id)
2125 NULLIFY (tmp_basis_set)
2126 CALL init_se_param(qs_kind%se_parameter, tmp_basis_set, ngauss)
2127 CALL add_basis_set_to_container(qs_kind%basis_sets, tmp_basis_set, "ORB")
2128 CALL init_potential(qs_kind%all_potential, itype="BARE", &
2129 zeff=qs_kind%se_parameter%zeff, zeff_correction=zeff_correction)
2130 qs_kind%se_parameter%zeff = qs_kind%se_parameter%zeff - zeff_correction
2131
2132 check = ((potential_name /= '') .OR. explicit_potential) .AND. .NOT. silent
2133 IF (check) &
2134 CALL cp_warn(__location__, &
2135 "Information provided in the input file regarding POTENTIAL for KIND <"// &
2136 trim(qs_kind%name)//"> will be ignored!")
2137
2138 check = ((k_rep > 0) .OR. explicit_basis) .AND. .NOT. silent
2139 IF (check) &
2140 CALL cp_warn(__location__, &
2141 "Information provided in the input file regarding BASIS for KIND <"// &
2142 trim(qs_kind%name)//"> will be ignored!")
2143
2144 CASE (do_method_dftb)
2145 ! Allocate all_potential
2146 CALL allocate_potential(qs_kind%all_potential)
2147 CALL set_default_all_potential(qs_kind%all_potential, z, zeff_correction)
2148 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2149 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2150 CALL get_potential(potential=qs_kind%all_potential, elec_conf=elec_conf)
2151 CALL set_qs_kind(qs_kind, elec_conf=elec_conf)
2152 END IF
2153 cpassert(.NOT. qs_kind%floating)
2154 IF (qs_kind%ghost) THEN
2155 CALL get_qs_kind(qs_kind=qs_kind, elec_conf=elec_conf)
2156 elec_conf(:) = 0
2157 CALL get_potential(potential=qs_kind%all_potential, &
2158 elec_conf=elec_conf)
2159 elec_conf(:) = 0
2160 CALL set_potential(potential=qs_kind%all_potential, &
2161 zeff=0.0_dp, &
2162 zeff_correction=0.0_dp)
2163 END IF
2164
2165 check = ((potential_name /= '') .OR. explicit_potential) .AND. .NOT. silent
2166 IF (check) &
2167 CALL cp_warn(__location__, &
2168 "Information provided in the input file regarding POTENTIAL for KIND <"// &
2169 trim(qs_kind%name)//"> will be ignored!")
2170
2171 check = ((k_rep > 0) .OR. explicit_basis) .AND. .NOT. silent
2172 IF (check) &
2173 CALL cp_warn(__location__, &
2174 "Information provided in the input file regarding BASIS for KIND <"// &
2175 trim(qs_kind%name)//"> will be ignored!")
2176
2177 CASE (do_method_xtb)
2178 ! Allocate all_potential
2179 CALL allocate_potential(qs_kind%all_potential)
2180 CALL set_default_all_potential(qs_kind%all_potential, z, zeff_correction)
2181 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2182 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2183 CALL get_potential(potential=qs_kind%all_potential, elec_conf=elec_conf)
2184 CALL set_qs_kind(qs_kind, elec_conf=elec_conf)
2185 END IF
2186 cpassert(.NOT. qs_kind%floating)
2187 IF (qs_kind%ghost) THEN
2188 CALL get_qs_kind(qs_kind=qs_kind, elec_conf=elec_conf)
2189 elec_conf(:) = 0
2190 CALL get_potential(potential=qs_kind%all_potential, &
2191 elec_conf=elec_conf)
2192 elec_conf(:) = 0
2193 CALL set_potential(potential=qs_kind%all_potential, &
2194 zeff=0.0_dp, &
2195 zeff_correction=0.0_dp)
2196 END IF
2197
2198 check = ((potential_name /= '') .OR. explicit_potential) .AND. .NOT. silent
2199 IF (check) &
2200 CALL cp_warn(__location__, &
2201 "Information provided in the input file regarding POTENTIAL for KIND <"// &
2202 trim(qs_kind%name)//"> will be ignored!")
2203
2204 check = ((k_rep > 0) .OR. explicit_basis) .AND. .NOT. silent
2205 IF (check) &
2206 CALL cp_warn(__location__, &
2207 "Information provided in the input file regarding BASIS for KIND <"// &
2208 trim(qs_kind%name)//"> will be ignored!")
2209
2210 CASE (do_method_pw)
2211 ! PW DFT
2212 ! Allocate and initialise the potential data set structure
2213 IF (potential_name /= '') THEN
2214 SELECT CASE (trim(potential_type))
2215 CASE ("ALL", "ECP")
2216 CALL cp_abort(__location__, &
2217 "PW DFT calculations only with potential type UPF or GTH possible."// &
2218 " <"//trim(potential_type)//"> was specified "// &
2219 "for the atomic kind <"//trim(qs_kind%name))
2220 CASE ("GTH")
2221 IF (potential_fn_kind == "-") THEN
2222 CALL section_vals_val_get(dft_section, "POTENTIAL_FILE_NAME", c_val=potential_file_name)
2223 ELSE
2224 potential_file_name = potential_fn_kind
2225 END IF
2226 CALL allocate_potential(qs_kind%gth_potential)
2227 CALL read_potential(qs_kind%element_symbol, potential_name, &
2228 qs_kind%gth_potential, zeff_correction, para_env, &
2229 potential_file_name, potential_section, update_input)
2230 CALL set_potential(qs_kind%gth_potential, z=z)
2231 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2232 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2233 CALL get_potential(potential=qs_kind%gth_potential, elec_conf=elec_conf)
2234 CALL set_qs_kind(qs_kind, elec_conf=elec_conf)
2235 ELSE
2236 CALL set_potential(potential=qs_kind%gth_potential, elec_conf=elec_conf)
2237 END IF
2238 CASE ("UPF")
2239 ALLOCATE (qs_kind%upf_potential)
2240 qs_kind%upf_potential%zion = 0
2241 qs_kind%upf_potential%filename = adjustl(trim(potential_name))
2242 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2243 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2244 CALL set_qs_kind(qs_kind, elec_conf=qs_kind%upf_potential%econf)
2245 END IF
2246 CASE DEFAULT
2247 CALL cp_abort(__location__, &
2248 "An invalid potential type <"// &
2249 trim(potential_type)//"> was specified "// &
2250 "for the atomic kind <"// &
2251 trim(qs_kind%name))
2252 END SELECT
2253 ELSE
2254 CALL cp_abort(__location__, &
2255 "No potential type was defined for the "// &
2256 "atomic kind <"//trim(qs_kind%name)//">")
2257 END IF
2258
2259 CASE DEFAULT
2260
2261 ! set ngauss for STO expansion
2262 CALL section_vals_val_get(dft_section, "QS%STO_NG", i_val=ngauss)
2263 ! Allocate and initialise the basis set data set structure
2264 ! first external basis sets
2265 DO i = 1, nb_rep
2266 SELECT CASE (basis_set_form(i))
2267 CASE ("GTO")
2268 NULLIFY (tmp_basis_set)
2269 CALL allocate_gto_basis_set(tmp_basis_set)
2270 CALL read_gto_basis_set(qs_kind%element_symbol, basis_set_name(i), &
2271 tmp_basis_set, para_env, dft_section)
2272 CASE ("STO")
2273 NULLIFY (sto_basis_set)
2274 CALL allocate_sto_basis_set(sto_basis_set)
2275 CALL read_sto_basis_set(qs_kind%element_symbol, basis_set_name(i), &
2276 sto_basis_set, para_env, dft_section)
2277 NULLIFY (tmp_basis_set)
2278 CALL create_gto_from_sto_basis(sto_basis_set, tmp_basis_set, ngauss)
2279 CALL deallocate_sto_basis_set(sto_basis_set)
2280 CASE DEFAULT
2281 CALL cp_abort(__location__, &
2282 "Invalid basis set form "//trim(basis_set_form(i))// &
2283 "for atomic kind <"//trim(qs_kind%name)//">")
2284 END SELECT
2285 tmp = basis_set_type(i)
2286 CALL uppercase(tmp)
2287 CALL add_basis_set_to_container(qs_kind%basis_sets, tmp_basis_set, tmp)
2288 END DO
2289 ! now explicit basis sets
2290 IF (explicit_basis) THEN
2291 CALL section_vals_get(basis_section, n_repetition=nexp)
2292 DO i = 1, nexp
2293 NULLIFY (tmp_basis_set)
2294 CALL allocate_gto_basis_set(tmp_basis_set)
2295 CALL read_gto_basis_set(qs_kind%element_symbol, basis_type, &
2296 tmp_basis_set, basis_section, i, dft_section)
2297 tmp = basis_type
2298 CALL uppercase(tmp)
2299 CALL add_basis_set_to_container(qs_kind%basis_sets, tmp_basis_set, tmp)
2300 END DO
2301 END IF
2302 ! combine multiple basis sets
2303 DO i = 1, SIZE(qs_kind%basis_sets)
2304 NULLIFY (tmp_basis_set)
2305 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis_set, &
2306 inumbas=i, basis_type=basis_type)
2307 IF (basis_type == "") cycle
2308 jj = i
2309 DO j = i + 1, SIZE(qs_kind%basis_sets)
2310 jj = jj + 1
2311 NULLIFY (sup_basis_set)
2312 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=sup_basis_set, &
2313 inumbas=jj, basis_type=tmp)
2314 IF (basis_type == tmp) THEN
2315 ! we found a match, combine the basis sets and delete the second
2316 CALL combine_basis_sets(tmp_basis_set, sup_basis_set)
2317 CALL remove_basis_from_container(qs_kind%basis_sets, jj)
2318 jj = jj - 1
2319 END IF
2320 END DO
2321 NULLIFY (sup_basis_set)
2322 END DO
2323
2324 ! check that we have an orbital basis set
2325 nobasis = .true.
2326 DO i = 1, SIZE(qs_kind%basis_sets)
2327 NULLIFY (tmp_basis_set)
2328 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis_set, &
2329 inumbas=i, basis_type=basis_type)
2330 IF (basis_type == "ORB") nobasis = .false.
2331 END DO
2332 IF (nobasis) THEN
2333 CALL cp_abort(__location__, &
2334 "No basis set type was defined for the "// &
2335 "atomic kind <"//trim(qs_kind%name)//">")
2336 END IF
2337
2338 ! If Ghost atom we don't need to allocate/initialize anything connected to POTENTIAL
2339 IF (qs_kind%ghost .OR. qs_kind%floating) THEN
2340 IF (ASSOCIATED(qs_kind%elec_conf)) qs_kind%elec_conf = 0
2341 ELSE
2342 ! Allocate and initialise the potential data set structure
2343 IF ((potential_name /= '') .OR. explicit_potential) THEN
2344 ! determine the pseudopotential file to search
2345 IF (potential_fn_kind == "-") THEN
2346 CALL section_vals_val_get(dft_section, "POTENTIAL_FILE_NAME", c_val=potential_file_name)
2347 ELSE
2348 potential_file_name = potential_fn_kind
2349 END IF
2350 !
2351 SELECT CASE (trim(potential_type))
2352 CASE ("ALL")
2353 CALL allocate_potential(qs_kind%all_potential)
2354 CALL read_potential(qs_kind%element_symbol, potential_name, &
2355 qs_kind%all_potential, zeff_correction, para_env, &
2356 potential_file_name, potential_section, update_input)
2357 CALL set_potential(qs_kind%all_potential, z=z)
2358 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2359 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2360 CALL get_potential(potential=qs_kind%all_potential, elec_conf=elec_conf)
2361 CALL set_qs_kind(qs_kind, elec_conf=elec_conf)
2362 ELSE
2363 CALL set_potential(potential=qs_kind%all_potential, elec_conf=elec_conf)
2364 END IF
2365 CASE ("GTH")
2366 CALL allocate_potential(qs_kind%gth_potential)
2367 CALL read_potential(qs_kind%element_symbol, potential_name, &
2368 qs_kind%gth_potential, zeff_correction, para_env, &
2369 potential_file_name, potential_section, update_input)
2370 CALL set_potential(qs_kind%gth_potential, z=z)
2371 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2372 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2373 CALL get_potential(potential=qs_kind%gth_potential, elec_conf=elec_conf)
2374 CALL set_qs_kind(qs_kind, elec_conf=elec_conf)
2375 ELSE
2376 CALL set_potential(potential=qs_kind%gth_potential, elec_conf=elec_conf)
2377 END IF
2378 CASE ("ECP")
2379 CALL allocate_potential(qs_kind%sgp_potential)
2380 CALL get_potential(qs_kind%sgp_potential, description=description)
2381 CALL read_ecp_potential(ptable(z)%symbol, ecppot, &
2382 potential_name, potential_file_name, potential_section)
2383 IF (ecp_semi_local) THEN
2384 description(1) = "Semi-local Gaussian pseudopotential "
2385 description(2) = "ECP "//trim(potential_name)
2386 description(3) = "LIBGRPP: A. V. Oleynichenko et al., Symmetry 15 197 2023"
2387 description(4) = " "
2388 ELSE
2389 description(4) = "ECP "//trim(potential_name)
2390 END IF
2391 CALL set_potential(qs_kind%sgp_potential, name=ecppot%pname, description=description, &
2392 zeff=ecppot%zion, z=z, ecp_local=.true., ecp_semi_local=ecp_semi_local, &
2393 nloc=ecppot%nloc, nrloc=ecppot%nrloc, aloc=ecppot%aloc, bloc=ecppot%bloc, &
2394 has_nlcc=.false.)
2395 CALL set_potential(qs_kind%sgp_potential, sl_lmax=ecppot%lmax, &
2396 npot=ecppot%npot, nrpot=ecppot%nrpot, apot=ecppot%apot, bpot=ecppot%bpot)
2397 ! convert PP
2398 IF (.NOT. ecp_semi_local) THEN
2399 cpabort("ECPs are only well tested in their semi-local form")
2400 CALL get_qs_kind(qs_kind, basis_set=orb_basis_set)
2401 CALL sgp_construction(sgp_pot=sgppot, ecp_pot=ecppot, orb_basis=orb_basis_set, error=error)
2402 IF (iounit > 0 .AND. .NOT. silent) THEN
2403 WRITE (iounit, "(/,T2,'PP Transformation for ',A)") trim(ecppot%pname)
2404 IF (sgppot%has_local) THEN
2405 WRITE (iounit, "(T8,'Accuracy for local part:',T41,F10.3,'%',T61,F20.12)") error(4), error(1)
2406 END IF
2407 IF (sgppot%has_nonlocal) THEN
2408 WRITE (iounit, "(T8,'Accuracy for nonlocal part:',T41,F10.3,'%',T61,F20.12)") error(5), error(2)
2409 END IF
2410 IF (sgppot%has_nlcc) THEN
2411 WRITE (iounit, "(T8,'Accuracy for NLCC density:',T61,F20.12)") error(3)
2412 END IF
2413 END IF
2414 END IF
2415 IF (sgppot%has_nonlocal) THEN
2416 CALL set_potential(qs_kind%sgp_potential, n_nonlocal=sgppot%n_nonlocal, lmax=sgppot%lmax, &
2417 is_nonlocal=sgppot%is_nonlocal)
2418 nnl = sgppot%n_nonlocal
2419 nppnl = 0
2420 DO l = 0, sgppot%lmax
2421 nppnl = nppnl + nnl*nco(l)
2422 END DO
2423 l = sgppot%lmax
2424 ALLOCATE (a_nl(nnl), h_nl(nnl, 0:l), c_nl(nnl, nnl, 0:l))
2425 a_nl(:) = sgppot%a_nonlocal(:)
2426 h_nl(:, :) = sgppot%h_nonlocal(:, :)
2427 DO l = 0, sgppot%lmax
2428 c_nl(:, :, l) = sgppot%c_nonlocal(:, :, l)*sqrt(2._dp*l + 1.0_dp)
2429 END DO
2430 CALL set_potential(qs_kind%sgp_potential, nppnl=nppnl, a_nonlocal=a_nl, h_nonlocal=h_nl, c_nonlocal=c_nl)
2431 ELSE
2432 CALL set_potential(qs_kind%sgp_potential, n_nonlocal=0, lmax=-1, is_nonlocal=sgppot%is_nonlocal)
2433 CALL set_potential(qs_kind%sgp_potential, nppnl=0)
2434 END IF
2435 !
2436 cpassert(.NOT. sgppot%has_local)
2437 cpassert(.NOT. sgppot%has_nlcc)
2438 ! core
2439 rc = 0.5_dp*qs_kind%covalent_radius*angstrom
2440 rc = max(rc, 0.2_dp)
2441 rc = min(rc, 1.0_dp)
2442 alpha = 1.0_dp/(2.0_dp*rc**2)
2443 ccore = ecppot%zion*sqrt((alpha/pi)**3)
2444 CALL set_potential(qs_kind%sgp_potential, alpha_core_charge=alpha, ccore_charge=ccore, &
2445 core_charge_radius=rc)
2446 CALL atom_sgp_release(sgppot)
2447 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2448 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2449 CALL set_qs_kind(qs_kind, elec_conf=ecppot%econf)
2450 END IF
2451 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2452 CALL set_potential(qs_kind%sgp_potential, elec_conf=elec_conf)
2453 CASE ("UPF")
2454 CALL allocate_potential(qs_kind%sgp_potential)
2455 CALL get_potential(qs_kind%sgp_potential, description=description)
2456 description(4) = "UPF "//trim(potential_name)
2457 CALL atom_read_upf(upfpot, potential_name)
2458 CALL set_potential(qs_kind%sgp_potential, name=upfpot%pname, description=description, &
2459 zeff=upfpot%zion, z=z, has_nlcc=upfpot%core_correction)
2460 ! convert pp
2461 CALL sgp_construction(sgp_pot=sgppot, upf_pot=upfpot, error=error)
2462 IF (iounit > 0 .AND. .NOT. silent) THEN
2463 WRITE (iounit, "(/,T2,'PP Transformation for ',A)") trim(upfpot%pname)
2464 IF (sgppot%has_local) THEN
2465 WRITE (iounit, "(T8,'Accuracy for local part:',T61,F20.12)") error(1)
2466 END IF
2467 IF (sgppot%has_nonlocal) THEN
2468 WRITE (iounit, "(T8,'Accuracy for nonlocal part:',T61,F20.12)") error(2)
2469 END IF
2470 IF (sgppot%has_nlcc) THEN
2471 WRITE (iounit, "(T8,'Accuracy for NLCC density:',T61,F20.12)") error(3)
2472 END IF
2473 END IF
2474 IF (sgppot%has_nonlocal) THEN
2475 CALL set_potential(qs_kind%sgp_potential, n_nonlocal=sgppot%n_nonlocal, lmax=sgppot%lmax, &
2476 is_nonlocal=sgppot%is_nonlocal)
2477 nnl = sgppot%n_nonlocal
2478 nppnl = 0
2479 DO l = 0, sgppot%lmax
2480 nppnl = nppnl + nnl*nco(l)
2481 END DO
2482 l = sgppot%lmax
2483 ALLOCATE (a_nl(nnl), h_nl(nnl, 0:l), c_nl(nnl, nnl, 0:l))
2484 a_nl(:) = sgppot%a_nonlocal(:)
2485 h_nl(:, :) = sgppot%h_nonlocal(:, :)
2486 c_nl(:, :, :) = sgppot%c_nonlocal(:, :, :)
2487 CALL set_potential(qs_kind%sgp_potential, nppnl=nppnl, a_nonlocal=a_nl, h_nonlocal=h_nl, c_nonlocal=c_nl)
2488 ELSE
2489 CALL set_potential(qs_kind%sgp_potential, n_nonlocal=0, lmax=-1, is_nonlocal=sgppot%is_nonlocal)
2490 CALL set_potential(qs_kind%sgp_potential, nppnl=0)
2491 END IF
2492 cpassert(sgppot%has_local)
2493 ! core
2494 rc = sgppot%ac_local
2495 alpha = 1.0_dp/(2.0_dp*rc**2)
2496 ccore = upfpot%zion*sqrt((alpha/pi)**3)
2497 CALL set_potential(qs_kind%sgp_potential, alpha_core_charge=alpha, ccore_charge=ccore, &
2498 core_charge_radius=rc)
2499 ! local potential
2500 nloc = sgppot%n_local
2501 ALLOCATE (aloc(nloc), cloc(nloc))
2502 aloc(1:nloc) = sgppot%a_local(1:nloc)
2503 cloc(1:nloc) = sgppot%c_local(1:nloc)
2504 CALL set_potential(qs_kind%sgp_potential, n_local=nloc, a_local=aloc, c_local=cloc)
2505 IF (sgppot%has_nlcc) THEN
2506 nlcc = sgppot%n_nlcc
2507 ALLOCATE (anlcc(nlcc), cnlcc(nlcc))
2508 anlcc(1:nlcc) = sgppot%a_nlcc(1:nlcc)
2509 cnlcc(1:nlcc) = sgppot%c_nlcc(1:nlcc)
2510 CALL set_potential(qs_kind%sgp_potential, has_nlcc=.true., n_nlcc=nlcc, a_nlcc=anlcc, c_nlcc=cnlcc)
2511 END IF
2512 CALL set_potential(qs_kind%sgp_potential, z=z)
2513 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2514 IF (.NOT. ASSOCIATED(elec_conf)) THEN
2515 CALL set_qs_kind(qs_kind, elec_conf=upfpot%econf)
2516 END IF
2517 CALL get_qs_kind(qs_kind, elec_conf=elec_conf)
2518 CALL set_potential(qs_kind%sgp_potential, elec_conf=elec_conf)
2519 CALL atom_release_upf(upfpot)
2520 CALL atom_sgp_release(sgppot)
2521 CASE DEFAULT
2522 CALL cp_abort(__location__, &
2523 "An invalid potential type <"// &
2524 trim(potential_name)//"> was specified "// &
2525 "for the atomic kind <"// &
2526 trim(qs_kind%name))
2527 END SELECT
2528 ELSE
2529 CALL cp_abort(__location__, &
2530 "No potential type was defined for the "// &
2531 "atomic kind <"//trim(qs_kind%name)//">")
2532 END IF
2533
2534 CALL check_potential_basis_compatibility(qs_kind)
2535
2536 ! Allocate and initialise the potential data set structure
2537 IF ((kgpot_name /= '') .OR. explicit_kgpot) THEN
2538 ipos = index(kgpot_name, "-")
2539 IF (ipos > 1) THEN
2540 kgpot_type = kgpot_name(:ipos - 1)
2541 ELSE
2542 kgpot_type = kgpot_name
2543 END IF
2544 CALL uppercase(kgpot_type)
2545
2546 SELECT CASE (trim(kgpot_type))
2547 CASE ("TNADD")
2548 ! determine the pseudopotential file to search
2549 IF (kg_potential_fn_kind == "-") THEN
2550 CALL section_vals_val_get(dft_section, "POTENTIAL_FILE_NAME", c_val=potential_file_name)
2551 ELSE
2552 potential_file_name = kg_potential_fn_kind
2553 END IF
2554 CALL allocate_potential(qs_kind%tnadd_potential)
2555 CALL read_potential(qs_kind%element_symbol, kgpot_name, &
2556 qs_kind%tnadd_potential, para_env, &
2557 potential_file_name, kgpot_section, update_input)
2558 CASE ("NONE")
2559 NULLIFY (qs_kind%tnadd_potential)
2560 CASE DEFAULT
2561 CALL cp_abort(__location__, &
2562 "An invalid kg_potential type <"// &
2563 trim(potential_name)//"> was specified "// &
2564 "for the atomic kind <"// &
2565 trim(qs_kind%name))
2566 END SELECT
2567 END IF
2568 END IF
2569 END SELECT
2570
2571 CALL timestop(handle)
2572
2573 END SUBROUTINE read_qs_kind
2574
2575! **************************************************************************************************
2576!> \brief Ensure pseudo-potential and basis set were optimized for same number of valence electrons
2577!> \param qs_kind ...
2578!> \author Ole Schuett
2579! **************************************************************************************************
2580 SUBROUTINE check_potential_basis_compatibility(qs_kind)
2581 TYPE(qs_kind_type), INTENT(INOUT) :: qs_kind
2582
2583 CHARACTER(LEN=default_string_length) :: name
2584 INTEGER :: nbs, npp
2585 TYPE(gth_potential_type), POINTER :: gth_potential
2586 TYPE(gto_basis_set_type), POINTER :: basis_set
2587
2588 CALL get_qs_kind(qs_kind, name=name, gth_potential=gth_potential, basis_set=basis_set)
2589
2590 npp = -1; nbs = -1
2591 IF (ASSOCIATED(gth_potential)) &
2592 npp = parse_valence_electrons(gth_potential%aliases)
2593 IF (ASSOCIATED(basis_set)) &
2594 nbs = parse_valence_electrons(basis_set%aliases)
2595
2596 IF (npp >= 0 .AND. nbs >= 0 .AND. npp /= nbs) &
2597 CALL cp_abort(__location__, "Basis-set and pseudo-potential of atomic kind '"//trim(name)//"'"// &
2598 " were optimized for different valence electron numbers.")
2599
2600 END SUBROUTINE check_potential_basis_compatibility
2601
2602! **************************************************************************************************
2603!> \brief Tries to parse valence eletron number using "-QXXX" notation, returns -1 if not found.
2604!> \param string ...
2605!> \return ...
2606!> \author Ole Schuett
2607! **************************************************************************************************
2608 FUNCTION parse_valence_electrons(string) RESULT(n)
2609 CHARACTER(*) :: string
2610 INTEGER :: n
2611
2612 INTEGER :: i, istat, j
2613
2614 i = index(string, "-Q", .true.)
2615 IF (i == 0) THEN
2616 n = -1
2617 ELSE
2618 j = scan(string(i + 2:), "- ")
2619 READ (string(i + 2:i + j), '(I3)', iostat=istat) n
2620 IF (istat /= 0) n = -1
2621 END IF
2622
2623 END FUNCTION
2624
2625! **************************************************************************************************
2626!> \brief Read an atomic kind set data set from the input file.
2627!> \param qs_kind_set ...
2628!> \param atomic_kind_set ...
2629!> \param kind_section ...
2630!> \param para_env ...
2631!> \param force_env_section ...
2632!> \param silent ...
2633! **************************************************************************************************
2634 SUBROUTINE create_qs_kind_set(qs_kind_set, atomic_kind_set, kind_section, para_env, &
2635 force_env_section, silent)
2636
2637 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
2638 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
2639 TYPE(section_vals_type), POINTER :: kind_section
2640 TYPE(mp_para_env_type), POINTER :: para_env
2641 TYPE(section_vals_type), POINTER :: force_env_section
2642 LOGICAL, INTENT(IN) :: silent
2643
2644 CHARACTER(len=*), PARAMETER :: routinen = 'create_qs_kind_set'
2645
2646 INTEGER :: handle, ikind, method, nkind, qs_method
2647 LOGICAL :: no_fail
2648
2649 CALL timeset(routinen, handle)
2650
2651 IF (ASSOCIATED(qs_kind_set)) cpabort("create_qs_kind_set: qs_kind_set already associated")
2652 IF (.NOT. ASSOCIATED(atomic_kind_set)) cpabort("create_qs_kind_set: atomic_kind_set not associated")
2653
2654 no_fail = .false.
2655
2656 ! Between all methods only SE and DFTB/xTB may not need a KIND section.
2657 CALL section_vals_val_get(force_env_section, "METHOD", i_val=method)
2658 IF (method == do_qs) THEN
2659 CALL section_vals_val_get(force_env_section, "DFT%QS%METHOD", i_val=qs_method)
2660 SELECT CASE (qs_method)
2663 no_fail = .true.
2664 CASE (do_method_dftb)
2665 no_fail = .true.
2666 CASE (do_method_xtb)
2667 no_fail = .true.
2668 END SELECT
2669 ELSE IF (method == do_sirius) THEN
2670 qs_method = do_method_pw
2671 ELSE
2672 qs_method = method
2673 END IF
2674
2675 nkind = SIZE(atomic_kind_set)
2676 ALLOCATE (qs_kind_set(nkind))
2677
2678 DO ikind = 1, nkind
2679 qs_kind_set(ikind)%name = atomic_kind_set(ikind)%name
2680 qs_kind_set(ikind)%element_symbol = atomic_kind_set(ikind)%element_symbol
2681 qs_kind_set(ikind)%natom = atomic_kind_set(ikind)%natom
2682 CALL read_qs_kind(qs_kind_set(ikind), kind_section, para_env, force_env_section, &
2683 no_fail, qs_method, silent)
2684 END DO
2685
2686 CALL timestop(handle)
2687
2688 END SUBROUTINE create_qs_kind_set
2689
2690! **************************************************************************************************
2691!> \brief This routines should perform only checks. no settings are allowed at
2692!> this level anymore..
2693!> \param qs_kind ...
2694!> \param dft_control ...
2695!> \param subsys_section ...
2696! **************************************************************************************************
2697 SUBROUTINE check_qs_kind(qs_kind, dft_control, subsys_section)
2698
2699 TYPE(qs_kind_type), POINTER :: qs_kind
2700 TYPE(dft_control_type), INTENT(IN) :: dft_control
2701 TYPE(section_vals_type), POINTER :: subsys_section
2702
2703 INTEGER :: gfn_type
2704 LOGICAL :: defined
2705 TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter
2706 TYPE(semi_empirical_type), POINTER :: se_parameter
2707 TYPE(xtb_atom_type), POINTER :: xtb_parameter
2708
2709 IF (dft_control%qs_control%semi_empirical) THEN
2710 CALL get_qs_kind(qs_kind, se_parameter=se_parameter)
2711 cpassert(ASSOCIATED(se_parameter))
2712 CALL get_se_param(se_parameter, defined=defined)
2713 cpassert(defined)
2714 CALL write_se_param(se_parameter, subsys_section)
2715 ELSE IF (dft_control%qs_control%dftb) THEN
2716 CALL get_qs_kind(qs_kind, dftb_parameter=dftb_parameter)
2717 cpassert(ASSOCIATED(dftb_parameter))
2718 CALL get_dftb_atom_param(dftb_parameter, defined=defined)
2719 cpassert(defined)
2720 CALL write_dftb_atom_param(dftb_parameter, subsys_section)
2721 ELSE IF (dft_control%qs_control%xtb) THEN
2722 IF (.NOT. (dft_control%qs_control%xtb_control%do_tblite)) THEN
2723 CALL get_qs_kind(qs_kind, xtb_parameter=xtb_parameter)
2724 cpassert(ASSOCIATED(xtb_parameter))
2725 gfn_type = dft_control%qs_control%xtb_control%gfn_type
2726 CALL write_xtb_atom_param(xtb_parameter, gfn_type, subsys_section)
2727 END IF
2728 END IF
2729
2730 END SUBROUTINE check_qs_kind
2731
2732! **************************************************************************************************
2733!> \brief ...
2734!> \param qs_kind_set ...
2735!> \param dft_control ...
2736!> \param subsys_section ...
2737! **************************************************************************************************
2738 SUBROUTINE check_qs_kind_set(qs_kind_set, dft_control, subsys_section)
2739
2740 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
2741 TYPE(dft_control_type), INTENT(IN) :: dft_control
2742 TYPE(section_vals_type), POINTER :: subsys_section
2743
2744 CHARACTER(len=*), PARAMETER :: routinen = 'check_qs_kind_set'
2745
2746 INTEGER :: handle, ikind, nkind
2747 TYPE(qs_kind_type), POINTER :: qs_kind
2748
2749 CALL timeset(routinen, handle)
2750 IF (ASSOCIATED(qs_kind_set)) THEN
2751 nkind = SIZE(qs_kind_set)
2752 DO ikind = 1, nkind
2753 qs_kind => qs_kind_set(ikind)
2754 CALL check_qs_kind(qs_kind, dft_control, subsys_section)
2755 END DO
2756 IF (dft_control%qs_control%xtb) THEN
2757 CALL write_xtb_kab_param(qs_kind_set, subsys_section, &
2758 dft_control%qs_control%xtb_control)
2759 END IF
2760 ELSE
2761 cpabort("The pointer qs_kind_set is not associated")
2762 END IF
2763 CALL timestop(handle)
2764 END SUBROUTINE check_qs_kind_set
2765
2766! **************************************************************************************************
2767!> \brief ...
2768!> \param qs_kind_set ...
2769!> \param subsys_section ...
2770!> \param xtb_control ...
2771! **************************************************************************************************
2772 SUBROUTINE write_xtb_kab_param(qs_kind_set, subsys_section, xtb_control)
2773
2774 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
2775 TYPE(section_vals_type), POINTER :: subsys_section
2776 TYPE(xtb_control_type), POINTER :: xtb_control
2777
2778 CHARACTER(LEN=default_string_length) :: aname, bname
2779 INTEGER :: ikind, io_unit, jkind, nkind, za, zb
2780 TYPE(cp_logger_type), POINTER :: logger
2781 TYPE(qs_kind_type), POINTER :: qs_kinda, qs_kindb
2782 TYPE(xtb_atom_type), POINTER :: xtb_parameter_a, xtb_parameter_b
2783
2784 NULLIFY (logger)
2785 logger => cp_get_default_logger()
2786 IF (btest(cp_print_key_should_output(logger%iter_info, subsys_section, &
2787 "PRINT%KINDS/POTENTIAL"), cp_p_file)) THEN
2788
2789 io_unit = cp_print_key_unit_nr(logger, subsys_section, "PRINT%KINDS", extension=".Log")
2790 IF (io_unit > 0) THEN
2791
2792 WRITE (io_unit, "(/,T2,A)") "xTB| Kab parameters"
2793 nkind = SIZE(qs_kind_set)
2794 DO ikind = 1, nkind
2795 qs_kinda => qs_kind_set(ikind)
2796 CALL get_qs_kind(qs_kinda, xtb_parameter=xtb_parameter_a)
2797 CALL get_xtb_atom_param(xtb_parameter_a, aname=aname, z=za)
2798 DO jkind = ikind, nkind
2799 qs_kindb => qs_kind_set(jkind)
2800 CALL get_qs_kind(qs_kindb, xtb_parameter=xtb_parameter_b)
2801 CALL get_xtb_atom_param(xtb_parameter_b, aname=bname, z=zb)
2802 WRITE (io_unit, "(A,T10,A15,T25,A15,T71,F10.3)") &
2803 " Kab:", trim(aname), trim(bname), xtb_set_kab(za, zb, xtb_control)
2804 END DO
2805 END DO
2806 WRITE (io_unit, *)
2807
2808 END IF
2809
2810 CALL cp_print_key_finished_output(io_unit, logger, subsys_section, "PRINT%KINDS")
2811 END IF
2812
2813 END SUBROUTINE write_xtb_kab_param
2814
2815! **************************************************************************************************
2816!> \brief Set the components of an atomic kind data set.
2817!> \param qs_kind ...
2818!> \param paw_atom ...
2819!> \param ghost ...
2820!> \param floating ...
2821!> \param hard_radius ...
2822!> \param hard0_radius ...
2823!> \param covalent_radius ...
2824!> \param vdw_radius ...
2825!> \param lmax_rho0 ...
2826!> \param zeff ...
2827!> \param no_optimize ...
2828!> \param dispersion ...
2829!> \param u_minus_j ...
2830!> \param reltmat ...
2831!> \param dftb_parameter ...
2832!> \param xtb_parameter ...
2833!> \param elec_conf ...
2834!> \param pao_basis_size ...
2835! **************************************************************************************************
2836 SUBROUTINE set_qs_kind(qs_kind, paw_atom, ghost, floating, hard_radius, hard0_radius, &
2837 covalent_radius, vdw_radius, lmax_rho0, zeff, &
2838 no_optimize, dispersion, u_minus_j, reltmat, &
2839 dftb_parameter, xtb_parameter, &
2840 elec_conf, pao_basis_size)
2841
2842 TYPE(qs_kind_type), INTENT(INOUT) :: qs_kind
2843 LOGICAL, INTENT(IN), OPTIONAL :: paw_atom, ghost, floating
2844 REAL(kind=dp), INTENT(IN), OPTIONAL :: hard_radius, hard0_radius, &
2845 covalent_radius, vdw_radius
2846 INTEGER, INTENT(IN), OPTIONAL :: lmax_rho0
2847 REAL(kind=dp), INTENT(IN), OPTIONAL :: zeff
2848 LOGICAL, INTENT(IN), OPTIONAL :: no_optimize
2849 TYPE(qs_atom_dispersion_type), OPTIONAL, POINTER :: dispersion
2850 REAL(kind=dp), INTENT(IN), OPTIONAL :: u_minus_j
2851 REAL(kind=dp), DIMENSION(:, :), OPTIONAL, POINTER :: reltmat
2852 TYPE(qs_dftb_atom_type), OPTIONAL, POINTER :: dftb_parameter
2853 TYPE(xtb_atom_type), OPTIONAL, POINTER :: xtb_parameter
2854 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: elec_conf
2855 INTEGER, INTENT(IN), OPTIONAL :: pao_basis_size
2856
2857 IF (PRESENT(dftb_parameter)) qs_kind%dftb_parameter => dftb_parameter
2858 IF (PRESENT(xtb_parameter)) qs_kind%xtb_parameter => xtb_parameter
2859 IF (PRESENT(elec_conf)) THEN
2860 IF (ASSOCIATED(qs_kind%elec_conf)) THEN
2861 DEALLOCATE (qs_kind%elec_conf)
2862 END IF
2863 ALLOCATE (qs_kind%elec_conf(0:SIZE(elec_conf) - 1))
2864 qs_kind%elec_conf(:) = elec_conf(:)
2865 END IF
2866 IF (PRESENT(paw_atom)) qs_kind%paw_atom = paw_atom
2867 IF (PRESENT(hard_radius)) qs_kind%hard_radius = hard_radius
2868 IF (PRESENT(hard0_radius)) qs_kind%hard0_radius = hard0_radius
2869 IF (PRESENT(covalent_radius)) qs_kind%covalent_radius = covalent_radius
2870 IF (PRESENT(vdw_radius)) qs_kind%vdw_radius = vdw_radius
2871 IF (PRESENT(lmax_rho0)) qs_kind%lmax_rho0 = lmax_rho0
2872 IF (PRESENT(zeff)) THEN
2873 IF (ASSOCIATED(qs_kind%all_potential)) THEN
2874 CALL set_potential(potential=qs_kind%all_potential, zeff=zeff)
2875 ELSE IF (ASSOCIATED(qs_kind%gth_potential)) THEN
2876 CALL set_potential(potential=qs_kind%gth_potential, zeff=zeff)
2877 ELSE IF (ASSOCIATED(qs_kind%sgp_potential)) THEN
2878 CALL set_potential(potential=qs_kind%sgp_potential, zeff=zeff)
2879 END IF
2880 END IF
2881 IF (PRESENT(ghost)) qs_kind%ghost = ghost
2882
2883 IF (PRESENT(floating)) qs_kind%floating = floating
2884
2885 IF (PRESENT(no_optimize)) qs_kind%no_optimize = no_optimize
2886
2887 IF (PRESENT(dispersion)) qs_kind%dispersion => dispersion
2888
2889 IF (PRESENT(u_minus_j)) THEN
2890 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
2891 qs_kind%dft_plus_u%u_minus_j = u_minus_j
2892 END IF
2893 END IF
2894
2895 IF (PRESENT(reltmat)) qs_kind%reltmat => reltmat
2896
2897 IF (PRESENT(pao_basis_size)) qs_kind%pao_basis_size = pao_basis_size
2898
2899 END SUBROUTINE set_qs_kind
2900
2901! **************************************************************************************************
2902!> \brief Write an atomic kind data set to the output unit.
2903!> \param qs_kind ...
2904!> \param kind_number ...
2905!> \param output_unit ...
2906!> \par History
2907!> Creation (09.02.2002,MK)
2908! **************************************************************************************************
2909 SUBROUTINE write_qs_kind(qs_kind, kind_number, output_unit)
2910
2911 TYPE(qs_kind_type), POINTER :: qs_kind
2912 INTEGER, INTENT(in) :: kind_number, output_unit
2913
2914 CHARACTER(LEN=3) :: yon
2915 CHARACTER(LEN=default_string_length) :: basis_type, bstring
2916 INTEGER :: ibas
2917 LOGICAL :: do_print
2918 TYPE(gto_basis_set_type), POINTER :: tmp_basis
2919
2920 IF (output_unit > 0) THEN
2921
2922 IF (ASSOCIATED(qs_kind)) THEN
2923 WRITE (unit=output_unit, fmt="(/,T2,I2,A,T57,A,T75,I6)") &
2924 kind_number, ". Atomic kind: "//trim(qs_kind%name), &
2925 "Number of atoms: ", qs_kind%natom
2926
2927 DO ibas = 1, SIZE(qs_kind%basis_sets, 1)
2928 NULLIFY (tmp_basis)
2929 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis, &
2930 inumbas=ibas, basis_type=basis_type)
2931 do_print = .true.
2932 SELECT CASE (basis_type)
2933 CASE DEFAULT
2934 bstring = "Basis Set"
2935 do_print = .false.
2936 CASE ("ORB")
2937 bstring = "Orbital Basis Set"
2938 CASE ("ORB_SOFT")
2939 bstring = "GAPW Soft Basis Set"
2940 do_print = .false.
2941 CASE ("AUX")
2942 bstring = "Auxiliary Basis Set"
2943 CASE ("MIN")
2944 bstring = "Minimal Basis Set"
2945 CASE ("RI_AUX")
2946 bstring = "RI Auxiliary Basis Set"
2947 CASE ("AUX_FIT")
2948 bstring = "Auxiliary Fit Basis Set"
2949 CASE ("LRI_AUX")
2950 bstring = "LRI Basis Set"
2951 CASE ("P_LRI_AUX")
2952 bstring = "LRI Basis Set for TDDFPT"
2953 CASE ("RI_XAS")
2954 bstring = "RI XAS Basis Set"
2955 CASE ("RI_HFX")
2956 bstring = "RI HFX Basis Set"
2957 END SELECT
2958
2959 IF (do_print) THEN
2960 CALL write_orb_basis_set(tmp_basis, output_unit, bstring)
2961 END IF
2962
2963 END DO
2964
2965 IF (qs_kind%ghost) THEN
2966 WRITE (unit=output_unit, fmt="(/,T6,A)") &
2967 "The atoms of this atomic kind are GHOST atoms!"
2968 END IF
2969 IF (qs_kind%floating) THEN
2970 WRITE (unit=output_unit, fmt="(/,T6,A)") &
2971 "The atoms of this atomic kind are FLOATING BASIS FUNCTIONS."
2972 END IF
2973 IF (qs_kind%covalent_radius > 0.0_dp) THEN
2974 WRITE (unit=output_unit, fmt="(/,T8,A,T71,F10.3)") &
2975 "Atomic covalent radius [Angstrom]:", &
2976 qs_kind%covalent_radius*angstrom
2977 END IF
2978 IF (qs_kind%vdw_radius > 0.0_dp) THEN
2979 WRITE (unit=output_unit, fmt="(/,T8,A,T71,F10.3)") &
2980 "Atomic van der Waals radius [Angstrom]:", &
2981 qs_kind%vdw_radius*angstrom
2982 END IF
2983 IF (qs_kind%paw_atom) THEN
2984 WRITE (unit=output_unit, fmt="(/,T6,A)") &
2985 "The atoms of this atomic kind are PAW atoms (GAPW):"
2986 WRITE (unit=output_unit, fmt="(T8,A,T71,F10.3)") &
2987 "Hard Gaussian function radius:", qs_kind%hard_radius, &
2988 "Rho0 radius:", qs_kind%hard0_radius, &
2989 "Maximum GTO radius used for PAW projector construction:", &
2990 qs_kind%max_rad_local
2991 NULLIFY (tmp_basis)
2992 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis, &
2993 basis_type="ORB_SOFT")
2994 CALL write_orb_basis_set(tmp_basis, output_unit, "GAPW Soft Basis Set")
2995 END IF
2996 ! Potentials
2997 IF (ASSOCIATED(qs_kind%all_potential)) CALL write_potential(qs_kind%all_potential, output_unit)
2998 IF (ASSOCIATED(qs_kind%gth_potential)) CALL write_potential(qs_kind%gth_potential, output_unit)
2999 IF (ASSOCIATED(qs_kind%sgp_potential)) CALL write_potential(qs_kind%sgp_potential, output_unit)
3000 IF (ASSOCIATED(qs_kind%tnadd_potential)) CALL write_potential(qs_kind%tnadd_potential, output_unit)
3001 IF (ASSOCIATED(qs_kind%dft_plus_u)) THEN
3002 WRITE (unit=output_unit, fmt="(/,T6,A,/,T8,A,T76,I5,/,T8,A,T73,F8.3)") &
3003 "A DFT+U correction is applied to atoms of this atomic kind:", &
3004 "Angular quantum momentum number L:", qs_kind%dft_plus_u%l, &
3005 "U(eff) = (U - J) value in [eV]:", qs_kind%dft_plus_u%u_minus_j_target*evolt
3006 IF (qs_kind%dft_plus_u%u_ramping > 0.0_dp) THEN
3007 IF (qs_kind%dft_plus_u%init_u_ramping_each_scf) THEN
3008 yon = "YES"
3009 ELSE
3010 yon = " NO"
3011 END IF
3012 WRITE (unit=output_unit, fmt="(T8,A,T73,F8.3,/,T8,A,T73,ES8.1,/,T8,A,T78,A3)") &
3013 "Increment for U ramping in [eV]:", qs_kind%dft_plus_u%u_ramping*evolt, &
3014 "SCF threshold value for U ramping:", qs_kind%dft_plus_u%eps_u_ramping, &
3015 "Set U ramping value to zero before each wavefunction optimisation:", yon
3016 END IF
3017 IF (ASSOCIATED(qs_kind%dft_plus_u%orbitals)) THEN
3018 WRITE (unit=output_unit, fmt="(T8,A)") &
3019 "An initial orbital occupation is requested:"
3020 IF (ASSOCIATED(qs_kind%dft_plus_u%nelec)) THEN
3021 IF (any(qs_kind%dft_plus_u%nelec(:) >= 0.5_dp)) THEN
3022 IF (SIZE(qs_kind%dft_plus_u%nelec) > 1) THEN
3023 WRITE (unit=output_unit, fmt="(T9,A,T75,F6.2)") &
3024 "Number of alpha electrons:", &
3025 qs_kind%dft_plus_u%nelec(1), &
3026 "Number of beta electrons:", &
3027 qs_kind%dft_plus_u%nelec(2)
3028 ELSE
3029 WRITE (unit=output_unit, fmt="(T9,A,T75,F6.2)") &
3030 "Number of electrons:", &
3031 qs_kind%dft_plus_u%nelec(1)
3032 END IF
3033 END IF
3034 END IF
3035 WRITE (unit=output_unit, fmt="(T9,A,(T78,I3))") &
3036 "Preferred (initial) orbital occupation order (orbital M values):", &
3037 qs_kind%dft_plus_u%orbitals(:)
3038 WRITE (unit=output_unit, fmt="(T9,A,T71,ES10.3,/,T9,A,T76,I5)") &
3039 "Threshold value for the SCF convergence criterion:", &
3040 qs_kind%dft_plus_u%eps_scf, &
3041 "Number of initial SCF iterations:", &
3042 qs_kind%dft_plus_u%max_scf
3043 IF (qs_kind%dft_plus_u%smear) THEN
3044 WRITE (unit=output_unit, fmt="(T9,A)") &
3045 "A smearing of the orbital occupations will be performed"
3046 END IF
3047 END IF
3048 END IF
3049 ELSE
3050 cpabort("")
3051 END IF
3052
3053 END IF
3054
3055 END SUBROUTINE write_qs_kind
3056
3057! **************************************************************************************************
3058!> \brief Write an atomic kind set data set to the output unit.
3059!> \param qs_kind_set ...
3060!> \param subsys_section ...
3061!> \par History
3062!> Creation (09.02.2002,MK)
3063! **************************************************************************************************
3064 SUBROUTINE write_qs_kind_set(qs_kind_set, subsys_section)
3065 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
3066 TYPE(section_vals_type), POINTER :: subsys_section
3067
3068 CHARACTER(len=*), PARAMETER :: routinen = 'write_qs_kind_set'
3069
3070 INTEGER :: handle, ikind, nkind, output_unit
3071 TYPE(cp_logger_type), POINTER :: logger
3072 TYPE(qs_kind_type), POINTER :: qs_kind
3073
3074 CALL timeset(routinen, handle)
3075
3076 NULLIFY (logger)
3077 logger => cp_get_default_logger()
3078 output_unit = cp_print_key_unit_nr(logger, subsys_section, &
3079 "PRINT%KINDS", extension=".Log")
3080 IF (output_unit > 0) THEN
3081 IF (ASSOCIATED(qs_kind_set)) THEN
3082 WRITE (unit=output_unit, fmt="(/,/,T2,A)") "ATOMIC KIND INFORMATION"
3083 nkind = SIZE(qs_kind_set)
3084 DO ikind = 1, nkind
3085 qs_kind => qs_kind_set(ikind)
3086 CALL write_qs_kind(qs_kind, ikind, output_unit)
3087 END DO
3088 ELSE
3089 cpabort("")
3090 END IF
3091 END IF
3092
3093 CALL cp_print_key_finished_output(output_unit, logger, subsys_section, &
3094 "PRINT%KINDS")
3095
3096 CALL timestop(handle)
3097
3098 END SUBROUTINE write_qs_kind_set
3099
3100! **************************************************************************************************
3101!> \brief Write all the GTO basis sets of an atomic kind set to the output
3102!> unit (for the printing of the unnormalized basis sets as read from
3103!> database).
3104!> \param qs_kind_set ...
3105!> \param subsys_section ...
3106!> \par History
3107!> Creation (17.01.2002,MK)
3108! **************************************************************************************************
3109 SUBROUTINE write_gto_basis_sets(qs_kind_set, subsys_section)
3110
3111 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
3112 TYPE(section_vals_type), POINTER :: subsys_section
3113
3114 CHARACTER(LEN=*), PARAMETER :: routinen = 'write_gto_basis_sets'
3115
3116 CHARACTER(LEN=default_string_length) :: basis_type, bstring
3117 INTEGER :: handle, ibas, ikind, nkind, output_unit
3118 TYPE(cp_logger_type), POINTER :: logger
3119 TYPE(gto_basis_set_type), POINTER :: tmp_basis
3120 TYPE(qs_kind_type), POINTER :: qs_kind
3121
3122 CALL timeset(routinen, handle)
3123
3124 NULLIFY (logger)
3125 logger => cp_get_default_logger()
3126 output_unit = cp_print_key_unit_nr(logger, subsys_section, &
3127 "PRINT%KINDS/BASIS_SET", &
3128 extension=".Log")
3129 IF (output_unit > 0) THEN
3130 IF (ASSOCIATED(qs_kind_set)) THEN
3131 WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
3132 "BASIS SET INFORMATION (Unnormalised Gaussian-type functions)"
3133 nkind = SIZE(qs_kind_set)
3134 DO ikind = 1, nkind
3135 qs_kind => qs_kind_set(ikind)
3136 WRITE (unit=output_unit, fmt="(/,T2,I2,A)") &
3137 ikind, ". Atomic kind: "//trim(qs_kind%name)
3138
3139 DO ibas = 1, SIZE(qs_kind%basis_sets, 1)
3140 NULLIFY (tmp_basis)
3141 CALL get_basis_from_container(qs_kind%basis_sets, basis_set=tmp_basis, &
3142 inumbas=ibas, basis_type=basis_type)
3143 IF (basis_type == "") cycle
3144 SELECT CASE (basis_type)
3145 CASE DEFAULT
3146 bstring = "Basis Set"
3147 CASE ("ORB")
3148 bstring = "Orbital Basis Set"
3149 CASE ("ORB_SOFT")
3150 bstring = "GAPW Soft Basis Set"
3151 CASE ("AUX")
3152 bstring = "Auxiliary Basis Set"
3153 CASE ("MIN")
3154 bstring = "Minimal Basis Set"
3155 CASE ("RI_AUX")
3156 bstring = "RI Auxiliary Basis Set"
3157 CASE ("AUX_FIT")
3158 bstring = "Auxiliary Fit Basis Set"
3159 CASE ("LRI_AUX")
3160 bstring = "LRI Basis Set"
3161 CASE ("P_LRI_AUX")
3162 bstring = "LRI Basis Set for TDDFPT"
3163 CASE ("RI_HFX")
3164 bstring = "RI HFX Basis Set"
3165 END SELECT
3166
3167 IF (ASSOCIATED(tmp_basis)) CALL write_gto_basis_set(tmp_basis, output_unit, bstring)
3168
3169 END DO
3170
3171 END DO
3172 ELSE
3173 cpabort("")
3174 END IF
3175 END IF
3176
3177 CALL cp_print_key_finished_output(output_unit, logger, subsys_section, &
3178 "PRINT%KINDS/BASIS_SET")
3179
3180 CALL timestop(handle)
3181
3182 END SUBROUTINE write_gto_basis_sets
3183
3184! **************************************************************************************************
3185!> \brief ...
3186!> \param atomic_kind ...
3187!> \param qs_kind ...
3188!> \param ncalc ...
3189!> \param ncore ...
3190!> \param nelem ...
3191!> \param edelta ...
3192! **************************************************************************************************
3193 SUBROUTINE init_atom_electronic_state(atomic_kind, qs_kind, ncalc, ncore, nelem, edelta)
3194
3195 TYPE(atomic_kind_type), INTENT(IN) :: atomic_kind
3196 TYPE(qs_kind_type), INTENT(IN) :: qs_kind
3197 INTEGER, DIMENSION(0:lmat, 10), INTENT(OUT) :: ncalc, ncore, nelem
3198 REAL(kind=dp), DIMENSION(0:lmat, 10, 2), &
3199 INTENT(OUT) :: edelta
3200
3201 INTEGER :: i, ii, is, l, ll, ne, nn, z
3202 INTEGER, DIMENSION(:), POINTER :: econf
3203 INTEGER, DIMENSION(:, :), POINTER :: addel, laddel, naddel
3204 LOGICAL :: bs_occupation
3205 REAL(kind=dp) :: dmag, magnetization
3206 TYPE(gth_potential_type), POINTER :: gth_potential
3207 TYPE(sgp_potential_type), POINTER :: sgp_potential
3208
3209 CALL get_atomic_kind(atomic_kind, z=z)
3210 NULLIFY (gth_potential)
3211 CALL get_qs_kind(qs_kind, &
3212 gth_potential=gth_potential, &
3213 sgp_potential=sgp_potential, &
3214 magnetization=magnetization, &
3215 bs_occupation=bs_occupation, &
3216 addel=addel, laddel=laddel, naddel=naddel)
3217
3218 ! electronic state
3219 nelem = 0
3220 ncore = 0
3221 ncalc = 0
3222 edelta = 0.0_dp
3223 IF (ASSOCIATED(gth_potential)) THEN
3224 CALL get_potential(gth_potential, elec_conf=econf)
3225 CALL set_pseudo_state(econf, z, ncalc, ncore, nelem)
3226 ELSE IF (ASSOCIATED(sgp_potential)) THEN
3227 CALL get_potential(sgp_potential, elec_conf=econf)
3228 CALL set_pseudo_state(econf, z, ncalc, ncore, nelem)
3229 ELSE
3230 DO l = 0, min(lmat, ubound(ptable(z)%e_conv, 1))
3231 ll = 2*(2*l + 1)
3232 nn = ptable(z)%e_conv(l)
3233 ii = 0
3234 DO
3235 ii = ii + 1
3236 IF (nn <= ll) THEN
3237 nelem(l, ii) = nn
3238 EXIT
3239 ELSE
3240 nelem(l, ii) = ll
3241 nn = nn - ll
3242 END IF
3243 END DO
3244 END DO
3245 ncalc = nelem - ncore
3246 END IF
3247
3248 ! readjust the occupation number of the orbitals as requested by user
3249 ! this is done to break symmetry (bs) and bias the initial guess
3250 ! to the pre-defined multiplicity/charge state of the atom
3251 IF (bs_occupation) THEN
3252 DO is = 1, 2
3253 DO i = 1, SIZE(addel, 1)
3254 ne = addel(i, is)
3255 l = laddel(i, is)
3256 nn = naddel(i, is) - l
3257 IF (ne /= 0) THEN
3258 IF (nn == 0) THEN
3259 DO ii = SIZE(nelem, 2), 1, -1
3260 IF (ncalc(l, ii) > 0) THEN
3261 IF ((ncalc(l, ii) + ne) < 2*(2*l + 1) + 1) THEN
3262 edelta(l, ii, is) = edelta(l, ii, is) + ne
3263 nn = ii
3264 ELSE
3265 edelta(l, ii + 1, is) = edelta(l, ii + 1, is) + ne
3266 nn = ii + 1
3267 END IF
3268 EXIT
3269 ELSE IF (ii == 1) THEN
3270 edelta(l, ii, is) = edelta(l, ii, is) + ne
3271 nn = ii
3272 END IF
3273 END DO
3274 ELSE
3275 edelta(l, nn, is) = edelta(l, nn, is) + ne
3276 END IF
3277 IF (ncalc(l, nn) + edelta(l, nn, is) < 0) THEN
3278 edelta(l, nn, is) = -ncalc(l, nn)
3279 END IF
3280 END IF
3281 END DO
3282 END DO
3283 edelta = 0.5_dp*edelta
3284 ELSE IF (magnetization /= 0.0_dp) THEN
3285 dmag = 0.5_dp*abs(magnetization)
3286 DO l = 0, min(lmat, ubound(ptable(z)%e_conv, 1))
3287 ll = 2*(2*l + 1)
3288 ii = 0
3289 DO i = 1, SIZE(ncalc, 2)
3290 IF (ncalc(l, i) == 0) cycle
3291 IF (ncalc(l, i) == ll) cycle
3292 IF (ncalc(l, i) > dmag .AND. (ll - ncalc(l, i)) > dmag) THEN
3293 ii = i
3294 EXIT
3295 END IF
3296 END DO
3297 IF (ii /= 0) THEN
3298 edelta(l, ii, 1) = magnetization*0.5_dp
3299 edelta(l, ii, 2) = -magnetization*0.5_dp
3300 EXIT
3301 END IF
3302 END DO
3303 IF (ii == 0) THEN
3304 CALL cp_abort(__location__, &
3305 "Magnetization value cannot be imposed for this atom type")
3306 END IF
3307 END IF
3308
3309 IF (qs_kind%ghost .OR. qs_kind%floating) THEN
3310 nelem = 0
3311 ncore = 0
3312 ncalc = 0
3313 edelta = 0.0_dp
3314 END IF
3315
3316 END SUBROUTINE init_atom_electronic_state
3317
3318! **************************************************************************************************
3319!> \brief ...
3320!> \param econf ...
3321!> \param z ...
3322!> \param ncalc ...
3323!> \param ncore ...
3324!> \param nelem ...
3325! **************************************************************************************************
3326 SUBROUTINE set_pseudo_state(econf, z, ncalc, ncore, nelem)
3327 INTEGER, DIMENSION(:), POINTER :: econf
3328 INTEGER, INTENT(IN) :: z
3329 INTEGER, DIMENSION(0:lmat, 10), INTENT(OUT) :: ncalc, ncore, nelem
3330
3331 CHARACTER(LEN=default_string_length) :: message
3332 INTEGER :: ii, iounit, l, ll, lmin, nc, nn
3333 INTEGER, DIMENSION(0:lmat) :: econfx
3334 TYPE(cp_logger_type), POINTER :: logger
3335
3336 NULLIFY (logger)
3337 logger => cp_get_default_logger()
3338 iounit = cp_logger_get_default_io_unit(logger)
3339
3340 econfx = 0
3341 econfx(0:SIZE(econf) - 1) = econf
3342 IF (sum(econf) >= 0) THEN
3343 lmin = min(lmat, ubound(ptable(z)%e_conv, 1))
3344 ! number of core electrons
3345 nc = z - sum(econf)
3346 ! setup ncore
3347 ncore = 0
3348 SELECT CASE (nc)
3349 CASE (0)
3350 CASE (2)
3351 ncore(0, 1) = 2
3352 CASE (10)
3353 ncore(0, 1) = 2
3354 ncore(0, 2) = 2
3355 ncore(1, 1) = 6
3356 CASE (18)
3357 ncore(0, 1) = 2
3358 ncore(0, 2) = 2
3359 ncore(0, 3) = 2
3360 ncore(1, 1) = 6
3361 ncore(1, 2) = 6
3362 CASE (28)
3363 ncore(0, 1) = 2
3364 ncore(0, 2) = 2
3365 ncore(0, 3) = 2
3366 ncore(1, 1) = 6
3367 ncore(1, 2) = 6
3368 ncore(2, 1) = 10
3369 CASE (36)
3370 ncore(0, 1) = 2
3371 ncore(0, 2) = 2
3372 ncore(0, 3) = 2
3373 ncore(0, 4) = 2
3374 ncore(1, 1) = 6
3375 ncore(1, 2) = 6
3376 ncore(1, 3) = 6
3377 ncore(2, 1) = 10
3378 CASE (46)
3379 ncore(0, 1) = 2
3380 ncore(0, 2) = 2
3381 ncore(0, 3) = 2
3382 ncore(0, 4) = 2
3383 ncore(1, 1) = 6
3384 ncore(1, 2) = 6
3385 ncore(1, 3) = 6
3386 ncore(2, 1) = 10
3387 ncore(2, 2) = 10
3388 CASE (54)
3389 ncore(0, 1) = 2
3390 ncore(0, 2) = 2
3391 ncore(0, 3) = 2
3392 ncore(0, 4) = 2
3393 ncore(0, 5) = 2
3394 ncore(1, 1) = 6
3395 ncore(1, 2) = 6
3396 ncore(1, 3) = 6
3397 ncore(1, 4) = 6
3398 ncore(2, 1) = 10
3399 ncore(2, 2) = 10
3400 CASE (60)
3401 ncore(0, 1) = 2
3402 ncore(0, 2) = 2
3403 ncore(0, 3) = 2
3404 ncore(0, 4) = 2
3405 ncore(1, 1) = 6
3406 ncore(1, 2) = 6
3407 ncore(1, 3) = 6
3408 ncore(2, 1) = 10
3409 ncore(2, 2) = 10
3410 ncore(3, 1) = 14
3411 CASE (68)
3412 ncore(0, 1) = 2
3413 ncore(0, 2) = 2
3414 ncore(0, 3) = 2
3415 ncore(0, 4) = 2
3416 ncore(0, 5) = 2
3417 ncore(1, 1) = 6
3418 ncore(1, 2) = 6
3419 ncore(1, 3) = 6
3420 ncore(1, 4) = 6
3421 ncore(2, 1) = 10
3422 ncore(2, 2) = 10
3423 ncore(3, 1) = 14
3424 CASE (78)
3425 ncore(0, 1) = 2
3426 ncore(0, 2) = 2
3427 ncore(0, 3) = 2
3428 ncore(0, 4) = 2
3429 ncore(0, 5) = 2
3430 ncore(1, 1) = 6
3431 ncore(1, 2) = 6
3432 ncore(1, 3) = 6
3433 ncore(1, 4) = 6
3434 ncore(2, 1) = 10
3435 ncore(2, 2) = 10
3436 ncore(2, 3) = 10
3437 ncore(3, 1) = 14
3438 ! 79 - 92 5f incore PP
3439 CASE (79)
3440 ncore(0, 1) = 2
3441 ncore(0, 2) = 2
3442 ncore(0, 3) = 2
3443 ncore(0, 4) = 2
3444 ncore(0, 5) = 2
3445 ncore(1, 1) = 6
3446 ncore(1, 2) = 6
3447 ncore(1, 3) = 6
3448 ncore(1, 4) = 6
3449 ncore(2, 1) = 10
3450 ncore(2, 2) = 10
3451 ncore(2, 3) = 10
3452 ncore(3, 1) = 14
3453 ncore(3, 2) = 1
3454 CASE (80)
3455 ncore(0, 1) = 2
3456 ncore(0, 2) = 2
3457 ncore(0, 3) = 2
3458 ncore(0, 4) = 2
3459 ncore(0, 5) = 2
3460 ncore(1, 1) = 6
3461 ncore(1, 2) = 6
3462 ncore(1, 3) = 6
3463 ncore(1, 4) = 6
3464 ncore(2, 1) = 10
3465 ncore(2, 2) = 10
3466 ncore(2, 3) = 10
3467 ncore(3, 1) = 14
3468 ncore(3, 2) = 2
3469 CASE (81)
3470 ncore(0, 1) = 2
3471 ncore(0, 2) = 2
3472 ncore(0, 3) = 2
3473 ncore(0, 4) = 2
3474 ncore(0, 5) = 2
3475 ncore(1, 1) = 6
3476 ncore(1, 2) = 6
3477 ncore(1, 3) = 6
3478 ncore(1, 4) = 6
3479 ncore(2, 1) = 10
3480 ncore(2, 2) = 10
3481 ncore(2, 3) = 10
3482 ncore(3, 1) = 14
3483 ncore(3, 2) = 3
3484 CASE (82)
3485 ncore(0, 1) = 2
3486 ncore(0, 2) = 2
3487 ncore(0, 3) = 2
3488 ncore(0, 4) = 2
3489 ncore(0, 5) = 2
3490 ncore(1, 1) = 6
3491 ncore(1, 2) = 6
3492 ncore(1, 3) = 6
3493 ncore(1, 4) = 6
3494 ncore(2, 1) = 10
3495 ncore(2, 2) = 10
3496 ncore(2, 3) = 10
3497 ncore(3, 1) = 14
3498 ncore(3, 2) = 4
3499 CASE (83)
3500 ncore(0, 1) = 2
3501 ncore(0, 2) = 2
3502 ncore(0, 3) = 2
3503 ncore(0, 4) = 2
3504 ncore(0, 5) = 2
3505 ncore(1, 1) = 6
3506 ncore(1, 2) = 6
3507 ncore(1, 3) = 6
3508 ncore(1, 4) = 6
3509 ncore(2, 1) = 10
3510 ncore(2, 2) = 10
3511 ncore(2, 3) = 10
3512 ncore(3, 1) = 14
3513 ncore(3, 2) = 5
3514 CASE (84)
3515 ncore(0, 1) = 2
3516 ncore(0, 2) = 2
3517 ncore(0, 3) = 2
3518 ncore(0, 4) = 2
3519 ncore(0, 5) = 2
3520 ncore(1, 1) = 6
3521 ncore(1, 2) = 6
3522 ncore(1, 3) = 6
3523 ncore(1, 4) = 6
3524 ncore(2, 1) = 10
3525 ncore(2, 2) = 10
3526 ncore(2, 3) = 10
3527 ncore(3, 1) = 14
3528 ncore(3, 2) = 6
3529 CASE (85)
3530 ncore(0, 1) = 2
3531 ncore(0, 2) = 2
3532 ncore(0, 3) = 2
3533 ncore(0, 4) = 2
3534 ncore(0, 5) = 2
3535 ncore(1, 1) = 6
3536 ncore(1, 2) = 6
3537 ncore(1, 3) = 6
3538 ncore(1, 4) = 6
3539 ncore(2, 1) = 10
3540 ncore(2, 2) = 10
3541 ncore(2, 3) = 10
3542 ncore(3, 1) = 14
3543 ncore(3, 2) = 7
3544 CASE (86)
3545 ! this is not Rn core, add double assignment below
3546 ncore(0, 1) = 2
3547 ncore(0, 2) = 2
3548 ncore(0, 3) = 2
3549 ncore(0, 4) = 2
3550 ncore(0, 5) = 2
3551 ncore(1, 1) = 6
3552 ncore(1, 2) = 6
3553 ncore(1, 3) = 6
3554 ncore(1, 4) = 6
3555 ncore(2, 1) = 10
3556 ncore(2, 2) = 10
3557 ncore(2, 3) = 10
3558 ncore(3, 1) = 14
3559 ncore(3, 2) = 8
3560 CASE (87)
3561 ncore(0, 1) = 2
3562 ncore(0, 2) = 2
3563 ncore(0, 3) = 2
3564 ncore(0, 4) = 2
3565 ncore(0, 5) = 2
3566 ncore(1, 1) = 6
3567 ncore(1, 2) = 6
3568 ncore(1, 3) = 6
3569 ncore(1, 4) = 6
3570 ncore(2, 1) = 10
3571 ncore(2, 2) = 10
3572 ncore(2, 3) = 10
3573 ncore(3, 1) = 14
3574 ncore(3, 2) = 9
3575 CASE (88)
3576 ncore(0, 1) = 2
3577 ncore(0, 2) = 2
3578 ncore(0, 3) = 2
3579 ncore(0, 4) = 2
3580 ncore(0, 5) = 2
3581 ncore(1, 1) = 6
3582 ncore(1, 2) = 6
3583 ncore(1, 3) = 6
3584 ncore(1, 4) = 6
3585 ncore(2, 1) = 10
3586 ncore(2, 2) = 10
3587 ncore(2, 3) = 10
3588 ncore(3, 1) = 14
3589 ncore(3, 2) = 10
3590 CASE (89)
3591 ncore(0, 1) = 2
3592 ncore(0, 2) = 2
3593 ncore(0, 3) = 2
3594 ncore(0, 4) = 2
3595 ncore(0, 5) = 2
3596 ncore(1, 1) = 6
3597 ncore(1, 2) = 6
3598 ncore(1, 3) = 6
3599 ncore(1, 4) = 6
3600 ncore(2, 1) = 10
3601 ncore(2, 2) = 10
3602 ncore(2, 3) = 10
3603 ncore(3, 1) = 14
3604 ncore(3, 2) = 11
3605 CASE (90)
3606 ncore(0, 1) = 2
3607 ncore(0, 2) = 2
3608 ncore(0, 3) = 2
3609 ncore(0, 4) = 2
3610 ncore(0, 5) = 2
3611 ncore(1, 1) = 6
3612 ncore(1, 2) = 6
3613 ncore(1, 3) = 6
3614 ncore(1, 4) = 6
3615 ncore(2, 1) = 10
3616 ncore(2, 2) = 10
3617 ncore(2, 3) = 10
3618 ncore(3, 1) = 14
3619 ncore(3, 2) = 12
3620 CASE (91)
3621 ncore(0, 1) = 2
3622 ncore(0, 2) = 2
3623 ncore(0, 3) = 2
3624 ncore(0, 4) = 2
3625 ncore(0, 5) = 2
3626 ncore(1, 1) = 6
3627 ncore(1, 2) = 6
3628 ncore(1, 3) = 6
3629 ncore(1, 4) = 6
3630 ncore(2, 1) = 10
3631 ncore(2, 2) = 10
3632 ncore(2, 3) = 10
3633 ncore(3, 1) = 14
3634 ncore(3, 2) = 13
3635 CASE (92)
3636 ncore(0, 1) = 2
3637 ncore(0, 2) = 2
3638 ncore(0, 3) = 2
3639 ncore(0, 4) = 2
3640 ncore(0, 5) = 2
3641 ncore(1, 1) = 6
3642 ncore(1, 2) = 6
3643 ncore(1, 3) = 6
3644 ncore(1, 4) = 6
3645 ncore(2, 1) = 10
3646 ncore(2, 2) = 10
3647 ncore(2, 3) = 10
3648 ncore(3, 1) = 14
3649 ncore(3, 2) = 14
3650 CASE DEFAULT
3651 ncore(0, 1) = -1
3652 END SELECT
3653 ! special cases of double assignments
3654 IF (z == 65 .AND. econfx(3) == 0) THEN
3655 ! 4f in core for Tb
3656 ncore = 0
3657 ncore(0, 1) = -1
3658 END IF
3659 ! if there is still no core, check for special cases
3660 IF (ncore(0, 1) <= 0) THEN
3661 IF (z >= 58 .AND. z <= 71) THEN
3662 ! 4f-in-core PPs for lanthanides
3663 nc = z - sum(econf)
3664 ! setup ncore
3665 ncore = 0
3666 SELECT CASE (nc)
3667 CASE (29:42)
3668 ncore(0, 1) = 2
3669 ncore(0, 2) = 2
3670 ncore(0, 3) = 2
3671 ncore(1, 1) = 6
3672 ncore(1, 2) = 6
3673 ncore(2, 1) = 10
3674 ncore(3, 1) = nc - 28
3675 message = "A small-core pseudopotential with 4f-in-core is used for the lanthanide "// &
3676 trim(ptable(z)%symbol)
3677 cphint(trim(message))
3678 CASE (47:60)
3679 ncore(0, 1) = 2
3680 ncore(0, 2) = 2
3681 ncore(0, 3) = 2
3682 ncore(0, 4) = 2
3683 ncore(1, 1) = 6
3684 ncore(1, 2) = 6
3685 ncore(1, 3) = 6
3686 ncore(2, 1) = 10
3687 ncore(2, 2) = 10
3688 ncore(3, 1) = nc - 46
3689 message = "A medium-core pseudopotential with 4f-in-core is used for the lanthanide "// &
3690 trim(ptable(z)%symbol)
3691 cphint(trim(message))
3692 CASE DEFAULT
3693 ncore(0, 1) = -1
3694 END SELECT
3695 END IF
3696 END IF
3697 ! if the core is established, finish the setup
3698 IF (ncore(0, 1) >= 0) THEN
3699 DO l = 0, lmin
3700 ll = 2*(2*l + 1)
3701 nn = sum(ncore(l, :)) + econfx(l)
3702 ii = 0
3703 DO
3704 ii = ii + 1
3705 IF (nn <= ll) THEN
3706 nelem(l, ii) = nn
3707 EXIT
3708 ELSE
3709 nelem(l, ii) = ll
3710 nn = nn - ll
3711 END IF
3712 END DO
3713 END DO
3714 ncalc = nelem - ncore
3715 ELSE
3716 ! test for compatibility of valence occupation and full atomic occupation
3717 IF (iounit > 0) THEN
3718 WRITE (iounit, "(/,A,A2)") "WARNING: Core states irregular for atom type ", ptable(z)%symbol
3719 WRITE (iounit, "(A,10I3)") "WARNING: Redefine ELEC_CONF in the KIND section"
3720 cpabort("Incompatible Atomic Occupations Detected")
3721 END IF
3722 END IF
3723 ELSE
3724 lmin = min(lmat, ubound(ptable(z)%e_conv, 1))
3725 ncore = 0
3726 ncalc = 0
3727 DO l = 0, lmin
3728 ll = 2*(2*l + 1)
3729 nn = abs(econfx(l))
3730 ii = 0
3731 DO
3732 ii = ii + 1
3733 IF (nn <= ll) THEN
3734 ncalc(l, ii) = -nn
3735 EXIT
3736 ELSE
3737 ncalc(l, ii) = -ll
3738 nn = nn - ll
3739 END IF
3740 END DO
3741 END DO
3742 nelem = ncalc
3743 END IF
3744
3745 END SUBROUTINE set_pseudo_state
3746
3747! **************************************************************************************************
3748!> \brief finds if a given qs run needs to use nlcc
3749!> \param qs_kind_set ...
3750!> \return ...
3751! **************************************************************************************************
3752 FUNCTION has_nlcc(qs_kind_set) RESULT(nlcc)
3753
3754 TYPE(qs_kind_type), DIMENSION(:) :: qs_kind_set
3755 LOGICAL :: nlcc
3756
3757 INTEGER :: ikind
3758 LOGICAL :: nlcc_present
3759 TYPE(gth_potential_type), POINTER :: gth_potential
3760 TYPE(sgp_potential_type), POINTER :: sgp_potential
3761
3762 nlcc = .false.
3763
3764 DO ikind = 1, SIZE(qs_kind_set)
3765 CALL get_qs_kind(qs_kind_set(ikind), gth_potential=gth_potential, sgp_potential=sgp_potential)
3766 IF (ASSOCIATED(gth_potential)) THEN
3767 CALL get_potential(potential=gth_potential, nlcc_present=nlcc_present)
3768 nlcc = nlcc .OR. nlcc_present
3769 ELSEIF (ASSOCIATED(sgp_potential)) THEN
3770 CALL get_potential(potential=sgp_potential, has_nlcc=nlcc_present)
3771 nlcc = nlcc .OR. nlcc_present
3772 END IF
3773 END DO
3774
3775 END FUNCTION has_nlcc
3776
3777! **************************************************************************************************
3778
3779END MODULE qs_kind_types
static int imax(int x, int y)
Returns the larger of two given integers (missing from the C standard)
subroutine, public atom_sgp_release(sgp_pot)
...
Definition atom_sgp.F:767
subroutine, public sgp_construction(sgp_pot, ecp_pot, upf_pot, orb_basis, error)
...
Definition atom_sgp.F:79
Define the atom type and its sub types.
Definition atom_types.F:15
integer, parameter, public lmat
Definition atom_types.F:67
subroutine, public read_ecp_potential(element_symbol, potential, pseudo_name, pseudo_file, potential_section)
...
Routines that process Quantum Espresso UPF files.
Definition atom_upf.F:14
subroutine, public atom_read_upf(pot, upf_filename, read_header)
...
Definition atom_upf.F:102
pure subroutine, public atom_release_upf(upfpot)
...
Definition atom_upf.F:875
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
subroutine, public remove_basis_set_container(basis)
...
subroutine, public remove_basis_from_container(container, inum, basis_type)
...
subroutine, public get_basis_from_container(container, basis_set, inumbas, basis_type)
Retrieve a basis set from the container.
subroutine, public add_basis_set_to_container(container, basis_set, basis_set_type)
...
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
subroutine, public write_orb_basis_set(orb_basis_set, output_unit, header)
Write a Gaussian-type orbital (GTO) basis set data set to the output unit.
subroutine, public deallocate_sto_basis_set(sto_basis_set)
...
subroutine, public init_aux_basis_set(gto_basis_set)
...
subroutine, public allocate_gto_basis_set(gto_basis_set)
...
subroutine, public combine_basis_sets(basis_set, basis_set_add)
...
subroutine, public write_gto_basis_set(gto_basis_set, output_unit, header)
Write a Gaussian-type orbital (GTO) basis set data set to the output unit.
subroutine, public allocate_sto_basis_set(sto_basis_set)
...
subroutine, public create_gto_from_sto_basis(sto_basis_set, gto_basis_set, ngauss, ortho)
...
subroutine, public read_sto_basis_set(element_symbol, basis_set_name, sto_basis_set, para_env, dft_section)
...
subroutine, public init_orb_basis_set(gto_basis_set)
Initialise a Gaussian-type orbital (GTO) basis set data set.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
Add the DFT+U contribution to the Hamiltonian matrix.
Definition dft_plus_u.F:18
Definition of the atomic potential types.
subroutine, public set_default_all_potential(potential, z, zeff_correction)
...
subroutine, public create_1c_basis(orb_basis, soft_basis, gapw_1c_basis, basis_1c_level)
create the one center basis from the orbital basis
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public gapw_1c_large
integer, parameter, public do_method_pdg
integer, parameter, public do_method_pnnl
integer, parameter, public gapw_1c_medium
integer, parameter, public do_method_pw
integer, parameter, public do_method_rm1
integer, parameter, public gapw_1c_small
integer, parameter, public do_method_pm3
integer, parameter, public do_sirius
integer, parameter, public do_method_mndo
integer, parameter, public gapw_1c_orb
integer, parameter, public gapw_1c_very_large
integer, parameter, public do_method_mndod
integer, parameter, public do_method_am1
integer, parameter, public do_method_dftb
integer, parameter, public do_qs
integer, parameter, public do_method_xtb
integer, parameter, public do_method_pm6fm
integer, parameter, public do_method_pm6
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public default_path_length
Definition kinds.F:58
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public ncoset
Factory routines for potentials used e.g. by pao_param_exp and pao_ml.
subroutine, public get_paw_proj_set(paw_proj_set, csprj, chprj, first_prj, first_prjs, last_prj, local_oce_sphi_h, local_oce_sphi_s, maxl, ncgauprj, nsgauprj, nsatbas, nsotot, nprj, o2nindex, n2oindex, rcprj, rzetprj, zisomin, zetprj)
Get informations about a paw projectors set.
subroutine, public allocate_paw_proj_set(paw_proj_set)
Allocate projector type for GAPW.
subroutine, public projectors(paw_proj, basis_1c, orb_basis, rc, qs_control, max_rad_local_type, force_env_section)
Initialize the projector-type set data set.
subroutine, public deallocate_paw_proj_set(paw_proj_set)
Deallocate a projector-type set data set.
Periodic Table related data definitions.
type(atom), dimension(0:nelem), public ptable
integer, parameter, public nelem
subroutine, public get_ptable_info(symbol, number, amass, ielement, covalent_radius, metallic_radius, vdw_radius, found)
Pass information about the kind given the element symbol.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public evolt
Definition physcon.F:183
real(kind=dp), parameter, public angstrom
Definition physcon.F:144
real(kind=dp), parameter, public bohr
Definition physcon.F:147
Definition of the DFTB parameter types.
Working with the DFTB parameter types.
subroutine, public deallocate_dftb_atom_param(dftb_parameter)
...
subroutine, public write_dftb_atom_param(dftb_parameter, subsys_section)
...
subroutine, public get_dftb_atom_param(dftb_parameter, name, typ, defined, z, zeff, natorb, lmax, skself, occupation, eta, energy, cutoff, xi, di, rcdisp, dudq)
...
Definition of disperson types for DFT calculations.
subroutine, public deallocate_grid_atom(grid_atom)
Deallocate a Gaussian-type orbital (GTO) basis set data set.
subroutine, public allocate_grid_atom(grid_atom)
Initialize components of the grid_atom_type structure.
subroutine, public allocate_harmonics_atom(harmonics)
Allocate a spherical harmonics set for the atom grid.
subroutine, public deallocate_harmonics_atom(harmonics)
Deallocate the spherical harmonics set for the atom grid.
Define the quickstep kind type and their sub types.
subroutine, public set_pseudo_state(econf, z, ncalc, ncore, nelem)
...
logical function, public has_nlcc(qs_kind_set)
finds if a given qs run needs to use nlcc
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, zatom, 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_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_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public deallocate_qs_kind_set(qs_kind_set)
Destructor routine for a set of qs kinds.
subroutine, public init_atom_electronic_state(atomic_kind, qs_kind, ncalc, ncore, nelem, edelta)
...
subroutine, public init_gapw_nlcc(qs_kind_set)
...
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg)
Get attributes of an atomic kind set.
subroutine, public set_qs_kind(qs_kind, paw_atom, ghost, floating, hard_radius, hard0_radius, covalent_radius, vdw_radius, lmax_rho0, zeff, no_optimize, dispersion, u_minus_j, reltmat, dftb_parameter, xtb_parameter, elec_conf, pao_basis_size)
Set the components of an atomic kind data set.
subroutine, public write_qs_kind_set(qs_kind_set, subsys_section)
Write an atomic kind set data set to the output unit.
subroutine, public init_gapw_basis_set(qs_kind_set, qs_control, force_env_section, modify_qs_control)
...
subroutine, public init_qs_kind_set(qs_kind_set)
Initialise an atomic kind set data set.
subroutine, public check_qs_kind_set(qs_kind_set, dft_control, subsys_section)
...
subroutine, public write_gto_basis_sets(qs_kind_set, subsys_section)
Write all the GTO basis sets of an atomic kind set to the output unit (for the printing of the unnorm...
subroutine, public create_qs_kind_set(qs_kind_set, atomic_kind_set, kind_section, para_env, force_env_section, silent)
Read an atomic kind set data set from the input file.
Definition of the semi empirical parameter types.
subroutine, public write_se_param(sep, subsys_section)
Writes the semi-empirical type.
subroutine, public semi_empirical_create(sep)
Allocate semi-empirical type.
subroutine, public get_se_param(sep, name, typ, defined, z, zeff, natorb, eheat, beta, sto_exponents, uss, upp, udd, uff, alp, eisol, gss, gsp, gpp, gp2, acoul, nr, de, ass, asp, app, hsp, gsd, gpd, gdd, ppddg, dpddg, ngauss)
Get info from the semi-empirical type.
subroutine, public semi_empirical_release(sep)
Deallocate the semi-empirical type.
Working with the semi empirical parameter types.
subroutine, public se_param_set_default(sep, z, method)
Initialize parameter for a semi_empirival type.
subroutine, public init_se_param(sep, orb_basis_set, ngauss)
Initialize semi_empirical type.
subroutine, public create_soft_basis(orb_basis, soft_basis, eps_fit, rc, paw_atom, paw_type_forced, gpw_r3d_rs_type_forced)
create the soft basis from a GTO basis
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
Read xTB parameters.
real(kind=dp) function, public xtb_set_kab(za, zb, xtb_control)
...
Definition of the xTB parameter types.
Definition xtb_types.F:20
subroutine, public get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, hen, zeta, xi, kappa0, alpg, occupation, electronegativity, chmax, en, kqat2, kcn, kq)
...
Definition xtb_types.F:199
subroutine, public deallocate_xtb_atom_param(xtb_parameter)
...
Definition xtb_types.F:149
subroutine, public write_xtb_atom_param(xtb_parameter, gfn_type, subsys_section)
...
Definition xtb_types.F:364
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
Holds information about a PAO descriptor.
Holds information about a PAO potential.
Provides all information about a quickstep kind.