subroutine print_gmbe_energy_breakdown(monomer_energy, n_monomers, level_energies, level_counts, &
max_level, total_energy, has_intersections)
!! Print GMBE energy breakdown using inclusion-exclusion principle
real(dp), intent(in) :: monomer_energy
integer, intent(in) :: n_monomers
real(dp), intent(in), optional :: level_energies(:)
integer, intent(in), optional :: level_counts(:)
integer, intent(in) :: max_level
real(dp), intent(in) :: total_energy
logical, intent(in) :: has_intersections
integer :: k
real(dp) :: sign_factor
character(len=256) :: line
if (has_intersections) then
call logger%info("GMBE Energy breakdown (Inclusion-Exclusion Principle):")
write (line, '(a,i0,a,f20.10)') " Monomers (", n_monomers, "): ", monomer_energy
call logger%info(trim(line))
do k = 2, max_level
if (level_counts(k) > 0) then
sign_factor = real((-1)**(k + 1), dp)
if (sign_factor > 0.0_dp) then
write (line, '(a,i0,a,i0,a,f20.10)') " ", k, "-way ∩ (", level_counts(k), "): +", level_energies(k)
else
write (line, '(a,i0,a,i0,a,f20.10)') " ", k, "-way ∩ (", level_counts(k), "): ", level_energies(k)
end if
call logger%info(trim(line))
end if
end do
write (line, '(a,f20.10)') " Total GMBE: ", total_energy
call logger%info(trim(line))
else
call logger%info("GMBE Energy breakdown:")
write (line, '(a,i0,a,f20.10)') " Monomers (", n_monomers, "): ", monomer_energy
call logger%info(trim(line))
write (line, '(a,f20.10)') " Total GMBE: ", total_energy
call logger%info(trim(line))
end if
end subroutine print_gmbe_energy_breakdown