# -------------------------------------------------------------
# TwoProbe configuration
# -------------------------------------------------------------

# -------------------------------------------------------------
# Left electrode
# -------------------------------------------------------------

# Set up lattice
vector_a = [10.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 21.36688, 0.0]*Angstrom
vector_c = [0.0, 0.0, 7.38300513133]*Angstrom
left_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
left_electrode_elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon]

# Define coordinates
left_electrode_coordinates = [[  5.        ,   5.71043   ,   0.61524957],
                              [  5.        ,   7.13129   ,   0.61524957],
                              [  5.        ,   9.97301   ,   0.61524957],
                              [  5.        ,  11.39387   ,   0.61524957],
                              [  5.        ,   5.        ,   1.84575043],
                              [  5.        ,   7.84172   ,   1.84575043],
                              [  5.        ,   9.26258   ,   1.84575043],
                              [  5.        ,  12.1043    ,   1.84575043],
                              [  5.        ,   5.71043   ,   3.07625128],
                              [  5.        ,   7.13129   ,   3.07625128],
                              [  5.        ,   9.97301   ,   3.07625128],
                              [  5.        ,  11.39387   ,   3.07625128],
                              [  5.        ,   5.        ,   4.30675214],
                              [  5.        ,   7.84172   ,   4.30675214],
                              [  5.        ,   9.26258   ,   4.30675214],
                              [  5.        ,  12.1043    ,   4.30675214],
                              [  5.        ,   5.71043   ,   5.53725299],
                              [  5.        ,   7.13129   ,   5.53725299],
                              [  5.        ,   9.97301   ,   5.53725299],
                              [  5.        ,  11.39387   ,   5.53725299],
                              [  5.        ,   5.        ,   6.76775385],
                              [  5.        ,   7.84172   ,   6.76775385],
                              [  5.        ,   9.26258   ,   6.76775385],
                              [  5.        ,  12.1043    ,   6.76775385]]*Angstrom

# Set up configuration
left_electrode = BulkConfiguration(
    bravais_lattice=left_electrode_lattice,
    elements=left_electrode_elements,
    cartesian_coordinates=left_electrode_coordinates
    )

# -------------------------------------------------------------
# Right electrode
# -------------------------------------------------------------

# Set up lattice
vector_a = [10.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 21.36688, 0.0]*Angstrom
vector_c = [0.0, 0.0, 7.38300513133]*Angstrom
right_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
right_electrode_elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                            Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                            Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon]

# Define coordinates
right_electrode_coordinates = [[  5.        ,   5.71043   ,   0.61524957],
                               [  5.        ,   7.13129   ,   0.61524957],
                               [  5.        ,   9.97301   ,   0.61524957],
                               [  5.        ,  11.39387   ,   0.61524957],
                               [  5.        ,   5.        ,   1.84575043],
                               [  5.        ,   7.84172   ,   1.84575043],
                               [  5.        ,   9.26258   ,   1.84575043],
                               [  5.        ,  12.1043    ,   1.84575043],
                               [  5.        ,   5.71043   ,   3.07625128],
                               [  5.        ,   7.13129   ,   3.07625128],
                               [  5.        ,   9.97301   ,   3.07625128],
                               [  5.        ,  11.39387   ,   3.07625128],
                               [  5.        ,   5.        ,   4.30675214],
                               [  5.        ,   7.84172   ,   4.30675214],
                               [  5.        ,   9.26258   ,   4.30675214],
                               [  5.        ,  12.1043    ,   4.30675214],
                               [  5.        ,   5.71043   ,   5.53725299],
                               [  5.        ,   7.13129   ,   5.53725299],
                               [  5.        ,   9.97301   ,   5.53725299],
                               [  5.        ,  11.39387   ,   5.53725299],
                               [  5.        ,   5.        ,   6.76775385],
                               [  5.        ,   7.84172   ,   6.76775385],
                               [  5.        ,   9.26258   ,   6.76775385],
                               [  5.        ,  12.1043    ,   6.76775385]]*Angstrom

# Set up configuration
right_electrode = BulkConfiguration(
    bravais_lattice=right_electrode_lattice,
    elements=right_electrode_elements,
    cartesian_coordinates=right_electrode_coordinates
    )

# -------------------------------------------------------------
# Central region
# -------------------------------------------------------------

# Set up lattice
vector_a = [10.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 21.36688, 0.0]*Angstrom
vector_c = [0.0, 0.0, 34.4540239462]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
central_region_elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon]

# Define coordinates
central_region_coordinates = [[  5.        ,   5.71043   ,   0.61524957],
                              [  5.        ,   7.13129   ,   0.61524957],
                              [  5.        ,   9.97301   ,   0.61524957],
                              [  5.        ,  11.39387   ,   0.61524957],
                              [  5.        ,   5.        ,   1.84575043],
                              [  5.        ,   7.84172   ,   1.84575043],
                              [  5.        ,   9.26258   ,   1.84575043],
                              [  5.        ,  12.1043    ,   1.84575043],
                              [  5.        ,   5.71043   ,   3.07625128],
                              [  5.        ,   7.13129   ,   3.07625128],
                              [  5.        ,   9.97301   ,   3.07625128],
                              [  5.        ,  11.39387   ,   3.07625128],
                              [  5.        ,   5.        ,   4.30675214],
                              [  5.        ,   7.84172   ,   4.30675214],
                              [  5.        ,   9.26258   ,   4.30675214],
                              [  5.        ,  12.1043    ,   4.30675214],
                              [  5.        ,   5.71043   ,   5.53725299],
                              [  5.        ,   7.13129   ,   5.53725299],
                              [  5.        ,   9.97301   ,   5.53725299],
                              [  5.        ,  11.39387   ,   5.53725299],
                              [  5.        ,   5.        ,   6.76775385],
                              [  5.        ,   7.84172   ,   6.76775385],
                              [  5.        ,   9.26258   ,   6.76775385],
                              [  5.        ,  12.1043    ,   6.76775385],
                              [  5.        ,   5.71043   ,   7.9982547 ],
                              [  5.        ,   7.13129   ,   7.9982547 ],
                              [  5.        ,   9.97301   ,   7.9982547 ],
                              [  5.        ,  11.39387   ,   7.9982547 ],
                              [  5.        ,   5.        ,   9.22875556],
                              [  5.        ,   7.84172   ,   9.22875556],
                              [  5.        ,   9.26258   ,   9.22875556],
                              [  5.        ,  12.1043    ,   9.22875556],
                              [  5.        ,   5.71043   ,  10.45925641],
                              [  5.        ,   7.13129   ,  10.45925641],
                              [  5.        ,   9.97301   ,  10.45925641],
                              [  5.        ,  11.39387   ,  10.45925641],
                              [  5.        ,   5.        ,  11.68975727],
                              [  5.        ,   7.84172   ,  11.68975727],
                              [  5.        ,   9.26258   ,  11.68975727],
                              [  5.        ,  12.1043    ,  11.68975727],
                              [  5.        ,   5.71043   ,  12.92025812],
                              [  5.        ,   7.13129   ,  12.92025812],
                              [  5.        ,   9.97301   ,  12.92025812],
                              [  5.        ,  11.39387   ,  12.92025812],
                              [  5.        ,   5.        ,  14.15075898],
                              [  5.        ,   7.84172   ,  14.15075898],
                              [  5.        ,   9.26258   ,  14.15075898],
                              [  5.        ,  12.1043    ,  14.15075898],
                              [  5.        ,  13.52516   ,  14.15075898],
                              [  5.        ,   5.71043   ,  15.38125984],
                              [  5.        ,   7.13129   ,  15.38125984],
                              [  5.        ,   9.97301   ,  15.38125984],
                              [  5.        ,  11.39387   ,  15.38125984],
                              [  5.        ,  14.23559   ,  15.38125984],
                              [  5.        ,  15.65645   ,  15.38125984],
                              [  5.        ,   5.        ,  16.61176069],
                              [  5.        ,   7.84172   ,  16.61176069],
                              [  5.        ,   9.26258   ,  16.61176069],
                              [  5.        ,  12.1043    ,  16.61176069],
                              [  5.        ,  13.52516   ,  16.61176069],
                              [  5.        ,  16.36688   ,  16.61176069],
                              [  5.        ,   5.71043   ,  17.84226155],
                              [  5.        ,   7.13129   ,  17.84226155],
                              [  5.        ,   9.97301   ,  17.84226155],
                              [  5.        ,  11.39387   ,  17.84226155],
                              [  5.        ,  14.23559   ,  17.84226155],
                              [  5.        ,  15.65645   ,  17.84226155],
                              [  5.        ,   5.        ,  19.0727624 ],
                              [  5.        ,   7.84172   ,  19.0727624 ],
                              [  5.        ,   9.26258   ,  19.0727624 ],
                              [  5.        ,  12.1043    ,  19.0727624 ],
                              [  5.        ,  13.52516   ,  19.0727624 ],
                              [  5.        ,   5.71043   ,  20.30326326],
                              [  5.        ,   7.13129   ,  20.30326326],
                              [  5.        ,   9.97301   ,  20.30326326],
                              [  5.        ,  11.39387   ,  20.30326326],
                              [  5.        ,   5.        ,  21.53376411],
                              [  5.        ,   7.84172   ,  21.53376411],
                              [  5.        ,   9.26258   ,  21.53376411],
                              [  5.        ,  12.1043    ,  21.53376411],
                              [  5.        ,   5.71043   ,  22.76426497],
                              [  5.        ,   7.13129   ,  22.76426497],
                              [  5.        ,   9.97301   ,  22.76426497],
                              [  5.        ,  11.39387   ,  22.76426497],
                              [  5.        ,   5.        ,  23.99476582],
                              [  5.        ,   7.84172   ,  23.99476582],
                              [  5.        ,   9.26258   ,  23.99476582],
                              [  5.        ,  12.1043    ,  23.99476582],
                              [  5.        ,   5.71043   ,  25.22526668],
                              [  5.        ,   7.13129   ,  25.22526668],
                              [  5.        ,   9.97301   ,  25.22526668],
                              [  5.        ,  11.39387   ,  25.22526668],
                              [  5.        ,   5.        ,  26.45576753],
                              [  5.        ,   7.84172   ,  26.45576753],
                              [  5.        ,   9.26258   ,  26.45576753],
                              [  5.        ,  12.1043    ,  26.45576753],
                              [  5.        ,   5.71043   ,  27.68626839],
                              [  5.        ,   7.13129   ,  27.68626839],
                              [  5.        ,   9.97301   ,  27.68626839],
                              [  5.        ,  11.39387   ,  27.68626839],
                              [  5.        ,   5.        ,  28.91676924],
                              [  5.        ,   7.84172   ,  28.91676924],
                              [  5.        ,   9.26258   ,  28.91676924],
                              [  5.        ,  12.1043    ,  28.91676924],
                              [  5.        ,   5.71043   ,  30.1472701 ],
                              [  5.        ,   7.13129   ,  30.1472701 ],
                              [  5.        ,   9.97301   ,  30.1472701 ],
                              [  5.        ,  11.39387   ,  30.1472701 ],
                              [  5.        ,   5.        ,  31.37777095],
                              [  5.        ,   7.84172   ,  31.37777095],
                              [  5.        ,   9.26258   ,  31.37777095],
                              [  5.        ,  12.1043    ,  31.37777095],
                              [  5.        ,   5.71043   ,  32.60827181],
                              [  5.        ,   7.13129   ,  32.60827181],
                              [  5.        ,   9.97301   ,  32.60827181],
                              [  5.        ,  11.39387   ,  32.60827181],
                              [  5.        ,   5.        ,  33.83877266],
                              [  5.        ,   7.84172   ,  33.83877266],
                              [  5.        ,   9.26258   ,  33.83877266],
                              [  5.        ,  12.1043    ,  33.83877266]]*Angstrom

# Set up configuration
central_region = BulkConfiguration(
    bravais_lattice=central_region_lattice,
    elements=central_region_elements,
    cartesian_coordinates=central_region_coordinates
    )

device_configuration = DeviceConfiguration(
    central_region,
    [left_electrode, right_electrode]
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Basis Set
#----------------------------------------
basis_set = Hancock.C_Basis

#----------------------------------------
# Numerical Accuracy Settings
#----------------------------------------
left_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    grid_mesh_cutoff=20.0*Hartree,
    k_point_sampling=(1, 1, 100),
    )

right_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    grid_mesh_cutoff=20.0*Hartree,
    k_point_sampling=(1, 1, 100),
    )

device_numerical_accuracy_parameters = NumericalAccuracyParameters(
    grid_mesh_cutoff=20.0*Hartree,
    )

#----------------------------------------
# Iteration Control Settings
#----------------------------------------
left_electrode_iteration_control_parameters = IterationControlParameters()

right_electrode_iteration_control_parameters = IterationControlParameters()

device_iteration_control_parameters = IterationControlParameters()

#----------------------------------------
# Poisson Solver Settings
#----------------------------------------
left_electrode_poisson_solver = FastFourier2DSolver(
    boundary_conditions=[[PeriodicBoundaryCondition,PeriodicBoundaryCondition],
                         [PeriodicBoundaryCondition,PeriodicBoundaryCondition],
                         [PeriodicBoundaryCondition,PeriodicBoundaryCondition]]
    )

right_electrode_poisson_solver = FastFourier2DSolver(
    boundary_conditions=[[PeriodicBoundaryCondition,PeriodicBoundaryCondition],
                         [PeriodicBoundaryCondition,PeriodicBoundaryCondition],
                         [PeriodicBoundaryCondition,PeriodicBoundaryCondition]]
    )

#----------------------------------------
# Electrode Calculators
#----------------------------------------
left_electrode_calculator = SlaterKosterCalculator(
    basis_set=basis_set,
    numerical_accuracy_parameters=left_electrode_numerical_accuracy_parameters,
    iteration_control_parameters=left_electrode_iteration_control_parameters,
    poisson_solver=left_electrode_poisson_solver,
    )

right_electrode_calculator = SlaterKosterCalculator(
    basis_set=basis_set,
    numerical_accuracy_parameters=right_electrode_numerical_accuracy_parameters,
    iteration_control_parameters=right_electrode_iteration_control_parameters,
    poisson_solver=right_electrode_poisson_solver,
    )

#----------------------------------------
# Device Calculator
#----------------------------------------
calculator = DeviceSlaterKosterCalculator(
    basis_set=basis_set,
    numerical_accuracy_parameters=device_numerical_accuracy_parameters,
    iteration_control_parameters=device_iteration_control_parameters,
    electrode_calculators=
        [left_electrode_calculator, right_electrode_calculator],
    )

device_configuration.setCalculator(calculator)
device_configuration.update()
nlsave('zero_bias.nc', device_configuration)

# -------------------------------------------------------------
# Transmission spectrum
# -------------------------------------------------------------
transmission_spectrum = TransmissionSpectrum(
    configuration=device_configuration,
    energies=numpy.linspace(-2,2,401)*eV,
    kpoints=MonkhorstPackGrid(1,1),
    energy_zero_parameter=AverageFermiLevel,
    infinitesimal=1e-06*eV,
    self_energy_calculator=KrylovSelfEnergy(),
    )
nlsave('zero_bias.nc', transmission_spectrum)
