95 INTEGER,
INTENT(IN) :: unit_nr
97 CHARACTER(len=*),
PARAMETER :: routinen =
'mao_analysis'
99 CHARACTER(len=2) :: element_symbol, esa, esb, esc
100 INTEGER :: fall, handle, ia, iab, iabc, iatom, ib, ic, icol, ikind, irow, ispin, jatom, &
101 mao_basis, max_iter, me, na, nab, nabc, natom, nb, nc, nimages, nspin, ssize
102 INTEGER,
DIMENSION(:),
POINTER :: col_blk_sizes, mao_blk, mao_blk_sizes, &
103 orb_blk, row_blk_sizes
104 LOGICAL :: analyze_ua, explicit, fo,
for, fos, &
105 found, neglect_abc, print_basis, &
107 REAL(kind=
dp) :: deltaq, electra(2), eps_ab, eps_abc, eps_filter, eps_fun, eps_grad, epsx, &
108 senabc, senmax, threshold, total_charge, total_spin, ua_charge(2), zeff
109 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: occnuma, occnumabc, qab, qmatab, qmatac, &
110 qmatbc, raq, sab, selnabc, sinv, &
111 smatab, smatac, smatbc, uaq
112 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: occnumab, selnab
113 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block, cmao,
diag, qblka, qblkb, qblkc, &
114 rblkl, rblku, sblk, sblka, sblkb, sblkc
115 TYPE(block_type),
ALLOCATABLE,
DIMENSION(:) :: rowblock
119 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mao_coef, mao_dmat, mao_qmat, mao_smat, &
120 matrix_q, matrix_smm, matrix_smo
121 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_p, matrix_s
122 TYPE(
dbcsr_type) :: amat, axmat, cgmat, cholmat, crumat, &
123 qmat, qmat_diag, rumat, smat_diag, &
130 DIMENSION(:),
POINTER :: nl_iterator
132 POINTER :: sab_all, sab_orb, smm_list, smo_list
134 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
141 IF (.NOT. explicit)
RETURN
143 CALL timeset(routinen, handle)
145 IF (unit_nr > 0)
THEN
146 WRITE (unit_nr,
'(/,T2,A)')
'!-----------------------------------------------------------------------------!'
147 WRITE (unit=unit_nr, fmt=
"(T36,A)")
"MAO ANALYSIS"
148 WRITE (unit=unit_nr, fmt=
"(T12,A)")
"Claus Ehrhardt and Reinhart Ahlrichs, TCA 68:231-245 (1985)"
149 WRITE (unit_nr,
'(T2,A)')
'!-----------------------------------------------------------------------------!'
168 CALL get_qs_env(qs_env, dft_control=dft_control)
169 nimages = dft_control%nimages
170 IF (nimages > 1)
THEN
171 IF (unit_nr > 0)
THEN
172 WRITE (unit=unit_nr, fmt=
"(T2,A)") &
173 "K-Points: MAO's determined and analyzed using Gamma-Point only."
178 NULLIFY (mao_basis_set_list, orb_basis_set_list)
180 unit_nr, print_basis)
183 NULLIFY (smm_list, smo_list)
188 NULLIFY (matrix_smm, matrix_smo)
191 mao_basis_set_list, mao_basis_set_list, smm_list)
193 mao_basis_set_list, orb_basis_set_list, smo_list)
196 CALL get_qs_env(qs_env, rho=rho, matrix_s_kp=matrix_s)
198 nspin =
SIZE(matrix_p, 1)
201 IF (nimages == 1)
THEN
202 CALL mao_build_q(matrix_q, matrix_p, matrix_s, matrix_smm, matrix_smo, smm_list, electra, eps_filter)
204 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, kpoints=kpoints)
205 CALL mao_build_q(matrix_q, matrix_p, matrix_s, matrix_smm, matrix_smo, smm_list, electra, eps_filter, &
206 nimages=nimages, kpoints=kpoints, matrix_ks=matrix_ks, sab_orb=sab_orb)
214 IF (iatom <= jatom)
THEN
222 row=irow, col=icol, block=block, found=found)
223 IF (.NOT. found) fall = fall + 1
227 CALL get_qs_env(qs_env=qs_env, para_env=para_env)
228 CALL para_env%sum(fall)
229 IF (unit_nr > 0 .AND. fall > 0)
THEN
230 WRITE (unit=unit_nr, fmt=
"(/,T2,A,/,T2,A,/)") &
231 "Warning: Extended MAO basis used with original basis filtered density matrix", &
232 "Warning: Possible errors can be controlled with EPS_PGF_ORB"
236 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
237 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set, dbcsr_dist=dbcsr_dist)
240 ALLOCATE (row_blk_sizes(natom), col_blk_sizes(natom))
242 basis=mao_basis_set_list)
246 IF (col_blk_sizes(iab) < 0)
THEN
247 cpabort(
"Number of MAOs has to be specified in KIND section for all elements")
252 ALLOCATE (mao_coef(ispin)%matrix)
254 name=
"MAO_COEF", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
255 row_blk_size=row_blk_sizes, col_blk_size=col_blk_sizes)
258 DEALLOCATE (row_blk_sizes, col_blk_sizes)
262 CALL mao_optimize(mao_coef, matrix_q, matrix_smm, electra, max_iter, eps_grad, epsx, &
267 qs_kind_set, unit_nr, para_env)
270 NULLIFY (mao_dmat, mao_smat, mao_qmat)
274 CALL dbcsr_get_info(mao_coef(1)%matrix, col_blk_size=col_blk_sizes, distribution=dbcsr_dist)
276 ALLOCATE (mao_dmat(ispin)%matrix)
277 CALL dbcsr_create(mao_dmat(ispin)%matrix, name=
"MAO density", dist=dbcsr_dist, &
278 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
279 col_blk_size=col_blk_sizes)
280 ALLOCATE (mao_smat(ispin)%matrix)
281 CALL dbcsr_create(mao_smat(ispin)%matrix, name=
"MAO overlap", dist=dbcsr_dist, &
282 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
283 col_blk_size=col_blk_sizes)
284 ALLOCATE (mao_qmat(ispin)%matrix)
285 CALL dbcsr_create(mao_qmat(ispin)%matrix, name=
"MAO covar density", dist=dbcsr_dist, &
286 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
287 col_blk_size=col_blk_sizes)
289 CALL dbcsr_create(amat, name=
"MAO overlap", template=mao_dmat(1)%matrix)
290 CALL dbcsr_create(tmat, name=
"MAO Overlap Inverse", template=amat)
291 CALL dbcsr_create(qmat, name=
"MAO covar density", template=amat)
292 CALL dbcsr_create(cgmat, name=
"TEMP matrix", template=mao_coef(1)%matrix)
293 CALL dbcsr_create(axmat, name=
"TEMP", template=amat, matrix_type=dbcsr_type_no_symmetry)
296 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_smm(1)%matrix, mao_coef(ispin)%matrix, &
298 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef(ispin)%matrix, cgmat, 0.0_dp, amat)
301 CALL invert_hotelling(tmat, amat, threshold, norm_convergence=1.e-4_dp, silent=.true.)
304 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_q(ispin)%matrix, mao_coef(ispin)%matrix, &
305 0.0_dp, cgmat, filter_eps=eps_filter)
306 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef(ispin)%matrix, cgmat, &
307 0.0_dp, qmat, filter_eps=eps_filter)
310 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, qmat, tmat, 0.0_dp, axmat, filter_eps=eps_filter)
311 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmat, axmat, 0.0_dp, mao_dmat(ispin)%matrix, &
312 filter_eps=eps_filter)
322 CALL dbcsr_dot(mao_dmat(ispin)%matrix, mao_smat(ispin)%matrix, ua_charge(ispin))
323 ua_charge(ispin) = electra(ispin) - ua_charge(ispin)
325 IF (unit_nr > 0)
THEN
328 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
329 "Unassigned charge",
"Spin ", ispin,
"delta charge =", ua_charge(ispin)
337 ALLOCATE (occnuma(natom, nspin))
342 row=iatom, col=iatom, block=block, found=found)
344 DO iab = 1,
SIZE(block, 1)
345 occnuma(iatom, ispin) = occnuma(iatom, ispin) + block(iab, iab)
350 CALL para_env%sum(occnuma)
353 ALLOCATE (occnumab(natom, natom, nspin))
356 CALL dbcsr_create(qmat_diag, name=
"MAO diagonal density", template=mao_dmat(1)%matrix)
357 CALL dbcsr_create(smat_diag, name=
"MAO diagonal overlap", template=mao_dmat(1)%matrix)
364 DO ib = ia + 1, natom
367 row=ia, col=ib, block=block, found=found)
369 CALL para_env%sum(iab)
371 IF (iab == 0 .AND. para_env%is_source())
THEN
374 occnumab(ia, ib, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin)
375 occnumab(ib, ia, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin)
381 ALLOCATE (sab(nab, nab), qab(nab, nab), sinv(nab, nab))
383 qab(1:na, na + 1:nab) = block(1:na, 1:nb)
384 qab(na + 1:nab, 1:na) = transpose(block(1:na, 1:nb))
387 qab(1:na, 1:na) =
diag(1:na, 1:na)
390 qab(na + 1:nab, na + 1:nab) =
diag(1:nb, 1:nb)
393 row=ia, col=ib, block=block, found=fo)
395 sab(1:na, na + 1:nab) = block(1:na, 1:nb)
396 sab(na + 1:nab, 1:na) = transpose(block(1:na, 1:nb))
399 sab(1:na, 1:na) =
diag(1:na, 1:na)
402 sab(na + 1:nab, na + 1:nab) =
diag(1:nb, 1:nb)
404 sinv(1:nab, 1:nab) = sab(1:nab, 1:nab)
407 occnumab(ia, ib, ispin) = sum(qab*sinv)
408 occnumab(ib, ia, ispin) = occnumab(ia, ib, ispin)
410 DEALLOCATE (sab, qab, sinv)
417 CALL para_env%sum(occnumab)
420 ALLOCATE (selnab(natom, natom, nspin))
424 DO ib = ia + 1, natom
425 selnab(ia, ib, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin) - occnumab(ia, ib, ispin)
426 selnab(ib, ia, ispin) = selnab(ia, ib, ispin)
431 IF (.NOT. neglect_abc)
THEN
433 nabc = (natom*(natom - 1)*(natom - 2))/6
434 ALLOCATE (occnumabc(nabc, nspin))
437 CALL dbcsr_create(qmat_diag, name=
"MAO diagonal density", template=mao_dmat(1)%matrix)
438 CALL dbcsr_create(smat_diag, name=
"MAO diagonal overlap", template=mao_dmat(1)%matrix)
451 DO ib = ia + 1, natom
453 IF (selnab(ia, ib, ispin) < eps_abc)
THEN
454 iabc = iabc + (natom - ib)
463 ALLOCATE (qmatab(na, nb), smatab(na, nb))
465 block=block, found=found)
467 IF (found) qmatab(1:na, 1:nb) = block(1:na, 1:nb)
468 CALL para_env%sum(qmatab)
470 block=block, found=found)
472 IF (found) smatab(1:na, 1:nb) = block(1:na, 1:nb)
473 CALL para_env%sum(smatab)
474 DO ic = ib + 1, natom
476 IF ((selnab(ia, ic, ispin) < eps_abc) .OR. (selnab(ib, ic, ispin) < eps_abc))
THEN
485 ALLOCATE (qmatac(na, nc), smatac(na, nc))
487 block=block, found=found)
489 IF (found) qmatac(1:na, 1:nc) = block(1:na, 1:nc)
490 CALL para_env%sum(qmatac)
492 block=block, found=found)
494 IF (found) smatac(1:na, 1:nc) = block(1:na, 1:nc)
495 CALL para_env%sum(smatac)
496 ALLOCATE (qmatbc(nb, nc), smatbc(nb, nc))
498 block=block, found=found)
500 IF (found) qmatbc(1:nb, 1:nc) = block(1:nb, 1:nc)
501 CALL para_env%sum(qmatbc)
503 block=block, found=found)
505 IF (found) smatbc(1:nb, 1:nc) = block(1:nb, 1:nc)
506 CALL para_env%sum(smatbc)
509 ALLOCATE (sab(nabc, nabc), sinv(nabc, nabc), qab(nabc, nabc))
511 qab(1:na, 1:na) = qblka(1:na, 1:na)
512 qab(na + 1:nab, na + 1:nab) = qblkb(1:nb, 1:nb)
513 qab(nab + 1:nabc, nab + 1:nabc) = qblkc(1:nc, 1:nc)
514 qab(1:na, na + 1:nab) = qmatab(1:na, 1:nb)
515 qab(na + 1:nab, 1:na) = transpose(qmatab(1:na, 1:nb))
516 qab(1:na, nab + 1:nabc) = qmatac(1:na, 1:nc)
517 qab(nab + 1:nabc, 1:na) = transpose(qmatac(1:na, 1:nc))
518 qab(na + 1:nab, nab + 1:nabc) = qmatbc(1:nb, 1:nc)
519 qab(nab + 1:nabc, na + 1:nab) = transpose(qmatbc(1:nb, 1:nc))
521 sab(1:na, 1:na) = sblka(1:na, 1:na)
522 sab(na + 1:nab, na + 1:nab) = sblkb(1:nb, 1:nb)
523 sab(nab + 1:nabc, nab + 1:nabc) = sblkc(1:nc, 1:nc)
524 sab(1:na, na + 1:nab) = smatab(1:na, 1:nb)
525 sab(na + 1:nab, 1:na) = transpose(smatab(1:na, 1:nb))
526 sab(1:na, nab + 1:nabc) = smatac(1:na, 1:nc)
527 sab(nab + 1:nabc, 1:na) = transpose(smatac(1:na, 1:nc))
528 sab(na + 1:nab, nab + 1:nabc) = smatbc(1:nb, 1:nc)
529 sab(nab + 1:nabc, na + 1:nab) = transpose(smatbc(1:nb, 1:nc))
531 sinv(1:nabc, 1:nabc) = sab(1:nabc, 1:nabc)
535 me = mod(iabc, para_env%num_pe)
536 IF (me == para_env%mepos)
THEN
537 occnumabc(iabc, ispin) = sum(qab*sinv)
539 occnumabc(iabc, ispin) = 0.0_dp
542 DEALLOCATE (sab, sinv, qab)
543 DEALLOCATE (qmatac, smatac)
544 DEALLOCATE (qmatbc, smatbc)
546 DEALLOCATE (qmatab, smatab)
552 CALL para_env%sum(occnumabc)
555 IF (.NOT. neglect_abc)
THEN
557 nabc = (natom*(natom - 1)*(natom - 2))/6
558 ALLOCATE (selnabc(nabc, nspin))
563 DO ib = ia + 1, natom
564 DO ic = ib + 1, natom
566 IF (occnumabc(iabc, ispin) >= 0.0_dp)
THEN
567 selnabc(iabc, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin) + occnuma(ic, ispin) - &
568 occnumab(ia, ib, ispin) - occnumab(ia, ic, ispin) - occnumab(ib, ic, ispin) + &
569 occnumabc(iabc, ispin)
578 ALLOCATE (raq(natom, nspin))
582 raq(ia, ispin) = occnuma(ia, ispin)
584 raq(ia, ispin) = raq(ia, ispin) - 0.5_dp*selnab(ia, ib, ispin)
587 IF (.NOT. neglect_abc)
THEN
590 DO ib = ia + 1, natom
591 DO ic = ib + 1, natom
593 raq(ia, ispin) = raq(ia, ispin) + selnabc(iabc, ispin)/3._dp
594 raq(ib, ispin) = raq(ib, ispin) + selnabc(iabc, ispin)/3._dp
595 raq(ic, ispin) = raq(ic, ispin) + selnabc(iabc, ispin)/3._dp
604 deltaq = (electra(ispin) - sum(raq(1:natom, ispin))) - ua_charge(ispin)
605 IF (unit_nr > 0)
THEN
606 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
607 "Cutoff error on charge",
"Spin ", ispin,
"error charge =", deltaq
612 ALLOCATE (uaq(natom, nspin))
615 CALL get_qs_env(qs_env=qs_env, para_env=para_env, blacs_env=blacs_env)
616 CALL get_qs_env(qs_env=qs_env, sab_orb=sab_orb, sab_all=sab_all)
617 CALL dbcsr_get_info(mao_coef(1)%matrix, row_blk_size=mao_blk_sizes, &
618 col_blk_size=col_blk_sizes, distribution=dbcsr_dist)
619 CALL dbcsr_get_info(matrix_s(1, 1)%matrix, row_blk_size=row_blk_sizes)
620 CALL dbcsr_create(amat, name=
"temp", template=matrix_s(1, 1)%matrix)
621 CALL dbcsr_create(tmat, name=
"temp", template=mao_coef(1)%matrix)
626 ALLOCATE (orb_blk(natom), mao_blk(natom))
628 orb_blk = row_blk_sizes
629 mao_blk = row_blk_sizes
630 mao_blk(ia) = col_blk_sizes(ia)
631 CALL dbcsr_create(sumat, name=
"Smat", dist=dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
632 row_blk_size=mao_blk, col_blk_size=mao_blk)
634 CALL dbcsr_create(cholmat, name=
"Cholesky matrix", dist=dbcsr_dist, &
635 matrix_type=dbcsr_type_no_symmetry, row_blk_size=mao_blk, col_blk_size=mao_blk)
636 CALL dbcsr_create(rumat, name=
"Rmat", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
637 row_blk_size=orb_blk, col_blk_size=mao_blk)
639 CALL dbcsr_create(crumat, name=
"Rmat*Umat", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
640 row_blk_size=orb_blk, col_blk_size=mao_blk)
642 ALLOCATE (rowblock(natom))
644 na = mao_blk_sizes(ia)
645 nb = row_blk_sizes(ib)
646 ALLOCATE (rowblock(ib)%mat(na, nb))
647 rowblock(ib)%mat = 0.0_dp
649 block=block, found=found)
650 IF (found) rowblock(ib)%mat(1:na, 1:nb) = block(1:na, 1:nb)
651 CALL para_env%sum(rowblock(ib)%mat)
660 CALL dbcsr_get_block_p(matrix=sumat, row=iatom, col=jatom, block=sblk, found=fos)
668 IF (iatom /= ia .AND. jatom /= ia)
THEN
672 rblkl = transpose(block)
673 ELSE IF (iatom /= ia)
THEN
674 rblkl = transpose(block)
675 sblk = matmul(transpose(rowblock(iatom)%mat), cmao)
677 ELSE IF (jatom /= ia)
THEN
679 sblk = matmul(transpose(cmao), rowblock(jatom)%mat)
680 rblkl = transpose(sblk)
682 CALL dbcsr_get_block_p(matrix=smat_diag, row=ia, col=ia, block=block, found=found)
684 sblk = matmul(transpose(cmao), matmul(block, cmao))
685 rblku = matmul(transpose(rowblock(ia)%mat), cmao)
695 transa=
"N", para_env=para_env, blacs_env=blacs_env)
697 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, crumat, crumat, 0.0_dp, amat, &
698 filter_eps=eps_filter)
700 CALL dbcsr_dot(matrix_p(ispin, 1)%matrix, amat, uaq(ia, ispin))
701 uaq(ia, ispin) = uaq(ia, ispin) - electra(ispin)
710 DEALLOCATE (rowblock(ib)%mat)
712 DEALLOCATE (rowblock)
717 DEALLOCATE (orb_blk, mao_blk)
720 raq(1:natom, 1:nspin) = raq(1:natom, 1:nspin) - uaq(1:natom, 1:nspin)
722 deltaq = electra(ispin) - sum(raq(1:natom, ispin))
723 IF (unit_nr > 0)
THEN
724 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
725 "Charge/Atom redistributed",
"Spin ", ispin,
"delta charge =", &
726 (deltaq + ua_charge(ispin))/real(natom, kind=
dp)
731 IF (unit_nr > 0)
THEN
733 WRITE (unit_nr,
"(/,T2,A,T40,A,T75,A)")
"MAO atomic charges ",
"Atom",
"Charge"
735 WRITE (unit_nr,
"(/,T2,A,T40,A,T55,A,T70,A)")
"MAO atomic charges ",
"Atom",
"Charge",
"Spin Charge"
738 deltaq = electra(ispin) - sum(raq(1:natom, ispin))
739 raq(:, ispin) = raq(:, ispin) + deltaq/real(natom, kind=
dp)
741 total_charge = 0.0_dp
745 element_symbol=element_symbol, kind_number=ikind)
748 WRITE (unit_nr,
"(T30,I6,T42,A2,T69,F12.6)") iatom, element_symbol, zeff - raq(iatom, 1)
749 total_charge = total_charge + (zeff - raq(iatom, 1))
751 WRITE (unit_nr,
"(T30,I6,T42,A2,T48,F12.6,T69,F12.6)") iatom, element_symbol, &
752 zeff - raq(iatom, 1) - raq(iatom, 2), raq(iatom, 1) - raq(iatom, 2)
753 total_charge = total_charge + (zeff - raq(iatom, 1) - raq(iatom, 2))
754 total_spin = total_spin + (raq(iatom, 1) - raq(iatom, 2))
758 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Total Charge", total_charge
760 WRITE (unit_nr,
"(T2,A,T49,F12.6,T69,F12.6)")
"Total Charge", total_charge, total_spin
766 IF (unit_nr > 0)
THEN
768 WRITE (unit_nr,
"(/,T2,A,T40,A,T75,A)")
"MAO hypervalent charges ",
"Atom",
"Charge"
770 WRITE (unit_nr,
"(/,T2,A,T40,A,T55,A,T70,A)")
"MAO hypervalent charges ",
"Atom", &
771 "Charge",
"Spin Charge"
773 total_charge = 0.0_dp
777 element_symbol=element_symbol)
779 WRITE (unit_nr,
"(T30,I6,T42,A2,T69,F12.6)") iatom, element_symbol, uaq(iatom, 1)
780 total_charge = total_charge + uaq(iatom, 1)
782 WRITE (unit_nr,
"(T30,I6,T42,A2,T48,F12.6,T69,F12.6)") iatom, element_symbol, &
783 uaq(iatom, 1) + uaq(iatom, 2), uaq(iatom, 1) - uaq(iatom, 2)
784 total_charge = total_charge + uaq(iatom, 1) + uaq(iatom, 2)
785 total_spin = total_spin + uaq(iatom, 1) - uaq(iatom, 2)
789 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Total Charge", total_charge
791 WRITE (unit_nr,
"(T2,A,T49,F12.6,T69,F12.6)")
"Total Charge", total_charge, total_spin
797 IF (unit_nr > 0)
THEN
799 WRITE (unit_nr,
"(/,T2,A,T31,A,T40,A,T78,A)")
"Shared electron numbers ",
"Atom",
"Atom",
"SEN"
801 WRITE (unit_nr,
"(/,T2,A,T31,A,T40,A,T51,A,T63,A,T71,A)")
"Shared electron numbers ",
"Atom",
"Atom", &
802 "SEN(1)",
"SEN(2)",
"SEN(total)"
805 DO ib = ia + 1, natom
806 CALL get_atomic_kind(atomic_kind=particle_set(ia)%atomic_kind, element_symbol=esa)
807 CALL get_atomic_kind(atomic_kind=particle_set(ib)%atomic_kind, element_symbol=esb)
809 IF (selnab(ia, ib, 1) > eps_ab)
THEN
810 WRITE (unit_nr,
"(T26,I6,' ',A2,T35,I6,' ',A2,T69,F12.6)") ia, esa, ib, esb, selnab(ia, ib, 1)
813 IF ((selnab(ia, ib, 1) + selnab(ia, ib, 2)) > eps_ab)
THEN
814 WRITE (unit_nr,
"(T26,I6,' ',A2,T35,I6,' ',A2,T45,3F12.6)") ia, esa, ib, esb, &
815 selnab(ia, ib, 1), selnab(ia, ib, 2), (selnab(ia, ib, 1) + selnab(ia, ib, 2))
822 IF (.NOT. neglect_abc)
THEN
824 IF (unit_nr > 0)
THEN
825 WRITE (unit_nr,
"(/,T2,A,T40,A,T49,A,T58,A,T78,A)")
"Shared electron numbers ABC", &
826 "Atom",
"Atom",
"Atom",
"SEN"
830 DO ib = ia + 1, natom
831 DO ic = ib + 1, natom
833 senabc = sum(selnabc(iabc, :))
834 senmax = max(senmax, senabc)
835 IF (senabc > eps_abc)
THEN
836 CALL get_atomic_kind(atomic_kind=particle_set(ia)%atomic_kind, element_symbol=esa)
837 CALL get_atomic_kind(atomic_kind=particle_set(ib)%atomic_kind, element_symbol=esb)
838 CALL get_atomic_kind(atomic_kind=particle_set(ic)%atomic_kind, element_symbol=esc)
839 WRITE (unit_nr,
"(T35,I6,' ',A2,T44,I6,' ',A2,T53,I6,' ',A2,T69,F12.6)") &
840 ia, esa, ib, esb, ic, esc, senabc
845 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Maximum SEN value calculated", senmax
853 IF (unit_nr > 0)
THEN
854 WRITE (unit_nr,
'(/,T2,A)') &
855 '!---------------------------END OF MAO ANALYSIS-------------------------------!'
859 DEALLOCATE (occnuma, occnumab, selnab, raq, uaq)
860 IF (.NOT. neglect_abc)
THEN
861 DEALLOCATE (occnumabc, selnabc)
868 DEALLOCATE (mao_basis_set_list, orb_basis_set_list)
879 CALL timestop(handle)
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, matrix_vhxc, 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.