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) &
247 cpabort(
"Number of MAOs has to be specified in KIND section for all elements")
251 ALLOCATE (mao_coef(ispin)%matrix)
253 name=
"MAO_COEF", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
254 row_blk_size=row_blk_sizes, col_blk_size=col_blk_sizes)
257 DEALLOCATE (row_blk_sizes, col_blk_sizes)
261 CALL mao_optimize(mao_coef, matrix_q, matrix_smm, electra, max_iter, eps_grad, epsx, &
266 qs_kind_set, unit_nr, para_env)
269 NULLIFY (mao_dmat, mao_smat, mao_qmat)
273 CALL dbcsr_get_info(mao_coef(1)%matrix, col_blk_size=col_blk_sizes, distribution=dbcsr_dist)
275 ALLOCATE (mao_dmat(ispin)%matrix)
276 CALL dbcsr_create(mao_dmat(ispin)%matrix, name=
"MAO density", dist=dbcsr_dist, &
277 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
278 col_blk_size=col_blk_sizes)
279 ALLOCATE (mao_smat(ispin)%matrix)
280 CALL dbcsr_create(mao_smat(ispin)%matrix, name=
"MAO overlap", dist=dbcsr_dist, &
281 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
282 col_blk_size=col_blk_sizes)
283 ALLOCATE (mao_qmat(ispin)%matrix)
284 CALL dbcsr_create(mao_qmat(ispin)%matrix, name=
"MAO covar density", dist=dbcsr_dist, &
285 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
286 col_blk_size=col_blk_sizes)
288 CALL dbcsr_create(amat, name=
"MAO overlap", template=mao_dmat(1)%matrix)
289 CALL dbcsr_create(tmat, name=
"MAO Overlap Inverse", template=amat)
290 CALL dbcsr_create(qmat, name=
"MAO covar density", template=amat)
291 CALL dbcsr_create(cgmat, name=
"TEMP matrix", template=mao_coef(1)%matrix)
292 CALL dbcsr_create(axmat, name=
"TEMP", template=amat, matrix_type=dbcsr_type_no_symmetry)
295 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_smm(1)%matrix, mao_coef(ispin)%matrix, &
297 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef(ispin)%matrix, cgmat, 0.0_dp, amat)
300 CALL invert_hotelling(tmat, amat, threshold, norm_convergence=1.e-4_dp, silent=.true.)
303 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_q(ispin)%matrix, mao_coef(ispin)%matrix, &
304 0.0_dp, cgmat, filter_eps=eps_filter)
305 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef(ispin)%matrix, cgmat, &
306 0.0_dp, qmat, filter_eps=eps_filter)
309 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, qmat, tmat, 0.0_dp, axmat, filter_eps=eps_filter)
310 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmat, axmat, 0.0_dp, mao_dmat(ispin)%matrix, &
311 filter_eps=eps_filter)
321 CALL dbcsr_dot(mao_dmat(ispin)%matrix, mao_smat(ispin)%matrix, ua_charge(ispin))
322 ua_charge(ispin) = electra(ispin) - ua_charge(ispin)
324 IF (unit_nr > 0)
THEN
327 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
328 "Unassigned charge",
"Spin ", ispin,
"delta charge =", ua_charge(ispin)
336 ALLOCATE (occnuma(natom, nspin))
341 row=iatom, col=iatom, block=block, found=found)
343 DO iab = 1,
SIZE(block, 1)
344 occnuma(iatom, ispin) = occnuma(iatom, ispin) + block(iab, iab)
349 CALL para_env%sum(occnuma)
352 ALLOCATE (occnumab(natom, natom, nspin))
355 CALL dbcsr_create(qmat_diag, name=
"MAO diagonal density", template=mao_dmat(1)%matrix)
356 CALL dbcsr_create(smat_diag, name=
"MAO diagonal overlap", template=mao_dmat(1)%matrix)
363 DO ib = ia + 1, natom
366 row=ia, col=ib, block=block, found=found)
368 CALL para_env%sum(iab)
370 IF (iab == 0 .AND. para_env%is_source())
THEN
373 occnumab(ia, ib, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin)
374 occnumab(ib, ia, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin)
380 ALLOCATE (sab(nab, nab), qab(nab, nab), sinv(nab, nab))
382 qab(1:na, na + 1:nab) = block(1:na, 1:nb)
383 qab(na + 1:nab, 1:na) = transpose(block(1:na, 1:nb))
386 qab(1:na, 1:na) =
diag(1:na, 1:na)
389 qab(na + 1:nab, na + 1:nab) =
diag(1:nb, 1:nb)
392 row=ia, col=ib, block=block, found=fo)
394 sab(1:na, na + 1:nab) = block(1:na, 1:nb)
395 sab(na + 1:nab, 1:na) = transpose(block(1:na, 1:nb))
398 sab(1:na, 1:na) =
diag(1:na, 1:na)
401 sab(na + 1:nab, na + 1:nab) =
diag(1:nb, 1:nb)
403 sinv(1:nab, 1:nab) = sab(1:nab, 1:nab)
406 occnumab(ia, ib, ispin) = sum(qab*sinv)
407 occnumab(ib, ia, ispin) = occnumab(ia, ib, ispin)
409 DEALLOCATE (sab, qab, sinv)
416 CALL para_env%sum(occnumab)
419 ALLOCATE (selnab(natom, natom, nspin))
423 DO ib = ia + 1, natom
424 selnab(ia, ib, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin) - occnumab(ia, ib, ispin)
425 selnab(ib, ia, ispin) = selnab(ia, ib, ispin)
430 IF (.NOT. neglect_abc)
THEN
432 nabc = (natom*(natom - 1)*(natom - 2))/6
433 ALLOCATE (occnumabc(nabc, nspin))
436 CALL dbcsr_create(qmat_diag, name=
"MAO diagonal density", template=mao_dmat(1)%matrix)
437 CALL dbcsr_create(smat_diag, name=
"MAO diagonal overlap", template=mao_dmat(1)%matrix)
450 DO ib = ia + 1, natom
452 IF (selnab(ia, ib, ispin) < eps_abc)
THEN
453 iabc = iabc + (natom - ib)
462 ALLOCATE (qmatab(na, nb), smatab(na, nb))
464 block=block, found=found)
466 IF (found) qmatab(1:na, 1:nb) = block(1:na, 1:nb)
467 CALL para_env%sum(qmatab)
469 block=block, found=found)
471 IF (found) smatab(1:na, 1:nb) = block(1:na, 1:nb)
472 CALL para_env%sum(smatab)
473 DO ic = ib + 1, natom
475 IF ((selnab(ia, ic, ispin) < eps_abc) .OR. (selnab(ib, ic, ispin) < eps_abc))
THEN
484 ALLOCATE (qmatac(na, nc), smatac(na, nc))
486 block=block, found=found)
488 IF (found) qmatac(1:na, 1:nc) = block(1:na, 1:nc)
489 CALL para_env%sum(qmatac)
491 block=block, found=found)
493 IF (found) smatac(1:na, 1:nc) = block(1:na, 1:nc)
494 CALL para_env%sum(smatac)
495 ALLOCATE (qmatbc(nb, nc), smatbc(nb, nc))
497 block=block, found=found)
499 IF (found) qmatbc(1:nb, 1:nc) = block(1:nb, 1:nc)
500 CALL para_env%sum(qmatbc)
502 block=block, found=found)
504 IF (found) smatbc(1:nb, 1:nc) = block(1:nb, 1:nc)
505 CALL para_env%sum(smatbc)
508 ALLOCATE (sab(nabc, nabc), sinv(nabc, nabc), qab(nabc, nabc))
510 qab(1:na, 1:na) = qblka(1:na, 1:na)
511 qab(na + 1:nab, na + 1:nab) = qblkb(1:nb, 1:nb)
512 qab(nab + 1:nabc, nab + 1:nabc) = qblkc(1:nc, 1:nc)
513 qab(1:na, na + 1:nab) = qmatab(1:na, 1:nb)
514 qab(na + 1:nab, 1:na) = transpose(qmatab(1:na, 1:nb))
515 qab(1:na, nab + 1:nabc) = qmatac(1:na, 1:nc)
516 qab(nab + 1:nabc, 1:na) = transpose(qmatac(1:na, 1:nc))
517 qab(na + 1:nab, nab + 1:nabc) = qmatbc(1:nb, 1:nc)
518 qab(nab + 1:nabc, na + 1:nab) = transpose(qmatbc(1:nb, 1:nc))
520 sab(1:na, 1:na) = sblka(1:na, 1:na)
521 sab(na + 1:nab, na + 1:nab) = sblkb(1:nb, 1:nb)
522 sab(nab + 1:nabc, nab + 1:nabc) = sblkc(1:nc, 1:nc)
523 sab(1:na, na + 1:nab) = smatab(1:na, 1:nb)
524 sab(na + 1:nab, 1:na) = transpose(smatab(1:na, 1:nb))
525 sab(1:na, nab + 1:nabc) = smatac(1:na, 1:nc)
526 sab(nab + 1:nabc, 1:na) = transpose(smatac(1:na, 1:nc))
527 sab(na + 1:nab, nab + 1:nabc) = smatbc(1:nb, 1:nc)
528 sab(nab + 1:nabc, na + 1:nab) = transpose(smatbc(1:nb, 1:nc))
530 sinv(1:nabc, 1:nabc) = sab(1:nabc, 1:nabc)
534 me = mod(iabc, para_env%num_pe)
535 IF (me == para_env%mepos)
THEN
536 occnumabc(iabc, ispin) = sum(qab*sinv)
538 occnumabc(iabc, ispin) = 0.0_dp
541 DEALLOCATE (sab, sinv, qab)
542 DEALLOCATE (qmatac, smatac)
543 DEALLOCATE (qmatbc, smatbc)
545 DEALLOCATE (qmatab, smatab)
551 CALL para_env%sum(occnumabc)
554 IF (.NOT. neglect_abc)
THEN
556 nabc = (natom*(natom - 1)*(natom - 2))/6
557 ALLOCATE (selnabc(nabc, nspin))
562 DO ib = ia + 1, natom
563 DO ic = ib + 1, natom
565 IF (occnumabc(iabc, ispin) >= 0.0_dp)
THEN
566 selnabc(iabc, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin) + occnuma(ic, ispin) - &
567 occnumab(ia, ib, ispin) - occnumab(ia, ic, ispin) - occnumab(ib, ic, ispin) + &
568 occnumabc(iabc, ispin)
577 ALLOCATE (raq(natom, nspin))
581 raq(ia, ispin) = occnuma(ia, ispin)
583 raq(ia, ispin) = raq(ia, ispin) - 0.5_dp*selnab(ia, ib, ispin)
586 IF (.NOT. neglect_abc)
THEN
589 DO ib = ia + 1, natom
590 DO ic = ib + 1, natom
592 raq(ia, ispin) = raq(ia, ispin) + selnabc(iabc, ispin)/3._dp
593 raq(ib, ispin) = raq(ib, ispin) + selnabc(iabc, ispin)/3._dp
594 raq(ic, ispin) = raq(ic, ispin) + selnabc(iabc, ispin)/3._dp
603 deltaq = (electra(ispin) - sum(raq(1:natom, ispin))) - ua_charge(ispin)
604 IF (unit_nr > 0)
THEN
605 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
606 "Cutoff error on charge",
"Spin ", ispin,
"error charge =", deltaq
611 ALLOCATE (uaq(natom, nspin))
614 CALL get_qs_env(qs_env=qs_env, para_env=para_env, blacs_env=blacs_env)
615 CALL get_qs_env(qs_env=qs_env, sab_orb=sab_orb, sab_all=sab_all)
616 CALL dbcsr_get_info(mao_coef(1)%matrix, row_blk_size=mao_blk_sizes, &
617 col_blk_size=col_blk_sizes, distribution=dbcsr_dist)
618 CALL dbcsr_get_info(matrix_s(1, 1)%matrix, row_blk_size=row_blk_sizes)
619 CALL dbcsr_create(amat, name=
"temp", template=matrix_s(1, 1)%matrix)
620 CALL dbcsr_create(tmat, name=
"temp", template=mao_coef(1)%matrix)
625 ALLOCATE (orb_blk(natom), mao_blk(natom))
627 orb_blk = row_blk_sizes
628 mao_blk = row_blk_sizes
629 mao_blk(ia) = col_blk_sizes(ia)
630 CALL dbcsr_create(sumat, name=
"Smat", dist=dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
631 row_blk_size=mao_blk, col_blk_size=mao_blk)
633 CALL dbcsr_create(cholmat, name=
"Cholesky matrix", dist=dbcsr_dist, &
634 matrix_type=dbcsr_type_no_symmetry, row_blk_size=mao_blk, col_blk_size=mao_blk)
635 CALL dbcsr_create(rumat, name=
"Rmat", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
636 row_blk_size=orb_blk, col_blk_size=mao_blk)
638 CALL dbcsr_create(crumat, name=
"Rmat*Umat", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
639 row_blk_size=orb_blk, col_blk_size=mao_blk)
641 ALLOCATE (rowblock(natom))
643 na = mao_blk_sizes(ia)
644 nb = row_blk_sizes(ib)
645 ALLOCATE (rowblock(ib)%mat(na, nb))
646 rowblock(ib)%mat = 0.0_dp
648 block=block, found=found)
649 IF (found) rowblock(ib)%mat(1:na, 1:nb) = block(1:na, 1:nb)
650 CALL para_env%sum(rowblock(ib)%mat)
659 CALL dbcsr_get_block_p(matrix=sumat, row=iatom, col=jatom, block=sblk, found=fos)
667 IF (iatom /= ia .AND. jatom /= ia)
THEN
671 rblkl = transpose(block)
672 ELSE IF (iatom /= ia)
THEN
673 rblkl = transpose(block)
674 sblk = matmul(transpose(rowblock(iatom)%mat), cmao)
676 ELSE IF (jatom /= ia)
THEN
678 sblk = matmul(transpose(cmao), rowblock(jatom)%mat)
679 rblkl = transpose(sblk)
681 CALL dbcsr_get_block_p(matrix=smat_diag, row=ia, col=ia, block=block, found=found)
683 sblk = matmul(transpose(cmao), matmul(block, cmao))
684 rblku = matmul(transpose(rowblock(ia)%mat), cmao)
694 transa=
"N", para_env=para_env, blacs_env=blacs_env)
696 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, crumat, crumat, 0.0_dp, amat, &
697 filter_eps=eps_filter)
699 CALL dbcsr_dot(matrix_p(ispin, 1)%matrix, amat, uaq(ia, ispin))
700 uaq(ia, ispin) = uaq(ia, ispin) - electra(ispin)
709 DEALLOCATE (rowblock(ib)%mat)
711 DEALLOCATE (rowblock)
716 DEALLOCATE (orb_blk, mao_blk)
719 raq(1:natom, 1:nspin) = raq(1:natom, 1:nspin) - uaq(1:natom, 1:nspin)
721 deltaq = electra(ispin) - sum(raq(1:natom, ispin))
722 IF (unit_nr > 0)
THEN
723 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
724 "Charge/Atom redistributed",
"Spin ", ispin,
"delta charge =", &
725 (deltaq + ua_charge(ispin))/real(natom, kind=
dp)
730 IF (unit_nr > 0)
THEN
732 WRITE (unit_nr,
"(/,T2,A,T40,A,T75,A)")
"MAO atomic charges ",
"Atom",
"Charge"
734 WRITE (unit_nr,
"(/,T2,A,T40,A,T55,A,T70,A)")
"MAO atomic charges ",
"Atom",
"Charge",
"Spin Charge"
737 deltaq = electra(ispin) - sum(raq(1:natom, ispin))
738 raq(:, ispin) = raq(:, ispin) + deltaq/real(natom, kind=
dp)
740 total_charge = 0.0_dp
744 element_symbol=element_symbol, kind_number=ikind)
747 WRITE (unit_nr,
"(T30,I6,T42,A2,T69,F12.6)") iatom, element_symbol, zeff - raq(iatom, 1)
748 total_charge = total_charge + (zeff - raq(iatom, 1))
750 WRITE (unit_nr,
"(T30,I6,T42,A2,T48,F12.6,T69,F12.6)") iatom, element_symbol, &
751 zeff - raq(iatom, 1) - raq(iatom, 2), raq(iatom, 1) - raq(iatom, 2)
752 total_charge = total_charge + (zeff - raq(iatom, 1) - raq(iatom, 2))
753 total_spin = total_spin + (raq(iatom, 1) - raq(iatom, 2))
757 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Total Charge", total_charge
759 WRITE (unit_nr,
"(T2,A,T49,F12.6,T69,F12.6)")
"Total Charge", total_charge, total_spin
765 IF (unit_nr > 0)
THEN
767 WRITE (unit_nr,
"(/,T2,A,T40,A,T75,A)")
"MAO hypervalent charges ",
"Atom",
"Charge"
769 WRITE (unit_nr,
"(/,T2,A,T40,A,T55,A,T70,A)")
"MAO hypervalent charges ",
"Atom", &
770 "Charge",
"Spin Charge"
772 total_charge = 0.0_dp
776 element_symbol=element_symbol)
778 WRITE (unit_nr,
"(T30,I6,T42,A2,T69,F12.6)") iatom, element_symbol, uaq(iatom, 1)
779 total_charge = total_charge + uaq(iatom, 1)
781 WRITE (unit_nr,
"(T30,I6,T42,A2,T48,F12.6,T69,F12.6)") iatom, element_symbol, &
782 uaq(iatom, 1) + uaq(iatom, 2), uaq(iatom, 1) - uaq(iatom, 2)
783 total_charge = total_charge + uaq(iatom, 1) + uaq(iatom, 2)
784 total_spin = total_spin + uaq(iatom, 1) - uaq(iatom, 2)
788 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Total Charge", total_charge
790 WRITE (unit_nr,
"(T2,A,T49,F12.6,T69,F12.6)")
"Total Charge", total_charge, total_spin
796 IF (unit_nr > 0)
THEN
798 WRITE (unit_nr,
"(/,T2,A,T31,A,T40,A,T78,A)")
"Shared electron numbers ",
"Atom",
"Atom",
"SEN"
800 WRITE (unit_nr,
"(/,T2,A,T31,A,T40,A,T51,A,T63,A,T71,A)")
"Shared electron numbers ",
"Atom",
"Atom", &
801 "SEN(1)",
"SEN(2)",
"SEN(total)"
804 DO ib = ia + 1, natom
805 CALL get_atomic_kind(atomic_kind=particle_set(ia)%atomic_kind, element_symbol=esa)
806 CALL get_atomic_kind(atomic_kind=particle_set(ib)%atomic_kind, element_symbol=esb)
808 IF (selnab(ia, ib, 1) > eps_ab)
THEN
809 WRITE (unit_nr,
"(T26,I6,' ',A2,T35,I6,' ',A2,T69,F12.6)") ia, esa, ib, esb, selnab(ia, ib, 1)
812 IF ((selnab(ia, ib, 1) + selnab(ia, ib, 2)) > eps_ab)
THEN
813 WRITE (unit_nr,
"(T26,I6,' ',A2,T35,I6,' ',A2,T45,3F12.6)") ia, esa, ib, esb, &
814 selnab(ia, ib, 1), selnab(ia, ib, 2), (selnab(ia, ib, 1) + selnab(ia, ib, 2))
821 IF (.NOT. neglect_abc)
THEN
823 IF (unit_nr > 0)
THEN
824 WRITE (unit_nr,
"(/,T2,A,T40,A,T49,A,T58,A,T78,A)")
"Shared electron numbers ABC", &
825 "Atom",
"Atom",
"Atom",
"SEN"
829 DO ib = ia + 1, natom
830 DO ic = ib + 1, natom
832 senabc = sum(selnabc(iabc, :))
833 senmax = max(senmax, senabc)
834 IF (senabc > eps_abc)
THEN
835 CALL get_atomic_kind(atomic_kind=particle_set(ia)%atomic_kind, element_symbol=esa)
836 CALL get_atomic_kind(atomic_kind=particle_set(ib)%atomic_kind, element_symbol=esb)
837 CALL get_atomic_kind(atomic_kind=particle_set(ic)%atomic_kind, element_symbol=esc)
838 WRITE (unit_nr,
"(T35,I6,' ',A2,T44,I6,' ',A2,T53,I6,' ',A2,T69,F12.6)") &
839 ia, esa, ib, esb, ic, esc, senabc
844 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Maximum SEN value calculated", senmax
852 IF (unit_nr > 0)
THEN
853 WRITE (unit_nr,
'(/,T2,A)') &
854 '!---------------------------END OF MAO ANALYSIS-------------------------------!'
858 DEALLOCATE (occnuma, occnumab, selnab, raq, uaq)
859 IF (.NOT. neglect_abc)
THEN
860 DEALLOCATE (occnumabc, selnabc)
867 DEALLOCATE (mao_basis_set_list, orb_basis_set_list)
878 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, 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.