Basis set optimization

Hello, I’m trying to optimize the basis set for B and N starting from monolayer hBN. I have set something like this, for boron:
B 5 # Species label, number of l-shells
n=2 0 2 S $spl_s_B # n, l, Nzeta
$s_z1_rc_B 0.000
1.000 1.000
n=2 1 2 S $spl_p_B P1 # n, l, Nzeta, Polarization, NzetaPol
$p_z1_rc_B 0.000
1.000 1.000
n=3 0 1 Q $ch_3s_B
n=3 1 1 Q $ch_3p_B
n=4 0 1 Q $ch_4s_B

However, I have some doubts:

  • I understand that the charge density should be converged. Thus, is it important the k-point mesh/cut-off mesh that I use to optimize the basis set?
  • I’ve seen that the charge confinement could be useful for empty orbitals. Can this be optimized with the simplex algorithm implemented in siesta?

Laura Caputo

Hi Laura,

here is a basis set for hBN:

%block PAO.Basis
B 3
n=2 0 2 E 40 -0.9
6.96216774708 3.3713211

n=2 1 2 E 40 -0.9
8.93974114822 3.4977770

n=2 2 1 E 40 -0.9 Q 5.4189369 .2152190

N 3
n=2 0 2 E 40 -0.9
6.5 4.3806496

n=2 1 2 E 40 -0.9
6.71294063991 2.4269315

n=2 2 1 E 40 -0.9 Q 8.2241579 .0100000
%endblock PAO.Basis

which I’ve been using it for monolayers, bilayers, etc., for a while with decent success. Actually, I think it is the basis set available from Simune.

As for your questions:

  • Converging a basis set can be done for a specific system (monolayer, bulk, nanotube, etc.), and you can optimize with respect to a given parameter: total energy, lattice constant (theoretical or experimental), and some people have even converged with respect to the electronic bands, although I’m not sure this is a good idea. In any case, you would want the calculations to be sensibly converged, but not so stringent that each calculation in the simplex algorithm takes a long time.
  • I think the simplex algorithm that comes with siesta is very general, and can be used to optimize whatever you want with respect to whatever you want. See here.

Although I’m not an expert, maybe others would like to weigh in.

A few more comments:

  • I would be careful using simplex to get a basis set, since the optimization is mathematical, not necessarily pysical. There might be basis sets which lower the total energy more than others, but are not physically sensible. However you make a basis set, you should be careful to check that things look sensible. You can do this by plotting the ORB.* and KB.* files which are output by siesta, and that may give you an idea of whether you need to increase or decrease a given cutoff. I think you might need to set WriteIonPlotFiles to true to print these files, but I’m not 100% sure.
  • One good way to converge the basis set is to compare with a plane wave DFT code. For example, abinit, which can use the same pseudopotentials as siesta. If you use the same xc functional, pseudos, k-point mesh, etc., you eliminate many variables and make it easier to compare results from the two codes/basis sets.