code: def _generate_G_points(self, kpoint):
          
          gpoints = []
          for i in range(2 * self._nbmax[2] + 1):
              i3 = i - 2 * self._nbmax[2] - 1 if i > self._nbmax[2] else i
              for j in range(2 * self._nbmax[1] + 1):
                  j2 = j - 2 * self._nbmax[1] - 1 if j > self._nbmax[1] else j
                  for k in range(2 * self._nbmax[0] + 1):
                      k1 = k - 2 * self._nbmax[0] - 1 if k > self._nbmax[0] else k
                      G = np.array([k1, j2, i3])
                      v = kpoint + G
                      g = np.linalg.norm(np.dot(v, self.b))
                      E = g ** 2 / self._C
                      if E < self.encut:
                          gpoints.append(G)
          return np.array(gpoints, dtype=np.float64)
docs: Helper function to generate G-points based on nbmax.
  
          This function iterates over possible G-point values and determines
          if the energy is less than G_{cut}. Valid values are appended to
          the output array. This function should not be called outside of
          initialization.
  
          Args:
              kpoint (np.array): the array containing the current k-point value
  
          Returns:
              a list containing valid G-points