94 INTEGER,
INTENT(IN) :: unit_nr
96 CHARACTER(len=*),
PARAMETER :: routinen =
'mao_analysis'
98 CHARACTER(len=2) :: element_symbol, esa, esb, esc
99 INTEGER :: fall, handle, ia, iab, iabc, iatom, ib, ic, icol, ikind, irow, ispin, jatom, &
100 mao_basis, max_iter, me, na, nab, nabc, natom, nb, nc, nimages, nspin, ssize
101 INTEGER,
DIMENSION(:),
POINTER :: col_blk_sizes, mao_blk, mao_blk_sizes, &
102 orb_blk, row_blk_sizes
103 LOGICAL :: analyze_ua, explicit, fo,
for, fos, &
104 found, neglect_abc, print_basis
105 REAL(kind=
dp) :: deltaq, electra(2), eps_ab, eps_abc, eps_filter, eps_fun, eps_grad, epsx, &
106 senabc, senmax, threshold, total_charge, total_spin, ua_charge(2), zeff
107 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: occnuma, occnumabc, qab, qmatab, qmatac, &
108 qmatbc, raq, sab, selnabc, sinv, &
109 smatab, smatac, smatbc, uaq
110 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: occnumab, selnab
111 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block, cmao,
diag, qblka, qblkb, qblkc, &
112 rblkl, rblku, sblk, sblka, sblkb, sblkc
113 TYPE(block_type),
ALLOCATABLE,
DIMENSION(:) :: rowblock
117 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mao_coef, mao_dmat, mao_qmat, mao_smat, &
118 matrix_q, matrix_smm, matrix_smo
119 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_p, matrix_s
120 TYPE(
dbcsr_type) :: amat, axmat, cgmat, cholmat, crumat, &
121 qmat, qmat_diag, rumat, smat_diag, &
128 DIMENSION(:),
POINTER :: nl_iterator
130 POINTER :: sab_all, sab_orb, smm_list, smo_list
132 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
139 IF (.NOT. explicit)
RETURN
141 CALL timeset(routinen, handle)
143 IF (unit_nr > 0)
THEN
144 WRITE (unit_nr,
'(/,T2,A)')
'!-----------------------------------------------------------------------------!'
145 WRITE (unit=unit_nr, fmt=
"(T36,A)")
"MAO ANALYSIS"
146 WRITE (unit=unit_nr, fmt=
"(T12,A)")
"Claus Ehrhardt and Reinhart Ahlrichs, TCA 68:231-245 (1985)"
147 WRITE (unit_nr,
'(T2,A)')
'!-----------------------------------------------------------------------------!'
165 CALL get_qs_env(qs_env, dft_control=dft_control)
166 nimages = dft_control%nimages
167 IF (nimages > 1)
THEN
168 IF (unit_nr > 0)
THEN
169 WRITE (unit=unit_nr, fmt=
"(T2,A)") &
170 "K-Points: MAO's determined and analyzed using Gamma-Point only."
175 NULLIFY (mao_basis_set_list, orb_basis_set_list)
177 unit_nr, print_basis)
180 NULLIFY (smm_list, smo_list)
185 NULLIFY (matrix_smm, matrix_smo)
188 mao_basis_set_list, mao_basis_set_list, smm_list)
190 mao_basis_set_list, orb_basis_set_list, smo_list)
193 CALL get_qs_env(qs_env, rho=rho, matrix_s_kp=matrix_s)
195 nspin =
SIZE(matrix_p, 1)
198 IF (nimages == 1)
THEN
199 CALL mao_build_q(matrix_q, matrix_p, matrix_s, matrix_smm, matrix_smo, smm_list, electra, eps_filter)
201 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, kpoints=kpoints)
202 CALL mao_build_q(matrix_q, matrix_p, matrix_s, matrix_smm, matrix_smo, smm_list, electra, eps_filter, &
203 nimages=nimages, kpoints=kpoints, matrix_ks=matrix_ks, sab_orb=sab_orb)
211 IF (iatom <= jatom)
THEN
219 row=irow, col=icol, block=block, found=found)
220 IF (.NOT. found) fall = fall + 1
224 CALL get_qs_env(qs_env=qs_env, para_env=para_env)
225 CALL para_env%sum(fall)
226 IF (unit_nr > 0 .AND. fall > 0)
THEN
227 WRITE (unit=unit_nr, fmt=
"(/,T2,A,/,T2,A,/)") &
228 "Warning: Extended MAO basis used with original basis filtered density matrix", &
229 "Warning: Possible errors can be controlled with EPS_PGF_ORB"
233 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
234 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set, dbcsr_dist=dbcsr_dist)
237 ALLOCATE (row_blk_sizes(natom), col_blk_sizes(natom))
239 basis=mao_basis_set_list)
243 IF (col_blk_sizes(iab) < 0) &
244 cpabort(
"Number of MAOs has to be specified in KIND section for all elements")
248 ALLOCATE (mao_coef(ispin)%matrix)
250 name=
"MAO_COEF", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
251 row_blk_size=row_blk_sizes, col_blk_size=col_blk_sizes)
254 DEALLOCATE (row_blk_sizes, col_blk_sizes)
258 CALL mao_optimize(mao_coef, matrix_q, matrix_smm, electra, max_iter, eps_grad, epsx, &
263 qs_kind_set, unit_nr, para_env)
266 NULLIFY (mao_dmat, mao_smat, mao_qmat)
270 CALL dbcsr_get_info(mao_coef(1)%matrix, col_blk_size=col_blk_sizes, distribution=dbcsr_dist)
272 ALLOCATE (mao_dmat(ispin)%matrix)
273 CALL dbcsr_create(mao_dmat(ispin)%matrix, name=
"MAO density", dist=dbcsr_dist, &
274 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
275 col_blk_size=col_blk_sizes)
276 ALLOCATE (mao_smat(ispin)%matrix)
277 CALL dbcsr_create(mao_smat(ispin)%matrix, name=
"MAO overlap", 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_qmat(ispin)%matrix)
281 CALL dbcsr_create(mao_qmat(ispin)%matrix, name=
"MAO covar density", dist=dbcsr_dist, &
282 matrix_type=dbcsr_type_symmetric, row_blk_size=col_blk_sizes, &
283 col_blk_size=col_blk_sizes)
285 CALL dbcsr_create(amat, name=
"MAO overlap", template=mao_dmat(1)%matrix)
286 CALL dbcsr_create(tmat, name=
"MAO Overlap Inverse", template=amat)
287 CALL dbcsr_create(qmat, name=
"MAO covar density", template=amat)
288 CALL dbcsr_create(cgmat, name=
"TEMP matrix", template=mao_coef(1)%matrix)
289 CALL dbcsr_create(axmat, name=
"TEMP", template=amat, matrix_type=dbcsr_type_no_symmetry)
292 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_smm(1)%matrix, mao_coef(ispin)%matrix, &
294 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef(ispin)%matrix, cgmat, 0.0_dp, amat)
297 CALL invert_hotelling(tmat, amat, threshold, norm_convergence=1.e-4_dp, silent=.true.)
300 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_q(ispin)%matrix, mao_coef(ispin)%matrix, &
301 0.0_dp, cgmat, filter_eps=eps_filter)
302 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef(ispin)%matrix, cgmat, &
303 0.0_dp, qmat, filter_eps=eps_filter)
306 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, qmat, tmat, 0.0_dp, axmat, filter_eps=eps_filter)
307 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmat, axmat, 0.0_dp, mao_dmat(ispin)%matrix, &
308 filter_eps=eps_filter)
318 CALL dbcsr_dot(mao_dmat(ispin)%matrix, mao_smat(ispin)%matrix, ua_charge(ispin))
319 ua_charge(ispin) = electra(ispin) - ua_charge(ispin)
321 IF (unit_nr > 0)
THEN
324 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
325 "Unassigned charge",
"Spin ", ispin,
"delta charge =", ua_charge(ispin)
333 ALLOCATE (occnuma(natom, nspin))
338 row=iatom, col=iatom, block=block, found=found)
340 DO iab = 1,
SIZE(block, 1)
341 occnuma(iatom, ispin) = occnuma(iatom, ispin) + block(iab, iab)
346 CALL para_env%sum(occnuma)
349 ALLOCATE (occnumab(natom, natom, nspin))
352 CALL dbcsr_create(qmat_diag, name=
"MAO diagonal density", template=mao_dmat(1)%matrix)
353 CALL dbcsr_create(smat_diag, name=
"MAO diagonal overlap", template=mao_dmat(1)%matrix)
360 DO ib = ia + 1, natom
363 row=ia, col=ib, block=block, found=found)
365 CALL para_env%sum(iab)
367 IF (iab == 0 .AND. para_env%is_source())
THEN
370 occnumab(ia, ib, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin)
371 occnumab(ib, ia, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin)
377 ALLOCATE (sab(nab, nab), qab(nab, nab), sinv(nab, nab))
379 qab(1:na, na + 1:nab) = block(1:na, 1:nb)
380 qab(na + 1:nab, 1:na) = transpose(block(1:na, 1:nb))
383 qab(1:na, 1:na) =
diag(1:na, 1:na)
386 qab(na + 1:nab, na + 1:nab) =
diag(1:nb, 1:nb)
389 row=ia, col=ib, block=block, found=fo)
391 sab(1:na, na + 1:nab) = block(1:na, 1:nb)
392 sab(na + 1:nab, 1:na) = transpose(block(1:na, 1:nb))
395 sab(1:na, 1:na) =
diag(1:na, 1:na)
398 sab(na + 1:nab, na + 1:nab) =
diag(1:nb, 1:nb)
400 sinv(1:nab, 1:nab) = sab(1:nab, 1:nab)
403 occnumab(ia, ib, ispin) = sum(qab*sinv)
404 occnumab(ib, ia, ispin) = occnumab(ia, ib, ispin)
406 DEALLOCATE (sab, qab, sinv)
413 CALL para_env%sum(occnumab)
416 ALLOCATE (selnab(natom, natom, nspin))
420 DO ib = ia + 1, natom
421 selnab(ia, ib, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin) - occnumab(ia, ib, ispin)
422 selnab(ib, ia, ispin) = selnab(ia, ib, ispin)
427 IF (.NOT. neglect_abc)
THEN
429 nabc = (natom*(natom - 1)*(natom - 2))/6
430 ALLOCATE (occnumabc(nabc, nspin))
433 CALL dbcsr_create(qmat_diag, name=
"MAO diagonal density", template=mao_dmat(1)%matrix)
434 CALL dbcsr_create(smat_diag, name=
"MAO diagonal overlap", template=mao_dmat(1)%matrix)
447 DO ib = ia + 1, natom
449 IF (selnab(ia, ib, ispin) < eps_abc)
THEN
450 iabc = iabc + (natom - ib)
459 ALLOCATE (qmatab(na, nb), smatab(na, nb))
461 block=block, found=found)
463 IF (found) qmatab(1:na, 1:nb) = block(1:na, 1:nb)
464 CALL para_env%sum(qmatab)
466 block=block, found=found)
468 IF (found) smatab(1:na, 1:nb) = block(1:na, 1:nb)
469 CALL para_env%sum(smatab)
470 DO ic = ib + 1, natom
472 IF ((selnab(ia, ic, ispin) < eps_abc) .OR. (selnab(ib, ic, ispin) < eps_abc))
THEN
481 ALLOCATE (qmatac(na, nc), smatac(na, nc))
483 block=block, found=found)
485 IF (found) qmatac(1:na, 1:nc) = block(1:na, 1:nc)
486 CALL para_env%sum(qmatac)
488 block=block, found=found)
490 IF (found) smatac(1:na, 1:nc) = block(1:na, 1:nc)
491 CALL para_env%sum(smatac)
492 ALLOCATE (qmatbc(nb, nc), smatbc(nb, nc))
494 block=block, found=found)
496 IF (found) qmatbc(1:nb, 1:nc) = block(1:nb, 1:nc)
497 CALL para_env%sum(qmatbc)
499 block=block, found=found)
501 IF (found) smatbc(1:nb, 1:nc) = block(1:nb, 1:nc)
502 CALL para_env%sum(smatbc)
505 ALLOCATE (sab(nabc, nabc), sinv(nabc, nabc), qab(nabc, nabc))
507 qab(1:na, 1:na) = qblka(1:na, 1:na)
508 qab(na + 1:nab, na + 1:nab) = qblkb(1:nb, 1:nb)
509 qab(nab + 1:nabc, nab + 1:nabc) = qblkc(1:nc, 1:nc)
510 qab(1:na, na + 1:nab) = qmatab(1:na, 1:nb)
511 qab(na + 1:nab, 1:na) = transpose(qmatab(1:na, 1:nb))
512 qab(1:na, nab + 1:nabc) = qmatac(1:na, 1:nc)
513 qab(nab + 1:nabc, 1:na) = transpose(qmatac(1:na, 1:nc))
514 qab(na + 1:nab, nab + 1:nabc) = qmatbc(1:nb, 1:nc)
515 qab(nab + 1:nabc, na + 1:nab) = transpose(qmatbc(1:nb, 1:nc))
517 sab(1:na, 1:na) = sblka(1:na, 1:na)
518 sab(na + 1:nab, na + 1:nab) = sblkb(1:nb, 1:nb)
519 sab(nab + 1:nabc, nab + 1:nabc) = sblkc(1:nc, 1:nc)
520 sab(1:na, na + 1:nab) = smatab(1:na, 1:nb)
521 sab(na + 1:nab, 1:na) = transpose(smatab(1:na, 1:nb))
522 sab(1:na, nab + 1:nabc) = smatac(1:na, 1:nc)
523 sab(nab + 1:nabc, 1:na) = transpose(smatac(1:na, 1:nc))
524 sab(na + 1:nab, nab + 1:nabc) = smatbc(1:nb, 1:nc)
525 sab(nab + 1:nabc, na + 1:nab) = transpose(smatbc(1:nb, 1:nc))
527 sinv(1:nabc, 1:nabc) = sab(1:nabc, 1:nabc)
531 me = mod(iabc, para_env%num_pe)
532 IF (me == para_env%mepos)
THEN
533 occnumabc(iabc, ispin) = sum(qab*sinv)
535 occnumabc(iabc, ispin) = 0.0_dp
538 DEALLOCATE (sab, sinv, qab)
539 DEALLOCATE (qmatac, smatac)
540 DEALLOCATE (qmatbc, smatbc)
542 DEALLOCATE (qmatab, smatab)
548 CALL para_env%sum(occnumabc)
551 IF (.NOT. neglect_abc)
THEN
553 nabc = (natom*(natom - 1)*(natom - 2))/6
554 ALLOCATE (selnabc(nabc, nspin))
559 DO ib = ia + 1, natom
560 DO ic = ib + 1, natom
562 IF (occnumabc(iabc, ispin) >= 0.0_dp)
THEN
563 selnabc(iabc, ispin) = occnuma(ia, ispin) + occnuma(ib, ispin) + occnuma(ic, ispin) - &
564 occnumab(ia, ib, ispin) - occnumab(ia, ic, ispin) - occnumab(ib, ic, ispin) + &
565 occnumabc(iabc, ispin)
574 ALLOCATE (raq(natom, nspin))
578 raq(ia, ispin) = occnuma(ia, ispin)
580 raq(ia, ispin) = raq(ia, ispin) - 0.5_dp*selnab(ia, ib, ispin)
583 IF (.NOT. neglect_abc)
THEN
586 DO ib = ia + 1, natom
587 DO ic = ib + 1, natom
589 raq(ia, ispin) = raq(ia, ispin) + selnabc(iabc, ispin)/3._dp
590 raq(ib, ispin) = raq(ib, ispin) + selnabc(iabc, ispin)/3._dp
591 raq(ic, ispin) = raq(ic, ispin) + selnabc(iabc, ispin)/3._dp
600 deltaq = (electra(ispin) - sum(raq(1:natom, ispin))) - ua_charge(ispin)
601 IF (unit_nr > 0)
THEN
602 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
603 "Cutoff error on charge",
"Spin ", ispin,
"error charge =", deltaq
608 ALLOCATE (uaq(natom, nspin))
611 CALL get_qs_env(qs_env=qs_env, para_env=para_env, blacs_env=blacs_env)
612 CALL get_qs_env(qs_env=qs_env, sab_orb=sab_orb, sab_all=sab_all)
613 CALL dbcsr_get_info(mao_coef(1)%matrix, row_blk_size=mao_blk_sizes, &
614 col_blk_size=col_blk_sizes, distribution=dbcsr_dist)
615 CALL dbcsr_get_info(matrix_s(1, 1)%matrix, row_blk_size=row_blk_sizes)
616 CALL dbcsr_create(amat, name=
"temp", template=matrix_s(1, 1)%matrix)
617 CALL dbcsr_create(tmat, name=
"temp", template=mao_coef(1)%matrix)
622 ALLOCATE (orb_blk(natom), mao_blk(natom))
624 orb_blk = row_blk_sizes
625 mao_blk = row_blk_sizes
626 mao_blk(ia) = col_blk_sizes(ia)
627 CALL dbcsr_create(sumat, name=
"Smat", dist=dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
628 row_blk_size=mao_blk, col_blk_size=mao_blk)
630 CALL dbcsr_create(cholmat, name=
"Cholesky matrix", dist=dbcsr_dist, &
631 matrix_type=dbcsr_type_no_symmetry, row_blk_size=mao_blk, col_blk_size=mao_blk)
632 CALL dbcsr_create(rumat, name=
"Rmat", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
633 row_blk_size=orb_blk, col_blk_size=mao_blk)
635 CALL dbcsr_create(crumat, name=
"Rmat*Umat", dist=dbcsr_dist, matrix_type=dbcsr_type_no_symmetry, &
636 row_blk_size=orb_blk, col_blk_size=mao_blk)
638 ALLOCATE (rowblock(natom))
640 na = mao_blk_sizes(ia)
641 nb = row_blk_sizes(ib)
642 ALLOCATE (rowblock(ib)%mat(na, nb))
643 rowblock(ib)%mat = 0.0_dp
645 block=block, found=found)
646 IF (found) rowblock(ib)%mat(1:na, 1:nb) = block(1:na, 1:nb)
647 CALL para_env%sum(rowblock(ib)%mat)
656 CALL dbcsr_get_block_p(matrix=sumat, row=iatom, col=jatom, block=sblk, found=fos)
664 IF (iatom /= ia .AND. jatom /= ia)
THEN
668 rblkl = transpose(block)
669 ELSE IF (iatom /= ia)
THEN
670 rblkl = transpose(block)
671 sblk = matmul(transpose(rowblock(iatom)%mat), cmao)
673 ELSE IF (jatom /= ia)
THEN
675 sblk = matmul(transpose(cmao), rowblock(jatom)%mat)
676 rblkl = transpose(sblk)
678 CALL dbcsr_get_block_p(matrix=smat_diag, row=ia, col=ia, block=block, found=found)
680 sblk = matmul(transpose(cmao), matmul(block, cmao))
681 rblku = matmul(transpose(rowblock(ia)%mat), cmao)
691 transa=
"N", para_env=para_env, blacs_env=blacs_env)
693 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, crumat, crumat, 0.0_dp, amat, &
694 filter_eps=eps_filter)
696 CALL dbcsr_dot(matrix_p(ispin, 1)%matrix, amat, uaq(ia, ispin))
697 uaq(ia, ispin) = uaq(ia, ispin) - electra(ispin)
706 DEALLOCATE (rowblock(ib)%mat)
708 DEALLOCATE (rowblock)
713 DEALLOCATE (orb_blk, mao_blk)
716 raq(1:natom, 1:nspin) = raq(1:natom, 1:nspin) - uaq(1:natom, 1:nspin)
718 deltaq = electra(ispin) - sum(raq(1:natom, ispin))
719 IF (unit_nr > 0)
THEN
720 WRITE (unit=unit_nr, fmt=
"(T2,A,T32,A,i2,T55,A,F12.8)") &
721 "Charge/Atom redistributed",
"Spin ", ispin,
"delta charge =", &
722 (deltaq + ua_charge(ispin))/real(natom, kind=
dp)
727 IF (unit_nr > 0)
THEN
729 WRITE (unit_nr,
"(/,T2,A,T40,A,T75,A)")
"MAO atomic charges ",
"Atom",
"Charge"
731 WRITE (unit_nr,
"(/,T2,A,T40,A,T55,A,T70,A)")
"MAO atomic charges ",
"Atom",
"Charge",
"Spin Charge"
734 deltaq = electra(ispin) - sum(raq(1:natom, ispin))
735 raq(:, ispin) = raq(:, ispin) + deltaq/real(natom, kind=
dp)
737 total_charge = 0.0_dp
741 element_symbol=element_symbol, kind_number=ikind)
744 WRITE (unit_nr,
"(T30,I6,T42,A2,T69,F12.6)") iatom, element_symbol, zeff - raq(iatom, 1)
745 total_charge = total_charge + (zeff - raq(iatom, 1))
747 WRITE (unit_nr,
"(T30,I6,T42,A2,T48,F12.6,T69,F12.6)") iatom, element_symbol, &
748 zeff - raq(iatom, 1) - raq(iatom, 2), raq(iatom, 1) - raq(iatom, 2)
749 total_charge = total_charge + (zeff - raq(iatom, 1) - raq(iatom, 2))
750 total_spin = total_spin + (raq(iatom, 1) - raq(iatom, 2))
754 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Total Charge", total_charge
756 WRITE (unit_nr,
"(T2,A,T49,F12.6,T69,F12.6)")
"Total Charge", total_charge, total_spin
762 IF (unit_nr > 0)
THEN
764 WRITE (unit_nr,
"(/,T2,A,T40,A,T75,A)")
"MAO hypervalent charges ",
"Atom",
"Charge"
766 WRITE (unit_nr,
"(/,T2,A,T40,A,T55,A,T70,A)")
"MAO hypervalent charges ",
"Atom", &
767 "Charge",
"Spin Charge"
769 total_charge = 0.0_dp
773 element_symbol=element_symbol)
775 WRITE (unit_nr,
"(T30,I6,T42,A2,T69,F12.6)") iatom, element_symbol, uaq(iatom, 1)
776 total_charge = total_charge + uaq(iatom, 1)
778 WRITE (unit_nr,
"(T30,I6,T42,A2,T48,F12.6,T69,F12.6)") iatom, element_symbol, &
779 uaq(iatom, 1) + uaq(iatom, 2), uaq(iatom, 1) - uaq(iatom, 2)
780 total_charge = total_charge + uaq(iatom, 1) + uaq(iatom, 2)
781 total_spin = total_spin + uaq(iatom, 1) - uaq(iatom, 2)
785 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Total Charge", total_charge
787 WRITE (unit_nr,
"(T2,A,T49,F12.6,T69,F12.6)")
"Total Charge", total_charge, total_spin
793 IF (unit_nr > 0)
THEN
795 WRITE (unit_nr,
"(/,T2,A,T31,A,T40,A,T78,A)")
"Shared electron numbers ",
"Atom",
"Atom",
"SEN"
797 WRITE (unit_nr,
"(/,T2,A,T31,A,T40,A,T51,A,T63,A,T71,A)")
"Shared electron numbers ",
"Atom",
"Atom", &
798 "SEN(1)",
"SEN(2)",
"SEN(total)"
801 DO ib = ia + 1, natom
802 CALL get_atomic_kind(atomic_kind=particle_set(ia)%atomic_kind, element_symbol=esa)
803 CALL get_atomic_kind(atomic_kind=particle_set(ib)%atomic_kind, element_symbol=esb)
805 IF (selnab(ia, ib, 1) > eps_ab)
THEN
806 WRITE (unit_nr,
"(T26,I6,' ',A2,T35,I6,' ',A2,T69,F12.6)") ia, esa, ib, esb, selnab(ia, ib, 1)
809 IF ((selnab(ia, ib, 1) + selnab(ia, ib, 2)) > eps_ab)
THEN
810 WRITE (unit_nr,
"(T26,I6,' ',A2,T35,I6,' ',A2,T45,3F12.6)") ia, esa, ib, esb, &
811 selnab(ia, ib, 1), selnab(ia, ib, 2), (selnab(ia, ib, 1) + selnab(ia, ib, 2))
818 IF (.NOT. neglect_abc)
THEN
820 IF (unit_nr > 0)
THEN
821 WRITE (unit_nr,
"(/,T2,A,T40,A,T49,A,T58,A,T78,A)")
"Shared electron numbers ABC", &
822 "Atom",
"Atom",
"Atom",
"SEN"
826 DO ib = ia + 1, natom
827 DO ic = ib + 1, natom
829 senabc = sum(selnabc(iabc, :))
830 senmax = max(senmax, senabc)
831 IF (senabc > eps_abc)
THEN
832 CALL get_atomic_kind(atomic_kind=particle_set(ia)%atomic_kind, element_symbol=esa)
833 CALL get_atomic_kind(atomic_kind=particle_set(ib)%atomic_kind, element_symbol=esb)
834 CALL get_atomic_kind(atomic_kind=particle_set(ic)%atomic_kind, element_symbol=esc)
835 WRITE (unit_nr,
"(T35,I6,' ',A2,T44,I6,' ',A2,T53,I6,' ',A2,T69,F12.6)") &
836 ia, esa, ib, esb, ic, esc, senabc
841 WRITE (unit_nr,
"(T2,A,T69,F12.6)")
"Maximum SEN value calculated", senmax
845 IF (unit_nr > 0)
THEN
846 WRITE (unit_nr,
'(/,T2,A)') &
847 '!---------------------------END OF MAO ANALYSIS-------------------------------!'
851 DEALLOCATE (occnuma, occnumab, selnab, raq, uaq)
852 IF (.NOT. neglect_abc)
THEN
853 DEALLOCATE (occnumabc, selnabc)
860 DEALLOCATE (mao_basis_set_list, orb_basis_set_list)
871 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, 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.