# Set minimal log verbosity
setVerbosity(MinimalLog)

# %% nio

# Set up lattice
lattice = Rhombohedral(5.138*Angstrom, 33.5573*Degrees)

# Define elements
elements = [Nickel, Oxygen, Nickel, Oxygen]

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

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

nio_name = "nio"


# %% InitialSpin

scaled_spins = [
    1.0,
    0.0,
    -1.0,
    0.0,
]
initial_spin = InitialSpin(scaled_spins=scaled_spins)
nlsave('NiO_DFT_results.hdf5', initial_spin)


# %% Set LCAOCalculator

# %% LCAOCalculator

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

# ----------------------------------------
# Basis Set
# ----------------------------------------
basis_set = [
    BasisGGAPseudoDojo.Oxygen_Medium,
    BasisGGAPseudoDojo.Nickel_Medium,
]

density_mesh_cutoff = calculateDefaultDensityMeshCutoff(
    calculator_type=LCAOCalculator,
    configuration=nio,
    basis_set=basis_set,
    wave_function_cutoff=None,
)

k_point_sampling = KpointDensity(
    density_a=4.0 * Angstrom, density_b=4.0 * Angstrom, density_c=4.0 * Angstrom
)

numerical_accuracy_parameters = NumericalAccuracyParameters(
    density_mesh_cutoff=density_mesh_cutoff,
    k_point_sampling=k_point_sampling,
    occupation_method=FermiDirac(broadening=300.0 * Kelvin),
)

iteration_control_parameters = IterationControlParameters(tolerance=1e-05)

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


# %% Set Calculator

nio.setCalculator(calculator=calculator, initial_spin=initial_spin)

nio.update()

nlsave('NiO_DFT_results.hdf5', nio)


# %% ProjectedDensityOfStates

kpoints = MonkhorstPackGrid(na=60, nb=60, nc=60)

projected_density_of_states = ProjectedDensityOfStates(configuration=nio, kpoints=kpoints)
nlsave('NiO_DFT_results.hdf5', projected_density_of_states)


# %% MullikenPopulation

mulliken_population = MullikenPopulation(configuration=nio)
nlsave('NiO_DFT_results.hdf5', mulliken_population)
