# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
lattice = FaceCenteredCubic(5.431*Angstrom)

# Define elements
elements = [Silicon, Silicon]

# Define coordinates
fractional_coordinates = [[ 0.  ,  0.  ,  0.  ],
                          [ 0.25,  0.25,  0.25]]

# Set up configuration
bulk_configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Basis Set
#----------------------------------------
# Ordinary GGA: Medium or High basis set for SG15.
basis_set = [BasisGGASG15.Silicon_Medium]
#basis_set = [BasisGGASG15.Silicon_High]

# GGA with pseudopotential projector-shift method: Medium or High basis set for SG15.
#projector_shift = PseudoPotentialProjectorShift(s_orbital_shift=11.23*eV,
#                                                p_orbital_shift=-1.09*eV)
#basis_set = [BasisGGASG15.Silicon_Medium(projector_shift=projector_shift)]
#basis_set = [BasisGGASG15.Silicon_High(projector_shift=projector_shift)]

#----------------------------------------
# Exchange-Correlation
#----------------------------------------
exchange_correlation = GGA.PBE

k_point_sampling = MonkhorstPackGrid(
    na=9,
    nb=9,
    nc=9,
    )
numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=k_point_sampling,
    density_mesh_cutoff=100.0*Hartree,
    )

iteration_control_parameters = IterationControlParameters(
    damping_factor=0.4,
    )

calculator = LCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    iteration_control_parameters=iteration_control_parameters,
    )

bulk_configuration.setCalculator(calculator)
nlprint(bulk_configuration)
bulk_configuration.update()
nlsave('silicon.nc', bulk_configuration)
