How to set attributes in k_integration{} - integrating over the FBZ#
Last update: 2026-04-27
In this tutorial we explain how to set parameters inside k_integration{ } and k_integration{ }. This group controls the procedure integrating densities over a selected piece of the first Brillouin zone (FBZ). The available attributes are exactly the same for all instances within the quantum{ } group.
Attention
The method described below works best for deep confinements or low occupations, where choosing force_k0_subspace = yes does not change the electrostatics dramatically, as it is reasonable to perform it manually.
If it is not the case for your simulation, then please use template feature of nextnanomat to perform respective sweeps automatically with force_k0_subspace = no starting already from the Step 2.
In most cases, this will require you to define extra variables, that will allow you to perform the sweeps.
In this approach, the steps 5. and 6. can be omitted.
Step 1. Find the symmetry of your system.
Start with the with running the code below to get some initial density of carriers that you can preview in bias_00000/Quantum/density_electron.dat and bias_00000/Quantum/density_hole.dat.
k_integration{
relative_size = 0.1
num_points = 6
num_subpoints = 0
force_k0_subspace = yes
symmetry = none
}
Once the initial densities are obtained, add them to overlay and compare to the results obtained with symmetry = C2, symmetry = C4, and symmetry = C6 if applicable.
Choose the highest symmetry that reproduces the original densities.
Often C2 will be your choice for the planar structures.
If so then you should end this step with the code below.
k_integration{
relative_size = 0.1
num_points = 6
num_subpoints = 0
force_k0_subspace = yes
symmetry = C2
}
Step 2. Find the relevant piece of the FBZ zone to integrate
Now you need to proceed with finding the size of the FBZ needed for the integration.
This is such part of the FBZ which contains occupied states, by electrons or holes, as these will contribute to the charge densities.
Your integration should include all relevant states.
To do so, you need to increase num_points and relative_size somewhat proportionally.
Use the code below to explore the needed size of integration volume.
$additional_points = 0
k_integration{
relative_size = 0.1 * (5+$additional_points) / 5
num_points = 6 + $additional_points
num_subpoints = 0
force_k0_subspace = yes
symmetry = C2
}
The code introduces a variable $additional_points which alters number of integration points and the integration k-spaces preserving the volume associated with each integration node.
In other words, it allows you to expand the integration k-region systematically without altering integration conditions for smaller wave vectors.
To proceed with this code, increase or decrease the $additional_points gradually, by 1.
Find the smallest $additional_points such that the bias_00000/Quantum/density_electron.dat does not change for two consecutive values.
Lets say that these were 3 and 4.
In such case, the 3 is a decent choice.
Therefore the conclusion of this step in such conditions would be the code below.
Hint
This step can be also sometimes accomplished by investigation of the electronic band structures and quasi-Fermi levels.
k_integration{
relative_size = 0.16
num_points = 6
num_subpoints = 0
force_k0_subspace = yes
symmetry = C2
}
Notice that at the end we modified only the relative_size size respective to the previous steps.
Step 3. Find how much you need to calculate
In this step you need to decide how fine should be the grid in the k-space for the integration.
To do this, you need to find for how many wave vectors the solver needs to evaluate energies and wave functions.
For this purpose, set num_points to some not-smallest value, for instance 10, and run the simulation.
Add it to the overlay and run further simulations with gradually increased num_points until you find that your density sops changing visibly (converged).
Update the overlay with this density of charges.
This is your benchmark for the further step.
Let’s say that your integration converged for num_points = 15, then you should end this step with teh code below.
k_integration{
relative_size = 0.16
num_points = 15
num_subpoints = 0
force_k0_subspace = yes
symmetry = C2
}
Step 4. Substitute the calculation with interpolation
In this step the goal is to reduce the number of times when the Schrödinger equation is solved without compromising accuracy of the integration.
To do this, reduce num_points to the value that makes your simulation much faster than you actually need.
You will see that the obtained density changed much respective to the one from the previous step.
It’s expected.
To restore it, increase value of num_subpoints until your new density matches the overlay satisfactorily.
Note tha increasing the num_subpoints does not cost much numerical resources.
Let’s say that you reduced the num_points down to 5 and managed to restore the densities with num_subpoints = 10.
Then you should end up with the code.
k_integration{
relative_size = 0.16
num_points = 5
num_subpoints = 10
force_k0_subspace = yes
symmetry = C2
}
Step 5. Solve the Schrödinger equation out of k=0
The final step is to set force_k0_subspace = no such that the actual wave functions are calculated.
This will make the integration much longer as now eigenfunctions will be properly evaluated for every wave vector for which teh Schrödinger equation is solved.
It is expected to notably impact change the densities, these are your final densities.
You should the finish with the code like below.
k_integration{
relative_size = 0.16
num_points = 5
num_subpoints = 10
force_k0_subspace = no
symmetry = C2
}
Step 6. Sanity check
To finalize the process, double-check if increasing num_points by one still does not change the integrated densities.
If it does, then you have to increase it further to find proper density.
If desired, add the best density to the overlay and perform search for better set of num_points and num_subpoints as in the step 4.