subroutine tagged_result(unit, energy, gradient, sigma)
integer, intent(in) :: unit
real(wp), intent(in), optional :: energy
real(wp), intent(in), optional :: gradient(:, :)
real(wp), intent(in), optional :: sigma(:, :)
character(len=*), parameter :: tag_header = &
& '(a,t20,":",a,":",i0,":",*(i0:,","))'
if (present(energy)) then
write(unit, tag_header) "energy", "real", 0
write(unit, '(3es24.16)') energy
end if
if (present(gradient)) then
write(unit, tag_header) "gradient", "real", 2, 3, size(gradient, 2)
write(unit, '(3es24.16)') gradient
end if
if (present(sigma)) then
write(unit, tag_header) "virial", "real", 2, 3, 3
write(unit, '(3es24.16)') sigma
end if
end subroutine tagged_result