(git:374b731)
Loading...
Searching...
No Matches
iao_analysis.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Calculate intrinsic atomic orbitals and analyze wavefunctions
10!> \par History
11!> 03.2023 created [JGH]
12!> \author JGH
13! **************************************************************************************************
15 USE ai_contraction, ONLY: block_add,&
17 USE ai_overlap, ONLY: overlap_ab
27 USE bibliography, ONLY: knizia2013,&
28 cite_reference
29 USE cell_types, ONLY: cell_type,&
30 pbc
46 USE cp_fm_types, ONLY: cp_fm_create,&
59 USE dbcsr_api, ONLY: &
60 dbcsr_copy, dbcsr_create, dbcsr_distribution_type, dbcsr_get_block_p, dbcsr_get_info, &
61 dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, dbcsr_iterator_start, &
62 dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_multiply, dbcsr_p_type, dbcsr_release, &
63 dbcsr_replicate_all, dbcsr_reserve_diag_blocks, dbcsr_set, dbcsr_trace, dbcsr_type, &
64 dbcsr_type_no_symmetry
65 USE iao_types, ONLY: iao_env_type
72 USE kinds, ONLY: default_path_length,&
74 dp
75 USE machine, ONLY: m_walltime
76 USE mathconstants, ONLY: twopi
77 USE mathlib, ONLY: invmat_symm,&
78 jacobi
82 USE orbital_pointers, ONLY: ncoset
87 USE pw_env_types, ONLY: pw_env_get,&
90 USE pw_types, ONLY: pw_c1d_gs_type,&
96 USE qs_kind_types, ONLY: get_qs_kind,&
98 USE qs_ks_types, ONLY: get_ks_env,&
105 USE qs_mo_types, ONLY: allocate_mo_set,&
107 get_mo_set,&
116 USE qs_subsys_types, ONLY: qs_subsys_get,&
118#include "./base/base_uses.f90"
119
120 IMPLICIT NONE
121 PRIVATE
122
123 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'iao_analysis'
124
126
128 MODULE PROCEDURE iao_calculate_dmat_diag, & ! diagonal occupation matrix
129 iao_calculate_dmat_full ! full occupation matrix
130 END INTERFACE
131
132! **************************************************************************************************
133
134CONTAINS
135
136! **************************************************************************************************
137!> \brief ...
138!> \param qs_env ...
139!> \param iao_env ...
140!> \param unit_nr ...
141!> \param c_iao_coef ...
142!> \param mos ...
143!> \param bond_centers ...
144! **************************************************************************************************
145 SUBROUTINE iao_wfn_analysis(qs_env, iao_env, unit_nr, c_iao_coef, mos, bond_centers)
146 TYPE(qs_environment_type), POINTER :: qs_env
147 TYPE(iao_env_type), INTENT(IN) :: iao_env
148 INTEGER, INTENT(IN) :: unit_nr
149 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:), &
150 OPTIONAL :: c_iao_coef
151 TYPE(mo_set_type), DIMENSION(:), OPTIONAL, POINTER :: mos
152 REAL(kind=dp), DIMENSION(:, :, :), OPTIONAL :: bond_centers
153
154 CHARACTER(len=*), PARAMETER :: routinen = 'iao_wfn_analysis'
155
156 CHARACTER(LEN=2) :: element_symbol
157 CHARACTER(LEN=default_string_length) :: bname
158 INTEGER :: handle, i, iatom, ikind, isgf, ispin, &
159 nao, natom, nimages, nkind, no, norb, &
160 nref, ns, nsgf, nspin, nvec, nx, order
161 INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf, last_sgf, nsgfat
162 INTEGER, DIMENSION(2) :: nocc
163 LOGICAL :: cubes_iao, cubes_ibo, molden_iao, &
164 molden_ibo, uniform_occupation
165 REAL(kind=dp) :: fin, fout, t1, t2, trace, zval
166 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: fdiag
167 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: mcharge
168 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: moments
169 REAL(kind=dp), DIMENSION(:), POINTER :: occupation_numbers
170 TYPE(cp_2d_r_p_type), ALLOCATABLE, DIMENSION(:) :: smat_kind
171 TYPE(cp_2d_r_p_type), ALLOCATABLE, DIMENSION(:, :) :: oce_atom
172 TYPE(cp_fm_struct_type), POINTER :: fm_struct
173 TYPE(cp_fm_type) :: p_orb_ref, p_ref_orb, smo
174 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: c_loc_orb, ciao, cloc, cvec, iao_coef
175 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: zij_atom
176 TYPE(cp_fm_type), POINTER :: mo_coeff
177 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: sref, sro, sxo
178 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
179 TYPE(dbcsr_type) :: dmat
180 TYPE(dbcsr_type), POINTER :: smat
181 TYPE(dft_control_type), POINTER :: dft_control
182 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: oce_basis_set_list, orb_basis_set_list, &
183 ref_basis_set_list
184 TYPE(gto_basis_set_type), POINTER :: ocebasis, orbbasis, refbasis
185 TYPE(mo_set_type), ALLOCATABLE, DIMENSION(:) :: mo_iao, mo_loc
186 TYPE(mo_set_type), DIMENSION(:), POINTER :: my_mos
187 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
188 POINTER :: sro_list, srr_list, sxo_list
189 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
190 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
191 TYPE(qs_kind_type), POINTER :: qs_kind
192 TYPE(qs_ks_env_type), POINTER :: ks_env
193 TYPE(section_vals_type), POINTER :: iao_cubes_section, iao_molden_section, &
194 ibo_cc_section, ibo_cubes_section, &
195 ibo_molden_section
196
197 ! only do IAO analysis if explicitly requested
198 cpassert(iao_env%do_iao)
199
200 ! k-points?
201 CALL get_qs_env(qs_env, dft_control=dft_control)
202 nspin = dft_control%nspins
203 nimages = dft_control%nimages
204 IF (nimages > 1) THEN
205 IF (unit_nr > 0) THEN
206 WRITE (unit=unit_nr, fmt="(T2,A)") &
207 "K-Points: Intrinsic Atomic Orbitals Analysis not available."
208 END IF
209 END IF
210 IF (nimages > 1) RETURN
211
212 CALL timeset(routinen, handle)
213
214 IF (unit_nr > 0) THEN
215 WRITE (unit_nr, '(/,T2,A)') '!-----------------------------------------------------------------------------!'
216 WRITE (unit=unit_nr, fmt="(T24,A)") "INTRINSIC ATOMIC ORBITALS ANALYSIS"
217 WRITE (unit=unit_nr, fmt="(T13,A)") "G. Knizia, J. Chem. Theory Comput. 9, 4834-4843 (2013)"
218 WRITE (unit_nr, '(T2,A)') '!-----------------------------------------------------------------------------!'
219 END IF
220 CALL cite_reference(knizia2013)
221
222 ! input sections
223 iao_molden_section => iao_env%iao_molden_section
224 iao_cubes_section => iao_env%iao_cubes_section
225 ibo_molden_section => iao_env%ibo_molden_section
226 ibo_cubes_section => iao_env%ibo_cubes_section
227 ibo_cc_section => iao_env%ibo_cc_section
228
229 !
230 molden_iao = .false.
231 IF (ASSOCIATED(iao_molden_section)) THEN
232 CALL section_vals_get(iao_molden_section, explicit=molden_iao)
233 END IF
234 cubes_iao = .false.
235 IF (ASSOCIATED(iao_cubes_section)) THEN
236 CALL section_vals_get(iao_cubes_section, explicit=cubes_iao)
237 END IF
238 molden_ibo = .false.
239 IF (ASSOCIATED(ibo_molden_section)) THEN
240 CALL section_vals_get(ibo_molden_section, explicit=molden_ibo)
241 END IF
242 cubes_ibo = .false.
243 IF (ASSOCIATED(ibo_cubes_section)) THEN
244 CALL section_vals_get(ibo_cubes_section, explicit=cubes_ibo)
245 END IF
246
247 ! check for or generate reference basis
248 CALL create_minbas_set(qs_env, unit_nr)
249
250 ! overlap matrices
251 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s)
252 smat => matrix_s(1, 1)%matrix
253 !
254 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
255 nkind = SIZE(qs_kind_set)
256 ALLOCATE (ref_basis_set_list(nkind), orb_basis_set_list(nkind))
257 DO ikind = 1, nkind
258 qs_kind => qs_kind_set(ikind)
259 NULLIFY (ref_basis_set_list(ikind)%gto_basis_set)
260 NULLIFY (orb_basis_set_list(ikind)%gto_basis_set)
261 NULLIFY (refbasis, orbbasis)
262 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orbbasis, basis_type="ORB")
263 IF (ASSOCIATED(orbbasis)) orb_basis_set_list(ikind)%gto_basis_set => orbbasis
264 CALL get_qs_kind(qs_kind=qs_kind, basis_set=refbasis, basis_type="MIN")
265 IF (ASSOCIATED(refbasis)) ref_basis_set_list(ikind)%gto_basis_set => refbasis
266 END DO
267
268 ! neighbor lists
269 NULLIFY (srr_list, sro_list)
270 CALL setup_neighbor_list(srr_list, ref_basis_set_list, qs_env=qs_env)
271 CALL setup_neighbor_list(sro_list, ref_basis_set_list, orb_basis_set_list, qs_env=qs_env)
272
273 ! Srr and Sro overlap matrices
274 NULLIFY (sref, sro)
275 CALL get_qs_env(qs_env, ks_env=ks_env)
276 CALL build_overlap_matrix_simple(ks_env, sref, &
277 ref_basis_set_list, ref_basis_set_list, srr_list)
278 CALL build_overlap_matrix_simple(ks_env, sro, &
279 ref_basis_set_list, orb_basis_set_list, sro_list)
280 !
281 IF (PRESENT(mos)) THEN
282 my_mos => mos
283 ELSE
284 CALL get_qs_env(qs_env, mos=my_mos)
285 END IF
286 CALL get_mo_set(my_mos(1), mo_coeff=mo_coeff)
287 CALL dbcsr_get_info(sro(1)%matrix, nfullrows_total=nref, nfullcols_total=nao)
288
289 ! Projectors
290 NULLIFY (fm_struct)
291 CALL cp_fm_struct_create(fm_struct, context=mo_coeff%matrix_struct%context, nrow_global=nref, &
292 ncol_global=nao, para_env=mo_coeff%matrix_struct%para_env)
293 CALL cp_fm_create(p_ref_orb, fm_struct)
294 CALL cp_fm_struct_release(fm_struct)
295 NULLIFY (fm_struct)
296 CALL cp_fm_struct_create(fm_struct, context=mo_coeff%matrix_struct%context, nrow_global=nao, &
297 ncol_global=nref, para_env=mo_coeff%matrix_struct%para_env)
298 CALL cp_fm_create(p_orb_ref, fm_struct)
299 CALL cp_fm_struct_release(fm_struct)
300 !
301 CALL iao_projectors(smat, sref(1)%matrix, sro(1)%matrix, p_orb_ref, p_ref_orb, iao_env%eps_svd)
302
303 ! occupied orbitals, orbitals considered for IAO generation
304 nocc(1:2) = 0
305 DO ispin = 1, nspin
306 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nmo=norb, uniform_occupation=uniform_occupation, &
307 occupation_numbers=occupation_numbers)
308 IF (uniform_occupation) THEN
309 nvec = norb
310 ELSE
311 nvec = 0
312 DO i = 1, norb
313 IF (occupation_numbers(i) > iao_env%eps_occ) THEN
314 nvec = i
315 ELSE
316 EXIT
317 END IF
318 END DO
319 END IF
320 nocc(ispin) = nvec
321 END DO
322 ! generate IAOs
323 ALLOCATE (iao_coef(nspin), cvec(nspin))
324 DO ispin = 1, nspin
325 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff)
326 nvec = nocc(ispin)
327 IF (nvec > 0) THEN
328 NULLIFY (fm_struct)
329 CALL cp_fm_struct_create(fm_struct, ncol_global=nvec, template_fmstruct=mo_coeff%matrix_struct)
330 CALL cp_fm_create(cvec(ispin), fm_struct)
331 CALL cp_fm_struct_release(fm_struct)
332 CALL cp_fm_to_fm(mo_coeff, cvec(ispin), nvec)
333 !
334 NULLIFY (fm_struct)
335 CALL cp_fm_struct_create(fm_struct, ncol_global=nref, template_fmstruct=mo_coeff%matrix_struct)
336 CALL cp_fm_create(iao_coef(ispin), fm_struct)
337 CALL cp_fm_struct_release(fm_struct)
338 !
339 CALL intrinsic_ao_calc(smat, p_orb_ref, p_ref_orb, cvec(ispin), iao_coef(ispin))
340 END IF
341 END DO
342 !
343 IF (iao_env%do_charges) THEN
344 ! MOs in IAO basis
345 ALLOCATE (ciao(nspin))
346 DO ispin = 1, nspin
347 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=norb)
348 CALL cp_fm_create(smo, mo_coeff%matrix_struct)
349 NULLIFY (fm_struct)
350 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, template_fmstruct=mo_coeff%matrix_struct)
351 CALL cp_fm_create(ciao(ispin), fm_struct)
352 CALL cp_fm_struct_release(fm_struct)
353 ! CIAO = A(T)*S*C
354 CALL cp_dbcsr_sm_fm_multiply(smat, mo_coeff, smo, ncol=norb)
355 CALL parallel_gemm('T', 'N', nref, norb, nao, 1.0_dp, iao_coef(ispin), smo, 0.0_dp, ciao(ispin))
356 CALL cp_fm_release(smo)
357 END DO
358 !
359 ! population analysis
360 IF (unit_nr > 0) THEN
361 WRITE (unit_nr, '(/,T2,A)') 'Intrinsic AO Population Analysis '
362 END IF
363 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
364 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
365 ALLOCATE (mcharge(natom, nspin))
366 CALL dbcsr_get_info(sref(1)%matrix, nfullrows_total=nref)
367 DO ispin = 1, nspin
368 CALL get_mo_set(my_mos(ispin), &
369 uniform_occupation=uniform_occupation, &
370 occupation_numbers=occupation_numbers)
371 ! diagonal block matrix
372 CALL dbcsr_create(dmat, template=sref(1)%matrix)
373 CALL dbcsr_reserve_diag_blocks(dmat)
374 !
375 CALL iao_calculate_dmat(ciao(ispin), dmat, occupation_numbers, uniform_occupation)
376 CALL dbcsr_trace(dmat, trace)
377 IF (unit_nr > 0) THEN
378 WRITE (unit_nr, '(T2,A,I2,T66,F15.4)') 'Number of Electrons: Trace(Piao) Spin ', ispin, trace
379 END IF
380 CALL iao_charges(dmat, mcharge(:, ispin))
381 CALL dbcsr_release(dmat)
382 END DO
383 CALL print_atomic_charges(particle_set, qs_kind_set, unit_nr, "Intrinsic Atomic Orbital Charges", &
384 electronic_charges=mcharge)
385 DEALLOCATE (mcharge)
386 CALL cp_fm_release(ciao)
387 END IF
388 !
389 ! Deallocate the neighbor list structure
390 CALL release_neighbor_list_sets(srr_list)
391 CALL release_neighbor_list_sets(sro_list)
392 IF (ASSOCIATED(sref)) CALL dbcsr_deallocate_matrix_set(sref)
393 IF (ASSOCIATED(sro)) CALL dbcsr_deallocate_matrix_set(sro)
394 CALL cp_fm_release(p_ref_orb)
395 CALL cp_fm_release(p_orb_ref)
396 CALL cp_fm_release(cvec)
397 DEALLOCATE (orb_basis_set_list)
398 !
399 IF (iao_env%do_oce) THEN
400 ! generate OCE basis
401 IF (unit_nr > 0) THEN
402 WRITE (unit_nr, '(T2,A)') "IAO One-Center Expansion: OCE Basis Set"
403 END IF
404 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
405 nkind = SIZE(qs_kind_set)
406 ALLOCATE (oce_basis_set_list(nkind), orb_basis_set_list(nkind))
407 DO ikind = 1, nkind
408 qs_kind => qs_kind_set(ikind)
409 NULLIFY (orb_basis_set_list(ikind)%gto_basis_set)
410 NULLIFY (orbbasis)
411 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orbbasis, basis_type="ORB")
412 IF (ASSOCIATED(orbbasis)) orb_basis_set_list(ikind)%gto_basis_set => orbbasis
413 END DO
414 DO ikind = 1, nkind
415 orbbasis => orb_basis_set_list(ikind)%gto_basis_set
416 cpassert(ASSOCIATED(orbbasis))
417 NULLIFY (ocebasis)
418 CALL create_oce_basis(ocebasis, orbbasis, iao_env%lmax_oce, iao_env%nbas_oce)
419 CALL init_orb_basis_set(ocebasis)
420 CALL init_interaction_radii_orb_basis(ocebasis, dft_control%qs_control%eps_pgf_orb)
421 oce_basis_set_list(ikind)%gto_basis_set => ocebasis
422 IF (unit_nr > 0) THEN
423 qs_kind => qs_kind_set(ikind)
424 CALL get_qs_kind(qs_kind, zeff=zval, element_symbol=element_symbol)
425 CALL get_gto_basis_set(ocebasis, name=bname, nsgf=nsgf)
426 WRITE (unit_nr, '(T2,A,A,T14,A,I4,T40,A,A30)') "Kind: ", element_symbol, "NBasFun: ", nsgf, &
427 "OCE Basis: ", adjustl(trim(bname))
428 END IF
429 END DO
430 IF (unit_nr > 0) WRITE (unit_nr, *)
431 ! OCE basis overlap
432 ALLOCATE (smat_kind(nkind))
433 DO ikind = 1, nkind
434 ocebasis => oce_basis_set_list(ikind)%gto_basis_set
435 CALL get_gto_basis_set(gto_basis_set=ocebasis, nsgf=nsgf)
436 ALLOCATE (smat_kind(ikind)%array(nsgf, nsgf))
437 END DO
438 CALL oce_overlap_matrix(smat_kind, oce_basis_set_list)
439 ! overlap between IAO OCE basis and orbital basis
440 NULLIFY (sxo, sxo_list)
441 CALL setup_neighbor_list(sxo_list, oce_basis_set_list, orb_basis_set_list, qs_env=qs_env)
442 CALL get_qs_env(qs_env, ks_env=ks_env)
443 CALL build_overlap_matrix_simple(ks_env, sxo, &
444 oce_basis_set_list, orb_basis_set_list, sxo_list)
445 !
446 ! One Center Expansion of IAOs
447 CALL get_qs_env(qs_env=qs_env, natom=natom)
448 ALLOCATE (oce_atom(natom, nspin))
449 CALL iao_oce_expansion(qs_env, oce_basis_set_list, smat_kind, sxo, iao_coef, oce_atom, unit_nr)
450 !
451 DO ikind = 1, nkind
452 ocebasis => oce_basis_set_list(ikind)%gto_basis_set
453 CALL deallocate_gto_basis_set(ocebasis)
454 END DO
455 DEALLOCATE (oce_basis_set_list, orb_basis_set_list)
456 !
457 CALL release_neighbor_list_sets(sxo_list)
458 IF (ASSOCIATED(sxo)) CALL dbcsr_deallocate_matrix_set(sxo)
459 DO ikind = 1, nkind
460 DEALLOCATE (smat_kind(ikind)%array)
461 END DO
462 DEALLOCATE (smat_kind)
463 DO ispin = 1, nspin
464 DO iatom = 1, natom
465 DEALLOCATE (oce_atom(iatom, ispin)%array)
466 END DO
467 END DO
468 DEALLOCATE (oce_atom)
469 END IF
470 !
471 IF (molden_iao) THEN
472 ! Print basis functions: molden file
473 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
474 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
475 IF (unit_nr > 0) THEN
476 WRITE (unit_nr, '(T2,A)') ' Write IAO in MOLDEN Format'
477 END IF
478 ALLOCATE (mo_iao(nspin))
479 DO ispin = 1, nspin
480 CALL get_mo_set(my_mos(ispin), nao=nao)
481 CALL allocate_mo_set(mo_iao(ispin), nao, nref, nref, 0.0_dp, 1.0_dp, 0.0_dp)
482 CALL init_mo_set(mo_iao(ispin), fm_ref=iao_coef(ispin), name="iao_set")
483 CALL cp_fm_to_fm(iao_coef(ispin), mo_iao(ispin)%mo_coeff)
484 CALL set_mo_set(mo_iao(ispin), homo=nref)
485 mo_iao(ispin)%occupation_numbers = 1.0_dp
486 END DO
487 ! Print IAO basis functions: molden format
488 CALL write_mos_molden(mo_iao, qs_kind_set, particle_set, iao_molden_section)
489 DO ispin = 1, nspin
490 CALL deallocate_mo_set(mo_iao(ispin))
491 END DO
492 DEALLOCATE (mo_iao)
493 END IF
494 IF (cubes_iao) THEN
495 IF (unit_nr > 0) THEN
496 WRITE (unit_nr, '(T2,A)') ' Write IAO as CUBE Files'
497 END IF
498 ! Print basis functions: cube file
499 CALL print_iao_cubes(qs_env, iao_cubes_section, iao_coef, ref_basis_set_list)
500 END IF
501 !
502 ! Intrinsic bond orbitals
503 IF (iao_env%do_bondorbitals) THEN
504 IF (unit_nr > 0) THEN
505 WRITE (unit_nr, '(/,T2,A)') 'Intrinsic Bond Orbital Generation'
506 END IF
507 ! MOs in IAO basis -> ciao
508 ALLOCATE (ciao(nspin))
509 DO ispin = 1, nspin
510 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=norb)
511 CALL cp_fm_create(smo, mo_coeff%matrix_struct)
512 NULLIFY (fm_struct)
513 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, template_fmstruct=mo_coeff%matrix_struct)
514 CALL cp_fm_create(ciao(ispin), fm_struct)
515 CALL cp_fm_struct_release(fm_struct)
516 ! CIAO = A(T)*S*C
517 CALL cp_dbcsr_sm_fm_multiply(smat, mo_coeff, smo, ncol=norb)
518 CALL parallel_gemm('T', 'N', nref, norb, nao, 1.0_dp, iao_coef(ispin), smo, 0.0_dp, ciao(ispin))
519 CALL cp_fm_release(smo)
520 END DO
521 !
522 ! localize occupied orbitals nocc(ispin), see IAO generation
523 !
524 ALLOCATE (cloc(nspin), c_loc_orb(nspin))
525 DO ispin = 1, nspin
526 NULLIFY (fm_struct)
527 CALL cp_fm_struct_create(fm_struct, ncol_global=nocc(ispin), &
528 template_fmstruct=ciao(ispin)%matrix_struct)
529 CALL cp_fm_create(cloc(ispin), fm_struct)
530 CALL cp_fm_struct_release(fm_struct)
531 CALL cp_fm_to_fm(ciao(ispin), cloc(ispin), ncol=nocc(ispin))
532 END DO
533 CALL cp_fm_release(ciao)
534 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
535 ALLOCATE (first_sgf(natom), last_sgf(natom), nsgfat(natom))
536 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
537 CALL get_particle_set(particle_set, qs_kind_set, first_sgf=first_sgf, last_sgf=last_sgf, &
538 nsgf=nsgfat, basis=ref_basis_set_list)
539
540 IF (iao_env%loc_operator /= do_iaoloc_pm2) THEN
541 cpabort("IAO localization operator NYA")
542 END IF
543 IF (iao_env%eloc_function /= do_iaoloc_enone) THEN
544 cpabort("IAO energy weight localization NYA")
545 END IF
546
547 DO ispin = 1, nspin
548 nvec = nocc(ispin)
549 IF (nvec > 0) THEN
550 ALLOCATE (zij_atom(natom, 1), fdiag(nvec))
551 NULLIFY (fm_struct)
552 CALL cp_fm_struct_create(fm_struct, nrow_global=nvec, ncol_global=nvec, &
553 template_fmstruct=cloc(ispin)%matrix_struct)
554 DO iatom = 1, natom
555 CALL cp_fm_create(zij_atom(iatom, 1), fm_struct)
556 isgf = first_sgf(iatom)
557 CALL parallel_gemm('T', 'N', nvec, nvec, nsgfat(iatom), 1.0_dp, cloc(ispin), cloc(ispin), &
558 0.0_dp, zij_atom(iatom, 1), &
559 a_first_col=1, a_first_row=isgf, b_first_col=1, b_first_row=isgf)
560 END DO
561 CALL cp_fm_struct_release(fm_struct)
562 !
563 t1 = m_walltime()
564 order = 4
565 fin = 0.0_dp
566 DO iatom = 1, natom
567 CALL cp_fm_get_diag(zij_atom(iatom, 1), fdiag)
568 fin = fin + sum(fdiag**order)
569 END DO
570 fin = fin**(1._dp/order)
571 ! QR localization
572 CALL scdm_qrfact(cloc(ispin))
573 !
574 DO iatom = 1, natom
575 isgf = first_sgf(iatom)
576 CALL parallel_gemm('T', 'N', nvec, nvec, nsgfat(iatom), 1.0_dp, cloc(ispin), cloc(ispin), &
577 0.0_dp, zij_atom(iatom, 1), &
578 a_first_col=1, a_first_row=isgf, b_first_col=1, b_first_row=isgf)
579 END DO
580 fout = 0.0_dp
581 DO iatom = 1, natom
582 CALL cp_fm_get_diag(zij_atom(iatom, 1), fdiag)
583 fout = fout + sum(fdiag**order)
584 END DO
585 fout = fout**(1._dp/order)
586 DEALLOCATE (fdiag)
587 t2 = m_walltime()
588 IF (unit_nr > 0) THEN
589 WRITE (unit_nr, '(T2,A,F14.8,A,F14.8,A,F8.2)') &
590 'SCDM pre-localization: fin=', fin, " fout=", fout, " Time=", t2 - t1
591 END IF
592 !
593 CALL pm_localization(zij_atom, cloc(ispin), order, 1.e-12_dp, unit_nr)
594 !
595 CALL cp_fm_release(zij_atom)
596 CALL get_mo_set(my_mos(ispin), nao=nao)
597 NULLIFY (fm_struct)
598 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, &
599 template_fmstruct=cloc(ispin)%matrix_struct)
600 CALL cp_fm_create(c_loc_orb(ispin), fm_struct)
601 CALL cp_fm_struct_release(fm_struct)
602 CALL parallel_gemm('N', 'N', nao, nvec, nref, 1.0_dp, iao_coef(ispin), cloc(ispin), &
603 0.0_dp, c_loc_orb(ispin))
604 END IF
605 END DO
606 DEALLOCATE (first_sgf, last_sgf, nsgfat)
607 CALL cp_fm_release(cloc)
608 !
609 IF (iao_env%do_center) THEN
610 IF (unit_nr > 0) THEN
611 WRITE (unit_nr, '(T2,A)') ' Calculate Localized Orbital Centers and Spread'
612 IF (iao_env%pos_periodic) THEN
613 WRITE (unit_nr, '(T2,A)') ' Use Berry Phase Position Operator'
614 ELSE
615 WRITE (unit_nr, '(T2,A)') ' Use Local Position Operator'
616 END IF
617 END IF
618 nvec = maxval(nocc)
619 ! x y z m2(1) m2(2)
620 ALLOCATE (moments(5, nvec, nspin))
621 moments = 0.0_dp
622 IF (iao_env%pos_periodic) THEN
623 CALL center_spread_berry(qs_env, c_loc_orb, moments)
624 ELSE
625 CALL center_spread_loc(qs_env, c_loc_orb, moments)
626 END IF
627 !
628 IF (ASSOCIATED(ibo_cc_section)) THEN
629 CALL print_center_spread(moments, nocc, ibo_cc_section)
630 END IF
631 !
632 IF (PRESENT(bond_centers)) THEN
633 nx = SIZE(bond_centers, 1)
634 no = SIZE(bond_centers, 2)
635 ns = SIZE(bond_centers, 3)
636 cpassert(no >= nvec)
637 cpassert(ns == nspin)
638 cpassert(nx >= 3)
639 nx = min(nx, 5)
640 bond_centers(1:nx, 1:nvec, 1:ns) = moments(1:nx, 1:nvec, 1:ns)
641 END IF
642 DEALLOCATE (moments)
643 END IF
644 !
645 IF (molden_ibo) THEN
646 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
647 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
648 IF (unit_nr > 0) THEN
649 WRITE (unit_nr, '(T2,A)') ' Write IBO in MOLDEN Format'
650 END IF
651 ALLOCATE (mo_loc(nspin))
652 DO ispin = 1, nspin
653 CALL get_mo_set(my_mos(ispin), nao=nao)
654 nvec = nocc(ispin)
655 CALL allocate_mo_set(mo_loc(ispin), nao, nvec, nvec, 0.0_dp, 1.0_dp, 0.0_dp)
656 CALL init_mo_set(mo_loc(ispin), fm_ref=c_loc_orb(ispin), name="ibo_orb")
657 CALL cp_fm_to_fm(c_loc_orb(ispin), mo_loc(ispin)%mo_coeff)
658 CALL set_mo_set(mo_loc(ispin), homo=nvec)
659 mo_loc(ispin)%occupation_numbers = 1.0_dp
660 END DO
661 ! Print IBO functions: molden format
662 CALL write_mos_molden(mo_loc, qs_kind_set, particle_set, ibo_molden_section)
663 DO ispin = 1, nspin
664 CALL deallocate_mo_set(mo_loc(ispin))
665 END DO
666 DEALLOCATE (mo_loc)
667 END IF
668 !
669 IF (cubes_ibo) THEN
670 IF (unit_nr > 0) THEN
671 WRITE (unit_nr, '(T2,A)') ' Write IBO on CUBE files'
672 END IF
673 ! Print localized orbital functions: cube file
674 CALL print_ibo_cubes(qs_env, ibo_cubes_section, c_loc_orb)
675 END IF
676 !
677 IF (PRESENT(mos) .AND. ALLOCATED(c_loc_orb)) THEN
678 ! c_loc_orb -> mos
679 DO ispin = 1, nspin
680 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
681 nvec = nocc(ispin)
682 CALL cp_fm_to_fm(c_loc_orb(ispin), mo_coeff, ncol=nvec)
683 END DO
684 END IF
685 CALL cp_fm_release(c_loc_orb)
686 END IF
687 DEALLOCATE (ref_basis_set_list)
688
689 IF (PRESENT(c_iao_coef)) THEN
690 CALL cp_fm_release(c_iao_coef)
691 ALLOCATE (c_iao_coef(nspin))
692 DO ispin = 1, nspin
693 CALL cp_fm_create(c_iao_coef(ispin), iao_coef(ispin)%matrix_struct)
694 CALL cp_fm_to_fm(iao_coef(ispin), c_iao_coef(ispin))
695 END DO
696 END IF
697 CALL cp_fm_release(iao_coef)
698
699 IF (unit_nr > 0) THEN
700 WRITE (unit_nr, '(T2,A)') &
701 '!----------------------------END OF IAO ANALYSIS------------------------------!'
702 END IF
703
704 CALL timestop(handle)
705
706 END SUBROUTINE iao_wfn_analysis
707
708! **************************************************************************************************
709!> \brief Computes projector matrices for ref to orb basis and reverse
710!> \param smat ...
711!> \param sref ...
712!> \param s_r_o ...
713!> \param p_o_r ...
714!> \param p_r_o ...
715!> \param eps_svd ...
716! **************************************************************************************************
717 SUBROUTINE iao_projectors(smat, sref, s_r_o, p_o_r, p_r_o, eps_svd)
718 TYPE(dbcsr_type), INTENT(INOUT) :: smat, sref, s_r_o
719 TYPE(cp_fm_type), INTENT(INOUT) :: p_o_r, p_r_o
720 REAL(kind=dp), INTENT(IN) :: eps_svd
721
722 CHARACTER(len=*), PARAMETER :: routinen = 'iao_projectors'
723
724 INTEGER :: handle, norb, nref
725 TYPE(cp_fm_struct_type), POINTER :: fm_struct
726 TYPE(cp_fm_type) :: fm_inv, fm_s, fm_sro
727
728 CALL timeset(routinen, handle)
729
730 CALL cp_fm_get_info(p_r_o, nrow_global=nref, ncol_global=norb)
731 CALL cp_fm_create(fm_sro, p_r_o%matrix_struct)
732 CALL copy_dbcsr_to_fm(s_r_o, fm_sro)
733
734 NULLIFY (fm_struct)
735 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=norb, &
736 template_fmstruct=p_r_o%matrix_struct)
737 CALL cp_fm_create(fm_s, fm_struct, name="smat")
738 CALL cp_fm_create(fm_inv, fm_struct, name="sinv")
739 CALL cp_fm_struct_release(fm_struct)
740 CALL copy_dbcsr_to_fm(smat, fm_s)
741 CALL cp_fm_invert(fm_s, fm_inv, eps_svd=eps_svd)
742 CALL parallel_gemm('N', 'T', norb, nref, norb, 1.0_dp, fm_inv, fm_sro, 0.0_dp, p_o_r)
743 CALL cp_fm_release(fm_s)
744 CALL cp_fm_release(fm_inv)
745
746 NULLIFY (fm_struct)
747 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, ncol_global=nref, &
748 template_fmstruct=p_r_o%matrix_struct)
749 CALL cp_fm_create(fm_s, fm_struct, name="sref")
750 CALL cp_fm_create(fm_inv, fm_struct, name="sinv")
751 CALL cp_fm_struct_release(fm_struct)
752 CALL copy_dbcsr_to_fm(sref, fm_s)
753 CALL cp_fm_invert(fm_s, fm_inv, eps_svd=eps_svd)
754 CALL parallel_gemm('N', 'N', nref, norb, nref, 1.0_dp, fm_inv, fm_sro, 0.0_dp, p_r_o)
755 CALL cp_fm_release(fm_s)
756 CALL cp_fm_release(fm_inv)
757
758 CALL cp_fm_release(fm_sro)
759
760 CALL timestop(handle)
761
762 END SUBROUTINE iao_projectors
763
764! **************************************************************************************************
765!> \brief Computes intrinsic orbitals for a given MO vector set
766!> \param smat ...
767!> \param p_o_r ...
768!> \param p_r_o ...
769!> \param cvec ...
770!> \param avec ...
771! **************************************************************************************************
772 SUBROUTINE intrinsic_ao_calc(smat, p_o_r, p_r_o, cvec, avec)
773 TYPE(dbcsr_type), INTENT(INOUT) :: smat
774 TYPE(cp_fm_type), INTENT(INOUT) :: p_o_r, p_r_o, cvec, avec
775
776 CHARACTER(len=*), PARAMETER :: routinen = 'intrinsic_ao_calc'
777
778 INTEGER :: handle, nao, norb, nref
779 TYPE(cp_fm_struct_type), POINTER :: fm_struct
780 TYPE(cp_fm_type) :: ctvec, pc, sc, sct, vec1
781
782 CALL timeset(routinen, handle)
783
784 ! number of orbitals
785 CALL cp_fm_get_info(cvec, ncol_global=norb)
786 ! basis set sizes
787 CALL cp_fm_get_info(p_r_o, nrow_global=nref, ncol_global=nao)
788 ! temp array
789 NULLIFY (fm_struct)
790 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, ncol_global=norb, &
791 template_fmstruct=cvec%matrix_struct)
792 CALL cp_fm_create(pc, fm_struct)
793 CALL cp_fm_struct_release(fm_struct)
794 ! CT = orth(Por.Pro.C)
795 CALL parallel_gemm('N', 'N', nref, norb, nao, 1.0_dp, p_r_o, cvec, 0.0_dp, pc)
796 CALL cp_fm_create(ctvec, cvec%matrix_struct)
797 CALL parallel_gemm('N', 'N', nao, norb, nref, 1.0_dp, p_o_r, pc, 0.0_dp, ctvec)
798 CALL cp_fm_release(pc)
799 CALL make_basis_lowdin(ctvec, norb, smat)
800 ! S*C and S*CT
801 CALL cp_fm_create(sc, cvec%matrix_struct)
802 CALL cp_dbcsr_sm_fm_multiply(smat, cvec, sc, ncol=norb)
803 CALL cp_fm_create(sct, cvec%matrix_struct)
804 CALL cp_dbcsr_sm_fm_multiply(smat, ctvec, sct, ncol=norb)
805 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=nref, &
806 template_fmstruct=cvec%matrix_struct)
807 CALL cp_fm_create(pc, fm_struct)
808 CALL cp_fm_struct_release(fm_struct)
809 ! V1 = (CT*SCT(T))Por
810 CALL parallel_gemm('T', 'N', norb, nref, nao, 1.0_dp, sct, p_o_r, 0.0_dp, pc)
811 NULLIFY (fm_struct)
812 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nref, &
813 template_fmstruct=cvec%matrix_struct)
814 CALL cp_fm_create(vec1, fm_struct)
815 CALL cp_fm_struct_release(fm_struct)
816 CALL parallel_gemm('N', 'N', nao, nref, norb, 1.0_dp, ctvec, pc, 0.0_dp, vec1)
817 ! A = C*SC(T)*V1
818 CALL parallel_gemm('T', 'N', norb, nref, nao, 1.0_dp, sc, vec1, 0.0_dp, pc)
819 CALL parallel_gemm('N', 'N', nao, nref, norb, 1.0_dp, cvec, pc, 0.0_dp, avec)
820 ! V1 = Por - V1
821 CALL cp_fm_geadd(1.0_dp, 'N', p_o_r, -1.0_dp, vec1)
822 ! A = A + V1
823 CALL cp_fm_geadd(1.0_dp, 'N', vec1, 1.0_dp, avec)
824 ! A = A - C*SC(T)*V1
825 CALL parallel_gemm('T', 'N', norb, nref, nao, 1.0_dp, sc, vec1, 0.0_dp, pc)
826 CALL parallel_gemm('N', 'N', nao, nref, norb, -1.0_dp, cvec, pc, 1.0_dp, avec)
827 ! A = orth(A)
828 CALL make_basis_lowdin(avec, nref, smat)
829
830 ! clean up
831 CALL cp_fm_release(pc)
832 CALL cp_fm_release(vec1)
833 CALL cp_fm_release(sc)
834 CALL cp_fm_release(sct)
835 CALL cp_fm_release(ctvec)
836
837 CALL timestop(handle)
838
839 END SUBROUTINE intrinsic_ao_calc
840
841! **************************************************************************************************
842!> \brief Calculate the density matrix from fm vectors using occupation numbers
843!> \param cvec ...
844!> \param density_matrix ...
845!> \param occupation ...
846!> \param uniform_occupation ...
847! **************************************************************************************************
848 SUBROUTINE iao_calculate_dmat_diag(cvec, density_matrix, occupation, uniform_occupation)
849
850 TYPE(cp_fm_type), INTENT(IN) :: cvec
851 TYPE(dbcsr_type) :: density_matrix
852 REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: occupation
853 LOGICAL, INTENT(IN) :: uniform_occupation
854
855 CHARACTER(len=*), PARAMETER :: routineN = 'iao_calculate_dmat_diag'
856
857 INTEGER :: handle, ncol
858 REAL(KIND=dp) :: alpha
859 TYPE(cp_fm_type) :: fm_tmp
860
861 CALL timeset(routinen, handle)
862
863 CALL dbcsr_set(density_matrix, 0.0_dp)
864
865 CALL cp_fm_get_info(cvec, ncol_global=ncol)
866 IF (.NOT. uniform_occupation) THEN
867 CALL cp_fm_create(fm_tmp, cvec%matrix_struct)
868 CALL cp_fm_to_fm(cvec, fm_tmp)
869 CALL cp_fm_column_scale(fm_tmp, occupation(1:ncol))
870 alpha = 1.0_dp
871 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=density_matrix, &
872 matrix_v=cvec, matrix_g=fm_tmp, &
873 ncol=ncol, alpha=alpha)
874 CALL cp_fm_release(fm_tmp)
875 ELSE
876 alpha = occupation(1)
877 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=density_matrix, &
878 matrix_v=cvec, ncol=ncol, alpha=alpha)
879 END IF
880
881 CALL timestop(handle)
882
883 END SUBROUTINE iao_calculate_dmat_diag
884
885! **************************************************************************************************
886!> \brief Calculate the density matrix from fm vectors using an occupation matrix
887!> \param cvec ...
888!> \param density_matrix ...
889!> \param weight ...
890!> \param occmat ...
891! **************************************************************************************************
892 SUBROUTINE iao_calculate_dmat_full(cvec, density_matrix, weight, occmat)
893
894 TYPE(cp_fm_type), INTENT(IN) :: cvec
895 TYPE(dbcsr_type) :: density_matrix
896 REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: weight
897 TYPE(cp_fm_type), INTENT(IN) :: occmat
898
899 CHARACTER(len=*), PARAMETER :: routinen = 'iao_calculate_dmat_full'
900
901 INTEGER :: handle, ic, jc, ncol
902 REAL(kind=dp) :: alpha
903 TYPE(cp_fm_struct_type), POINTER :: fm_struct
904 TYPE(cp_fm_type) :: fm1, fm2
905
906 CALL timeset(routinen, handle)
907
908 CALL dbcsr_set(density_matrix, 0.0_dp)
909
910 CALL cp_fm_struct_create(fm_struct, ncol_global=1, &
911 template_fmstruct=cvec%matrix_struct)
912 CALL cp_fm_create(fm1, fm_struct)
913 CALL cp_fm_create(fm2, fm_struct)
914 CALL cp_fm_struct_release(fm_struct)
915
916 CALL cp_fm_get_info(cvec, ncol_global=ncol)
917 DO ic = 1, ncol
918 CALL cp_fm_to_fm(cvec, fm1, ncol=1, source_start=ic, target_start=1)
919 DO jc = 1, ncol
920 CALL cp_fm_to_fm(cvec, fm2, ncol=1, source_start=jc, target_start=1)
921 CALL cp_fm_get_element(occmat, ic, jc, alpha)
922 alpha = weight(ic)*alpha
923 CALL cp_dbcsr_plus_fm_fm_t(density_matrix, fm1, fm2, ncol=1, &
924 alpha=alpha, symmetry_mode=1)
925 END DO
926 END DO
927 CALL cp_fm_release(fm1)
928 CALL cp_fm_release(fm2)
929
930 CALL timestop(handle)
931
932 END SUBROUTINE iao_calculate_dmat_full
933
934! **************************************************************************************************
935!> \brief compute the atomic charges (orthogonal basis)
936!> \param p_matrix ...
937!> \param charges ...
938! **************************************************************************************************
939 SUBROUTINE iao_charges(p_matrix, charges)
940 TYPE(dbcsr_type) :: p_matrix
941 REAL(kind=dp), DIMENSION(:) :: charges
942
943 INTEGER :: blk, group_handle, i, iblock_col, &
944 iblock_row
945 REAL(kind=dp) :: trace
946 REAL(kind=dp), DIMENSION(:, :), POINTER :: p_block
947 TYPE(dbcsr_iterator_type) :: iter
948 TYPE(mp_comm_type) :: group
949
950 charges = 0.0_dp
951
952 CALL dbcsr_iterator_start(iter, p_matrix)
953 DO WHILE (dbcsr_iterator_blocks_left(iter))
954 NULLIFY (p_block)
955 CALL dbcsr_iterator_next_block(iter, iblock_row, iblock_col, p_block, blk)
956 cpassert(iblock_row == iblock_col)
957 trace = 0.0_dp
958 DO i = 1, SIZE(p_block, 1)
959 trace = trace + p_block(i, i)
960 END DO
961 charges(iblock_row) = trace
962 END DO
963 CALL dbcsr_iterator_stop(iter)
964
965 CALL dbcsr_get_info(p_matrix, group=group_handle)
966 CALL group%set_handle(group_handle)
967
968 CALL group%sum(charges)
969
970 END SUBROUTINE iao_charges
971
972! **************************************************************************************************
973!> \brief Computes and prints the Cube Files for the intrinsic atomic orbitals
974!> \param qs_env ...
975!> \param print_section ...
976!> \param iao_coef ...
977!> \param basis_set_list ...
978! **************************************************************************************************
979 SUBROUTINE print_iao_cubes(qs_env, print_section, iao_coef, basis_set_list)
980 TYPE(qs_environment_type), POINTER :: qs_env
981 TYPE(section_vals_type), POINTER :: print_section
982 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: iao_coef
983 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_list
984
985 CHARACTER(LEN=default_path_length) :: filename, title
986 INTEGER :: i, i_rep, ispin, ivec, iw, j, n_rep, &
987 nat, natom, norb, nspins, nstart
988 INTEGER, DIMENSION(:), POINTER :: atom_list, blk_sizes, first_bas, stride
989 LOGICAL :: mpi_io
990 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
991 TYPE(cell_type), POINTER :: cell
992 TYPE(cp_logger_type), POINTER :: logger
993 TYPE(dft_control_type), POINTER :: dft_control
994 TYPE(particle_list_type), POINTER :: particles
995 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
996 TYPE(pw_c1d_gs_type) :: wf_g
997 TYPE(pw_env_type), POINTER :: pw_env
998 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
999 TYPE(pw_r3d_rs_type) :: wf_r
1000 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1001 TYPE(qs_subsys_type), POINTER :: subsys
1002
1003 logger => cp_get_default_logger()
1004 stride => section_get_ivals(print_section, "STRIDE")
1005 CALL section_vals_val_get(print_section, "ATOM_LIST", n_rep_val=n_rep)
1006
1007 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1008 subsys=subsys, cell=cell, particle_set=particle_set, pw_env=pw_env, dft_control=dft_control)
1009 CALL qs_subsys_get(subsys, particles=particles)
1010
1011 CALL get_qs_env(qs_env=qs_env, natom=natom)
1012 ALLOCATE (blk_sizes(natom), first_bas(0:natom))
1013 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_sizes, basis=basis_set_list)
1014 first_bas(0) = 0
1015 DO i = 1, natom
1016 first_bas(i) = first_bas(i - 1) + blk_sizes(i)
1017 END DO
1018
1019 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1020 CALL auxbas_pw_pool%create_pw(wf_r)
1021 CALL auxbas_pw_pool%create_pw(wf_g)
1022
1023 nspins = SIZE(iao_coef)
1024 nstart = min(1, n_rep)
1025
1026 DO ispin = 1, nspins
1027 DO i_rep = nstart, n_rep
1028 CALL cp_fm_get_info(iao_coef(ispin), ncol_global=norb)
1029 IF (i_rep == 0) THEN
1030 nat = natom
1031 ELSE
1032 CALL section_vals_val_get(print_section, "ATOM_LIST", i_rep_val=i_rep, i_vals=atom_list)
1033 nat = SIZE(atom_list)
1034 END IF
1035 DO i = 1, nat
1036 IF (i_rep == 0) THEN
1037 j = i
1038 ELSE
1039 j = atom_list(i)
1040 END IF
1041 cpassert(j >= 1 .AND. j <= natom)
1042 DO ivec = first_bas(j - 1) + 1, first_bas(j)
1043 WRITE (filename, '(a4,I5.5,a1,I1.1)') "IAO_", ivec, "_", ispin
1044 WRITE (title, *) "Intrinsic Atomic Orbitals ", ivec, " atom ", j, " spin ", ispin
1045 mpi_io = .true.
1046 iw = cp_print_key_unit_nr(logger, print_section, "", extension=".cube", &
1047 middle_name=trim(filename), file_position="REWIND", log_filename=.false., &
1048 mpi_io=mpi_io)
1049 CALL calculate_wavefunction(iao_coef(ispin), ivec, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1050 cell, dft_control, particle_set, pw_env)
1051 CALL cp_pw_to_cube(wf_r, iw, title, particles=particles, stride=stride, mpi_io=mpi_io)
1052 CALL cp_print_key_finished_output(iw, logger, print_section, "", mpi_io=mpi_io)
1053 END DO
1054 END DO
1055 END DO
1056 END DO
1057 DEALLOCATE (blk_sizes, first_bas)
1058 CALL auxbas_pw_pool%give_back_pw(wf_r)
1059 CALL auxbas_pw_pool%give_back_pw(wf_g)
1060
1061 END SUBROUTINE print_iao_cubes
1062
1063! **************************************************************************************************
1064!> \brief Computes and prints the Cube Files for the intrinsic bond orbitals
1065!> \param qs_env ...
1066!> \param print_section ...
1067!> \param ibo_coef ...
1068! **************************************************************************************************
1069 SUBROUTINE print_ibo_cubes(qs_env, print_section, ibo_coef)
1070 TYPE(qs_environment_type), POINTER :: qs_env
1071 TYPE(section_vals_type), POINTER :: print_section
1072 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: ibo_coef
1073
1074 CHARACTER(LEN=default_path_length) :: filename, title
1075 INTEGER :: i, i_rep, ispin, iw, j, n_rep, norb, &
1076 nspins, nstart, nstate
1077 INTEGER, DIMENSION(:), POINTER :: state_list, stride
1078 LOGICAL :: mpi_io
1079 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1080 TYPE(cell_type), POINTER :: cell
1081 TYPE(cp_logger_type), POINTER :: logger
1082 TYPE(dft_control_type), POINTER :: dft_control
1083 TYPE(particle_list_type), POINTER :: particles
1084 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1085 TYPE(pw_c1d_gs_type) :: wf_g
1086 TYPE(pw_env_type), POINTER :: pw_env
1087 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1088 TYPE(pw_r3d_rs_type) :: wf_r
1089 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1090 TYPE(qs_subsys_type), POINTER :: subsys
1091
1092 cpassert(ASSOCIATED(print_section))
1093
1094 logger => cp_get_default_logger()
1095 stride => section_get_ivals(print_section, "STRIDE")
1096 CALL section_vals_val_get(print_section, "STATE_LIST", n_rep_val=n_rep)
1097
1098 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1099 subsys=subsys, cell=cell, particle_set=particle_set, pw_env=pw_env, dft_control=dft_control)
1100 CALL qs_subsys_get(subsys, particles=particles)
1101
1102 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1103 CALL auxbas_pw_pool%create_pw(wf_r)
1104 CALL auxbas_pw_pool%create_pw(wf_g)
1105
1106 nspins = SIZE(ibo_coef)
1107 nstart = min(1, n_rep)
1108
1109 DO ispin = 1, nspins
1110 DO i_rep = nstart, n_rep
1111 CALL cp_fm_get_info(ibo_coef(ispin), ncol_global=norb)
1112 IF (i_rep == 0) THEN
1113 nstate = norb
1114 ELSE
1115 CALL section_vals_val_get(print_section, "STATE_LIST", i_rep_val=i_rep, i_vals=state_list)
1116 nstate = SIZE(state_list)
1117 END IF
1118 DO i = 1, nstate
1119 IF (i_rep == 0) THEN
1120 j = i
1121 ELSE
1122 j = state_list(i)
1123 END IF
1124 cpassert(j >= 1 .AND. j <= norb)
1125 WRITE (filename, '(a4,I5.5,a1,I1.1)') "IBO_", j, "_", ispin
1126 WRITE (title, *) "Intrinsic Atomic Orbitals ", j, " spin ", ispin
1127 mpi_io = .true.
1128 iw = cp_print_key_unit_nr(logger, print_section, "", extension=".cube", &
1129 middle_name=trim(filename), file_position="REWIND", log_filename=.false., &
1130 mpi_io=mpi_io)
1131 CALL calculate_wavefunction(ibo_coef(ispin), j, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1132 cell, dft_control, particle_set, pw_env)
1133 CALL cp_pw_to_cube(wf_r, iw, title, particles=particles, stride=stride, mpi_io=mpi_io)
1134 CALL cp_print_key_finished_output(iw, logger, print_section, "", mpi_io=mpi_io)
1135 END DO
1136 END DO
1137 END DO
1138
1139 CALL auxbas_pw_pool%give_back_pw(wf_r)
1140 CALL auxbas_pw_pool%give_back_pw(wf_g)
1141
1142 END SUBROUTINE print_ibo_cubes
1143
1144! **************************************************************************************************
1145!> \brief prints charge center and spreads for all orbitals
1146!> \param moments ...
1147!> \param nocc ...
1148!> \param print_section ...
1149!> \param iounit ...
1150! **************************************************************************************************
1151 SUBROUTINE print_center_spread(moments, nocc, print_section, iounit)
1152 REAL(kind=dp), DIMENSION(:, :, :), INTENT(IN) :: moments
1153 INTEGER, DIMENSION(:), INTENT(IN) :: nocc
1154 TYPE(section_vals_type), OPTIONAL, POINTER :: print_section
1155 INTEGER, INTENT(IN), OPTIONAL :: iounit
1156
1157 CHARACTER(LEN=default_path_length) :: filename
1158 INTEGER :: is, ispin, iw, nspin
1159 TYPE(cp_logger_type), POINTER :: logger
1160
1161 logger => cp_get_default_logger()
1162 nspin = SIZE(moments, 3)
1163
1164 IF (PRESENT(print_section)) THEN
1165 WRITE (filename, '(A18,I1.1)') "IBO_CENTERS_SPREAD"
1166 iw = cp_print_key_unit_nr(logger, print_section, "", extension=".csp", &
1167 middle_name=trim(filename), file_position="REWIND", log_filename=.false.)
1168 ELSEIF (PRESENT(iounit)) THEN
1169 iw = iounit
1170 ELSE
1171 iw = -1
1172 END IF
1173 IF (iw > 0) THEN
1174 DO ispin = 1, nspin
1175 WRITE (iw, "(T2,A,i1)") "Intrinsic Bond Orbitals: Centers and Spread for Spin ", ispin
1176 WRITE (iw, "(A7,T30,A6,T68,A7)") "State", "Center", "Spreads"
1177 DO is = 1, nocc(ispin)
1178 WRITE (iw, "(i7,3F15.8,8X,2F10.5)") is, moments(:, is, ispin)
1179 END DO
1180 END DO
1181 END IF
1182 IF (PRESENT(print_section)) THEN
1183 CALL cp_print_key_finished_output(iw, logger, print_section, "")
1184 END IF
1185
1186 END SUBROUTINE print_center_spread
1187
1188! **************************************************************************************************
1189!> \brief ...
1190!> \param qs_env ...
1191!> \param c_loc_orb ...
1192!> \param moments ...
1193! **************************************************************************************************
1194 SUBROUTINE center_spread_loc(qs_env, c_loc_orb, moments)
1195 TYPE(qs_environment_type), POINTER :: qs_env
1196 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: c_loc_orb
1197 REAL(kind=dp), DIMENSION(:, :, :), INTENT(INOUT) :: moments
1198
1199 CHARACTER(len=*), PARAMETER :: routinen = 'center_spread_loc'
1200 INTEGER, DIMENSION(6), PARAMETER :: list = (/1, 2, 3, 4, 7, 9/)
1201
1202 INTEGER :: handle, i, iop, iorb, ispin, nao, norb, &
1203 nspin
1204 REAL(kind=dp) :: xmii
1205 REAL(kind=dp), DIMENSION(3) :: rpoint
1206 TYPE(cell_type), POINTER :: cell
1207 TYPE(cp_fm_struct_type), POINTER :: fm_struct
1208 TYPE(cp_fm_type) :: ccmat, ocvec
1209 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: dipmat
1210 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
1211 TYPE(dbcsr_type), POINTER :: omat, smat
1212
1213 CALL timeset(routinen, handle)
1214
1215 CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s)
1216 smat => matrix_s(1, 1)%matrix
1217 rpoint = 0.0_dp
1218 nspin = SIZE(c_loc_orb)
1219 moments = 0.0_dp
1220
1221 ALLOCATE (dipmat(9))
1222 DO i = 1, 9
1223 ALLOCATE (dipmat(i)%matrix)
1224 CALL dbcsr_copy(dipmat(i)%matrix, smat)
1225 CALL dbcsr_set(dipmat(i)%matrix, 0.0_dp)
1226 END DO
1227
1228 CALL build_local_moment_matrix(qs_env, dipmat, 2, rpoint)
1229
1230 DO ispin = 1, nspin
1231 CALL cp_fm_get_info(c_loc_orb(ispin), nrow_global=nao, ncol_global=norb)
1232 CALL cp_fm_create(ocvec, c_loc_orb(ispin)%matrix_struct)
1233 NULLIFY (fm_struct)
1234 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=norb, &
1235 template_fmstruct=c_loc_orb(ispin)%matrix_struct)
1236 CALL cp_fm_create(ccmat, fm_struct)
1237 CALL cp_fm_struct_release(fm_struct)
1238 DO i = 1, 6
1239 iop = list(i)
1240 omat => dipmat(iop)%matrix
1241 CALL cp_dbcsr_sm_fm_multiply(omat, c_loc_orb(ispin), ocvec, ncol=norb)
1242 CALL parallel_gemm('T', 'N', norb, norb, nao, 1.0_dp, c_loc_orb(ispin), ocvec, &
1243 0.0_dp, ccmat)
1244 DO iorb = 1, norb
1245 CALL cp_fm_get_element(ccmat, iorb, iorb, xmii)
1246 IF (iop <= 3) THEN
1247 moments(iop, iorb, ispin) = moments(iop, iorb, ispin) + xmii
1248 moments(4, iorb, ispin) = moments(4, iorb, ispin) - xmii**2
1249 ELSE
1250 moments(4, iorb, ispin) = moments(4, iorb, ispin) + xmii
1251 END IF
1252 END DO
1253 END DO
1254 CALL cp_fm_release(ocvec)
1255 CALL cp_fm_release(ccmat)
1256 END DO
1257
1258 DO i = 1, 9
1259 CALL dbcsr_release(dipmat(i)%matrix)
1260 DEALLOCATE (dipmat(i)%matrix)
1261 END DO
1262 DEALLOCATE (dipmat)
1263
1264 CALL get_qs_env(qs_env=qs_env, cell=cell)
1265 DO ispin = 1, nspin
1266 DO iorb = 1, norb
1267 moments(1:3, iorb, ispin) = pbc(moments(1:3, iorb, ispin), cell)
1268 END DO
1269 END DO
1270
1271 CALL timestop(handle)
1272
1273 END SUBROUTINE center_spread_loc
1274
1275! **************************************************************************************************
1276!> \brief ...
1277!> \param qs_env ...
1278!> \param c_loc_orb ...
1279!> \param moments ...
1280! **************************************************************************************************
1281 SUBROUTINE center_spread_berry(qs_env, c_loc_orb, moments)
1282 TYPE(qs_environment_type), POINTER :: qs_env
1283 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: c_loc_orb
1284 REAL(kind=dp), DIMENSION(:, :, :), INTENT(INOUT) :: moments
1285
1286 CHARACTER(len=*), PARAMETER :: routinen = 'center_spread_berry'
1287
1288 COMPLEX(KIND=dp) :: z
1289 INTEGER :: dim_op, handle, i, idir, ispin, istate, &
1290 j, jdir, nao, norb, nspin
1291 REAL(dp), DIMENSION(3) :: c, cpbc
1292 REAL(dp), DIMENSION(6) :: weights
1293 REAL(kind=dp) :: imagpart, realpart, spread_i, spread_ii
1294 TYPE(cell_type), POINTER :: cell
1295 TYPE(cp_fm_struct_type), POINTER :: fm_struct
1296 TYPE(cp_fm_type) :: opvec
1297 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: zij
1298 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
1299 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: op_sm_set
1300
1301 CALL timeset(routinen, handle)
1302
1303 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, cell=cell)
1304
1305 IF (cell%orthorhombic) THEN
1306 dim_op = 3
1307 ELSE
1308 dim_op = 6
1309 END IF
1310 ALLOCATE (op_sm_set(2, dim_op))
1311 DO i = 1, dim_op
1312 DO j = 1, 2
1313 NULLIFY (op_sm_set(j, i)%matrix)
1314 ALLOCATE (op_sm_set(j, i)%matrix)
1315 CALL dbcsr_copy(op_sm_set(j, i)%matrix, matrix_s(1)%matrix)
1316 CALL dbcsr_set(op_sm_set(j, i)%matrix, 0.0_dp)
1317 END DO
1318 END DO
1319 CALL initialize_weights(cell, weights)
1320
1321 CALL compute_berry_operator(qs_env, cell, op_sm_set, dim_op)
1322
1323 nspin = SIZE(c_loc_orb, 1)
1324 DO ispin = 1, nspin
1325 CALL cp_fm_get_info(c_loc_orb(ispin), nrow_global=nao, ncol_global=norb)
1326 CALL cp_fm_create(opvec, c_loc_orb(ispin)%matrix_struct)
1327 NULLIFY (fm_struct)
1328 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=norb, &
1329 template_fmstruct=c_loc_orb(ispin)%matrix_struct)
1330 ALLOCATE (zij(2, dim_op))
1331
1332 ! Compute zij here
1333 DO i = 1, dim_op
1334 DO j = 1, 2
1335 CALL cp_fm_create(zij(j, i), fm_struct)
1336 CALL cp_fm_set_all(zij(j, i), 0.0_dp)
1337 CALL cp_dbcsr_sm_fm_multiply(op_sm_set(j, i)%matrix, c_loc_orb(ispin), opvec, ncol=norb)
1338 CALL parallel_gemm("T", "N", norb, norb, nao, 1.0_dp, c_loc_orb(ispin), opvec, 0.0_dp, zij(j, i))
1339 END DO
1340 END DO
1341
1342 CALL cp_fm_struct_release(fm_struct)
1343 CALL cp_fm_release(opvec)
1344
1345 DO istate = 1, norb
1346 c = 0.0_dp
1347 spread_i = 0.0_dp
1348 spread_ii = 0.0_dp
1349 DO jdir = 1, dim_op
1350 CALL cp_fm_get_element(zij(1, jdir), istate, istate, realpart)
1351 CALL cp_fm_get_element(zij(2, jdir), istate, istate, imagpart)
1352 z = cmplx(realpart, imagpart, dp)
1353 spread_i = spread_i - weights(jdir)* &
1354 log(realpart*realpart + imagpart*imagpart)/twopi/twopi
1355 spread_ii = spread_ii + weights(jdir)* &
1356 (1.0_dp - (realpart*realpart + imagpart*imagpart))/twopi/twopi
1357 IF (jdir < 4) THEN
1358 DO idir = 1, 3
1359 c(idir) = c(idir) + &
1360 (cell%hmat(idir, jdir)/twopi)*aimag(log(z))
1361 END DO
1362 END IF
1363 END DO
1364 cpbc = pbc(c, cell)
1365 moments(1:3, istate, ispin) = cpbc(1:3)
1366 moments(4, istate, ispin) = spread_i
1367 moments(5, istate, ispin) = spread_ii
1368 END DO
1369
1370 CALL cp_fm_release(zij)
1371
1372 END DO
1373
1374 DO i = 1, dim_op
1375 DO j = 1, 2
1376 CALL dbcsr_release(op_sm_set(j, i)%matrix)
1377 DEALLOCATE (op_sm_set(j, i)%matrix)
1378 END DO
1379 END DO
1380 DEALLOCATE (op_sm_set)
1381
1382 CALL timestop(handle)
1383
1384 END SUBROUTINE center_spread_berry
1385
1386! **************************************************************************************************
1387!> \brief ...
1388!> \param qs_env ...
1389!> \param oce_basis_set_list ...
1390!> \param smat_kind ...
1391!> \param sxo ...
1392!> \param iao_coef ...
1393!> \param oce_atom ...
1394!> \param unit_nr ...
1395! **************************************************************************************************
1396 SUBROUTINE iao_oce_expansion(qs_env, oce_basis_set_list, smat_kind, sxo, iao_coef, oce_atom, unit_nr)
1397 TYPE(qs_environment_type), POINTER :: qs_env
1398 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: oce_basis_set_list
1399 TYPE(cp_2d_r_p_type), DIMENSION(:) :: smat_kind
1400 TYPE(dbcsr_p_type), DIMENSION(:) :: sxo
1401 TYPE(cp_fm_type), DIMENSION(:) :: iao_coef
1402 TYPE(cp_2d_r_p_type), DIMENSION(:, :) :: oce_atom
1403 INTEGER, INTENT(IN) :: unit_nr
1404
1405 CHARACTER(len=*), PARAMETER :: routinen = 'iao_oce_expansion'
1406
1407 INTEGER :: handle, i, i1, i2, iao, iatom, ikind, &
1408 iset, ishell, ispin, l, m, maxl, n, &
1409 natom, nkind, noce, ns, nset, nsgf, &
1410 nspin, para_group_handle
1411 INTEGER, DIMENSION(:), POINTER :: iao_blk_sizes, nshell, oce_blk_sizes, &
1412 orb_blk_sizes
1413 INTEGER, DIMENSION(:, :), POINTER :: first_sgf, last_sgf, lval
1414 LOGICAL :: found
1415 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ev, vector
1416 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: amat, bmat, filter, oce_comp, prol, vec
1417 REAL(kind=dp), DIMENSION(:, :), POINTER :: ablock
1418 TYPE(cp_2d_r_p_type), ALLOCATABLE, DIMENSION(:) :: sinv_kind
1419 TYPE(dbcsr_distribution_type) :: dbcsr_dist
1420 TYPE(dbcsr_type) :: iao_vec, sx_vec
1421 TYPE(gto_basis_set_type), POINTER :: oce_basis
1422 TYPE(mp_comm_type) :: para_type
1423 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1424 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1425 TYPE(qs_ks_env_type), POINTER :: ks_env
1426
1427 CALL timeset(routinen, handle)
1428
1429 ! basis sets: block sizes
1430 CALL dbcsr_get_info(sxo(1)%matrix, row_blk_size=oce_blk_sizes, col_blk_size=orb_blk_sizes, &
1431 distribution=dbcsr_dist)
1432 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, natom=natom)
1433 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set, qs_kind_set=qs_kind_set)
1434 ALLOCATE (iao_blk_sizes(natom))
1435 DO iatom = 1, natom
1436 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1437 CALL get_qs_kind(qs_kind_set(ikind), nsgf=ns, basis_type="MIN")
1438 iao_blk_sizes(iatom) = ns
1439 END DO
1440
1441 CALL dbcsr_create(iao_vec, name="IAO_VEC", dist=dbcsr_dist, &
1442 matrix_type=dbcsr_type_no_symmetry, row_blk_size=orb_blk_sizes, &
1443 col_blk_size=iao_blk_sizes, nze=0)
1444 CALL dbcsr_create(sx_vec, name="SX_VEC", dist=dbcsr_dist, &
1445 matrix_type=dbcsr_type_no_symmetry, row_blk_size=oce_blk_sizes, &
1446 col_blk_size=iao_blk_sizes, nze=0)
1447 CALL dbcsr_reserve_diag_blocks(matrix=sx_vec)
1448
1449 nkind = SIZE(smat_kind)
1450 ALLOCATE (sinv_kind(nkind))
1451 DO ikind = 1, nkind
1452 noce = SIZE(smat_kind(ikind)%array, 1)
1453 ALLOCATE (sinv_kind(ikind)%array(noce, noce))
1454 sinv_kind(ikind)%array = smat_kind(ikind)%array
1455 CALL invmat_symm(sinv_kind(ikind)%array)
1456 END DO
1457 CALL dbcsr_get_info(iao_vec, group=para_group_handle)
1458 CALL para_type%set_handle(para_group_handle)
1459
1460 nspin = SIZE(iao_coef, 1)
1461 ALLOCATE (oce_comp(natom, nspin))
1462 oce_comp = 0.0_dp
1463 DO ispin = 1, nspin
1464 CALL copy_fm_to_dbcsr(iao_coef(ispin), iao_vec)
1465 CALL dbcsr_multiply("N", "N", 1.0_dp, sxo(1)%matrix, iao_vec, 0.0_dp, sx_vec, &
1466 retain_sparsity=.true.)
1467 DO iatom = 1, natom
1468 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1469 CALL dbcsr_get_block_p(matrix=sx_vec, &
1470 row=iatom, col=iatom, block=ablock, found=found)
1471 IF (found) THEN
1472 n = SIZE(ablock, 1)
1473 m = SIZE(ablock, 2)
1474 ablock = matmul(sinv_kind(ikind)%array, ablock)
1475 ALLOCATE (amat(n, m), bmat(m, m), ev(m), vec(m, m))
1476 amat(1:n, 1:m) = matmul(smat_kind(ikind)%array(1:n, 1:n), ablock(1:n, 1:m))
1477 bmat(1:m, 1:m) = matmul(transpose(ablock(1:n, 1:m)), amat(1:n, 1:m))
1478 CALL jacobi(bmat, ev, vec)
1479 oce_comp(iatom, ispin) = sum(ev(1:m))/real(m, kind=dp)
1480 DO i = 1, m
1481 ev(i) = 1._dp/sqrt(ev(i))
1482 bmat(1:m, i) = vec(1:m, i)*ev(i)
1483 END DO
1484 bmat(1:m, 1:m) = matmul(bmat(1:m, 1:m), transpose(vec(1:m, 1:m)))
1485 ablock(1:n, 1:m) = matmul(ablock(1:n, 1:m), bmat(1:m, 1:m))
1486 DEALLOCATE (amat, bmat, ev, vec)
1487 END IF
1488 END DO
1489 CALL dbcsr_replicate_all(sx_vec)
1490 DO iatom = 1, natom
1491 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1492 CALL dbcsr_get_block_p(matrix=sx_vec, &
1493 row=iatom, col=iatom, block=ablock, found=found)
1494 cpassert(found)
1495 n = SIZE(ablock, 1)
1496 m = SIZE(ablock, 2)
1497 ALLOCATE (oce_atom(iatom, ispin)%array(n, m))
1498 oce_atom(iatom, ispin)%array = ablock
1499 END DO
1500 END DO
1501
1502 CALL para_type%sum(oce_comp)
1503 IF (unit_nr > 0) THEN
1504 DO iatom = 1, natom
1505 WRITE (unit_nr, "(T4,A,I6,T30,A,2F12.4)") "Atom:", iatom, " Completeness: ", oce_comp(iatom, 1:nspin)
1506 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1507 oce_basis => oce_basis_set_list(ikind)%gto_basis_set
1508 CALL get_gto_basis_set(oce_basis, nset=nset, nshell=nshell, nsgf=nsgf, maxl=maxl, &
1509 l=lval, first_sgf=first_sgf, last_sgf=last_sgf)
1510 ALLOCATE (filter(nsgf, 0:maxl), vector(nsgf), prol(0:maxl, nspin))
1511 filter = 0.0_dp
1512 DO iset = 1, nset
1513 DO ishell = 1, nshell(iset)
1514 l = lval(ishell, iset)
1515 i1 = first_sgf(ishell, iset)
1516 i2 = last_sgf(ishell, iset)
1517 filter(i1:i2, l) = 1.0_dp
1518 END DO
1519 END DO
1520 !
1521 n = SIZE(oce_atom(iatom, 1)%array, 1)
1522 m = SIZE(oce_atom(iatom, 1)%array, 2)
1523 cpassert(n == nsgf)
1524 DO iao = 1, m
1525 prol = 0.0_dp
1526 DO ispin = 1, nspin
1527 DO l = 0, maxl
1528 vector(1:n) = oce_atom(iatom, ispin)%array(1:n, iao)*filter(1:n, l)
1529 prol(l, ispin) = sum(matmul(smat_kind(ikind)%array(1:n, 1:n), vector(1:n))*vector(1:n))
1530 END DO
1531 END DO
1532 WRITE (unit_nr, "(T4,I3,T15,A,T39,(6F7.4))") iao, " l-contributions:", (sum(prol(l, :)), l=0, maxl)
1533 END DO
1534 DEALLOCATE (filter, vector, prol)
1535 END DO
1536 WRITE (unit_nr, *)
1537 END IF
1538
1539 DEALLOCATE (oce_comp)
1540 DO ikind = 1, nkind
1541 DEALLOCATE (sinv_kind(ikind)%array)
1542 END DO
1543 DEALLOCATE (sinv_kind)
1544 DEALLOCATE (iao_blk_sizes)
1545 CALL dbcsr_release(iao_vec)
1546 CALL dbcsr_release(sx_vec)
1547
1548 CALL timestop(handle)
1549
1550 END SUBROUTINE iao_oce_expansion
1551
1552! **************************************************************************************************
1553!> \brief ...
1554!> \param smat_kind ...
1555!> \param basis_set_list ...
1556! **************************************************************************************************
1557 SUBROUTINE oce_overlap_matrix(smat_kind, basis_set_list)
1558 TYPE(cp_2d_r_p_type), DIMENSION(:) :: smat_kind
1559 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_list
1560
1561 CHARACTER(len=*), PARAMETER :: routinen = 'oce_overlap_matrix'
1562
1563 INTEGER :: handle, ikind, iset, jset, ldsab, m1, &
1564 m2, n1, n2, ncoa, ncob, nkind, nseta, &
1565 sgfa, sgfb
1566 INTEGER, DIMENSION(:), POINTER :: la_max, la_min, npgfa, nsgfa
1567 INTEGER, DIMENSION(:, :), POINTER :: first_sgfa
1568 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: oint, owork
1569 REAL(kind=dp), DIMENSION(3) :: rab
1570 REAL(kind=dp), DIMENSION(:, :), POINTER :: rpgfa, scon_a, smat, zeta
1571 TYPE(gto_basis_set_type), POINTER :: basis_set
1572
1573 CALL timeset(routinen, handle)
1574
1575 rab(1:3) = 0.0_dp
1576
1577 nkind = SIZE(smat_kind)
1578 ldsab = 0
1579 DO ikind = 1, nkind
1580 basis_set => basis_set_list(ikind)%gto_basis_set
1581 cpassert(ASSOCIATED(basis_set))
1582 CALL get_gto_basis_set(gto_basis_set=basis_set, maxco=m1, nsgf=m2)
1583 ldsab = max(m1, m2, ldsab)
1584 END DO
1585
1586 ALLOCATE (oint(ldsab, ldsab), owork(ldsab, ldsab))
1587
1588 DO ikind = 1, nkind
1589 basis_set => basis_set_list(ikind)%gto_basis_set
1590 cpassert(ASSOCIATED(basis_set))
1591 smat => smat_kind(ikind)%array
1592 smat = 0.0_dp
1593 ! basis ikind
1594 first_sgfa => basis_set%first_sgf
1595 la_max => basis_set%lmax
1596 la_min => basis_set%lmin
1597 npgfa => basis_set%npgf
1598 nseta = basis_set%nset
1599 nsgfa => basis_set%nsgf_set
1600 rpgfa => basis_set%pgf_radius
1601 scon_a => basis_set%scon
1602 zeta => basis_set%zet
1603
1604 DO iset = 1, nseta
1605
1606 ncoa = npgfa(iset)*ncoset(la_max(iset))
1607 n1 = npgfa(iset)*(ncoset(la_max(iset)) - ncoset(la_min(iset) - 1))
1608 sgfa = first_sgfa(1, iset)
1609
1610 DO jset = 1, nseta
1611
1612 ncob = npgfa(jset)*ncoset(la_max(jset))
1613 n2 = npgfa(jset)*(ncoset(la_max(jset)) - ncoset(la_min(jset) - 1))
1614 sgfb = first_sgfa(1, jset)
1615
1616 ! calculate integrals and derivatives
1617 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
1618 la_max(jset), la_min(jset), npgfa(jset), rpgfa(:, jset), zeta(:, jset), &
1619 rab, sab=oint(:, :))
1620 ! Contraction
1621 CALL contraction(oint(:, :), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
1622 cb=scon_a(:, sgfb:), nb=n2, mb=nsgfa(jset), fscale=1.0_dp, trans=.false.)
1623 CALL block_add("IN", owork, nsgfa(iset), nsgfa(jset), smat, &
1624 sgfa, sgfb, trans=.false.)
1625
1626 END DO
1627 END DO
1628
1629 END DO
1630 DEALLOCATE (oint, owork)
1631
1632 CALL timestop(handle)
1633
1634 END SUBROUTINE oce_overlap_matrix
1635
1636! **************************************************************************************************
1637!> \brief 2 by 2 rotation optimization for the Pipek-Mezey operator
1638!> \param zij_fm_set ...
1639!> \param vectors ...
1640!> \param order ...
1641!> \param accuracy ...
1642!> \param unit_nr ...
1643!> \par History
1644!> 05-2005 created
1645!> 10-2023 adapted from jacobi_rotation_pipek [JGH]
1646!> \author MI
1647! **************************************************************************************************
1648 SUBROUTINE pm_localization(zij_fm_set, vectors, order, accuracy, unit_nr)
1649
1650 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: zij_fm_set
1651 TYPE(cp_fm_type), INTENT(IN) :: vectors
1652 INTEGER, INTENT(IN) :: order
1653 REAL(kind=dp), INTENT(IN) :: accuracy
1654 INTEGER, INTENT(IN) :: unit_nr
1655
1656 INTEGER, PARAMETER :: max_sweeps = 250
1657
1658 INTEGER :: iatom, istate, jstate, natom, nstate, &
1659 sweeps
1660 REAL(kind=dp) :: aij, bij, ct, ftarget, mii, mij, mjj, &
1661 st, t1, t2, theta, tolerance, tt
1662 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: fdiag
1663 TYPE(cp_fm_type) :: rmat
1664
1665 CALL cp_fm_create(rmat, zij_fm_set(1, 1)%matrix_struct)
1666 CALL cp_fm_set_all(rmat, 0.0_dp, 1.0_dp)
1667
1668 CALL cp_fm_get_info(rmat, nrow_global=nstate)
1669 ALLOCATE (fdiag(nstate))
1670 tolerance = 1.0e10_dp
1671 sweeps = 0
1672 natom = SIZE(zij_fm_set, 1)
1673 IF (unit_nr > 0) THEN
1674 WRITE (unit_nr, '(A,T30,A,T45,A,T63,A,T77,A)') &
1675 " Jacobi Localization ", "Sweep", "Functional", "Gradient", "Time"
1676 END IF
1677 ! do jacobi sweeps until converged
1678 DO sweeps = 1, max_sweeps
1679 t1 = m_walltime()
1680 tolerance = 0.0_dp
1681 DO istate = 1, nstate
1682 DO jstate = istate + 1, nstate
1683 aij = 0.0_dp
1684 bij = 0.0_dp
1685 DO iatom = 1, natom
1686 CALL cp_fm_get_element(zij_fm_set(iatom, 1), istate, istate, mii)
1687 CALL cp_fm_get_element(zij_fm_set(iatom, 1), istate, jstate, mij)
1688 CALL cp_fm_get_element(zij_fm_set(iatom, 1), jstate, jstate, mjj)
1689 IF (order == 2) THEN
1690 aij = aij + 4._dp*mij**2 - (mii - mjj)**2
1691 bij = bij + 4._dp*mij*(mii - mjj)
1692 ELSEIF (order == 4) THEN
1693 aij = aij - mii**4 - mjj**4 + 6._dp*(mii**2 + mjj**2)*mij**2 + &
1694 mii**3*mjj + mii*mjj**3
1695 bij = bij + 4._dp*mij*(mii**3 - mjj**3)
1696 ELSE
1697 cpabort("PM order")
1698 END IF
1699 END DO
1700 IF ((aij**2 + bij**2) < 1.e-10_dp) cycle
1701 tolerance = tolerance + bij**2
1702 theta = 0.25_dp*atan2(bij, -aij)
1703 ct = cos(theta)
1704 st = sin(theta)
1705
1706 CALL cp_fm_rot_cols(rmat, istate, jstate, ct, st)
1707
1708 DO iatom = 1, natom
1709 CALL cp_fm_rot_cols(zij_fm_set(iatom, 1), istate, jstate, ct, st)
1710 CALL cp_fm_rot_rows(zij_fm_set(iatom, 1), istate, jstate, ct, st)
1711 END DO
1712 END DO
1713 END DO
1714 ftarget = 0.0_dp
1715 DO iatom = 1, natom
1716 CALL cp_fm_get_diag(zij_fm_set(iatom, 1), fdiag)
1717 ftarget = ftarget + sum(fdiag**order)
1718 END DO
1719 ftarget = ftarget**(1._dp/order)
1720 tolerance = sqrt(tolerance)
1721 t2 = m_walltime()
1722 tt = t2 - t1
1723 IF (unit_nr > 0) THEN
1724 WRITE (unit_nr, '(T31,I4,T39,F16.8,T55,G16.8,T71,F10.2)') sweeps, ftarget, tolerance, tt
1725 END IF
1726 IF (tolerance < accuracy) EXIT
1727 END DO
1728 DEALLOCATE (fdiag)
1729
1730 CALL rotate_orbitals(rmat, vectors)
1731 CALL cp_fm_release(rmat)
1732
1733 END SUBROUTINE pm_localization
1734! **************************************************************************************************
1735
1736END MODULE iao_analysis
Set of routines to: Contract integrals over primitive Gaussians Decontract (density) matrices Trace m...
Calculation of the overlap integrals over Cartesian Gaussian-type functions.
Definition ai_overlap.F:18
subroutine, public overlap_ab(la_max, la_min, npgfa, rpgfa, zeta, lb_max, lb_min, npgfb, rpgfb, zetb, rab, sab, dab, ddab)
Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions....
Definition ai_overlap.F:680
simple routine to print charges for all atomic charge methods (currently mulliken,...
subroutine, public print_atomic_charges(particle_set, qs_kind_set, scr, title, electronic_charges, atomic_charges)
generates a unified output format for atomic charges
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.
Automatic generation of auxiliary basis sets of different kind.
Definition auto_basis.F:15
subroutine, public create_oce_basis(oce_basis, orb_basis, lmax_oce, nbas_oce)
...
Definition auto_basis.F:405
subroutine, public deallocate_gto_basis_set(gto_basis_set)
...
subroutine, public init_orb_basis_set(gto_basis_set)
Initialise a Gaussian-type orbital (GTO) basis set data set.
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)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public knizia2013
Handles all functions related to the CELL.
Definition cell_types.F:15
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
basic linear algebra operations for full matrices
subroutine, public cp_fm_rot_rows(matrix, irow, jrow, cs, sn)
Applies a planar rotation defined by cs and sn to the i'th and j'th rows.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_rot_cols(matrix, icol, jcol, cs, sn)
Applies a planar rotation defined by cs and sn to the i'th and j'th columnns.
subroutine, public cp_fm_geadd(alpha, trans, matrix_a, beta, matrix_b)
interface to BLACS geadd: matrix_b = beta*matrix_b + alpha*opt(matrix_a) where opt(matrix_a) can be e...
subroutine, public cp_fm_invert(matrix_a, matrix_inverse, det_a, eps_svd, eigval)
Inverts a cp_fm_type matrix, optionally returning the determinant of the input matrix.
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_diag(matrix, diag)
returns the diagonal elements of a fm
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_get_element(matrix, irow_global, icol_global, alpha, local)
returns an element of a fm this value is valid on every cpu using this call is expensive
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
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,...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, stride, zero_tails, silent, mpi_io)
...
Calculate intrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_wfn_analysis(qs_env, iao_env, unit_nr, c_iao_coef, mos, bond_centers)
...
subroutine, public print_center_spread(moments, nocc, print_section, iounit)
prints charge center and spreads for all orbitals
subroutine, public iao_charges(p_matrix, charges)
compute the atomic charges (orthogonal basis)
Calculate ntrinsic atomic orbitals and analyze wavefunctions.
Definition iao_types.F:14
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_iaoloc_enone
integer, parameter, public do_iaoloc_pm2
objects that represent the structure of input sections and the data contained in an input section
integer function, dimension(:), pointer, public section_get_ivals(section_vals, keyword_name)
...
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
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition list.F:24
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:123
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
subroutine, public jacobi(a, d, v)
Jacobi matrix diagonalization. The eigenvalues are returned in vector d and the eigenvectors are retu...
Definition mathlib.F:1479
subroutine, public invmat_symm(a, cholesky_triangle)
returns inverse of real symmetric, positive definite matrix
Definition mathlib.F:574
Interface to the message passing library MPI.
generate or use from input minimal basis set
subroutine, public create_minbas_set(qs_env, unit_nr, basis_type, primitive)
...
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section)
Write out the MOs in molden format for visualisation.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
basic linear algebra operations for full matrixes
represent a simple array based list of the given type
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type, external_vector)
maps a given wavefunction on the grid
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Get the QUICKSTEP environment.
Calculate the interaction radii for the operator matrix calculation.
subroutine, public init_interaction_radii_orb_basis(orb_basis_set, eps_pgf_orb, eps_pgf_short)
...
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_r3d_rs_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
Some utilities for the construction of the localization environment.
subroutine, public compute_berry_operator(qs_env, cell, op_sm_set, dim_op)
Computes the Berry operator for periodic systems used to define the spread of the MOS Here the matrix...
Localization methods such as 2x2 Jacobi rotations Steepest Decents Conjugate Gradient.
subroutine, public rotate_orbitals(rmat, vectors)
...
subroutine, public initialize_weights(cell, weights)
...
subroutine, public scdm_qrfact(vectors)
...
collects routines that perform operations directly related to MOs
subroutine, public make_basis_lowdin(vmatrix, ncol, matrix_s)
return a set of S orthonormal vectors (C^T S C == 1) where a Loedwin transformation is applied to kee...
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public set_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, uniform_occupation, kts, mu, flexible_electron_count)
Set the components of a MO set data structure.
subroutine, public allocate_mo_set(mo_set, nao, nmo, nelectron, n_el_f, maxocc, flexible_electron_count)
Allocates a mo set and partially initializes it (nao,nmo,nelectron, and flexible_electron_count are v...
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
Definition qs_moments.F:14
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type)
...
Definition qs_moments.F:558
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Generate the atomic neighbor lists.
subroutine, public setup_neighbor_list(ab_list, basis_set_a, basis_set_b, qs_env, mic, symmetric, molecular, operator_type)
Build a neighborlist.
Calculation of overlap matrix, its derivatives and forces.
Definition qs_overlap.F:19
subroutine, public build_overlap_matrix_simple(ks_env, matrix_s, basis_set_list_a, basis_set_list_b, sab_nl)
Calculation of the overlap matrix over Cartesian Gaussian functions.
Definition qs_overlap.F:558
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
represent a pointer to a 2d array
keeps the information about the structure of a full matrix
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...