# -*- coding: utf-8 -*-
# -------------------------------------------------------------
# Two-probe Configuration
# -------------------------------------------------------------

# -------------------------------------------------------------
# Left Electrode
# -------------------------------------------------------------

# Set up lattice
vector_a = [10.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 17.1043, 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 = [Hydrogen, Carbon, Carbon, Carbon, Carbon, Hydrogen, Carbon, Carbon,
                           Carbon, Carbon, Hydrogen, Carbon, Carbon, Carbon, Carbon, Hydrogen,
                           Carbon, Carbon, Carbon, Carbon, Hydrogen, Carbon, Carbon, Carbon,
                           Carbon, Hydrogen, Carbon, Carbon, Carbon, Carbon]

# Define coordinates
left_electrode_coordinates = [[  5.        ,   3.91000051,   0.61525043],
                              [  5.        ,   5.        ,   0.61525043],
                              [  5.        ,   7.84172   ,   0.61525043],
                              [  5.        ,   9.26258   ,   0.61525043],
                              [  5.        ,  12.1043    ,   0.61525043],
                              [  5.        ,  13.19429949,   0.61525043],
                              [  5.        ,   5.71043   ,   1.84575128],
                              [  5.        ,   7.13129   ,   1.84575128],
                              [  5.        ,   9.97301   ,   1.84575128],
                              [  5.        ,  11.39387   ,   1.84575128],
                              [  5.        ,   3.91000051,   3.07625214],
                              [  5.        ,   5.        ,   3.07625214],
                              [  5.        ,   7.84172   ,   3.07625214],
                              [  5.        ,   9.26258   ,   3.07625214],
                              [  5.        ,  12.1043    ,   3.07625214],
                              [  5.        ,  13.19429949,   3.07625214],
                              [  5.        ,   5.71043   ,   4.30675299],
                              [  5.        ,   7.13129   ,   4.30675299],
                              [  5.        ,   9.97301   ,   4.30675299],
                              [  5.        ,  11.39387   ,   4.30675299],
                              [  5.        ,   3.91000051,   5.53725385],
                              [  5.        ,   5.        ,   5.53725385],
                              [  5.        ,   7.84172   ,   5.53725385],
                              [  5.        ,   9.26258   ,   5.53725385],
                              [  5.        ,  12.1043    ,   5.53725385],
                              [  5.        ,  13.19429949,   5.53725385],
                              [  5.        ,   5.71043   ,   6.7677547 ],
                              [  5.        ,   7.13129   ,   6.7677547 ],
                              [  5.        ,   9.97301   ,   6.7677547 ],
                              [  5.        ,  11.39387   ,   6.7677547 ]]*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, 17.1043, 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 = [Hydrogen, Carbon, Carbon, Carbon, Carbon, Hydrogen, Carbon, Carbon,
                            Carbon, Carbon, Hydrogen, Carbon, Carbon, Carbon, Carbon, Hydrogen,
                            Carbon, Carbon, Carbon, Carbon, Hydrogen, Carbon, Carbon, Carbon,
                            Carbon, Hydrogen, Carbon, Carbon, Carbon, Carbon]

# Define coordinates
right_electrode_coordinates = [[  5.        ,   3.91000051,   0.61525043],
                               [  5.        ,   5.        ,   0.61525043],
                               [  5.        ,   7.84172   ,   0.61525043],
                               [  5.        ,   9.26258   ,   0.61525043],
                               [  5.        ,  12.1043    ,   0.61525043],
                               [  5.        ,  13.19429949,   0.61525043],
                               [  5.        ,   5.71043   ,   1.84575128],
                               [  5.        ,   7.13129   ,   1.84575128],
                               [  5.        ,   9.97301   ,   1.84575128],
                               [  5.        ,  11.39387   ,   1.84575128],
                               [  5.        ,   3.91000051,   3.07625214],
                               [  5.        ,   5.        ,   3.07625214],
                               [  5.        ,   7.84172   ,   3.07625214],
                               [  5.        ,   9.26258   ,   3.07625214],
                               [  5.        ,  12.1043    ,   3.07625214],
                               [  5.        ,  13.19429949,   3.07625214],
                               [  5.        ,   5.71043   ,   4.30675299],
                               [  5.        ,   7.13129   ,   4.30675299],
                               [  5.        ,   9.97301   ,   4.30675299],
                               [  5.        ,  11.39387   ,   4.30675299],
                               [  5.        ,   3.91000051,   5.53725385],
                               [  5.        ,   5.        ,   5.53725385],
                               [  5.        ,   7.84172   ,   5.53725385],
                               [  5.        ,   9.26258   ,   5.53725385],
                               [  5.        ,  12.1043    ,   5.53725385],
                               [  5.        ,  13.19429949,   5.53725385],
                               [  5.        ,   5.71043   ,   6.7677547 ],
                               [  5.        ,   7.13129   ,   6.7677547 ],
                               [  5.        ,   9.97301   ,   6.7677547 ],
                               [  5.        ,  11.39387   ,   6.7677547 ]]*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, 17.1043, 0.0]*Angstrom
vector_c = [0.0, 0.0, 29.5320205253]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)

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

# Define coordinates
central_region_coordinates = [[  5.        ,   3.91000051,   0.61525043],
                              [  5.        ,   5.        ,   0.61525043],
                              [  5.        ,   7.84172   ,   0.61525043],
                              [  5.        ,   9.26258   ,   0.61525043],
                              [  5.        ,  12.1043    ,   0.61525043],
                              [  5.        ,  13.19429949,   0.61525043],
                              [  5.        ,   5.71043   ,   1.84575128],
                              [  5.        ,   7.13129   ,   1.84575128],
                              [  5.        ,   9.97301   ,   1.84575128],
                              [  5.        ,  11.39387   ,   1.84575128],
                              [  5.        ,   3.91000051,   3.07625214],
                              [  5.        ,   5.        ,   3.07625214],
                              [  5.        ,   7.84172   ,   3.07625214],
                              [  5.        ,   9.26258   ,   3.07625214],
                              [  5.        ,  12.1043    ,   3.07625214],
                              [  5.        ,  13.19429949,   3.07625214],
                              [  5.        ,   5.71043   ,   4.30675299],
                              [  5.        ,   7.13129   ,   4.30675299],
                              [  5.        ,   9.97301   ,   4.30675299],
                              [  5.        ,  11.39387   ,   4.30675299],
                              [  5.        ,   3.91000051,   5.53725385],
                              [  5.        ,   5.        ,   5.53725385],
                              [  5.        ,   7.84172   ,   5.53725385],
                              [  5.        ,   9.26258   ,   5.53725385],
                              [  5.        ,  12.1043    ,   5.53725385],
                              [  5.        ,  13.19429949,   5.53725385],
                              [  5.        ,   5.71043   ,   6.7677547 ],
                              [  5.        ,   7.13129   ,   6.7677547 ],
                              [  5.        ,   9.97301   ,   6.7677547 ],
                              [  5.        ,  11.39387   ,   6.7677547 ],
                              [  5.        ,   3.93873624,   7.9900128 ],
                              [  5.        ,   5.02983086,   8.0006382 ],
                              [  5.        ,   7.83307725,   7.98417408],
                              [  5.        ,   9.24198158,   7.94137127],
                              [  5.        ,  12.11763076,   7.93386665],
                              [  5.        ,  13.2077171 ,   7.9291557 ],
                              [  5.        ,   5.69624251,   9.23480042],
                              [  5.        ,   7.11343444,   9.20234198],
                              [  5.        ,   9.98854354,   9.10862823],
                              [  5.        ,  11.41351558,   9.11677813],
                              [  5.        ,   3.99457392,  10.54646416],
                              [  5.        ,   5.08525218,  10.49866335],
                              [  5.        ,   7.85341583,  10.40268127],
                              [  5.        ,   9.25173286,  10.28273433],
                              [  5.        ,  12.14711386,  10.28692506],
                              [  5.        ,  13.23525704,  10.26768464],
                              [  5.        ,   5.80432767,  11.70853725],
                              [  5.        ,   7.22789244,  11.68042132],
                              [  5.        ,  10.00686704,  11.41409073],
                              [  5.        ,  11.43919409,  11.44876684],
                              [  5.        ,   4.10135285,  13.01248231],
                              [  5.        ,   5.1911716 ,  12.96030342],
                              [  5.        ,   8.01845569,  12.88858377],
                              [  5.        ,   9.42616869,  12.71982192],
                              [  5.        ,  11.81576577,  12.78126574],
                              [  5.        ,  12.82202432,  13.19251511],
                              [  5.        ,  10.61645882,  13.50849837],
                              [  5.        ,   5.91250774,  14.16170138],
                              [  5.        ,   7.35153719,  14.16542691],
                              [  5.        ,  10.61534033,  14.83542496],
                              [  5.        ,   4.10150001,  15.30937876],
                              [  5.        ,   5.19106012,  15.36203785],
                              [  5.        ,   8.01780494,  15.44400533],
                              [  5.        ,   9.42449408,  15.62193714],
                              [  5.        ,  11.81316377,  15.56519189],
                              [  5.        ,  12.81666936,  15.14697787],
                              [  5.        ,   5.80282331,  16.61379531],
                              [  5.        ,   7.22545814,  16.64998715],
                              [  5.        ,  10.00205002,  16.92973559],
                              [  5.        ,  11.43491855,  16.89754786],
                              [  5.        ,   3.98896429,  17.76618413],
                              [  5.        ,   5.07933548,  17.81851703],
                              [  5.        ,   7.84739469,  17.93057531],
                              [  5.        ,   9.24476366,  18.06047001],
                              [  5.        ,  12.13974473,  18.06181835],
                              [  5.        ,  13.22803196,  18.08278849],
                              [  5.        ,   5.68671339,  19.08261466],
                              [  5.        ,   7.10413659,  19.12828784],
                              [  5.        ,   9.9805564 ,  19.23621365],
                              [  5.        ,  11.40378261,  19.23105071],
                              [  5.        ,   3.91323329,  20.30430217],
                              [  5.        ,   5.00460547,  20.3057868 ],
                              [  5.        ,   7.82221797,  20.34986905],
                              [  5.        ,   9.24029594,  20.40905578],
                              [  5.        ,  12.10546319,  20.41439833],
                              [  5.        ,  13.19499461,  20.41701068],
                              [  5.        ,   5.67579273,  21.53870293],
                              [  5.        ,   7.09855712,  21.56040289],
                              [  5.        ,   9.98453125,  21.58482474],
                              [  5.        ,  11.3936403 ,  21.58978815],
                              [  5.        ,   3.91000051,  22.76426582],
                              [  5.        ,   5.        ,  22.76426582],
                              [  5.        ,   7.84172   ,  22.76426582],
                              [  5.        ,   9.26258   ,  22.76426582],
                              [  5.        ,  12.1043    ,  22.76426582],
                              [  5.        ,  13.19429949,  22.76426582],
                              [  5.        ,   5.71043   ,  23.99476668],
                              [  5.        ,   7.13129   ,  23.99476668],
                              [  5.        ,   9.97301   ,  23.99476668],
                              [  5.        ,  11.39387   ,  23.99476668],
                              [  5.        ,   3.91000051,  25.22526753],
                              [  5.        ,   5.        ,  25.22526753],
                              [  5.        ,   7.84172   ,  25.22526753],
                              [  5.        ,   9.26258   ,  25.22526753],
                              [  5.        ,  12.1043    ,  25.22526753],
                              [  5.        ,  13.19429949,  25.22526753],
                              [  5.        ,   5.71043   ,  26.45576839],
                              [  5.        ,   7.13129   ,  26.45576839],
                              [  5.        ,   9.97301   ,  26.45576839],
                              [  5.        ,  11.39387   ,  26.45576839],
                              [  5.        ,   3.91000051,  27.68626924],
                              [  5.        ,   5.        ,  27.68626924],
                              [  5.        ,   7.84172   ,  27.68626924],
                              [  5.        ,   9.26258   ,  27.68626924],
                              [  5.        ,  12.1043    ,  27.68626924],
                              [  5.        ,  13.19429949,  27.68626924],
                              [  5.        ,   5.71043   ,  28.9167701 ],
                              [  5.        ,   7.13129   ,  28.9167701 ],
                              [  5.        ,   9.97301   ,  28.9167701 ],
                              [  5.        ,  11.39387   ,  28.9167701 ]]*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],
    equivalent_electrode_lengths=[7.38300513133, 7.38300513133]*Angstrom,
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Hamiltonian Parametrization
#----------------------------------------
basis_set = [
    HoffmannHuckelParameters.Hydrogen_Basis,
    CerdaHuckelParameters.Carbon_graphite_Basis,
    ]

hamiltonian_parametrization = HuckelHamiltonianParametrization(
    basis_set=basis_set)

#----------------------------------------
# Numerical Accuracy Settings
#----------------------------------------
left_electrode_k_point_sampling = MonkhorstPackGrid(
    nc=128,
    k_point_shift=[0.0, 0.0, 0.0],
    )
left_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=left_electrode_k_point_sampling,
    density_mesh_cutoff=20.0*Hartree,
    )

right_electrode_k_point_sampling = MonkhorstPackGrid(
    nc=128,
    k_point_shift=[0.0, 0.0, 0.0],
    )
right_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=right_electrode_k_point_sampling,
    density_mesh_cutoff=20.0*Hartree,
    )

device_k_point_sampling = MonkhorstPackGrid(
    nc=128,
    k_point_shift=[0.0, 0.0, 0.0],
    )
device_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=device_k_point_sampling,
    density_mesh_cutoff=20.0*Hartree,
    )

#----------------------------------------
# Iteration Control Settings
#----------------------------------------
left_electrode_iteration_control_parameters = IterationControlParameters(
    tolerance=4e-05,
    )

right_electrode_iteration_control_parameters = IterationControlParameters(
    tolerance=4e-05,
    )

device_iteration_control_parameters = IterationControlParameters(
    tolerance=4e-05,
    )

#----------------------------------------
# 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 = SemiEmpiricalCalculator(
    hamiltonian_parametrization=hamiltonian_parametrization,
    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 = SemiEmpiricalCalculator(
    hamiltonian_parametrization=hamiltonian_parametrization,
    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 = DeviceSemiEmpiricalCalculator(
    hamiltonian_parametrization=hamiltonian_parametrization,
    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)
nlprint(device_configuration)
device_configuration.update()
nlsave('nanoribbon.hdf5', device_configuration)

# -------------------------------------------------------------
# IV Characteristics
# -------------------------------------------------------------
# Kpoint sampling
kpoint_grid = MonkhorstPackGrid()

# Gate-source voltages
gate_source_voltages = numpy.linspace(0, 0, 1)*Volt

# Drain-source voltages
drain_source_voltages = numpy.linspace(0, 1, 11)*Volt

# File name.
filename = u'nanoribbon.hdf5'

iv_characteristics = IVCharacteristics(
    configuration=device_configuration,
    filename=filename,
    object_id='ivcharacteristics',
    gate_regions=[],
    gate_source_voltages=gate_source_voltages,
    drain_source_voltages=drain_source_voltages,
    energies=None,
    kpoints=kpoint_grid,
    self_energy_calculator=RecursionSelfEnergy(),
    energy_zero_parameter=AverageFermiLevel,
    infinitesimal=1e-06*eV,
    log_filename_prefix='ivcharacteristics_',
    number_of_processes_per_task=None,
)
iv_characteristics.update()

# -------------------------------------------------------------
# TransmissionEigenstate analysis for quantum numbers [0,1,2]
# -------------------------------------------------------------
for i in [0,1,2]:
    iv_characteristics.addAnalysis(
        0.0 * Volt,
        0.0 * Volt,
        TransmissionEigenstate,
        {'quantum_number': i}
        )

# Update IV characteristics again.
iv_characteristics.update()