79 subsys_section, para_env)
84 POINTER :: dftb_potential
88 CHARACTER(LEN=2) :: iel, jel
89 CHARACTER(LEN=6) :: cspline
90 CHARACTER(LEN=default_path_length) :: file_name
91 CHARACTER(LEN=default_path_length),
ALLOCATABLE, &
92 DIMENSION(:, :) :: sk_files
93 CHARACTER(LEN=default_string_length) :: iname, jname, name_a, name_b, skfn
94 INTEGER :: ikind, isp, jkind, k, l, l1, l2, llm, &
95 lmax, lmax_a, lmax_b, lp, m, n_urpoly, &
96 ngrd, nkind, output_unit, runit, &
98 LOGICAL :: at_end, found, ldum, search, sklist
99 REAL(dp) :: da, db, dgrd, dij, energy, eps_disp, ra, &
100 radmax, rb, rcdisp, rmax6, s_cut, xij, &
102 REAL(dp),
ALLOCATABLE,
DIMENSION(:, :) :: fmat, scoeff, smat, spxr
103 REAL(dp),
DIMENSION(0:3) :: eta, occupation, skself
104 REAL(dp),
DIMENSION(10) :: fwork, swork, uwork
105 REAL(dp),
DIMENSION(1:2) :: surr
106 REAL(dp),
DIMENSION(1:3) :: srep
114 "PRINT%KINDS/BASIS_SET"),
cp_p_file))
THEN
116 "PRINT%KINDS", extension=
".Log")
117 IF (output_unit > 0)
THEN
118 WRITE (output_unit,
"(/,A)")
" DFTB| A set of relativistic DFTB "// &
119 "parameters for material sciences."
120 WRITE (output_unit,
"(A)")
" DFTB| J. Frenzel, N. Jardillier, A.F. Oliveira,"// &
121 " T. Heine, G. Seifert"
122 WRITE (output_unit,
"(A)")
" DFTB| TU Dresden, 2002-2007"
123 WRITE (output_unit,
"(/,A)")
" DFTB| Non-SCC parameters "
124 WRITE (output_unit,
"(A,T25,A)")
" DFTB| C,H :", &
125 " D. Porezag et al, PRB 51 12947 (1995)"
126 WRITE (output_unit,
"(A,T25,A)")
" DFTB| B,N :", &
127 " J. Widany et al, PRB 53 4443 (1996)"
128 WRITE (output_unit,
"(A,T25,A)")
" DFTB| Li,Na,K,Cl :", &
129 " S. Hazebroucq et al, JCP 123 134510 (2005)"
130 WRITE (output_unit,
"(A,T25,A)")
" DFTB| F :", &
131 " T. Heine et al, JCSoc-Perkins Trans 2 707 (1999)"
132 WRITE (output_unit,
"(A,T25,A)")
" DFTB| Mo,S :", &
133 " G. Seifert et al, PRL 85 146 (2000)"
134 WRITE (output_unit,
"(A,T25,A)")
" DFTB| P :", &
135 " G. Seifert et al, EPS 16 341 (2001)"
136 WRITE (output_unit,
"(A,T25,A)")
" DFTB| Sc,N,C :", &
137 " M. Krause et al, JCP 115 6596 (2001)"
143 sklist = (dftb_control%sk_file_list /=
"")
145 nkind =
SIZE(atomic_kind_set)
146 ALLOCATE (sk_files(nkind, nkind))
148 ALLOCATE (dftb_potential(nkind, nkind))
152 CALL get_atomic_kind(atomic_kind_set(ikind), name=iname, element_symbol=iel)
157 CALL get_atomic_kind(atomic_kind_set(jkind), name=jname, element_symbol=jel)
162 DO k = 1,
SIZE(dftb_control%sk_pair_list, 2)
163 name_a = trim(dftb_control%sk_pair_list(1, k))
164 name_b = trim(dftb_control%sk_pair_list(2, k))
167 IF ((iname == name_a .AND. jname == name_b))
THEN
168 sk_files(ikind, jkind) = trim(dftb_control%sk_file_path)//
"/"// &
169 trim(dftb_control%sk_pair_list(3, k))
174 IF (.NOT. found .AND. sklist)
THEN
175 file_name = trim(dftb_control%sk_file_path)//
"/"// &
176 trim(dftb_control%sk_file_list)
187 IF ((iname == name_a .AND. jname == name_b))
THEN
189 sk_files(ikind, jkind) = trim(dftb_control%sk_file_path)//
"/"// &
195 IF ((iel == name_a .AND. jel == name_b))
THEN
197 sk_files(ikind, jkind) = trim(dftb_control%sk_file_path)//
"/"// &
206 IF (.NOT. found)
THEN
207 CALL cp_abort(__location__, &
208 "Failure in assigning KINDS <"//trim(iname)//
"> and <"//trim(jname)// &
209 "> to a DFTB interaction pair!")
218 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
219 IF (.NOT.
ASSOCIATED(dftb_atom_a))
THEN
221 CALL set_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
228 CALL get_qs_kind(qs_kind_set(jkind), dftb_parameter=dftb_atom_b)
230 IF (output_unit > 0)
THEN
231 WRITE (output_unit,
"(A,T30,A50)")
" DFTB| Reading parameter file ", &
232 adjustr(trim(sk_files(jkind, ikind)))
237 IF (para_env%is_source())
THEN
238 CALL open_file(file_name=sk_files(jkind, ikind), unit_number=runit)
240 READ (runit, fmt=*,
END=1, err=1) dgrd, ngrd
248 READ (runit, fmt=*,
END=1, err=1) skself(2:0:-1), energy, &
249 eta(2:0:-1), occupation(2:0:-1)
251 READ (runit, fmt=*,
END=1, err=1) uwork(1:10)
253 IF (dot_product(uwork(2:10), uwork(2:10)) >= 1.e-12_dp)
THEN
256 IF (abs(uwork(k)) >= 1.e-12_dp) n_urpoly = k
261 IF (n_urpoly < 2) n_urpoly = 0
264 CALL para_env%bcast(n_urpoly)
265 CALL para_env%bcast(uwork)
266 CALL para_env%bcast(ngrd)
267 CALL para_env%bcast(dgrd)
269 CALL para_env%bcast(skself)
270 CALL para_env%bcast(energy)
271 CALL para_env%bcast(eta)
272 CALL para_env%bcast(occupation)
274 CALL set_dftb_atom_param(dftb_parameter=dftb_atom_a, &
275 z=z, zeff=sum(occupation), defined=.true., &
276 skself=skself, energy=energy, eta=eta, occupation=occupation)
279 ALLOCATE (fmat(ngrd, 10))
280 ALLOCATE (smat(ngrd, 10))
281 IF (para_env%is_source())
THEN
283 READ (runit, fmt=*,
END=1, err=1) fwork(1:10), swork(1:10)
284 fmat(k, 1:10) = fwork(1:10)
285 smat(k, 1:10) = swork(1:10)
288 CALL para_env%bcast(fmat)
289 CALL para_env%bcast(smat)
302 CALL get_qs_kind(qs_kind_set(ikind), lmax_dftb=lmax)
308 cpabort(
"Only 0, 1, 2 are supported as the value of l")
320 IF ((abs(skself(l)) > 0._dp) .OR. &
321 (sum(abs(fmat(ngrd/10:ngrd, lp))) > 0._dp)) lmax = l
327 CALL cp_abort(__location__,
"Maximum L allowed is d. "// &
328 "Use KIND/LMAX_DFTB to set smaller values if needed.")
331 CALL set_dftb_atom_param(dftb_parameter=dftb_atom_a, &
332 lmax=lmax, natorb=(lmax + 1)**2)
335 IF (n_urpoly == 0)
THEN
336 IF (para_env%is_source())
THEN
340 READ (runit, fmt=
'(A6)',
END=1, err=1) cspline
341 IF (cspline ==
'Spline')
THEN
344 READ (runit, fmt=*,
END=1, err=1) spdim, s_cut
345 ALLOCATE (spxr(spdim, 2))
346 ALLOCATE (scoeff(spdim, 4))
348 READ (runit, fmt=*,
END=1, err=1) srep(1:3)
349 DO isp = 1, spdim - 1
351 READ (runit, fmt=*,
END=1, err=1) spxr(isp, 1:2), scoeff(isp, 1:4)
354 READ (runit, fmt=*,
END=1, err=1) spxr(spdim, 1:2), scoeff(spdim, 1:4), surr(1:2)
360 IF (para_env%is_source())
THEN
361 CALL close_file(unit_number=runit)
364 CALL para_env%bcast(spdim)
365 IF (spdim > 0 .AND. (.NOT. para_env%is_source()))
THEN
366 ALLOCATE (spxr(spdim, 2))
367 ALLOCATE (scoeff(spdim, 4))
370 CALL para_env%bcast(spxr)
371 CALL para_env%bcast(scoeff)
372 CALL para_env%bcast(surr)
373 CALL para_env%bcast(srep)
374 CALL para_env%bcast(s_cut)
379 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_a, lmax=lmax_a)
380 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_b, lmax=lmax_b)
382 DO l1 = 0, max(lmax_a, lmax_b)
383 DO l2 = 0, min(l1, lmax_a, lmax_b)
389 CALL qs_dftb_pairpot_create(dftb_potential(ikind, jkind), &
393 dftb_potential(ikind, jkind)%n_urpoly = n_urpoly
394 dftb_potential(ikind, jkind)%urep_cut = uwork(10)
395 dftb_potential(ikind, jkind)%urep(:) = 0._dp
396 dftb_potential(ikind, jkind)%urep(1) = uwork(10)
397 dftb_potential(ikind, jkind)%urep(2:n_urpoly) = uwork(2:n_urpoly)
400 dftb_potential(ikind, jkind)%dgrd = dgrd
401 CALL skreorder(fmat, lmax_a, lmax_b)
402 dftb_potential(ikind, jkind)%fmat(:, 1:llm) = fmat(:, 1:llm)
403 CALL skreorder(smat, lmax_a, lmax_b)
404 dftb_potential(ikind, jkind)%smat(:, 1:llm) = smat(:, 1:llm)
405 dftb_potential(ikind, jkind)%ngrdcut = ngrd + int(slako_d0/dgrd)
408 dftb_potential(ikind, jkind)%s_cut = s_cut
409 dftb_potential(ikind, jkind)%srep = srep
410 dftb_potential(ikind, jkind)%spxr = spxr
411 dftb_potential(ikind, jkind)%scoeff = scoeff
412 dftb_potential(ikind, jkind)%surr = surr
426 CALL get_atomic_kind(atomic_kind_set(ikind), z=z, name=iname)
427 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
429 IF (.NOT.
ASSOCIATED(dftb_atom_a))
THEN
430 CALL allocate_dftb_atom_param(dftb_atom_a)
431 CALL set_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
436 IF (ikind == jkind) cycle
437 CALL get_atomic_kind(atomic_kind_set(jkind), name=jname)
438 CALL get_qs_kind(qs_kind_set(jkind), dftb_parameter=dftb_atom_b)
440 IF (output_unit > 0)
THEN
441 WRITE (output_unit,
"(A,T30,A50)")
" DFTB| Reading parameter file ", &
442 adjustr(trim(sk_files(ikind, jkind)))
447 IF (para_env%is_source())
THEN
448 CALL open_file(file_name=sk_files(ikind, jkind), unit_number=runit)
450 READ (runit, fmt=*,
END=1, err=1) dgrd, ngrd
457 IF (ikind == jkind)
THEN
459 READ (runit, fmt=*,
END=1, err=1) skself(2:0:-1), energy, &
460 eta(2:0:-1), occupation(2:0:-1)
463 READ (runit, fmt=*,
END=1, err=1) uwork(1:10)
465 IF (dot_product(uwork(2:10), uwork(2:10)) >= 1.e-12_dp)
THEN
468 IF (abs(uwork(k)) >= 1.e-12_dp) n_urpoly = k
473 IF (n_urpoly < 2) n_urpoly = 0
476 CALL para_env%bcast(n_urpoly)
477 CALL para_env%bcast(uwork)
478 CALL para_env%bcast(ngrd)
479 CALL para_env%bcast(dgrd)
482 ALLOCATE (fmat(ngrd, 10))
483 ALLOCATE (smat(ngrd, 10))
484 IF (para_env%is_source())
THEN
486 READ (runit, fmt=*,
END=1, err=1) fwork(1:10), swork(1:10)
487 fmat(k, 1:10) = fwork(1:10)
488 smat(k, 1:10) = swork(1:10)
491 CALL para_env%bcast(fmat)
492 CALL para_env%bcast(smat)
495 IF (n_urpoly == 0)
THEN
496 IF (para_env%is_source())
THEN
500 READ (runit, fmt=
'(A6)',
END=1, err=1) cspline
501 IF (cspline ==
'Spline')
THEN
504 READ (runit, fmt=*,
END=1, err=1) spdim, s_cut
505 ALLOCATE (spxr(spdim, 2))
506 ALLOCATE (scoeff(spdim, 4))
508 READ (runit, fmt=*,
END=1, err=1) srep(1:3)
509 DO isp = 1, spdim - 1
511 READ (runit, fmt=*,
END=1, err=1) spxr(isp, 1:2), scoeff(isp, 1:4)
514 READ (runit, fmt=*,
END=1, err=1) spxr(spdim, 1:2), scoeff(spdim, 1:4), surr(1:2)
520 IF (para_env%is_source())
THEN
521 CALL close_file(unit_number=runit)
524 CALL para_env%bcast(spdim)
525 IF (spdim > 0 .AND. (.NOT. para_env%is_source()))
THEN
526 ALLOCATE (spxr(spdim, 2))
527 ALLOCATE (scoeff(spdim, 4))
530 CALL para_env%bcast(spxr)
531 CALL para_env%bcast(scoeff)
532 CALL para_env%bcast(surr)
533 CALL para_env%bcast(srep)
534 CALL para_env%bcast(s_cut)
539 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_a, lmax=lmax_a)
540 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_b, lmax=lmax_b)
542 DO l1 = 0, max(lmax_a, lmax_b)
543 DO l2 = 0, min(l1, lmax_a, lmax_b)
549 CALL qs_dftb_pairpot_create(dftb_potential(ikind, jkind), &
553 dftb_potential(ikind, jkind)%n_urpoly = n_urpoly
554 dftb_potential(ikind, jkind)%urep_cut = uwork(10)
555 dftb_potential(ikind, jkind)%urep(:) = 0._dp
556 dftb_potential(ikind, jkind)%urep(1) = uwork(10)
557 dftb_potential(ikind, jkind)%urep(2:n_urpoly) = uwork(2:n_urpoly)
560 dftb_potential(ikind, jkind)%dgrd = dgrd
561 CALL skreorder(fmat, lmax_a, lmax_b)
562 dftb_potential(ikind, jkind)%fmat(:, 1:llm) = fmat(:, 1:llm)
563 CALL skreorder(smat, lmax_a, lmax_b)
564 dftb_potential(ikind, jkind)%smat(:, 1:llm) = smat(:, 1:llm)
565 dftb_potential(ikind, jkind)%ngrdcut = ngrd + int(slako_d0/dgrd)
568 dftb_potential(ikind, jkind)%s_cut = s_cut
569 dftb_potential(ikind, jkind)%srep = srep
570 dftb_potential(ikind, jkind)%spxr = spxr
571 dftb_potential(ikind, jkind)%scoeff = scoeff
572 dftb_potential(ikind, jkind)%surr = surr
585 DEALLOCATE (sk_files)
588 IF (dftb_control%dispersion)
THEN
590 IF (dftb_control%dispersion_type == dispersion_uff)
THEN
591 file_name = trim(dftb_control%sk_file_path)//
"/"// &
592 trim(dftb_control%uff_force_field)
594 TYPE(cp_parser_type) :: parser
596 CALL get_atomic_kind(atomic_kind_set(ikind), name=iname)
597 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
600 CALL parser_create(parser, file_name, para_env=para_env)
604 CALL parser_get_next_line(parser, 1, at_end)
606 CALL parser_get_object(parser, name_a)
608 IF (name_a(1:1) ==
'"') name_a(1:m) = name_a(2:m + 1)
609 IF (name_a(1:m) == trim(iname))
THEN
610 CALL parser_get_object(parser, rb)
611 CALL parser_get_object(parser, rb)
612 CALL parser_get_object(parser, ra)
613 CALL parser_get_object(parser, da)
617 CALL set_dftb_atom_param(dftb_parameter=dftb_atom_a, name=iname, xi=ra, di=da)
621 CALL parser_release(parser)
630 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
631 radmax = (dftb_potential(ikind, ikind)%ngrdcut + 1)* &
632 dftb_potential(ikind, ikind)%dgrd*0.5_dp
633 CALL set_dftb_atom_param(dftb_parameter=dftb_atom_a, cutoff=radmax)
636 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
637 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_a, cutoff=ra)
639 CALL get_qs_kind(qs_kind_set(jkind), dftb_parameter=dftb_atom_b)
640 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_b, cutoff=rb)
641 radmax = (dftb_potential(ikind, jkind)%ngrdcut + 1)* &
642 dftb_potential(ikind, jkind)%dgrd
643 IF (ra + rb < radmax)
THEN
644 ra = ra + (radmax - ra - rb)*0.5_dp
645 rb = rb + (radmax - ra - rb)*0.5_dp
646 CALL set_dftb_atom_param(dftb_parameter=dftb_atom_a, cutoff=ra)
647 CALL set_dftb_atom_param(dftb_parameter=dftb_atom_b, cutoff=rb)
654 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
655 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_a, zeff=zeff)
656 CALL set_potential(potential=qs_kind_set(ikind)%all_potential, &
657 zeff=zeff, zeff_correction=0.0_dp)
661 IF (dftb_control%dftb3_diagonal)
THEN
663 CALL get_qs_kind(qs_kind_set(ikind), dftb3_param=db)
664 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
665 CALL set_dftb_atom_param(dftb_parameter=dftb_atom_a, dudq=db)
670 IF (dftb_control%dispersion)
THEN
671 IF (dftb_control%dispersion_type == dispersion_uff)
THEN
672 eps_disp = dftb_control%eps_disp
674 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_atom_a)
675 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_a, xi=ra, di=da)
678 CALL get_qs_kind(qs_kind_set(jkind), dftb_parameter=dftb_atom_b)
679 CALL get_dftb_atom_param(dftb_parameter=dftb_atom_b, xi=rb, di=db)
682 dftb_potential(ikind, jkind)%xij = xij
683 dftb_potential(ikind, jkind)%dij = dij
684 dftb_potential(ikind, jkind)%x0ij = xij*(0.5_dp**(1.0_dp/6.0_dp))
685 dftb_potential(ikind, jkind)%a = dij*396.0_dp/25.0_dp
686 dftb_potential(ikind, jkind)%b = &
687 dij/(xij**5)*672.0_dp*2.0_dp**(5.0_dp/6.0_dp)/25.0_dp
688 dftb_potential(ikind, jkind)%c = &
689 -dij/(xij**10)*2.0_dp**(2.0_dp/3.0_dp)*552.0_dp/25.0_dp
690 rmax6 = ((8._dp*pi*dij/eps_disp)*xij**6)**0.25_dp
691 rcdisp = max(rcdisp, rmax6*0.5_dp)
693 CALL set_dftb_atom_param(dftb_parameter=dftb_atom_a, rcdisp=rcdisp)
703 cpabort(
"Something went wrong while reading DFTB parameter file")
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_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, hund_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, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.