I have a very simple technical question with regards to the SIESTA software. When defining an anion/cation for a given species, is it sufficient to add an electron when defining a given species? For example:

%block ChemicalSpecieslabel
    1 17 S
%endblock ChemicalSpecieslabel

Or would this just be a Cl atom but with an S symbol. If I am incorrect, can anyone share how they would define an anion/cation in SIESTA ?

  • 1
    $\begingroup$ I don't know enough about SIESTA to answer the question, but from the manual I can at least say the ChemicalSpeciesLabel is just a label, so whether it is S or SomeLongNameForAnion, on its own it won't change any properties of the atom. $\endgroup$
    – Tyberius
    Commented Dec 9, 2021 at 15:27

1 Answer 1


You are correct in saying that

%block ChemicalSpecieslabel
    1 17 S
%endblock ChemicalSpecieslabel

would just indicate that you have a Cl atom but with an S symbol.

There's the NetCharge flag. If you look at SIESTA's user guide it explains what it does. However, then you'd probably be defining a periodically charged system. Does this make sense? You should read carefully the indications in the manual to know if your system fits the very specific requirements for it to work.

A more natural thing is usually to have a neutral system where your atoms get naturally charged because of the positions of their energy levels. Say if you think there's a $S^-$ in your system, there probably is a positive ion as well that is donating the charge.

You can then check Hirshfeld, Voronoi or Mulliken charges to understand if the atom is really getting charged. SIESTA will give you these outputs with the flags WriteHirshfeldPop, WriteVoronoiPop and WriteMullikenPop, respectively. You can then check your output file manually or color your structure with charge values using sisl, for example (in python):

import sisl
import sisl.viz

# Get your structure
geom = sisl.get_sile("myfile.fdf").read_geometry(output=True)
# Get the last charges from the output file
net_charges = sisl.get_sile("myfile.out").read_charge(
    "hirshfeld", iscf=None, imd=None, as_dataframe=True

# And plot the structure using the net charges as the color for the atoms
geom.plot(atoms_style={"color": net_charges})

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .