(git:4733e3f)
Loading...
Searching...
No Matches
minbas_wfn_analysis.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Calculate localized minimal basis and analyze wavefunctions
10!> \par History
11!> 12.2016 created [JGH]
12!> \author JGH
13! **************************************************************************************************
18 USE bibliography, ONLY: lu2004,&
19 cite_reference
20 USE cell_types, ONLY: cell_type
23 USE cp_dbcsr_api, ONLY: &
27 dbcsr_p_type, dbcsr_release, dbcsr_set, dbcsr_type, dbcsr_type_no_symmetry, &
28 dbcsr_type_symmetric
39 USE cp_fm_types, ONLY: cp_fm_create,&
55 USE kinds, ONLY: default_path_length,&
56 dp
60 USE mulliken, ONLY: compute_bond_order,&
66 USE pw_env_types, ONLY: pw_env_get,&
69 USE pw_types, ONLY: pw_c1d_gs_type,&
75 USE qs_ks_types, ONLY: get_ks_env,&
78 USE qs_mo_types, ONLY: allocate_mo_set,&
85#include "./base/base_uses.f90"
86
87 IMPLICIT NONE
88 PRIVATE
89
90 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'minbas_wfn_analysis'
91
92 PUBLIC :: minbas_analysis
93
94! **************************************************************************************************
95
96CONTAINS
97
98! **************************************************************************************************
99!> \brief ...
100!> \param qs_env ...
101!> \param input_section ...
102!> \param unit_nr ...
103! **************************************************************************************************
104 SUBROUTINE minbas_analysis(qs_env, input_section, unit_nr)
105 TYPE(qs_environment_type), POINTER :: qs_env
106 TYPE(section_vals_type), POINTER :: input_section
107 INTEGER, INTENT(IN) :: unit_nr
108
109 CHARACTER(len=*), PARAMETER :: routinen = 'minbas_analysis'
110
111 INTEGER :: handle, homo, i, ispin, nao, natom, &
112 nimages, nmao, nmo, nspin
113 INTEGER, ALLOCATABLE, DIMENSION(:, :, :) :: ecount
114 INTEGER, DIMENSION(:), POINTER :: col_blk_sizes, row_blk_sizes
115 LOGICAL :: do_bondorder, explicit, full_ortho, occeq
116 REAL(kind=dp) :: alpha, amax, eps_filter, filter_eps, &
117 trace
118 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: border, fnorm, mcharge, prmao
119 REAL(kind=dp), DIMENSION(:), POINTER :: occupation_numbers
120 TYPE(cell_type), POINTER :: cell
121 TYPE(cp_blacs_env_type), POINTER :: blacs_env
122 TYPE(cp_fm_struct_type), POINTER :: fm_struct_a, fm_struct_b, fm_struct_c
123 TYPE(cp_fm_type) :: fm1, fm2, fm3, fm4
124 TYPE(cp_fm_type), POINTER :: fm_mos
125 TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist
126 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mao_coef, pqmat, quambo, sqmat
127 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
128 TYPE(dbcsr_type) :: psmat, sinv, smao, smaox, spmat
129 TYPE(dbcsr_type), POINTER :: smat
130 TYPE(dft_control_type), POINTER :: dft_control
131 TYPE(mo_set_type), ALLOCATABLE, DIMENSION(:) :: mbas
132 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
133 TYPE(mp_para_env_type), POINTER :: para_env
134 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
135 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
136 TYPE(qs_ks_env_type), POINTER :: ks_env
137 TYPE(section_vals_type), POINTER :: molden_section
138
139 ! only do MINBAS analysis if explicitly requested
140 CALL section_vals_get(input_section, explicit=explicit)
141 IF (.NOT. explicit) RETURN
142
143 ! k-points?
144 CALL get_qs_env(qs_env, dft_control=dft_control)
145 nspin = dft_control%nspins
146 nimages = dft_control%nimages
147 IF (nimages > 1) THEN
148 IF (unit_nr > 0) THEN
149 WRITE (unit=unit_nr, fmt="(T2,A)") &
150 "K-Points: Localized Minimal Basis Analysis not available."
151 END IF
152 END IF
153 IF (nimages > 1) RETURN
154
155 CALL timeset(routinen, handle)
156
157 IF (unit_nr > 0) THEN
158 WRITE (unit_nr, '(/,T2,A)') '!-----------------------------------------------------------------------------!'
159 WRITE (unit=unit_nr, fmt="(T26,A)") "LOCALIZED MINIMAL BASIS ANALYSIS"
160 WRITE (unit=unit_nr, fmt="(T18,A)") "W.C. Lu et al, J. Chem. Phys. 120, 2629 (2004)"
161 WRITE (unit_nr, '(T2,A)') '!-----------------------------------------------------------------------------!'
162 END IF
163 CALL cite_reference(lu2004)
164
165 ! input options
166 CALL section_vals_val_get(input_section, "EPS_FILTER", r_val=eps_filter)
167 CALL section_vals_val_get(input_section, "FULL_ORTHOGONALIZATION", l_val=full_ortho)
168 CALL section_vals_val_get(input_section, "BOND_ORDER", l_val=do_bondorder)
169
170 ! generate MAOs and QUAMBOs
171 CALL get_qs_env(qs_env, mos=mos)
172 NULLIFY (quambo, mao_coef)
173 CALL minbas_calculation(qs_env, mos, quambo, mao=mao_coef, iounit=unit_nr, &
174 full_ortho=full_ortho, eps_filter=eps_filter)
175 IF (ASSOCIATED(quambo)) THEN
176 CALL get_mo_set(mo_set=mos(1), nao=nao, nmo=nmo)
177 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env)
178 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
179 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set, dbcsr_dist=dbcsr_dist)
180 ALLOCATE (row_blk_sizes(natom), col_blk_sizes(natom))
181 CALL get_particle_set(particle_set, qs_kind_set, nsgf=row_blk_sizes)
182 CALL get_particle_set(particle_set, qs_kind_set, nmao=col_blk_sizes)
183 nmao = sum(col_blk_sizes)
184
185 NULLIFY (pqmat, sqmat)
186 CALL dbcsr_allocate_matrix_set(sqmat, nspin)
187 CALL dbcsr_allocate_matrix_set(pqmat, nspin)
188 DO ispin = 1, nspin
189 ALLOCATE (sqmat(ispin)%matrix)
190 CALL dbcsr_create(matrix=sqmat(ispin)%matrix, &
191 name="SQMAT", dist=dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
192 row_blk_size=col_blk_sizes, col_blk_size=col_blk_sizes)
193 ALLOCATE (pqmat(ispin)%matrix)
194 CALL dbcsr_create(matrix=pqmat(ispin)%matrix, &
195 name="PQMAT", dist=dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
196 row_blk_size=col_blk_sizes, col_blk_size=col_blk_sizes)
197 END DO
198 DEALLOCATE (row_blk_sizes, col_blk_sizes)
199
200 ! Start wfn analysis
201 IF (unit_nr > 0) THEN
202 WRITE (unit_nr, '(/,T2,A)') 'Localized Minimal Basis Wavefunction Analysis'
203 END IF
204
205 ! localization of basis
206 DO ispin = 1, nspin
207 amax = dbcsr_get_occupation(quambo(ispin)%matrix)
208 IF (unit_nr > 0) THEN
209 WRITE (unit_nr, '(/,T2,A,I2,T69,F10.3,A2,/)') &
210 'Occupation of Basis Function Representation (Spin) ', ispin, amax*100._dp, ' %'
211 END IF
212 END DO
213
214 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s)
215 CALL get_qs_env(qs_env=qs_env, para_env=para_env, blacs_env=blacs_env)
216 CALL cp_fm_struct_create(fm_struct_a, nrow_global=nao, ncol_global=nmao, &
217 para_env=para_env, context=blacs_env)
218 CALL cp_fm_create(fm1, fm_struct_a)
219 CALL cp_fm_struct_create(fm_struct_b, nrow_global=nmao, ncol_global=nmo, &
220 para_env=para_env, context=blacs_env)
221 CALL cp_fm_create(fm2, fm_struct_b)
222 CALL cp_fm_create(fm3, fm_struct_b)
223 CALL cp_fm_struct_create(fm_struct_c, nrow_global=nmo, ncol_global=nmo, &
224 para_env=para_env, context=blacs_env)
225 CALL cp_fm_create(fm4, fm_struct_c)
226 ALLOCATE (fnorm(nmo, nspin), ecount(natom, 3, nspin), prmao(natom, nspin))
227 ecount = 0
228 prmao = 0.0_dp
229 DO ispin = 1, nspin
230 CALL dbcsr_create(smao, name="S*QM", template=mao_coef(1)%matrix)
231 smat => matrix_s(1, 1)%matrix
232 CALL dbcsr_multiply("N", "N", 1.0_dp, smat, quambo(ispin)%matrix, 0.0_dp, smao)
233 ! calculate atomic extend of basis
234 CALL pm_extend(quambo(ispin)%matrix, smao, ecount(:, :, ispin))
235 CALL dbcsr_create(sinv, name="QM*S*QM", template=sqmat(ispin)%matrix)
236 CALL dbcsr_multiply("T", "N", 1.0_dp, quambo(ispin)%matrix, smao, 0.0_dp, sqmat(ispin)%matrix)
237 ! atomic MAO projection
238 CALL project_mao(mao_coef(ispin)%matrix, smao, sqmat(ispin)%matrix, prmao(:, ispin))
239 ! invert overlap
240 CALL invert_hotelling(sinv, sqmat(ispin)%matrix, 1.e-6_dp, silent=.true.)
241 CALL dbcsr_create(smaox, name="S*QM*SINV", template=smao)
242 CALL dbcsr_multiply("N", "N", 1.0_dp, smao, sinv, 0.0_dp, smaox)
243 CALL copy_dbcsr_to_fm(smaox, fm1)
244 CALL get_mo_set(mos(ispin), mo_coeff=fm_mos, homo=homo)
245 CALL parallel_gemm("T", "N", nmao, nmo, nao, 1.0_dp, fm1, fm_mos, 0.0_dp, fm2)
246 CALL cp_dbcsr_sm_fm_multiply(sqmat(ispin)%matrix, fm2, fm3, nmo)
247 CALL parallel_gemm("T", "N", nmo, nmo, nmao, 1.0_dp, fm2, fm3, 0.0_dp, fm4)
248 CALL cp_fm_get_diag(fm4, fnorm(1:nmo, ispin))
249 ! fm2 are the projected MOs (in MAO basis); orthogonalize the occupied subspace
250 CALL make_basis_lowdin(vmatrix=fm2, ncol=homo, matrix_s=sqmat(ispin)%matrix)
251 ! pmat
252 CALL get_mo_set(mos(ispin), occupation_numbers=occupation_numbers, maxocc=alpha)
253 occeq = all(occupation_numbers(1:homo) == alpha)
254 CALL dbcsr_copy(pqmat(ispin)%matrix, sqmat(ispin)%matrix)
255 CALL dbcsr_set(pqmat(ispin)%matrix, 0.0_dp)
256 IF (occeq) THEN
257 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=pqmat(ispin)%matrix, matrix_v=fm2, &
258 ncol=homo, alpha=alpha, keep_sparsity=.false.)
259 ELSE
260 CALL cp_fm_to_fm(fm2, fm3)
261 CALL cp_fm_column_scale(fm3, occupation_numbers(1:homo))
262 alpha = 1.0_dp
263 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=pqmat(ispin)%matrix, matrix_v=fm2, &
264 matrix_g=fm3, ncol=homo, alpha=alpha, keep_sparsity=.true.)
265 END IF
266
267 CALL dbcsr_release(smao)
268 CALL dbcsr_release(smaox)
269 CALL dbcsr_release(sinv)
270 END DO
271 ! Basis extension
272 CALL para_env%sum(ecount)
273 IF (unit_nr > 0) THEN
274 IF (nspin == 1) THEN
275 WRITE (unit_nr, '(T2,A,T20,A,T40,A,T60,A)') 'Ref. Atom', ' # > 0.100 ', ' # > 0.010 ', ' # > 0.001 '
276 DO i = 1, natom
277 WRITE (unit_nr, '(T2,I8,T20,I10,T40,I10,T60,I10)') i, ecount(i, 1:3, 1)
278 END DO
279 ELSE
280 WRITE (unit_nr, '(T2,A,T20,A,T40,A,T60,A)') 'Ref. Atom', ' # > 0.100 ', ' # > 0.010 ', ' # > 0.001 '
281 DO i = 1, natom
282 WRITE (unit_nr, '(T2,I8,T20,2I6,T40,2I6,T60,2I6)') &
283 i, ecount(i, 1, 1:2), ecount(i, 2, 1:2), ecount(i, 3, 1:2)
284 END DO
285 END IF
286 END IF
287 ! MAO projection
288 CALL para_env%sum(prmao)
289 IF (unit_nr > 0) THEN
290 DO ispin = 1, nspin
291 WRITE (unit_nr, '(/,T2,A,I2)') 'Projection on same atom MAO orbitals: Spin ', ispin
292 DO i = 1, natom, 2
293 IF (i < natom) THEN
294 WRITE (unit_nr, '(T2,A,I8,T20,A,F10.6,T42,A,I8,T60,A,F10.6)') &
295 " Atom:", i, "Projection:", prmao(i, ispin), " Atom:", i + 1, "Projection:", prmao(i + 1, ispin)
296 ELSE
297 WRITE (unit_nr, '(T2,A,I8,T20,A,F10.6)') " Atom:", i, "Projection:", prmao(i, ispin)
298 END IF
299 END DO
300 END DO
301 END IF
302 ! MO expansion completness
303 DO ispin = 1, nspin
304 CALL get_mo_set(mos(ispin), homo=homo, nmo=nmo)
305 IF (unit_nr > 0) THEN
306 WRITE (unit_nr, '(/,T2,A,I2)') 'MO expansion in Localized Minimal Basis: Spin ', ispin
307 WRITE (unit_nr, '(T64,A)') 'Occupied Orbitals'
308 WRITE (unit_nr, '(8F10.6)') fnorm(1:homo, ispin)
309 WRITE (unit_nr, '(T65,A)') 'Virtual Orbitals'
310 WRITE (unit_nr, '(8F10.6)') fnorm(homo + 1:nmo, ispin)
311 END IF
312 END DO
313 ! Mulliken population
314 IF (unit_nr > 0) THEN
315 WRITE (unit_nr, '(/,T2,A)') 'Mulliken Population Analysis '
316 END IF
317 ALLOCATE (mcharge(natom, nspin))
318 DO ispin = 1, nspin
319 CALL dbcsr_dot(pqmat(ispin)%matrix, sqmat(ispin)%matrix, trace)
320 IF (unit_nr > 0) THEN
321 WRITE (unit_nr, '(T2,A,I2,T66,F15.4)') 'Number of Electrons: Trace(PS) Spin ', ispin, trace
322 END IF
323 CALL mulliken_charges(pqmat(ispin)%matrix, sqmat(ispin)%matrix, para_env, mcharge(:, ispin))
324 END DO
325 CALL print_atomic_charges(particle_set, qs_kind_set, unit_nr, "Minimal Basis Mulliken Charges", &
326 electronic_charges=mcharge)
327 ! Mayer bond orders
328 IF (do_bondorder) THEN
329 ALLOCATE (border(natom, natom))
330 border = 0.0_dp
331 CALL dbcsr_create(psmat, name="PS", template=sqmat(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
332 CALL dbcsr_create(spmat, name="SP", template=sqmat(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
333 filter_eps = 1.e-6_dp
334 DO ispin = 1, nspin
335 CALL dbcsr_multiply("N", "N", 1.0_dp, pqmat(ispin)%matrix, sqmat(ispin)%matrix, 0.0_dp, psmat, &
336 filter_eps=filter_eps)
337 CALL dbcsr_multiply("N", "N", 1.0_dp, sqmat(ispin)%matrix, pqmat(ispin)%matrix, 0.0_dp, spmat, &
338 filter_eps=filter_eps)
339 CALL compute_bond_order(psmat, spmat, border)
340 END DO
341 CALL para_env%sum(border)
342 border = border*real(nspin, kind=dp)
343 CALL dbcsr_release(psmat)
344 CALL dbcsr_release(spmat)
345 CALL print_bond_orders(particle_set, unit_nr, border)
346 DEALLOCATE (border)
347 END IF
348
349 ! for printing purposes we now copy the QUAMBOs into MO format
350 ALLOCATE (mbas(nspin))
351 DO ispin = 1, nspin
352 CALL allocate_mo_set(mbas(ispin), nao, nmao, nmao, 0.0_dp, 1.0_dp, 0.0_dp)
353 CALL set_mo_set(mbas(ispin), homo=nmao)
354 ALLOCATE (mbas(ispin)%eigenvalues(nmao))
355 mbas(ispin)%eigenvalues = 0.0_dp
356 ALLOCATE (mbas(ispin)%occupation_numbers(nmao))
357 mbas(ispin)%occupation_numbers = 1.0_dp
358 CALL cp_fm_create(mbas(ispin)%mo_coeff, fm_struct_a)
359 CALL copy_dbcsr_to_fm(quambo(ispin)%matrix, mbas(ispin)%mo_coeff)
360 END DO
361
362 ! Print basis functions: cube files
363 DO ispin = 1, nspin
364 CALL get_mo_set(mbas(ispin), mo_coeff=fm_mos)
365 CALL post_minbas_cubes(qs_env, input_section, fm_mos, ispin)
366 END DO
367 ! Print basis functions: molden format
368 CALL get_qs_env(qs_env, cell=cell)
369 molden_section => section_vals_get_subs_vals(input_section, "MINBAS_MOLDEN")
370 CALL write_mos_molden(mbas, qs_kind_set, particle_set, molden_section, cell=cell, qs_env=qs_env)
371 DO ispin = 1, nspin
372 CALL deallocate_mo_set(mbas(ispin))
373 END DO
374 DEALLOCATE (mbas)
375
376 DEALLOCATE (fnorm, ecount, prmao, mcharge)
377 CALL cp_fm_release(fm1)
378 CALL cp_fm_release(fm2)
379 CALL cp_fm_release(fm3)
380 CALL cp_fm_release(fm4)
381 CALL cp_fm_struct_release(fm_struct_a)
382 CALL cp_fm_struct_release(fm_struct_b)
383 CALL cp_fm_struct_release(fm_struct_c)
384
385 ! clean up
388 CALL dbcsr_deallocate_matrix_set(mao_coef)
389 CALL dbcsr_deallocate_matrix_set(quambo)
390
391 END IF
392
393 IF (unit_nr > 0) THEN
394 WRITE (unit_nr, '(/,T2,A)') &
395 '!--------------------------END OF MINBAS ANALYSIS-----------------------------!'
396 END IF
397
398 CALL timestop(handle)
399
400 END SUBROUTINE minbas_analysis
401
402! **************************************************************************************************
403!> \brief ...
404!> \param quambo ...
405!> \param smao ...
406!> \param ecount ...
407! **************************************************************************************************
408 SUBROUTINE pm_extend(quambo, smao, ecount)
409 TYPE(dbcsr_type) :: quambo, smao
410 INTEGER, DIMENSION(:, :), INTENT(INOUT) :: ecount
411
412 INTEGER :: iatom, jatom, n
413 LOGICAL :: found
414 REAL(kind=dp) :: wij
415 REAL(kind=dp), DIMENSION(:, :), POINTER :: qblock, sblock
416 TYPE(dbcsr_iterator_type) :: dbcsr_iter
417
418 CALL dbcsr_iterator_start(dbcsr_iter, quambo)
419 DO WHILE (dbcsr_iterator_blocks_left(dbcsr_iter))
420 CALL dbcsr_iterator_next_block(dbcsr_iter, iatom, jatom, qblock)
421 CALL dbcsr_get_block_p(matrix=smao, row=iatom, col=jatom, block=sblock, found=found)
422 IF (found) THEN
423 n = SIZE(qblock, 2)
424 wij = abs(sum(qblock*sblock))/real(n, kind=dp)
425 IF (wij > 0.1_dp) THEN
426 ecount(jatom, 1) = ecount(jatom, 1) + 1
427 ELSEIF (wij > 0.01_dp) THEN
428 ecount(jatom, 2) = ecount(jatom, 2) + 1
429 ELSEIF (wij > 0.001_dp) THEN
430 ecount(jatom, 3) = ecount(jatom, 3) + 1
431 END IF
432 END IF
433 END DO
434 CALL dbcsr_iterator_stop(dbcsr_iter)
435
436 END SUBROUTINE pm_extend
437
438! **************************************************************************************************
439!> \brief ...
440!> \param mao ...
441!> \param smao ...
442!> \param sovl ...
443!> \param prmao ...
444! **************************************************************************************************
445 SUBROUTINE project_mao(mao, smao, sovl, prmao)
446 TYPE(dbcsr_type) :: mao, smao, sovl
447 REAL(kind=dp), DIMENSION(:), INTENT(INOUT) :: prmao
448
449 INTEGER :: i, iatom, jatom, n
450 LOGICAL :: found
451 REAL(kind=dp) :: wi
452 REAL(kind=dp), DIMENSION(:, :), POINTER :: qblock, sblock, so
453 TYPE(dbcsr_iterator_type) :: dbcsr_iter
454
455 CALL dbcsr_iterator_start(dbcsr_iter, mao)
456 DO WHILE (dbcsr_iterator_blocks_left(dbcsr_iter))
457 CALL dbcsr_iterator_next_block(dbcsr_iter, iatom, jatom, qblock)
458 cpassert(iatom == jatom)
459 CALL dbcsr_get_block_p(matrix=smao, row=iatom, col=jatom, block=sblock, found=found)
460 IF (found) THEN
461 CALL dbcsr_get_block_p(matrix=sovl, row=iatom, col=jatom, block=so, found=found)
462 n = SIZE(qblock, 2)
463 DO i = 1, n
464 wi = sum(qblock(:, i)*sblock(:, i))
465 prmao(iatom) = prmao(iatom) + wi/so(i, i)
466 END DO
467 END IF
468 END DO
469 CALL dbcsr_iterator_stop(dbcsr_iter)
470
471 END SUBROUTINE project_mao
472
473! **************************************************************************************************
474!> \brief Computes and prints the Cube Files for the minimal basis set
475!> \param qs_env ...
476!> \param print_section ...
477!> \param minbas_coeff ...
478!> \param ispin ...
479! **************************************************************************************************
480 SUBROUTINE post_minbas_cubes(qs_env, print_section, minbas_coeff, ispin)
481 TYPE(qs_environment_type), POINTER :: qs_env
482 TYPE(section_vals_type), POINTER :: print_section
483 TYPE(cp_fm_type), INTENT(IN) :: minbas_coeff
484 INTEGER, INTENT(IN) :: ispin
485
486 CHARACTER(LEN=default_path_length) :: filename, title
487 INTEGER :: i, i_rep, ivec, iw, j, n_rep, natom
488 INTEGER, DIMENSION(:), POINTER :: blk_sizes, first_bas, ilist, stride
489 LOGICAL :: explicit, mpi_io
490 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
491 TYPE(cell_type), POINTER :: cell
492 TYPE(cp_logger_type), POINTER :: logger
493 TYPE(dft_control_type), POINTER :: dft_control
494 TYPE(particle_list_type), POINTER :: particles
495 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
496 TYPE(pw_c1d_gs_type) :: wf_g
497 TYPE(pw_env_type), POINTER :: pw_env
498 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
499 TYPE(pw_r3d_rs_type) :: wf_r
500 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
501 TYPE(qs_subsys_type), POINTER :: subsys
502 TYPE(section_vals_type), POINTER :: minbas_section
503
504 minbas_section => section_vals_get_subs_vals(print_section, "MINBAS_CUBE")
505 CALL section_vals_get(minbas_section, explicit=explicit)
506 IF (.NOT. explicit) RETURN
507
508 logger => cp_get_default_logger()
509 stride => section_get_ivals(print_section, "MINBAS_CUBE%STRIDE")
510
511 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
512 subsys=subsys, cell=cell, particle_set=particle_set, pw_env=pw_env, dft_control=dft_control)
513 CALL qs_subsys_get(subsys, particles=particles)
514
515 CALL get_qs_env(qs_env=qs_env, natom=natom)
516 ALLOCATE (blk_sizes(natom), first_bas(0:natom))
517 CALL get_particle_set(particle_set, qs_kind_set, nmao=blk_sizes)
518 first_bas(0) = 0
519 DO i = 1, natom
520 first_bas(i) = first_bas(i - 1) + blk_sizes(i)
521 END DO
522
523 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
524 CALL auxbas_pw_pool%create_pw(wf_r)
525 CALL auxbas_pw_pool%create_pw(wf_g)
526
527 ! loop over list of atoms
528 CALL section_vals_val_get(minbas_section, "ATOM_LIST", n_rep_val=n_rep)
529 IF (n_rep == 0) THEN
530 DO i = 1, natom
531 DO ivec = first_bas(i - 1) + 1, first_bas(i)
532 WRITE (filename, '(a4,I5.5,a1,I1.1)') "MINBAS_", ivec, "_", ispin
533 WRITE (title, *) "MINIMAL BASIS ", ivec, " atom ", i, " spin ", ispin
534 mpi_io = .true.
535 iw = cp_print_key_unit_nr(logger, print_section, "MINBAS_CUBE", extension=".cube", &
536 middle_name=trim(filename), file_position="REWIND", log_filename=.false., &
537 mpi_io=mpi_io)
538 CALL calculate_wavefunction(minbas_coeff, ivec, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
539 cell, dft_control, particle_set, pw_env)
540 CALL cp_pw_to_cube(wf_r, iw, title, particles=particles, stride=stride, mpi_io=mpi_io)
541 CALL cp_print_key_finished_output(iw, logger, print_section, "MINBAS_CUBE", mpi_io=mpi_io)
542 END DO
543 END DO
544 ELSE
545 DO i_rep = 1, n_rep
546 CALL section_vals_val_get(minbas_section, "ATOM_LIST", i_rep_val=i_rep, i_vals=ilist)
547 DO i = 1, SIZE(ilist, 1)
548 j = ilist(i)
549 DO ivec = first_bas(j - 1) + 1, first_bas(j)
550 WRITE (filename, '(a4,I5.5,a1,I1.1)') "MINBAS_", ivec, "_", ispin
551 WRITE (title, *) "MINIMAL BASIS ", ivec, " atom ", j, " spin ", ispin
552 mpi_io = .true.
553 iw = cp_print_key_unit_nr(logger, print_section, "MINBAS_CUBE", extension=".cube", &
554 middle_name=trim(filename), file_position="REWIND", log_filename=.false., &
555 mpi_io=mpi_io)
556 CALL calculate_wavefunction(minbas_coeff, ivec, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
557 cell, dft_control, particle_set, pw_env)
558 CALL cp_pw_to_cube(wf_r, iw, title, particles=particles, stride=stride, mpi_io=mpi_io)
559 CALL cp_print_key_finished_output(iw, logger, print_section, "MINBAS_CUBE", mpi_io=mpi_io)
560 END DO
561 END DO
562 END DO
563 END IF
564 DEALLOCATE (blk_sizes, first_bas)
565 CALL auxbas_pw_pool%give_back_pw(wf_r)
566 CALL auxbas_pw_pool%give_back_pw(wf_g)
567
568 END SUBROUTINE post_minbas_cubes
569
570END MODULE minbas_wfn_analysis
simple routine to print charges for all atomic charge methods (currently mulliken,...
subroutine, public print_bond_orders(particle_set, scr, bond_orders)
Print Mayer bond orders.
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.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public lu2004
Handles all functions related to the CELL.
Definition cell_types.F:15
methods related to the blacs parallel environment
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)
...
real(kind=dp) function, public dbcsr_get_occupation(matrix)
...
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_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
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,...
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
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_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
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, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
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)
...
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Routines useful for iterative matrix calculations.
subroutine, public invert_hotelling(matrix_inverse, matrix, threshold, use_inv_as_guess, norm_convergence, filter_eps, accelerator_order, max_iter_lanczos, eps_lanczos, silent)
invert a symmetric positive definite matrix by Hotelling's method explicit symmetrization makes this ...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_path_length
Definition kinds.F:58
Interface to the message passing library MPI.
Calculate localized minimal basis.
subroutine, public minbas_calculation(qs_env, mos, quambo, mao, iounit, full_ortho, eps_filter)
...
Calculate localized minimal basis and analyze wavefunctions.
subroutine, public minbas_analysis(qs_env, input_section, unit_nr)
...
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section, cell, unoccupied_orbs, unoccupied_evals, qs_env, calc_energies)
Write out the MOs in molden format for visualisation.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Definition mulliken.F:13
subroutine, public compute_bond_order(psmat, spmat, bond_order)
compute Mayer bond orders for a single spin channel for complete result sum up over all spins and mul...
Definition mulliken.F:657
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, mimic, 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, sab_cneo, 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, xcint_weights, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, 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, xcint_weights, 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, sab_cneo, 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)
...
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.
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:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
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...
stores all the informations relevant to an mpi environment
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 ...