Unable to print virtual MO energies

29 views
Skip to first unread message

Xing Zhang

unread,
Mar 19, 2026, 12:25:14 AMMar 19
to cp2k
I was trying to print both occupied and unoccupied MO energies for an XTB calculation.
However, the output always only shows the occupied orbitals. I wonder if my input is incorrect. Please help. Thank you in advance.

I have attached the input and output files.
Si.out
Si.inp

Xing Zhang

unread,
Mar 20, 2026, 1:41:05 AMMar 20
to cp2k
I figured out that I need to set ADDED_MOS. Then I'm curious about how the standard diagonalization algorithm works in CP2K. Does it only diagonalize in a subspace?

tkuehne

unread,
Aug 11, 2026, 2:11:46 PM (2 days ago) Aug 11
to cp2k
Dear Xing,

you were correct that ADDED_MOS was required by the CP2K development
version used for the output attached to your message.

This behavior has since changed. Starting with commit

https://github.com/cp2k/cp2k/commit/983a8784de08474e9a2886adc0c8e52bba168087

which is included in CP2K 2026.2, an explicit positive MO_INDEX_RANGE
automatically makes the requested orbitals available. Using -1 as the
last index requests all orbitals available in the AO basis.

I reran your attached input unchanged with a current CP2K 2026.2
development build. With

  MO_INDEX_RANGE 0 -1

and without ADDED_MOS, CP2K reported 4 occupied and 18 total molecular
orbitals at each of the 8 k-points.

If you need to use the older executable from your original calculation,
you can instead add

  ADDED_MOS -1

to request all available orbitals, or specify a positive number if only
that many additional virtual orbitals are required.

Regarding your question about ALGORITHM STANDARD: for this k-point
calculation, it does not diagonalize the Hamiltonian only in the
occupied-MO subspace. CP2K constructs the Kohn-Sham matrix H(k) and
overlap matrix S(k) in the atomic-orbital basis and solves

  H(k) C(k) = S(k) C(k) epsilon(k)

separately for every k-point and spin channel.

ADDED_MOS controls how many of the lowest eigenpairs are requested and
stored in addition to those needed for the occupied states. Depending on
the selected eigensolver backend, it may calculate only this requested
part of the spectrum, or calculate the full spectrum and retain the
requested part. At zero electronic temperature, the unoccupied orbitals
do not contribute to the density matrix.

DIAG_SUB_SCF is a separate optional inner SCF loop. It keeps the molecular
orbitals fixed while refining occupations and is not available with
k-points. For Gamma-point calculations, STANDARD can also switch to a
block-Jacobi pseudo-diagonalization sweep close to convergence.

The documentation clarification is available here:

https://github.com/cp2k/cp2k/pull/5712

Best regards,
Thomas
Reply all
Reply to author
Forward
0 new messages