# -*- coding: utf-8 -*-

# Set up lattice
vector_a = [64.332, 0.0, 0.0]*Angstrom
vector_b = [0.0, 7.166, 0.0]*Angstrom
vector_c = [0.0, 0.0, 7.166]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

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

# Define coordinates
fractional_coordinates = [[ 0.409494885905,  0.1875        ,  0.125         ],
                        [ 0.52088579556 ,  0.1875        ,  0.125         ],
                        [ 0.493038068147,  0.9375        ,  0.875         ],
                        [ 0.604428977802,  0.9375        ,  0.875         ],
                        [ 0.395571022198,  0.0625        ,  0.            ],
                        [ 0.506961931853,  0.0625        ,  0.            ],
                        [ 0.423418749611,  0.0625        ,  0.25          ],
                        [ 0.534809659267,  0.0625        ,  0.25          ],
                        [ 0.395571022198,  0.3125        ,  0.25          ],
                        [ 0.506961931853,  0.3125        ,  0.25          ],
                        [ 0.423418749611,  0.3125        ,  0.            ],
                        [ 0.534809659267,  0.3125        ,  0.            ],
                        [ 0.465190340733,  0.6875        ,  0.125         ],
                        [ 0.576581250389,  0.6875        ,  0.125         ],
                        [ 0.437342613318,  0.4375        ,  0.875         ],
                        [ 0.548733522975,  0.4375        ,  0.875         ],
                        [ 0.451266477025,  0.5625        ,  0.            ],
                        [ 0.562657386682,  0.5625        ,  0.            ],
                        [ 0.47911420444 ,  0.5625        ,  0.25          ],
                        [ 0.590505114095,  0.5625        ,  0.25          ],
                        [ 0.451266477025,  0.8125        ,  0.25          ],
                        [ 0.562657386682,  0.8125        ,  0.25          ],
                        [ 0.47911420444 ,  0.8125        ,  0.            ],
                        [ 0.590505114095,  0.8125        ,  0.            ],
                        [ 0.465190340733,  0.1875        ,  0.625         ],
                        [ 0.576581250389,  0.1875        ,  0.625         ],
                        [ 0.437342613318,  0.9375        ,  0.375         ],
                        [ 0.548733522975,  0.9375        ,  0.375         ],
                        [ 0.451266477025,  0.0625        ,  0.5           ],
                        [ 0.562657386682,  0.0625        ,  0.5           ],
                        [ 0.47911420444 ,  0.0625        ,  0.75          ],
                        [ 0.590505114095,  0.0625        ,  0.75          ],
                        [ 0.451266477025,  0.3125        ,  0.75          ],
                        [ 0.562657386682,  0.3125        ,  0.75          ],
                        [ 0.47911420444 ,  0.3125        ,  0.5           ],
                        [ 0.590505114095,  0.3125        ,  0.5           ],
                        [ 0.409494885905,  0.6875        ,  0.625         ],
                        [ 0.52088579556 ,  0.6875        ,  0.625         ],
                        [ 0.493038068147,  0.4375        ,  0.375         ],
                        [ 0.604428977802,  0.4375        ,  0.375         ],
                        [ 0.395571022198,  0.5625        ,  0.5           ],
                        [ 0.506961931853,  0.5625        ,  0.5           ],
                        [ 0.423418749611,  0.5625        ,  0.75          ],
                        [ 0.534809659267,  0.5625        ,  0.75          ],
                        [ 0.395571022198,  0.8125        ,  0.75          ],
                        [ 0.506961931853,  0.8125        ,  0.75          ],
                        [ 0.423418749611,  0.8125        ,  0.5           ],
                        [ 0.534809659267,  0.8125        ,  0.5           ]]

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

bulk_configuration = bulk_configuration.repeat(1, repeat, repeat)

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Basis Set
#----------------------------------------
basis_set = [
    LDABasis.Silicon_SingleZeta,
    LDABasis.Oxygen_SingleZeta,
    ]

#----------------------------------------
# Exchange-Correlation
#----------------------------------------
exchange_correlation = LDA.PZ

k_point_sampling = KpointDensity(
    density_a=1.0*Angstrom,
    )
numerical_accuracy_parameters = NumericalAccuracyParameters(
    density_mesh_cutoff=100.0*Hartree,
    k_point_sampling=k_point_sampling,
    )

iteration_control_parameters = IterationControlParameters(
    max_steps=1,
    number_of_history_steps=1,
    )

poisson_solver = FastFourierSolver(
    boundary_conditions=[[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
                        [PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
                        [PeriodicBoundaryCondition(),PeriodicBoundaryCondition()]]
    )

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

bulk_configuration.setCalculator(calculator)
bulk_configuration.update()
