(git:ed6f26b)
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-2025 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
33 USE cp_dbcsr_api, ONLY: &
37 dbcsr_replicate_all, dbcsr_set, dbcsr_type, dbcsr_type_no_symmetry
53 USE cp_fm_types, ONLY: cp_fm_create,&
66 USE iao_types, ONLY: iao_env_type
73 USE kinds, ONLY: default_path_length,&
75 dp
76 USE machine, ONLY: m_walltime
77 USE mathconstants, ONLY: twopi
78 USE mathlib, ONLY: invmat_symm,&
79 jacobi
83 USE orbital_pointers, ONLY: ncoset
88 USE pw_env_types, ONLY: pw_env_get,&
91 USE pw_types, ONLY: pw_c1d_gs_type,&
97 USE qs_kind_types, ONLY: get_qs_kind,&
99 USE qs_ks_types, ONLY: get_ks_env,&
106 USE qs_mo_types, ONLY: allocate_mo_set,&
108 get_mo_set,&
117 USE qs_subsys_types, ONLY: qs_subsys_get,&
119#include "./base/base_uses.f90"
120
121 IMPLICIT NONE
122 PRIVATE
123
124 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'iao_analysis'
125
127
129 MODULE PROCEDURE iao_calculate_dmat_diag, & ! diagonal occupation matrix
130 iao_calculate_dmat_full ! full occupation matrix
131 END INTERFACE
132
133! **************************************************************************************************
134
135CONTAINS
136
137! **************************************************************************************************
138!> \brief ...
139!> \param qs_env ...
140!> \param iao_env ...
141!> \param unit_nr ...
142!> \param c_iao_coef ...
143!> \param mos ...
144!> \param bond_centers ...
145! **************************************************************************************************
146 SUBROUTINE iao_wfn_analysis(qs_env, iao_env, unit_nr, c_iao_coef, mos, bond_centers)
147 TYPE(qs_environment_type), POINTER :: qs_env
148 TYPE(iao_env_type), INTENT(IN) :: iao_env
149 INTEGER, INTENT(IN) :: unit_nr
150 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:), &
151 OPTIONAL :: c_iao_coef
152 TYPE(mo_set_type), DIMENSION(:), OPTIONAL, POINTER :: mos
153 REAL(kind=dp), DIMENSION(:, :, :), OPTIONAL :: bond_centers
154
155 CHARACTER(len=*), PARAMETER :: routinen = 'iao_wfn_analysis'
156
157 CHARACTER(LEN=2) :: element_symbol
158 CHARACTER(LEN=default_string_length) :: bname
159 INTEGER :: handle, i, iatom, ikind, isgf, ispin, &
160 nao, natom, nimages, nkind, no, norb, &
161 nref, ns, nsgf, nspin, nvec, nx, order
162 INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf, last_sgf, nsgfat
163 INTEGER, DIMENSION(2) :: nocc
164 LOGICAL :: cubes_iao, cubes_ibo, molden_iao, &
165 molden_ibo, uniform_occupation
166 REAL(kind=dp) :: fin, fout, t1, t2, trace, zval
167 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: fdiag
168 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: mcharge
169 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: moments
170 REAL(kind=dp), DIMENSION(:), POINTER :: occupation_numbers
171 TYPE(cp_2d_r_p_type), ALLOCATABLE, DIMENSION(:) :: smat_kind
172 TYPE(cp_2d_r_p_type), ALLOCATABLE, DIMENSION(:, :) :: oce_atom
173 TYPE(cp_fm_struct_type), POINTER :: fm_struct
174 TYPE(cp_fm_type) :: p_orb_ref, p_ref_orb, smo
175 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: c_loc_orb, ciao, cloc, cvec, iao_coef
176 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: zij_atom
177 TYPE(cp_fm_type), POINTER :: mo_coeff
178 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: sref, sro, sxo
179 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
180 TYPE(dbcsr_type) :: dmat
181 TYPE(dbcsr_type), POINTER :: smat
182 TYPE(dft_control_type), POINTER :: dft_control
183 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: oce_basis_set_list, orb_basis_set_list, &
184 ref_basis_set_list
185 TYPE(gto_basis_set_type), POINTER :: ocebasis, orbbasis, refbasis
186 TYPE(mo_set_type), ALLOCATABLE, DIMENSION(:) :: mo_iao, mo_loc
187 TYPE(mo_set_type), DIMENSION(:), POINTER :: my_mos
188 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
189 POINTER :: sro_list, srr_list, sxo_list
190 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
191 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
192 TYPE(qs_kind_type), POINTER :: qs_kind
193 TYPE(qs_ks_env_type), POINTER :: ks_env
194 TYPE(section_vals_type), POINTER :: iao_cubes_section, iao_molden_section, &
195 ibo_cc_section, ibo_cubes_section, &
196 ibo_molden_section
197
198 ! only do IAO analysis if explicitly requested
199 cpassert(iao_env%do_iao)
200
201 ! k-points?
202 CALL get_qs_env(qs_env, dft_control=dft_control)
203 nspin = dft_control%nspins
204 nimages = dft_control%nimages
205 IF (nimages > 1) THEN
206 IF (unit_nr > 0) THEN
207 WRITE (unit=unit_nr, fmt="(T2,A)") &
208 "K-Points: Intrinsic Atomic Orbitals Analysis not available."
209 END IF
210 END IF
211 IF (nimages > 1) RETURN
212
213 CALL timeset(routinen, handle)
214
215 IF (unit_nr > 0) THEN
216 WRITE (unit_nr, '(/,T2,A)') '!-----------------------------------------------------------------------------!'
217 WRITE (unit=unit_nr, fmt="(T24,A)") "INTRINSIC ATOMIC ORBITALS ANALYSIS"
218 WRITE (unit=unit_nr, fmt="(T13,A)") "G. Knizia, J. Chem. Theory Comput. 9, 4834-4843 (2013)"
219 WRITE (unit_nr, '(T2,A)') '!-----------------------------------------------------------------------------!'
220 END IF
221 CALL cite_reference(knizia2013)
222
223 ! input sections
224 iao_molden_section => iao_env%iao_molden_section
225 iao_cubes_section => iao_env%iao_cubes_section
226 ibo_molden_section => iao_env%ibo_molden_section
227 ibo_cubes_section => iao_env%ibo_cubes_section
228 ibo_cc_section => iao_env%ibo_cc_section
229
230 !
231 molden_iao = .false.
232 IF (ASSOCIATED(iao_molden_section)) THEN
233 CALL section_vals_get(iao_molden_section, explicit=molden_iao)
234 END IF
235 cubes_iao = .false.
236 IF (ASSOCIATED(iao_cubes_section)) THEN
237 CALL section_vals_get(iao_cubes_section, explicit=cubes_iao)
238 END IF
239 molden_ibo = .false.
240 IF (ASSOCIATED(ibo_molden_section)) THEN
241 CALL section_vals_get(ibo_molden_section, explicit=molden_ibo)
242 END IF
243 cubes_ibo = .false.
244 IF (ASSOCIATED(ibo_cubes_section)) THEN
245 CALL section_vals_get(ibo_cubes_section, explicit=cubes_ibo)
246 END IF
247
248 ! check for or generate reference basis
249 CALL create_minbas_set(qs_env, unit_nr)
250
251 ! overlap matrices
252 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s)
253 smat => matrix_s(1, 1)%matrix
254 !
255 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
256 nkind = SIZE(qs_kind_set)
257 ALLOCATE (ref_basis_set_list(nkind), orb_basis_set_list(nkind))
258 DO ikind = 1, nkind
259 qs_kind => qs_kind_set(ikind)
260 NULLIFY (ref_basis_set_list(ikind)%gto_basis_set)
261 NULLIFY (orb_basis_set_list(ikind)%gto_basis_set)
262 NULLIFY (refbasis, orbbasis)
263 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orbbasis, basis_type="ORB")
264 IF (ASSOCIATED(orbbasis)) orb_basis_set_list(ikind)%gto_basis_set => orbbasis
265 CALL get_qs_kind(qs_kind=qs_kind, basis_set=refbasis, basis_type="MIN")
266 IF (ASSOCIATED(refbasis)) ref_basis_set_list(ikind)%gto_basis_set => refbasis
267 END DO
268
269 ! neighbor lists
270 NULLIFY (srr_list, sro_list)
271 CALL setup_neighbor_list(srr_list, ref_basis_set_list, qs_env=qs_env)
272 CALL setup_neighbor_list(sro_list, ref_basis_set_list, orb_basis_set_list, qs_env=qs_env)
273
274 ! Srr and Sro overlap matrices
275 NULLIFY (sref, sro)
276 CALL get_qs_env(qs_env, ks_env=ks_env)
277 CALL build_overlap_matrix_simple(ks_env, sref, &
278 ref_basis_set_list, ref_basis_set_list, srr_list)
279 CALL build_overlap_matrix_simple(ks_env, sro, &
280 ref_basis_set_list, orb_basis_set_list, sro_list)
281 !
282 IF (PRESENT(mos)) THEN
283 my_mos => mos
284 ELSE
285 CALL get_qs_env(qs_env, mos=my_mos)
286 END IF
287 CALL get_mo_set(my_mos(1), mo_coeff=mo_coeff)
288 CALL dbcsr_get_info(sro(1)%matrix, nfullrows_total=nref, nfullcols_total=nao)
289
290 ! Projectors
291 NULLIFY (fm_struct)
292 CALL cp_fm_struct_create(fm_struct, context=mo_coeff%matrix_struct%context, nrow_global=nref, &
293 ncol_global=nao, para_env=mo_coeff%matrix_struct%para_env)
294 CALL cp_fm_create(p_ref_orb, fm_struct)
295 CALL cp_fm_struct_release(fm_struct)
296 NULLIFY (fm_struct)
297 CALL cp_fm_struct_create(fm_struct, context=mo_coeff%matrix_struct%context, nrow_global=nao, &
298 ncol_global=nref, para_env=mo_coeff%matrix_struct%para_env)
299 CALL cp_fm_create(p_orb_ref, fm_struct)
300 CALL cp_fm_struct_release(fm_struct)
301 !
302 CALL iao_projectors(smat, sref(1)%matrix, sro(1)%matrix, p_orb_ref, p_ref_orb, iao_env%eps_svd)
303
304 ! occupied orbitals, orbitals considered for IAO generation
305 nocc(1:2) = 0
306 DO ispin = 1, nspin
307 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nmo=norb, uniform_occupation=uniform_occupation, &
308 occupation_numbers=occupation_numbers)
309 IF (uniform_occupation) THEN
310 nvec = norb
311 ELSE
312 nvec = 0
313 DO i = 1, norb
314 IF (occupation_numbers(i) > iao_env%eps_occ) THEN
315 nvec = i
316 ELSE
317 EXIT
318 END IF
319 END DO
320 END IF
321 nocc(ispin) = nvec
322 END DO
323 ! generate IAOs
324 ALLOCATE (iao_coef(nspin), cvec(nspin))
325 DO ispin = 1, nspin
326 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff)
327 nvec = nocc(ispin)
328 IF (nvec > 0) THEN
329 NULLIFY (fm_struct)
330 CALL cp_fm_struct_create(fm_struct, ncol_global=nvec, template_fmstruct=mo_coeff%matrix_struct)
331 CALL cp_fm_create(cvec(ispin), fm_struct)
332 CALL cp_fm_struct_release(fm_struct)
333 CALL cp_fm_to_fm(mo_coeff, cvec(ispin), nvec)
334 !
335 NULLIFY (fm_struct)
336 CALL cp_fm_struct_create(fm_struct, ncol_global=nref, template_fmstruct=mo_coeff%matrix_struct)
337 CALL cp_fm_create(iao_coef(ispin), fm_struct)
338 CALL cp_fm_struct_release(fm_struct)
339 !
340 CALL intrinsic_ao_calc(smat, p_orb_ref, p_ref_orb, cvec(ispin), iao_coef(ispin))
341 END IF
342 END DO
343 !
344 IF (iao_env%do_charges) THEN
345 ! MOs in IAO basis
346 ALLOCATE (ciao(nspin))
347 DO ispin = 1, nspin
348 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=norb)
349 CALL cp_fm_create(smo, mo_coeff%matrix_struct)
350 NULLIFY (fm_struct)
351 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, template_fmstruct=mo_coeff%matrix_struct)
352 CALL cp_fm_create(ciao(ispin), fm_struct)
353 CALL cp_fm_struct_release(fm_struct)
354 ! CIAO = A(T)*S*C
355 CALL cp_dbcsr_sm_fm_multiply(smat, mo_coeff, smo, ncol=norb)
356 CALL parallel_gemm('T', 'N', nref, norb, nao, 1.0_dp, iao_coef(ispin), smo, 0.0_dp, ciao(ispin))
357 CALL cp_fm_release(smo)
358 END DO
359 !
360 ! population analysis
361 IF (unit_nr > 0) THEN
362 WRITE (unit_nr, '(/,T2,A)') 'Intrinsic AO Population Analysis '
363 END IF
364 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
365 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
366 ALLOCATE (mcharge(natom, nspin))
367 CALL dbcsr_get_info(sref(1)%matrix, nfullrows_total=nref)
368 DO ispin = 1, nspin
369 CALL get_mo_set(my_mos(ispin), &
370 uniform_occupation=uniform_occupation, &
371 occupation_numbers=occupation_numbers)
372 ! diagonal block matrix
373 CALL dbcsr_create(dmat, template=sref(1)%matrix)
375 !
376 CALL iao_calculate_dmat(ciao(ispin), dmat, occupation_numbers, uniform_occupation)
377 CALL dbcsr_trace(dmat, trace)
378 IF (unit_nr > 0) THEN
379 WRITE (unit_nr, '(T2,A,I2,T66,F15.4)') 'Number of Electrons: Trace(Piao) Spin ', ispin, trace
380 END IF
381 CALL iao_charges(dmat, mcharge(:, ispin))
382 CALL dbcsr_release(dmat)
383 END DO
384 CALL print_atomic_charges(particle_set, qs_kind_set, unit_nr, "Intrinsic Atomic Orbital Charges", &
385 electronic_charges=mcharge)
386 DEALLOCATE (mcharge)
387 CALL cp_fm_release(ciao)
388 END IF
389 !
390 ! Deallocate the neighbor list structure
391 CALL release_neighbor_list_sets(srr_list)
392 CALL release_neighbor_list_sets(sro_list)
393 IF (ASSOCIATED(sref)) CALL dbcsr_deallocate_matrix_set(sref)
394 IF (ASSOCIATED(sro)) CALL dbcsr_deallocate_matrix_set(sro)
395 CALL cp_fm_release(p_ref_orb)
396 CALL cp_fm_release(p_orb_ref)
397 CALL cp_fm_release(cvec)
398 DEALLOCATE (orb_basis_set_list)
399 !
400 IF (iao_env%do_oce) THEN
401 ! generate OCE basis
402 IF (unit_nr > 0) THEN
403 WRITE (unit_nr, '(T2,A)') "IAO One-Center Expansion: OCE Basis Set"
404 END IF
405 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
406 nkind = SIZE(qs_kind_set)
407 ALLOCATE (oce_basis_set_list(nkind), orb_basis_set_list(nkind))
408 DO ikind = 1, nkind
409 qs_kind => qs_kind_set(ikind)
410 NULLIFY (orb_basis_set_list(ikind)%gto_basis_set)
411 NULLIFY (orbbasis)
412 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orbbasis, basis_type="ORB")
413 IF (ASSOCIATED(orbbasis)) orb_basis_set_list(ikind)%gto_basis_set => orbbasis
414 END DO
415 DO ikind = 1, nkind
416 orbbasis => orb_basis_set_list(ikind)%gto_basis_set
417 cpassert(ASSOCIATED(orbbasis))
418 NULLIFY (ocebasis)
419 CALL create_oce_basis(ocebasis, orbbasis, iao_env%lmax_oce, iao_env%nbas_oce)
420 CALL init_orb_basis_set(ocebasis)
421 CALL init_interaction_radii_orb_basis(ocebasis, dft_control%qs_control%eps_pgf_orb)
422 oce_basis_set_list(ikind)%gto_basis_set => ocebasis
423 IF (unit_nr > 0) THEN
424 qs_kind => qs_kind_set(ikind)
425 CALL get_qs_kind(qs_kind, zeff=zval, element_symbol=element_symbol)
426 CALL get_gto_basis_set(ocebasis, name=bname, nsgf=nsgf)
427 WRITE (unit_nr, '(T2,A,A,T14,A,I4,T40,A,A30)') "Kind: ", element_symbol, "NBasFun: ", nsgf, &
428 "OCE Basis: ", adjustl(trim(bname))
429 END IF
430 END DO
431 IF (unit_nr > 0) WRITE (unit_nr, *)
432 ! OCE basis overlap
433 ALLOCATE (smat_kind(nkind))
434 DO ikind = 1, nkind
435 ocebasis => oce_basis_set_list(ikind)%gto_basis_set
436 CALL get_gto_basis_set(gto_basis_set=ocebasis, nsgf=nsgf)
437 ALLOCATE (smat_kind(ikind)%array(nsgf, nsgf))
438 END DO
439 CALL oce_overlap_matrix(smat_kind, oce_basis_set_list)
440 ! overlap between IAO OCE basis and orbital basis
441 NULLIFY (sxo, sxo_list)
442 CALL setup_neighbor_list(sxo_list, oce_basis_set_list, orb_basis_set_list, qs_env=qs_env)
443 CALL get_qs_env(qs_env, ks_env=ks_env)
444 CALL build_overlap_matrix_simple(ks_env, sxo, &
445 oce_basis_set_list, orb_basis_set_list, sxo_list)
446 !
447 ! One Center Expansion of IAOs
448 CALL get_qs_env(qs_env=qs_env, natom=natom)
449 ALLOCATE (oce_atom(natom, nspin))
450 CALL iao_oce_expansion(qs_env, oce_basis_set_list, smat_kind, sxo, iao_coef, oce_atom, unit_nr)
451 !
452 DO ikind = 1, nkind
453 ocebasis => oce_basis_set_list(ikind)%gto_basis_set
454 CALL deallocate_gto_basis_set(ocebasis)
455 END DO
456 DEALLOCATE (oce_basis_set_list, orb_basis_set_list)
457 !
458 CALL release_neighbor_list_sets(sxo_list)
459 IF (ASSOCIATED(sxo)) CALL dbcsr_deallocate_matrix_set(sxo)
460 DO ikind = 1, nkind
461 DEALLOCATE (smat_kind(ikind)%array)
462 END DO
463 DEALLOCATE (smat_kind)
464 DO ispin = 1, nspin
465 DO iatom = 1, natom
466 DEALLOCATE (oce_atom(iatom, ispin)%array)
467 END DO
468 END DO
469 DEALLOCATE (oce_atom)
470 END IF
471 !
472 IF (molden_iao) THEN
473 ! Print basis functions: molden file
474 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
475 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
476 IF (unit_nr > 0) THEN
477 WRITE (unit_nr, '(T2,A)') ' Write IAO in MOLDEN Format'
478 END IF
479 ALLOCATE (mo_iao(nspin))
480 DO ispin = 1, nspin
481 CALL get_mo_set(my_mos(ispin), nao=nao)
482 CALL allocate_mo_set(mo_iao(ispin), nao, nref, nref, 0.0_dp, 1.0_dp, 0.0_dp)
483 CALL init_mo_set(mo_iao(ispin), fm_ref=iao_coef(ispin), name="iao_set")
484 CALL cp_fm_to_fm(iao_coef(ispin), mo_iao(ispin)%mo_coeff)
485 CALL set_mo_set(mo_iao(ispin), homo=nref)
486 mo_iao(ispin)%occupation_numbers = 1.0_dp
487 END DO
488 ! Print IAO basis functions: molden format
489 CALL write_mos_molden(mo_iao, qs_kind_set, particle_set, iao_molden_section)
490 DO ispin = 1, nspin
491 CALL deallocate_mo_set(mo_iao(ispin))
492 END DO
493 DEALLOCATE (mo_iao)
494 END IF
495 IF (cubes_iao) THEN
496 IF (unit_nr > 0) THEN
497 WRITE (unit_nr, '(T2,A)') ' Write IAO as CUBE Files'
498 END IF
499 ! Print basis functions: cube file
500 CALL print_iao_cubes(qs_env, iao_cubes_section, iao_coef, ref_basis_set_list)
501 END IF
502 !
503 ! Intrinsic bond orbitals
504 IF (iao_env%do_bondorbitals) THEN
505 IF (unit_nr > 0) THEN
506 WRITE (unit_nr, '(/,T2,A)') 'Intrinsic Bond Orbital Generation'
507 END IF
508 ! MOs in IAO basis -> ciao
509 ALLOCATE (ciao(nspin))
510 DO ispin = 1, nspin
511 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=norb)
512 CALL cp_fm_create(smo, mo_coeff%matrix_struct)
513 NULLIFY (fm_struct)
514 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, template_fmstruct=mo_coeff%matrix_struct)
515 CALL cp_fm_create(ciao(ispin), fm_struct)
516 CALL cp_fm_struct_release(fm_struct)
517 ! CIAO = A(T)*S*C
518 CALL cp_dbcsr_sm_fm_multiply(smat, mo_coeff, smo, ncol=norb)
519 CALL parallel_gemm('T', 'N', nref, norb, nao, 1.0_dp, iao_coef(ispin), smo, 0.0_dp, ciao(ispin))
520 CALL cp_fm_release(smo)
521 END DO
522 !
523 ! localize occupied orbitals nocc(ispin), see IAO generation
524 !
525 ALLOCATE (cloc(nspin), c_loc_orb(nspin))
526 DO ispin = 1, nspin
527 NULLIFY (fm_struct)
528 CALL cp_fm_struct_create(fm_struct, ncol_global=nocc(ispin), &
529 template_fmstruct=ciao(ispin)%matrix_struct)
530 CALL cp_fm_create(cloc(ispin), fm_struct)
531 CALL cp_fm_struct_release(fm_struct)
532 CALL cp_fm_to_fm(ciao(ispin), cloc(ispin), ncol=nocc(ispin))
533 END DO
534 CALL cp_fm_release(ciao)
535 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
536 ALLOCATE (first_sgf(natom), last_sgf(natom), nsgfat(natom))
537 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
538 CALL get_particle_set(particle_set, qs_kind_set, first_sgf=first_sgf, last_sgf=last_sgf, &
539 nsgf=nsgfat, basis=ref_basis_set_list)
540
541 IF (iao_env%loc_operator /= do_iaoloc_pm2) THEN
542 cpabort("IAO localization operator NYA")
543 END IF
544 IF (iao_env%eloc_function /= do_iaoloc_enone) THEN
545 cpabort("IAO energy weight localization NYA")
546 END IF
547
548 DO ispin = 1, nspin
549 nvec = nocc(ispin)
550 IF (nvec > 0) THEN
551 ALLOCATE (zij_atom(natom, 1), fdiag(nvec))
552 NULLIFY (fm_struct)
553 CALL cp_fm_struct_create(fm_struct, nrow_global=nvec, ncol_global=nvec, &
554 template_fmstruct=cloc(ispin)%matrix_struct)
555 DO iatom = 1, natom
556 CALL cp_fm_create(zij_atom(iatom, 1), fm_struct)
557 isgf = first_sgf(iatom)
558 CALL parallel_gemm('T', 'N', nvec, nvec, nsgfat(iatom), 1.0_dp, cloc(ispin), cloc(ispin), &
559 0.0_dp, zij_atom(iatom, 1), &
560 a_first_col=1, a_first_row=isgf, b_first_col=1, b_first_row=isgf)
561 END DO
562 CALL cp_fm_struct_release(fm_struct)
563 !
564 t1 = m_walltime()
565 order = 4
566 fin = 0.0_dp
567 DO iatom = 1, natom
568 CALL cp_fm_get_diag(zij_atom(iatom, 1), fdiag)
569 fin = fin + sum(fdiag**order)
570 END DO
571 fin = fin**(1._dp/order)
572 ! QR localization
573 CALL scdm_qrfact(cloc(ispin))
574 !
575 DO iatom = 1, natom
576 isgf = first_sgf(iatom)
577 CALL parallel_gemm('T', 'N', nvec, nvec, nsgfat(iatom), 1.0_dp, cloc(ispin), cloc(ispin), &
578 0.0_dp, zij_atom(iatom, 1), &
579 a_first_col=1, a_first_row=isgf, b_first_col=1, b_first_row=isgf)
580 END DO
581 fout = 0.0_dp
582 DO iatom = 1, natom
583 CALL cp_fm_get_diag(zij_atom(iatom, 1), fdiag)
584 fout = fout + sum(fdiag**order)
585 END DO
586 fout = fout**(1._dp/order)
587 DEALLOCATE (fdiag)
588 t2 = m_walltime()
589 IF (unit_nr > 0) THEN
590 WRITE (unit_nr, '(T2,A,F14.8,A,F14.8,A,F8.2)') &
591 'SCDM pre-localization: fin=', fin, " fout=", fout, " Time=", t2 - t1
592 END IF
593 !
594 CALL pm_localization(zij_atom, cloc(ispin), order, 1.e-12_dp, unit_nr)
595 !
596 CALL cp_fm_release(zij_atom)
597 CALL get_mo_set(my_mos(ispin), nao=nao)
598 NULLIFY (fm_struct)
599 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, &
600 template_fmstruct=cloc(ispin)%matrix_struct)
601 CALL cp_fm_create(c_loc_orb(ispin), fm_struct)
602 CALL cp_fm_struct_release(fm_struct)
603 CALL parallel_gemm('N', 'N', nao, nvec, nref, 1.0_dp, iao_coef(ispin), cloc(ispin), &
604 0.0_dp, c_loc_orb(ispin))
605 END IF
606 END DO
607 DEALLOCATE (first_sgf, last_sgf, nsgfat)
608 CALL cp_fm_release(cloc)
609 !
610 IF (iao_env%do_center) THEN
611 IF (unit_nr > 0) THEN
612 WRITE (unit_nr, '(T2,A)') ' Calculate Localized Orbital Centers and Spread'
613 IF (iao_env%pos_periodic) THEN
614 WRITE (unit_nr, '(T2,A)') ' Use Berry Phase Position Operator'
615 ELSE
616 WRITE (unit_nr, '(T2,A)') ' Use Local Position Operator'
617 END IF
618 END IF
619 nvec = maxval(nocc)
620 ! x y z m2(1) m2(2)
621 ALLOCATE (moments(5, nvec, nspin))
622 moments = 0.0_dp
623 IF (iao_env%pos_periodic) THEN
624 CALL center_spread_berry(qs_env, c_loc_orb, moments)
625 ELSE
626 CALL center_spread_loc(qs_env, c_loc_orb, moments)
627 END IF
628 !
629 IF (ASSOCIATED(ibo_cc_section)) THEN
630 CALL print_center_spread(moments, nocc, ibo_cc_section)
631 END IF
632 !
633 IF (PRESENT(bond_centers)) THEN
634 nx = SIZE(bond_centers, 1)
635 no = SIZE(bond_centers, 2)
636 ns = SIZE(bond_centers, 3)
637 cpassert(no >= nvec)
638 cpassert(ns == nspin)
639 cpassert(nx >= 3)
640 nx = min(nx, 5)
641 bond_centers(1:nx, 1:nvec, 1:ns) = moments(1:nx, 1:nvec, 1:ns)
642 END IF
643 DEALLOCATE (moments)
644 END IF
645 !
646 IF (molden_ibo) THEN
647 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
648 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
649 IF (unit_nr > 0) THEN
650 WRITE (unit_nr, '(T2,A)') ' Write IBO in MOLDEN Format'
651 END IF
652 ALLOCATE (mo_loc(nspin))
653 DO ispin = 1, nspin
654 CALL get_mo_set(my_mos(ispin), nao=nao)
655 nvec = nocc(ispin)
656 CALL allocate_mo_set(mo_loc(ispin), nao, nvec, nvec, 0.0_dp, 1.0_dp, 0.0_dp)
657 CALL init_mo_set(mo_loc(ispin), fm_ref=c_loc_orb(ispin), name="ibo_orb")
658 CALL cp_fm_to_fm(c_loc_orb(ispin), mo_loc(ispin)%mo_coeff)
659 CALL set_mo_set(mo_loc(ispin), homo=nvec)
660 mo_loc(ispin)%occupation_numbers = 1.0_dp
661 END DO
662 ! Print IBO functions: molden format
663 CALL write_mos_molden(mo_loc, qs_kind_set, particle_set, ibo_molden_section)
664 DO ispin = 1, nspin
665 CALL deallocate_mo_set(mo_loc(ispin))
666 END DO
667 DEALLOCATE (mo_loc)
668 END IF
669 !
670 IF (cubes_ibo) THEN
671 IF (unit_nr > 0) THEN
672 WRITE (unit_nr, '(T2,A)') ' Write IBO on CUBE files'
673 END IF
674 ! Print localized orbital functions: cube file
675 CALL print_ibo_cubes(qs_env, ibo_cubes_section, c_loc_orb)
676 END IF
677 !
678 IF (PRESENT(mos) .AND. ALLOCATED(c_loc_orb)) THEN
679 ! c_loc_orb -> mos
680 DO ispin = 1, nspin
681 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
682 nvec = nocc(ispin)
683 CALL cp_fm_to_fm(c_loc_orb(ispin), mo_coeff, ncol=nvec)
684 END DO
685 END IF
686 CALL cp_fm_release(c_loc_orb)
687 END IF
688 DEALLOCATE (ref_basis_set_list)
689
690 IF (PRESENT(c_iao_coef)) THEN
691 CALL cp_fm_release(c_iao_coef)
692 ALLOCATE (c_iao_coef(nspin))
693 DO ispin = 1, nspin
694 CALL cp_fm_create(c_iao_coef(ispin), iao_coef(ispin)%matrix_struct)
695 CALL cp_fm_to_fm(iao_coef(ispin), c_iao_coef(ispin))
696 END DO
697 END IF
698 CALL cp_fm_release(iao_coef)
699
700 IF (unit_nr > 0) THEN
701 WRITE (unit_nr, '(T2,A)') &
702 '!----------------------------END OF IAO ANALYSIS------------------------------!'
703 END IF
704
705 CALL timestop(handle)
706
707 END SUBROUTINE iao_wfn_analysis
708
709! **************************************************************************************************
710!> \brief Computes projector matrices for ref to orb basis and reverse
711!> \param smat ...
712!> \param sref ...
713!> \param s_r_o ...
714!> \param p_o_r ...
715!> \param p_r_o ...
716!> \param eps_svd ...
717! **************************************************************************************************
718 SUBROUTINE iao_projectors(smat, sref, s_r_o, p_o_r, p_r_o, eps_svd)
719 TYPE(dbcsr_type), INTENT(INOUT) :: smat, sref, s_r_o
720 TYPE(cp_fm_type), INTENT(INOUT) :: p_o_r, p_r_o
721 REAL(kind=dp), INTENT(IN) :: eps_svd
722
723 CHARACTER(len=*), PARAMETER :: routinen = 'iao_projectors'
724
725 INTEGER :: handle, norb, nref
726 TYPE(cp_fm_struct_type), POINTER :: fm_struct
727 TYPE(cp_fm_type) :: fm_inv, fm_s, fm_sro
728
729 CALL timeset(routinen, handle)
730
731 CALL cp_fm_get_info(p_r_o, nrow_global=nref, ncol_global=norb)
732 CALL cp_fm_create(fm_sro, p_r_o%matrix_struct)
733 CALL copy_dbcsr_to_fm(s_r_o, fm_sro)
734
735 NULLIFY (fm_struct)
736 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=norb, &
737 template_fmstruct=p_r_o%matrix_struct)
738 CALL cp_fm_create(fm_s, fm_struct, name="smat")
739 CALL cp_fm_create(fm_inv, fm_struct, name="sinv")
740 CALL cp_fm_struct_release(fm_struct)
741 CALL copy_dbcsr_to_fm(smat, fm_s)
742 CALL cp_fm_invert(fm_s, fm_inv, eps_svd=eps_svd)
743 CALL parallel_gemm('N', 'T', norb, nref, norb, 1.0_dp, fm_inv, fm_sro, 0.0_dp, p_o_r)
744 CALL cp_fm_release(fm_s)
745 CALL cp_fm_release(fm_inv)
746
747 NULLIFY (fm_struct)
748 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, ncol_global=nref, &
749 template_fmstruct=p_r_o%matrix_struct)
750 CALL cp_fm_create(fm_s, fm_struct, name="sref")
751 CALL cp_fm_create(fm_inv, fm_struct, name="sinv")
752 CALL cp_fm_struct_release(fm_struct)
753 CALL copy_dbcsr_to_fm(sref, fm_s)
754 CALL cp_fm_invert(fm_s, fm_inv, eps_svd=eps_svd)
755 CALL parallel_gemm('N', 'N', nref, norb, nref, 1.0_dp, fm_inv, fm_sro, 0.0_dp, p_r_o)
756 CALL cp_fm_release(fm_s)
757 CALL cp_fm_release(fm_inv)
758
759 CALL cp_fm_release(fm_sro)
760
761 CALL timestop(handle)
762
763 END SUBROUTINE iao_projectors
764
765! **************************************************************************************************
766!> \brief Computes intrinsic orbitals for a given MO vector set
767!> \param smat ...
768!> \param p_o_r ...
769!> \param p_r_o ...
770!> \param cvec ...
771!> \param avec ...
772! **************************************************************************************************
773 SUBROUTINE intrinsic_ao_calc(smat, p_o_r, p_r_o, cvec, avec)
774 TYPE(dbcsr_type), INTENT(INOUT) :: smat
775 TYPE(cp_fm_type), INTENT(INOUT) :: p_o_r, p_r_o, cvec, avec
776
777 CHARACTER(len=*), PARAMETER :: routinen = 'intrinsic_ao_calc'
778
779 INTEGER :: handle, nao, norb, nref
780 TYPE(cp_fm_struct_type), POINTER :: fm_struct
781 TYPE(cp_fm_type) :: ctvec, pc, sc, sct, vec1
782
783 CALL timeset(routinen, handle)
784
785 ! number of orbitals
786 CALL cp_fm_get_info(cvec, ncol_global=norb)
787 ! basis set sizes
788 CALL cp_fm_get_info(p_r_o, nrow_global=nref, ncol_global=nao)
789 ! temp array
790 NULLIFY (fm_struct)
791 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, ncol_global=norb, &
792 template_fmstruct=cvec%matrix_struct)
793 CALL cp_fm_create(pc, fm_struct)
794 CALL cp_fm_struct_release(fm_struct)
795 ! CT = orth(Por.Pro.C)
796 CALL parallel_gemm('N', 'N', nref, norb, nao, 1.0_dp, p_r_o, cvec, 0.0_dp, pc)
797 CALL cp_fm_create(ctvec, cvec%matrix_struct)
798 CALL parallel_gemm('N', 'N', nao, norb, nref, 1.0_dp, p_o_r, pc, 0.0_dp, ctvec)
799 CALL cp_fm_release(pc)
800 CALL make_basis_lowdin(ctvec, norb, smat)
801 ! S*C and S*CT
802 CALL cp_fm_create(sc, cvec%matrix_struct)
803 CALL cp_dbcsr_sm_fm_multiply(smat, cvec, sc, ncol=norb)
804 CALL cp_fm_create(sct, cvec%matrix_struct)
805 CALL cp_dbcsr_sm_fm_multiply(smat, ctvec, sct, ncol=norb)
806 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=nref, &
807 template_fmstruct=cvec%matrix_struct)
808 CALL cp_fm_create(pc, fm_struct)
809 CALL cp_fm_struct_release(fm_struct)
810 ! V1 = (CT*SCT(T))Por
811 CALL parallel_gemm('T', 'N', norb, nref, nao, 1.0_dp, sct, p_o_r, 0.0_dp, pc)
812 NULLIFY (fm_struct)
813 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nref, &
814 template_fmstruct=cvec%matrix_struct)
815 CALL cp_fm_create(vec1, fm_struct)
816 CALL cp_fm_struct_release(fm_struct)
817 CALL parallel_gemm('N', 'N', nao, nref, norb, 1.0_dp, ctvec, pc, 0.0_dp, vec1)
818 ! A = C*SC(T)*V1
819 CALL parallel_gemm('T', 'N', norb, nref, nao, 1.0_dp, sc, vec1, 0.0_dp, pc)
820 CALL parallel_gemm('N', 'N', nao, nref, norb, 1.0_dp, cvec, pc, 0.0_dp, avec)
821 ! V1 = Por - V1
822 CALL cp_fm_geadd(1.0_dp, 'N', p_o_r, -1.0_dp, vec1)
823 ! A = A + V1
824 CALL cp_fm_geadd(1.0_dp, 'N', vec1, 1.0_dp, avec)
825 ! A = A - C*SC(T)*V1
826 CALL parallel_gemm('T', 'N', norb, nref, nao, 1.0_dp, sc, vec1, 0.0_dp, pc)
827 CALL parallel_gemm('N', 'N', nao, nref, norb, -1.0_dp, cvec, pc, 1.0_dp, avec)
828 ! A = orth(A)
829 CALL make_basis_lowdin(avec, nref, smat)
830
831 ! clean up
832 CALL cp_fm_release(pc)
833 CALL cp_fm_release(vec1)
834 CALL cp_fm_release(sc)
835 CALL cp_fm_release(sct)
836 CALL cp_fm_release(ctvec)
837
838 CALL timestop(handle)
839
840 END SUBROUTINE intrinsic_ao_calc
841
842! **************************************************************************************************
843!> \brief Calculate the density matrix from fm vectors using occupation numbers
844!> \param cvec ...
845!> \param density_matrix ...
846!> \param occupation ...
847!> \param uniform_occupation ...
848! **************************************************************************************************
849 SUBROUTINE iao_calculate_dmat_diag(cvec, density_matrix, occupation, uniform_occupation)
850
851 TYPE(cp_fm_type), INTENT(IN) :: cvec
852 TYPE(dbcsr_type) :: density_matrix
853 REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: occupation
854 LOGICAL, INTENT(IN) :: uniform_occupation
855
856 CHARACTER(len=*), PARAMETER :: routineN = 'iao_calculate_dmat_diag'
857
858 INTEGER :: handle, ncol
859 REAL(KIND=dp) :: alpha
860 TYPE(cp_fm_type) :: fm_tmp
861
862 CALL timeset(routinen, handle)
863
864 CALL dbcsr_set(density_matrix, 0.0_dp)
865
866 CALL cp_fm_get_info(cvec, ncol_global=ncol)
867 IF (.NOT. uniform_occupation) THEN
868 CALL cp_fm_create(fm_tmp, cvec%matrix_struct)
869 CALL cp_fm_to_fm(cvec, fm_tmp)
870 CALL cp_fm_column_scale(fm_tmp, occupation(1:ncol))
871 alpha = 1.0_dp
872 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=density_matrix, &
873 matrix_v=cvec, matrix_g=fm_tmp, &
874 ncol=ncol, alpha=alpha)
875 CALL cp_fm_release(fm_tmp)
876 ELSE
877 alpha = occupation(1)
878 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=density_matrix, &
879 matrix_v=cvec, ncol=ncol, alpha=alpha)
880 END IF
881
882 CALL timestop(handle)
883
884 END SUBROUTINE iao_calculate_dmat_diag
885
886! **************************************************************************************************
887!> \brief Calculate the density matrix from fm vectors using an occupation matrix
888!> \param cvec ...
889!> \param density_matrix ...
890!> \param weight ...
891!> \param occmat ...
892! **************************************************************************************************
893 SUBROUTINE iao_calculate_dmat_full(cvec, density_matrix, weight, occmat)
894
895 TYPE(cp_fm_type), INTENT(IN) :: cvec
896 TYPE(dbcsr_type) :: density_matrix
897 REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: weight
898 TYPE(cp_fm_type), INTENT(IN) :: occmat
899
900 CHARACTER(len=*), PARAMETER :: routinen = 'iao_calculate_dmat_full'
901
902 INTEGER :: handle, ic, jc, ncol
903 REAL(kind=dp) :: alpha
904 TYPE(cp_fm_struct_type), POINTER :: fm_struct
905 TYPE(cp_fm_type) :: fm1, fm2
906
907 CALL timeset(routinen, handle)
908
909 CALL dbcsr_set(density_matrix, 0.0_dp)
910
911 CALL cp_fm_struct_create(fm_struct, ncol_global=1, &
912 template_fmstruct=cvec%matrix_struct)
913 CALL cp_fm_create(fm1, fm_struct)
914 CALL cp_fm_create(fm2, fm_struct)
915 CALL cp_fm_struct_release(fm_struct)
916
917 CALL cp_fm_get_info(cvec, ncol_global=ncol)
918 DO ic = 1, ncol
919 CALL cp_fm_to_fm(cvec, fm1, ncol=1, source_start=ic, target_start=1)
920 DO jc = 1, ncol
921 CALL cp_fm_to_fm(cvec, fm2, ncol=1, source_start=jc, target_start=1)
922 CALL cp_fm_get_element(occmat, ic, jc, alpha)
923 alpha = weight(ic)*alpha
924 CALL cp_dbcsr_plus_fm_fm_t(density_matrix, fm1, fm2, ncol=1, &
925 alpha=alpha, symmetry_mode=1)
926 END DO
927 END DO
928 CALL cp_fm_release(fm1)
929 CALL cp_fm_release(fm2)
930
931 CALL timestop(handle)
932
933 END SUBROUTINE iao_calculate_dmat_full
934
935! **************************************************************************************************
936!> \brief compute the atomic charges (orthogonal basis)
937!> \param p_matrix ...
938!> \param charges ...
939! **************************************************************************************************
940 SUBROUTINE iao_charges(p_matrix, charges)
941 TYPE(dbcsr_type) :: p_matrix
942 REAL(kind=dp), DIMENSION(:) :: charges
943
944 INTEGER :: i, iblock_col, 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)
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)
966 CALL group%sum(charges)
967
968 END SUBROUTINE iao_charges
969
970! **************************************************************************************************
971!> \brief Computes and prints the Cube Files for the intrinsic atomic orbitals
972!> \param qs_env ...
973!> \param print_section ...
974!> \param iao_coef ...
975!> \param basis_set_list ...
976! **************************************************************************************************
977 SUBROUTINE print_iao_cubes(qs_env, print_section, iao_coef, basis_set_list)
978 TYPE(qs_environment_type), POINTER :: qs_env
979 TYPE(section_vals_type), POINTER :: print_section
980 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: iao_coef
981 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_list
982
983 CHARACTER(LEN=default_path_length) :: filename, title
984 INTEGER :: i, i_rep, ispin, ivec, iw, j, n_rep, &
985 nat, natom, norb, nspins, nstart
986 INTEGER, DIMENSION(:), POINTER :: atom_list, blk_sizes, first_bas, stride
987 LOGICAL :: mpi_io
988 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
989 TYPE(cell_type), POINTER :: cell
990 TYPE(cp_logger_type), POINTER :: logger
991 TYPE(dft_control_type), POINTER :: dft_control
992 TYPE(particle_list_type), POINTER :: particles
993 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
994 TYPE(pw_c1d_gs_type) :: wf_g
995 TYPE(pw_env_type), POINTER :: pw_env
996 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
997 TYPE(pw_r3d_rs_type) :: wf_r
998 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
999 TYPE(qs_subsys_type), POINTER :: subsys
1000
1001 logger => cp_get_default_logger()
1002 stride => section_get_ivals(print_section, "STRIDE")
1003 CALL section_vals_val_get(print_section, "ATOM_LIST", n_rep_val=n_rep)
1004
1005 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1006 subsys=subsys, cell=cell, particle_set=particle_set, pw_env=pw_env, dft_control=dft_control)
1007 CALL qs_subsys_get(subsys, particles=particles)
1008
1009 CALL get_qs_env(qs_env=qs_env, natom=natom)
1010 ALLOCATE (blk_sizes(natom), first_bas(0:natom))
1011 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_sizes, basis=basis_set_list)
1012 first_bas(0) = 0
1013 DO i = 1, natom
1014 first_bas(i) = first_bas(i - 1) + blk_sizes(i)
1015 END DO
1016
1017 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1018 CALL auxbas_pw_pool%create_pw(wf_r)
1019 CALL auxbas_pw_pool%create_pw(wf_g)
1020
1021 nspins = SIZE(iao_coef)
1022 nstart = min(1, n_rep)
1023
1024 DO ispin = 1, nspins
1025 DO i_rep = nstart, n_rep
1026 CALL cp_fm_get_info(iao_coef(ispin), ncol_global=norb)
1027 IF (i_rep == 0) THEN
1028 nat = natom
1029 ELSE
1030 CALL section_vals_val_get(print_section, "ATOM_LIST", i_rep_val=i_rep, i_vals=atom_list)
1031 nat = SIZE(atom_list)
1032 END IF
1033 DO i = 1, nat
1034 IF (i_rep == 0) THEN
1035 j = i
1036 ELSE
1037 j = atom_list(i)
1038 END IF
1039 cpassert(j >= 1 .AND. j <= natom)
1040 DO ivec = first_bas(j - 1) + 1, first_bas(j)
1041 WRITE (filename, '(a4,I5.5,a1,I1.1)') "IAO_", ivec, "_", ispin
1042 WRITE (title, *) "Intrinsic Atomic Orbitals ", ivec, " atom ", j, " spin ", ispin
1043 mpi_io = .true.
1044 iw = cp_print_key_unit_nr(logger, print_section, "", extension=".cube", &
1045 middle_name=trim(filename), file_position="REWIND", log_filename=.false., &
1046 mpi_io=mpi_io)
1047 CALL calculate_wavefunction(iao_coef(ispin), ivec, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1048 cell, dft_control, particle_set, pw_env)
1049 CALL cp_pw_to_cube(wf_r, iw, title, particles=particles, stride=stride, mpi_io=mpi_io)
1050 CALL cp_print_key_finished_output(iw, logger, print_section, "", mpi_io=mpi_io)
1051 END DO
1052 END DO
1053 END DO
1054 END DO
1055 DEALLOCATE (blk_sizes, first_bas)
1056 CALL auxbas_pw_pool%give_back_pw(wf_r)
1057 CALL auxbas_pw_pool%give_back_pw(wf_g)
1058
1059 END SUBROUTINE print_iao_cubes
1060
1061! **************************************************************************************************
1062!> \brief Computes and prints the Cube Files for the intrinsic bond orbitals
1063!> \param qs_env ...
1064!> \param print_section ...
1065!> \param ibo_coef ...
1066! **************************************************************************************************
1067 SUBROUTINE print_ibo_cubes(qs_env, print_section, ibo_coef)
1068 TYPE(qs_environment_type), POINTER :: qs_env
1069 TYPE(section_vals_type), POINTER :: print_section
1070 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: ibo_coef
1071
1072 CHARACTER(LEN=default_path_length) :: filename, title
1073 INTEGER :: i, i_rep, ispin, iw, j, n_rep, norb, &
1074 nspins, nstart, nstate
1075 INTEGER, DIMENSION(:), POINTER :: state_list, stride
1076 LOGICAL :: mpi_io
1077 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1078 TYPE(cell_type), POINTER :: cell
1079 TYPE(cp_logger_type), POINTER :: logger
1080 TYPE(dft_control_type), POINTER :: dft_control
1081 TYPE(particle_list_type), POINTER :: particles
1082 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1083 TYPE(pw_c1d_gs_type) :: wf_g
1084 TYPE(pw_env_type), POINTER :: pw_env
1085 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1086 TYPE(pw_r3d_rs_type) :: wf_r
1087 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1088 TYPE(qs_subsys_type), POINTER :: subsys
1089
1090 cpassert(ASSOCIATED(print_section))
1091
1092 logger => cp_get_default_logger()
1093 stride => section_get_ivals(print_section, "STRIDE")
1094 CALL section_vals_val_get(print_section, "STATE_LIST", n_rep_val=n_rep)
1095
1096 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1097 subsys=subsys, cell=cell, particle_set=particle_set, pw_env=pw_env, dft_control=dft_control)
1098 CALL qs_subsys_get(subsys, particles=particles)
1099
1100 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1101 CALL auxbas_pw_pool%create_pw(wf_r)
1102 CALL auxbas_pw_pool%create_pw(wf_g)
1103
1104 nspins = SIZE(ibo_coef)
1105 nstart = min(1, n_rep)
1106
1107 DO ispin = 1, nspins
1108 DO i_rep = nstart, n_rep
1109 CALL cp_fm_get_info(ibo_coef(ispin), ncol_global=norb)
1110 IF (i_rep == 0) THEN
1111 nstate = norb
1112 ELSE
1113 CALL section_vals_val_get(print_section, "STATE_LIST", i_rep_val=i_rep, i_vals=state_list)
1114 nstate = SIZE(state_list)
1115 END IF
1116 DO i = 1, nstate
1117 IF (i_rep == 0) THEN
1118 j = i
1119 ELSE
1120 j = state_list(i)
1121 END IF
1122 cpassert(j >= 1 .AND. j <= norb)
1123 WRITE (filename, '(a4,I5.5,a1,I1.1)') "IBO_", j, "_", ispin
1124 WRITE (title, *) "Intrinsic Atomic Orbitals ", j, " spin ", ispin
1125 mpi_io = .true.
1126 iw = cp_print_key_unit_nr(logger, print_section, "", extension=".cube", &
1127 middle_name=trim(filename), file_position="REWIND", log_filename=.false., &
1128 mpi_io=mpi_io)
1129 CALL calculate_wavefunction(ibo_coef(ispin), j, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1130 cell, dft_control, particle_set, pw_env)
1131 CALL cp_pw_to_cube(wf_r, iw, title, particles=particles, stride=stride, mpi_io=mpi_io)
1132 CALL cp_print_key_finished_output(iw, logger, print_section, "", mpi_io=mpi_io)
1133 END DO
1134 END DO
1135 END DO
1136
1137 CALL auxbas_pw_pool%give_back_pw(wf_r)
1138 CALL auxbas_pw_pool%give_back_pw(wf_g)
1139
1140 END SUBROUTINE print_ibo_cubes
1141
1142! **************************************************************************************************
1143!> \brief prints charge center and spreads for all orbitals
1144!> \param moments ...
1145!> \param nocc ...
1146!> \param print_section ...
1147!> \param iounit ...
1148! **************************************************************************************************
1149 SUBROUTINE print_center_spread(moments, nocc, print_section, iounit)
1150 REAL(kind=dp), DIMENSION(:, :, :), INTENT(IN) :: moments
1151 INTEGER, DIMENSION(:), INTENT(IN) :: nocc
1152 TYPE(section_vals_type), OPTIONAL, POINTER :: print_section
1153 INTEGER, INTENT(IN), OPTIONAL :: iounit
1154
1155 CHARACTER(LEN=default_path_length) :: filename
1156 INTEGER :: is, ispin, iw, nspin
1157 TYPE(cp_logger_type), POINTER :: logger
1158
1159 logger => cp_get_default_logger()
1160 nspin = SIZE(moments, 3)
1161
1162 IF (PRESENT(print_section)) THEN
1163 WRITE (filename, '(A18,I1.1)') "IBO_CENTERS_SPREAD"
1164 iw = cp_print_key_unit_nr(logger, print_section, "", extension=".csp", &
1165 middle_name=trim(filename), file_position="REWIND", log_filename=.false.)
1166 ELSEIF (PRESENT(iounit)) THEN
1167 iw = iounit
1168 ELSE
1169 iw = -1
1170 END IF
1171 IF (iw > 0) THEN
1172 DO ispin = 1, nspin
1173 WRITE (iw, "(T2,A,i1)") "Intrinsic Bond Orbitals: Centers and Spread for Spin ", ispin
1174 WRITE (iw, "(A7,T30,A6,T68,A7)") "State", "Center", "Spreads"
1175 DO is = 1, nocc(ispin)
1176 WRITE (iw, "(i7,3F15.8,8X,2F10.5)") is, moments(:, is, ispin)
1177 END DO
1178 END DO
1179 END IF
1180 IF (PRESENT(print_section)) THEN
1181 CALL cp_print_key_finished_output(iw, logger, print_section, "")
1182 END IF
1183
1184 END SUBROUTINE print_center_spread
1185
1186! **************************************************************************************************
1187!> \brief ...
1188!> \param qs_env ...
1189!> \param c_loc_orb ...
1190!> \param moments ...
1191! **************************************************************************************************
1192 SUBROUTINE center_spread_loc(qs_env, c_loc_orb, moments)
1193 TYPE(qs_environment_type), POINTER :: qs_env
1194 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: c_loc_orb
1195 REAL(kind=dp), DIMENSION(:, :, :), INTENT(INOUT) :: moments
1196
1197 CHARACTER(len=*), PARAMETER :: routinen = 'center_spread_loc'
1198 INTEGER, DIMENSION(6), PARAMETER :: list = (/1, 2, 3, 4, 7, 9/)
1199
1200 INTEGER :: handle, i, iop, iorb, ispin, nao, norb, &
1201 nspin
1202 REAL(kind=dp) :: xmii
1203 REAL(kind=dp), DIMENSION(3) :: rpoint
1204 TYPE(cell_type), POINTER :: cell
1205 TYPE(cp_fm_struct_type), POINTER :: fm_struct
1206 TYPE(cp_fm_type) :: ccmat, ocvec
1207 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: dipmat
1208 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
1209 TYPE(dbcsr_type), POINTER :: omat, smat
1210
1211 CALL timeset(routinen, handle)
1212
1213 CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s)
1214 smat => matrix_s(1, 1)%matrix
1215 rpoint = 0.0_dp
1216 nspin = SIZE(c_loc_orb)
1217 moments = 0.0_dp
1218
1219 ALLOCATE (dipmat(9))
1220 DO i = 1, 9
1221 ALLOCATE (dipmat(i)%matrix)
1222 CALL dbcsr_copy(dipmat(i)%matrix, smat)
1223 CALL dbcsr_set(dipmat(i)%matrix, 0.0_dp)
1224 END DO
1225
1226 CALL build_local_moment_matrix(qs_env, dipmat, 2, rpoint)
1227
1228 DO ispin = 1, nspin
1229 CALL cp_fm_get_info(c_loc_orb(ispin), nrow_global=nao, ncol_global=norb)
1230 CALL cp_fm_create(ocvec, c_loc_orb(ispin)%matrix_struct)
1231 NULLIFY (fm_struct)
1232 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=norb, &
1233 template_fmstruct=c_loc_orb(ispin)%matrix_struct)
1234 CALL cp_fm_create(ccmat, fm_struct)
1235 CALL cp_fm_struct_release(fm_struct)
1236 DO i = 1, 6
1237 iop = list(i)
1238 omat => dipmat(iop)%matrix
1239 CALL cp_dbcsr_sm_fm_multiply(omat, c_loc_orb(ispin), ocvec, ncol=norb)
1240 CALL parallel_gemm('T', 'N', norb, norb, nao, 1.0_dp, c_loc_orb(ispin), ocvec, &
1241 0.0_dp, ccmat)
1242 DO iorb = 1, norb
1243 CALL cp_fm_get_element(ccmat, iorb, iorb, xmii)
1244 IF (iop <= 3) THEN
1245 moments(iop, iorb, ispin) = moments(iop, iorb, ispin) + xmii
1246 moments(4, iorb, ispin) = moments(4, iorb, ispin) - xmii**2
1247 ELSE
1248 moments(4, iorb, ispin) = moments(4, iorb, ispin) + xmii
1249 END IF
1250 END DO
1251 END DO
1252 CALL cp_fm_release(ocvec)
1253 CALL cp_fm_release(ccmat)
1254 END DO
1255
1256 DO i = 1, 9
1257 CALL dbcsr_release(dipmat(i)%matrix)
1258 DEALLOCATE (dipmat(i)%matrix)
1259 END DO
1260 DEALLOCATE (dipmat)
1261
1262 CALL get_qs_env(qs_env=qs_env, cell=cell)
1263 DO ispin = 1, nspin
1264 DO iorb = 1, norb
1265 moments(1:3, iorb, ispin) = pbc(moments(1:3, iorb, ispin), cell)
1266 END DO
1267 END DO
1268
1269 CALL timestop(handle)
1270
1271 END SUBROUTINE center_spread_loc
1272
1273! **************************************************************************************************
1274!> \brief ...
1275!> \param qs_env ...
1276!> \param c_loc_orb ...
1277!> \param moments ...
1278! **************************************************************************************************
1279 SUBROUTINE center_spread_berry(qs_env, c_loc_orb, moments)
1280 TYPE(qs_environment_type), POINTER :: qs_env
1281 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: c_loc_orb
1282 REAL(kind=dp), DIMENSION(:, :, :), INTENT(INOUT) :: moments
1283
1284 CHARACTER(len=*), PARAMETER :: routinen = 'center_spread_berry'
1285
1286 COMPLEX(KIND=dp) :: z
1287 INTEGER :: dim_op, handle, i, idir, ispin, istate, &
1288 j, jdir, nao, norb, nspin
1289 REAL(dp), DIMENSION(3) :: c, cpbc
1290 REAL(dp), DIMENSION(6) :: weights
1291 REAL(kind=dp) :: imagpart, realpart, spread_i, spread_ii
1292 TYPE(cell_type), POINTER :: cell
1293 TYPE(cp_fm_struct_type), POINTER :: fm_struct
1294 TYPE(cp_fm_type) :: opvec
1295 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: zij
1296 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
1297 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: op_sm_set
1298
1299 CALL timeset(routinen, handle)
1300
1301 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, cell=cell)
1302
1303 IF (cell%orthorhombic) THEN
1304 dim_op = 3
1305 ELSE
1306 dim_op = 6
1307 END IF
1308 ALLOCATE (op_sm_set(2, dim_op))
1309 DO i = 1, dim_op
1310 DO j = 1, 2
1311 NULLIFY (op_sm_set(j, i)%matrix)
1312 ALLOCATE (op_sm_set(j, i)%matrix)
1313 CALL dbcsr_copy(op_sm_set(j, i)%matrix, matrix_s(1)%matrix)
1314 CALL dbcsr_set(op_sm_set(j, i)%matrix, 0.0_dp)
1315 END DO
1316 END DO
1317 CALL initialize_weights(cell, weights)
1318
1319 CALL compute_berry_operator(qs_env, cell, op_sm_set, dim_op)
1320
1321 nspin = SIZE(c_loc_orb, 1)
1322 DO ispin = 1, nspin
1323 CALL cp_fm_get_info(c_loc_orb(ispin), nrow_global=nao, ncol_global=norb)
1324 CALL cp_fm_create(opvec, c_loc_orb(ispin)%matrix_struct)
1325 NULLIFY (fm_struct)
1326 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=norb, &
1327 template_fmstruct=c_loc_orb(ispin)%matrix_struct)
1328 ALLOCATE (zij(2, dim_op))
1329
1330 ! Compute zij here
1331 DO i = 1, dim_op
1332 DO j = 1, 2
1333 CALL cp_fm_create(zij(j, i), fm_struct)
1334 CALL cp_fm_set_all(zij(j, i), 0.0_dp)
1335 CALL cp_dbcsr_sm_fm_multiply(op_sm_set(j, i)%matrix, c_loc_orb(ispin), opvec, ncol=norb)
1336 CALL parallel_gemm("T", "N", norb, norb, nao, 1.0_dp, c_loc_orb(ispin), opvec, 0.0_dp, zij(j, i))
1337 END DO
1338 END DO
1339
1340 CALL cp_fm_struct_release(fm_struct)
1341 CALL cp_fm_release(opvec)
1342
1343 DO istate = 1, norb
1344 c = 0.0_dp
1345 spread_i = 0.0_dp
1346 spread_ii = 0.0_dp
1347 DO jdir = 1, dim_op
1348 CALL cp_fm_get_element(zij(1, jdir), istate, istate, realpart)
1349 CALL cp_fm_get_element(zij(2, jdir), istate, istate, imagpart)
1350 z = cmplx(realpart, imagpart, dp)
1351 spread_i = spread_i - weights(jdir)* &
1352 log(realpart*realpart + imagpart*imagpart)/twopi/twopi
1353 spread_ii = spread_ii + weights(jdir)* &
1354 (1.0_dp - (realpart*realpart + imagpart*imagpart))/twopi/twopi
1355 IF (jdir < 4) THEN
1356 DO idir = 1, 3
1357 c(idir) = c(idir) + &
1358 (cell%hmat(idir, jdir)/twopi)*aimag(log(z))
1359 END DO
1360 END IF
1361 END DO
1362 cpbc = pbc(c, cell)
1363 moments(1:3, istate, ispin) = cpbc(1:3)
1364 moments(4, istate, ispin) = spread_i
1365 moments(5, istate, ispin) = spread_ii
1366 END DO
1367
1368 CALL cp_fm_release(zij)
1369
1370 END DO
1371
1372 DO i = 1, dim_op
1373 DO j = 1, 2
1374 CALL dbcsr_release(op_sm_set(j, i)%matrix)
1375 DEALLOCATE (op_sm_set(j, i)%matrix)
1376 END DO
1377 END DO
1378 DEALLOCATE (op_sm_set)
1379
1380 CALL timestop(handle)
1381
1382 END SUBROUTINE center_spread_berry
1383
1384! **************************************************************************************************
1385!> \brief ...
1386!> \param qs_env ...
1387!> \param oce_basis_set_list ...
1388!> \param smat_kind ...
1389!> \param sxo ...
1390!> \param iao_coef ...
1391!> \param oce_atom ...
1392!> \param unit_nr ...
1393! **************************************************************************************************
1394 SUBROUTINE iao_oce_expansion(qs_env, oce_basis_set_list, smat_kind, sxo, iao_coef, oce_atom, unit_nr)
1395 TYPE(qs_environment_type), POINTER :: qs_env
1396 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: oce_basis_set_list
1397 TYPE(cp_2d_r_p_type), DIMENSION(:) :: smat_kind
1398 TYPE(dbcsr_p_type), DIMENSION(:) :: sxo
1399 TYPE(cp_fm_type), DIMENSION(:) :: iao_coef
1400 TYPE(cp_2d_r_p_type), DIMENSION(:, :) :: oce_atom
1401 INTEGER, INTENT(IN) :: unit_nr
1402
1403 CHARACTER(len=*), PARAMETER :: routinen = 'iao_oce_expansion'
1404
1405 INTEGER :: handle, i, i1, i2, iao, iatom, ikind, &
1406 iset, ishell, ispin, l, m, maxl, n, &
1407 natom, nkind, noce, ns, nset, nsgf, &
1408 nspin
1409 INTEGER, DIMENSION(:), POINTER :: iao_blk_sizes, nshell, oce_blk_sizes, &
1410 orb_blk_sizes
1411 INTEGER, DIMENSION(:, :), POINTER :: first_sgf, last_sgf, lval
1412 LOGICAL :: found
1413 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ev, vector
1414 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: amat, bmat, filter, oce_comp, prol, vec
1415 REAL(kind=dp), DIMENSION(:, :), POINTER :: ablock
1416 TYPE(cp_2d_r_p_type), ALLOCATABLE, DIMENSION(:) :: sinv_kind
1417 TYPE(dbcsr_distribution_type) :: dbcsr_dist
1418 TYPE(dbcsr_type) :: iao_vec, sx_vec
1419 TYPE(gto_basis_set_type), POINTER :: oce_basis
1420 TYPE(mp_comm_type) :: group
1421 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1422 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1423 TYPE(qs_ks_env_type), POINTER :: ks_env
1424
1425 CALL timeset(routinen, handle)
1426
1427 ! basis sets: block sizes
1428 CALL dbcsr_get_info(sxo(1)%matrix, row_blk_size=oce_blk_sizes, col_blk_size=orb_blk_sizes, &
1429 distribution=dbcsr_dist)
1430 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, natom=natom)
1431 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set, qs_kind_set=qs_kind_set)
1432 ALLOCATE (iao_blk_sizes(natom))
1433 DO iatom = 1, natom
1434 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1435 CALL get_qs_kind(qs_kind_set(ikind), nsgf=ns, basis_type="MIN")
1436 iao_blk_sizes(iatom) = ns
1437 END DO
1438
1439 CALL dbcsr_create(iao_vec, name="IAO_VEC", dist=dbcsr_dist, &
1440 matrix_type=dbcsr_type_no_symmetry, row_blk_size=orb_blk_sizes, &
1441 col_blk_size=iao_blk_sizes)
1442 CALL dbcsr_create(sx_vec, name="SX_VEC", dist=dbcsr_dist, &
1443 matrix_type=dbcsr_type_no_symmetry, row_blk_size=oce_blk_sizes, &
1444 col_blk_size=iao_blk_sizes)
1445 CALL dbcsr_reserve_diag_blocks(matrix=sx_vec)
1446
1447 nkind = SIZE(smat_kind)
1448 ALLOCATE (sinv_kind(nkind))
1449 DO ikind = 1, nkind
1450 noce = SIZE(smat_kind(ikind)%array, 1)
1451 ALLOCATE (sinv_kind(ikind)%array(noce, noce))
1452 sinv_kind(ikind)%array = smat_kind(ikind)%array
1453 CALL invmat_symm(sinv_kind(ikind)%array)
1454 END DO
1455 CALL dbcsr_get_info(iao_vec, group=group)
1456
1457 nspin = SIZE(iao_coef, 1)
1458 ALLOCATE (oce_comp(natom, nspin))
1459 oce_comp = 0.0_dp
1460 DO ispin = 1, nspin
1461 CALL copy_fm_to_dbcsr(iao_coef(ispin), iao_vec)
1462 CALL dbcsr_multiply("N", "N", 1.0_dp, sxo(1)%matrix, iao_vec, 0.0_dp, sx_vec, &
1463 retain_sparsity=.true.)
1464 DO iatom = 1, natom
1465 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1466 CALL dbcsr_get_block_p(matrix=sx_vec, &
1467 row=iatom, col=iatom, block=ablock, found=found)
1468 IF (found) THEN
1469 n = SIZE(ablock, 1)
1470 m = SIZE(ablock, 2)
1471 ablock = matmul(sinv_kind(ikind)%array, ablock)
1472 ALLOCATE (amat(n, m), bmat(m, m), ev(m), vec(m, m))
1473 amat(1:n, 1:m) = matmul(smat_kind(ikind)%array(1:n, 1:n), ablock(1:n, 1:m))
1474 bmat(1:m, 1:m) = matmul(transpose(ablock(1:n, 1:m)), amat(1:n, 1:m))
1475 CALL jacobi(bmat, ev, vec)
1476 oce_comp(iatom, ispin) = sum(ev(1:m))/real(m, kind=dp)
1477 DO i = 1, m
1478 ev(i) = 1._dp/sqrt(ev(i))
1479 bmat(1:m, i) = vec(1:m, i)*ev(i)
1480 END DO
1481 bmat(1:m, 1:m) = matmul(bmat(1:m, 1:m), transpose(vec(1:m, 1:m)))
1482 ablock(1:n, 1:m) = matmul(ablock(1:n, 1:m), bmat(1:m, 1:m))
1483 DEALLOCATE (amat, bmat, ev, vec)
1484 END IF
1485 END DO
1486 CALL dbcsr_replicate_all(sx_vec)
1487 DO iatom = 1, natom
1488 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1489 CALL dbcsr_get_block_p(matrix=sx_vec, &
1490 row=iatom, col=iatom, block=ablock, found=found)
1491 cpassert(found)
1492 n = SIZE(ablock, 1)
1493 m = SIZE(ablock, 2)
1494 ALLOCATE (oce_atom(iatom, ispin)%array(n, m))
1495 oce_atom(iatom, ispin)%array = ablock
1496 END DO
1497 END DO
1498
1499 CALL group%sum(oce_comp)
1500 IF (unit_nr > 0) THEN
1501 DO iatom = 1, natom
1502 WRITE (unit_nr, "(T4,A,I6,T30,A,2F12.4)") "Atom:", iatom, " Completeness: ", oce_comp(iatom, 1:nspin)
1503 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1504 oce_basis => oce_basis_set_list(ikind)%gto_basis_set
1505 CALL get_gto_basis_set(oce_basis, nset=nset, nshell=nshell, nsgf=nsgf, maxl=maxl, &
1506 l=lval, first_sgf=first_sgf, last_sgf=last_sgf)
1507 ALLOCATE (filter(nsgf, 0:maxl), vector(nsgf), prol(0:maxl, nspin))
1508 filter = 0.0_dp
1509 DO iset = 1, nset
1510 DO ishell = 1, nshell(iset)
1511 l = lval(ishell, iset)
1512 i1 = first_sgf(ishell, iset)
1513 i2 = last_sgf(ishell, iset)
1514 filter(i1:i2, l) = 1.0_dp
1515 END DO
1516 END DO
1517 !
1518 n = SIZE(oce_atom(iatom, 1)%array, 1)
1519 m = SIZE(oce_atom(iatom, 1)%array, 2)
1520 cpassert(n == nsgf)
1521 DO iao = 1, m
1522 prol = 0.0_dp
1523 DO ispin = 1, nspin
1524 DO l = 0, maxl
1525 vector(1:n) = oce_atom(iatom, ispin)%array(1:n, iao)*filter(1:n, l)
1526 prol(l, ispin) = sum(matmul(smat_kind(ikind)%array(1:n, 1:n), vector(1:n))*vector(1:n))
1527 END DO
1528 END DO
1529 WRITE (unit_nr, "(T4,I3,T15,A,T39,(6F7.4))") iao, " l-contributions:", (sum(prol(l, :)), l=0, maxl)
1530 END DO
1531 DEALLOCATE (filter, vector, prol)
1532 END DO
1533 WRITE (unit_nr, *)
1534 END IF
1535
1536 DEALLOCATE (oce_comp)
1537 DO ikind = 1, nkind
1538 DEALLOCATE (sinv_kind(ikind)%array)
1539 END DO
1540 DEALLOCATE (sinv_kind)
1541 DEALLOCATE (iao_blk_sizes)
1542 CALL dbcsr_release(iao_vec)
1543 CALL dbcsr_release(sx_vec)
1544
1545 CALL timestop(handle)
1546
1547 END SUBROUTINE iao_oce_expansion
1548
1549! **************************************************************************************************
1550!> \brief ...
1551!> \param smat_kind ...
1552!> \param basis_set_list ...
1553! **************************************************************************************************
1554 SUBROUTINE oce_overlap_matrix(smat_kind, basis_set_list)
1555 TYPE(cp_2d_r_p_type), DIMENSION(:) :: smat_kind
1556 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_list
1557
1558 CHARACTER(len=*), PARAMETER :: routinen = 'oce_overlap_matrix'
1559
1560 INTEGER :: handle, ikind, iset, jset, ldsab, m1, &
1561 m2, n1, n2, ncoa, ncob, nkind, nseta, &
1562 sgfa, sgfb
1563 INTEGER, DIMENSION(:), POINTER :: la_max, la_min, npgfa, nsgfa
1564 INTEGER, DIMENSION(:, :), POINTER :: first_sgfa
1565 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: oint, owork
1566 REAL(kind=dp), DIMENSION(3) :: rab
1567 REAL(kind=dp), DIMENSION(:, :), POINTER :: rpgfa, scon_a, smat, zeta
1568 TYPE(gto_basis_set_type), POINTER :: basis_set
1569
1570 CALL timeset(routinen, handle)
1571
1572 rab(1:3) = 0.0_dp
1573
1574 nkind = SIZE(smat_kind)
1575 ldsab = 0
1576 DO ikind = 1, nkind
1577 basis_set => basis_set_list(ikind)%gto_basis_set
1578 cpassert(ASSOCIATED(basis_set))
1579 CALL get_gto_basis_set(gto_basis_set=basis_set, maxco=m1, nsgf=m2)
1580 ldsab = max(m1, m2, ldsab)
1581 END DO
1582
1583 ALLOCATE (oint(ldsab, ldsab), owork(ldsab, ldsab))
1584
1585 DO ikind = 1, nkind
1586 basis_set => basis_set_list(ikind)%gto_basis_set
1587 cpassert(ASSOCIATED(basis_set))
1588 smat => smat_kind(ikind)%array
1589 smat = 0.0_dp
1590 ! basis ikind
1591 first_sgfa => basis_set%first_sgf
1592 la_max => basis_set%lmax
1593 la_min => basis_set%lmin
1594 npgfa => basis_set%npgf
1595 nseta = basis_set%nset
1596 nsgfa => basis_set%nsgf_set
1597 rpgfa => basis_set%pgf_radius
1598 scon_a => basis_set%scon
1599 zeta => basis_set%zet
1600
1601 DO iset = 1, nseta
1602
1603 ncoa = npgfa(iset)*ncoset(la_max(iset))
1604 n1 = npgfa(iset)*(ncoset(la_max(iset)) - ncoset(la_min(iset) - 1))
1605 sgfa = first_sgfa(1, iset)
1606
1607 DO jset = 1, nseta
1608
1609 ncob = npgfa(jset)*ncoset(la_max(jset))
1610 n2 = npgfa(jset)*(ncoset(la_max(jset)) - ncoset(la_min(jset) - 1))
1611 sgfb = first_sgfa(1, jset)
1612
1613 ! calculate integrals and derivatives
1614 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
1615 la_max(jset), la_min(jset), npgfa(jset), rpgfa(:, jset), zeta(:, jset), &
1616 rab, sab=oint(:, :))
1617 ! Contraction
1618 CALL contraction(oint(:, :), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
1619 cb=scon_a(:, sgfb:), nb=n2, mb=nsgfa(jset), fscale=1.0_dp, trans=.false.)
1620 CALL block_add("IN", owork, nsgfa(iset), nsgfa(jset), smat, &
1621 sgfa, sgfb, trans=.false.)
1622
1623 END DO
1624 END DO
1625
1626 END DO
1627 DEALLOCATE (oint, owork)
1628
1629 CALL timestop(handle)
1630
1631 END SUBROUTINE oce_overlap_matrix
1632
1633! **************************************************************************************************
1634!> \brief 2 by 2 rotation optimization for the Pipek-Mezey operator
1635!> \param zij_fm_set ...
1636!> \param vectors ...
1637!> \param order ...
1638!> \param accuracy ...
1639!> \param unit_nr ...
1640!> \par History
1641!> 05-2005 created
1642!> 10-2023 adapted from jacobi_rotation_pipek [JGH]
1643!> \author MI
1644! **************************************************************************************************
1645 SUBROUTINE pm_localization(zij_fm_set, vectors, order, accuracy, unit_nr)
1646
1647 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: zij_fm_set
1648 TYPE(cp_fm_type), INTENT(IN) :: vectors
1649 INTEGER, INTENT(IN) :: order
1650 REAL(kind=dp), INTENT(IN) :: accuracy
1651 INTEGER, INTENT(IN) :: unit_nr
1652
1653 INTEGER, PARAMETER :: max_sweeps = 250
1654
1655 INTEGER :: iatom, istate, jstate, natom, nstate, &
1656 sweeps
1657 REAL(kind=dp) :: aij, bij, ct, ftarget, mii, mij, mjj, &
1658 st, t1, t2, theta, tolerance, tt
1659 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: fdiag
1660 TYPE(cp_fm_type) :: rmat
1661
1662 CALL cp_fm_create(rmat, zij_fm_set(1, 1)%matrix_struct)
1663 CALL cp_fm_set_all(rmat, 0.0_dp, 1.0_dp)
1664
1665 CALL cp_fm_get_info(rmat, nrow_global=nstate)
1666 ALLOCATE (fdiag(nstate))
1667 tolerance = 1.0e10_dp
1668 sweeps = 0
1669 natom = SIZE(zij_fm_set, 1)
1670 IF (unit_nr > 0) THEN
1671 WRITE (unit_nr, '(A,T30,A,T45,A,T63,A,T77,A)') &
1672 " Jacobi Localization ", "Sweep", "Functional", "Gradient", "Time"
1673 END IF
1674 ! do jacobi sweeps until converged
1675 DO sweeps = 1, max_sweeps
1676 t1 = m_walltime()
1677 tolerance = 0.0_dp
1678 DO istate = 1, nstate
1679 DO jstate = istate + 1, nstate
1680 aij = 0.0_dp
1681 bij = 0.0_dp
1682 DO iatom = 1, natom
1683 CALL cp_fm_get_element(zij_fm_set(iatom, 1), istate, istate, mii)
1684 CALL cp_fm_get_element(zij_fm_set(iatom, 1), istate, jstate, mij)
1685 CALL cp_fm_get_element(zij_fm_set(iatom, 1), jstate, jstate, mjj)
1686 IF (order == 2) THEN
1687 aij = aij + 4._dp*mij**2 - (mii - mjj)**2
1688 bij = bij + 4._dp*mij*(mii - mjj)
1689 ELSEIF (order == 4) THEN
1690 aij = aij - mii**4 - mjj**4 + 6._dp*(mii**2 + mjj**2)*mij**2 + &
1691 mii**3*mjj + mii*mjj**3
1692 bij = bij + 4._dp*mij*(mii**3 - mjj**3)
1693 ELSE
1694 cpabort("PM order")
1695 END IF
1696 END DO
1697 IF ((aij**2 + bij**2) < 1.e-10_dp) cycle
1698 tolerance = tolerance + bij**2
1699 theta = 0.25_dp*atan2(bij, -aij)
1700 ct = cos(theta)
1701 st = sin(theta)
1702
1703 CALL cp_fm_rot_cols(rmat, istate, jstate, ct, st)
1704
1705 DO iatom = 1, natom
1706 CALL cp_fm_rot_cols(zij_fm_set(iatom, 1), istate, jstate, ct, st)
1707 CALL cp_fm_rot_rows(zij_fm_set(iatom, 1), istate, jstate, ct, st)
1708 END DO
1709 END DO
1710 END DO
1711 ftarget = 0.0_dp
1712 DO iatom = 1, natom
1713 CALL cp_fm_get_diag(zij_fm_set(iatom, 1), fdiag)
1714 ftarget = ftarget + sum(fdiag**order)
1715 END DO
1716 ftarget = ftarget**(1._dp/order)
1717 tolerance = sqrt(tolerance)
1718 t2 = m_walltime()
1719 tt = t2 - t1
1720 IF (unit_nr > 0) THEN
1721 WRITE (unit_nr, '(T31,I4,T39,F16.8,T55,G16.8,T71,F10.2)') sweeps, ftarget, tolerance, tt
1722 END IF
1723 IF (tolerance < accuracy) EXIT
1724 END DO
1725 DEALLOCATE (fdiag)
1726
1727 CALL rotate_orbitals(rmat, vectors)
1728 CALL cp_fm_release(rmat)
1729
1730 END SUBROUTINE pm_localization
1731! **************************************************************************************************
1732
1733END 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 get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
subroutine, public 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.
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...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_replicate_all(matrix)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_trace(matrix, trace)
Computes the trace of the given matrix, also known as the sum of its diagonal elements.
subroutine, public dbcsr_reserve_diag_blocks(matrix)
Reserves all diagonal blocks.
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:147
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:1468
subroutine, public invmat_symm(a, potrf, uplo)
returns inverse of real symmetric, positive definite matrix
Definition mathlib.F:580
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)
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_pp, 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, harris_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, eeq, 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, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public 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_pp, 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:560
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 ...