# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------
lattice = FaceCenteredCubic(5.4306*Angstrom)
elements = [Silicon, Silicon]
fractional_coordinates = [[ 0.  ,  0.  ,  0.  ],
                          [ 0.25,  0.25,  0.25]]
bulk_configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
basis_set = [CerdaHuckelParameters.Silicon_GW_diamond_Basis]
hamiltonian_parametrization = HuckelHamiltonianParametrization(
    basis_set=basis_set)
k_point_sampling = MonkhorstPackGrid(9,9,9)
numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=k_point_sampling,
    density_mesh_cutoff=10.0*Hartree,
    )
calculator = SemiEmpiricalCalculator(
    hamiltonian_parametrization=hamiltonian_parametrization,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    )
bulk_configuration.setCalculator(calculator)
bulk_configuration.update()

# -------------------------------------------------------------
# Bandstructure
# -------------------------------------------------------------
bandstructure = Bandstructure(
    configuration=bulk_configuration,
    route=['G', 'X'],
    points_per_segment=40,
    bands_above_fermi_level=4
    )

# Read the valence and conduction band edges wrt. the Fermi level
edge_valence = bandstructure.valenceBandEdge()
edge_conduction = bandstructure.conductionBandEdge()
print(edge_valence)
# Read the direct and indirect band gaps
gap_direct   = bandstructure.directBandGap()
gap_indirect = bandstructure.indirectBandGap()
print(gap_indirect)
# Print out results
print('Valence band maximum    = %.2f eV' % edge_valence.inUnitsOf(eV))
print('Conduction band minimum = %.2f eV' % edge_conduction.inUnitsOf(eV))
print('Direct band gap   = %.2f eV' % gap_direct.inUnitsOf(eV))
print('Indirect band gap = %.2f eV' % gap_indirect.inUnitsOf(eV))