# -------------------------------------------------------------
# Two-probe Configuration
# -------------------------------------------------------------

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

# Set up lattice
vector_a = [3.80199984562, 0.0, 0.0]*Angstrom
vector_b = [0.0, 3.80199984562, 0.0]*Angstrom
vector_c = [0.0, 0.0, 10.7536794916]*Angstrom
left_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
left_electrode_elements = [Nickel, Silicon, Silicon, Nickel, Silicon, Silicon, Nickel, Silicon,
                           Silicon, Nickel, Silicon, Silicon]

# Define coordinates
left_electrode_coordinates = [[  0.        ,   1.90099992,   0.67212548],
                              [  0.        ,   0.        ,   2.01633541],
                              [  1.90099992,   1.90099992,   2.01633541],
                              [  1.90099992,   0.        ,   3.36054535],
                              [  0.        ,   0.        ,   4.70475529],
                              [  1.90099992,   1.90099992,   4.70475529],
                              [  0.        ,   1.90099992,   6.04896522],
                              [  0.        ,   0.        ,   7.39317516],
                              [  1.90099992,   1.90099992,   7.39317516],
                              [  1.90099992,   0.        ,   8.7373851 ],
                              [  0.        ,   0.        ,  10.08159503],
                              [  1.90099992,   1.90099992,  10.08159503]]*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 = [3.80199984562, 0.0, 0.0]*Angstrom
vector_b = [0.0, 3.80199984562, 0.0]*Angstrom
vector_c = [0.0, 0.0, 10.8127487924]*Angstrom
right_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

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

# Define coordinates
right_electrode_coordinates = [[  0.        ,   1.90099992,   0.67613834],
                               [  1.90099992,   1.90099992,   2.02773194],
                               [  1.90099992,   0.        ,   3.37932554],
                               [  0.        ,   0.        ,   4.73091914],
                               [  0.        ,   1.90099992,   6.08251274],
                               [  1.90099992,   1.90099992,   7.43410634],
                               [  1.90099992,   0.        ,   8.78569994],
                               [  0.        ,   0.        ,  10.13729354]]*Angstrom

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

# Add tags
right_electrode.addTags('doping_central_region')

# Add external potential
external_potential = AtomicCompensationCharge([
    ('doping_central_region', 0.000195375596127)
    ])

right_electrode.setExternalPotential(external_potential)

# -------------------------------------------------------------
# Central Region
# -------------------------------------------------------------

# Set up lattice
vector_a = [3.80199984562, 0.0, 0.0]*Angstrom
vector_b = [0.0, 3.80199984562, 0.0]*Angstrom
vector_c = [0.0, 0.0, 118.895934257]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
central_region_elements = [Nickel, Silicon, Silicon, Nickel, Silicon, Silicon, Nickel, Silicon,
                           Silicon, Nickel, Silicon, Silicon, Nickel, Silicon, Silicon, Nickel,
                           Silicon, Silicon, Nickel, Silicon, Silicon, Nickel, Silicon,
                           Silicon, Nickel, Silicon, Silicon, Nickel, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon, Silicon, Silicon,
                           Silicon, Silicon, Silicon, Silicon, Silicon]

# Define coordinates
central_region_coordinates = [[   0.        ,    1.90099992,    0.67212548],
                              [   0.        ,    0.        ,    2.01633541],
                              [   1.90099992,    1.90099992,    2.01633541],
                              [   1.90099992,    0.        ,    3.36054535],
                              [   0.        ,    0.        ,    4.70475529],
                              [   1.90099992,    1.90099992,    4.70475529],
                              [   0.        ,    1.90099992,    6.04896522],
                              [   0.        ,    0.        ,    7.39317516],
                              [   1.90099992,    1.90099992,    7.39317516],
                              [   1.90099992,    0.        ,    8.7373851 ],
                              [   0.        ,    0.        ,   10.08159503],
                              [   1.90099992,    1.90099992,   10.08159503],
                              [   0.        ,    1.90099992,   11.42580497],
                              [   0.        ,    0.        ,   12.7700149 ],
                              [   1.90099992,    1.90099992,   12.7700149 ],
                              [   1.90099992,    0.        ,   14.11422484],
                              [   0.        ,    0.        ,   15.45843478],
                              [   1.90099992,    1.90099992,   15.45843478],
                              [   0.        ,    1.90099992,   16.80264471],
                              [   0.        ,    0.        ,   18.14685465],
                              [   1.90099992,    1.90099992,   18.14685465],
                              [   1.90099992,    0.        ,   19.49106459],
                              [   0.        ,    0.        ,   20.83527452],
                              [   1.90099992,    1.90099992,   20.83527452],
                              [   0.        ,    1.90099992,   22.17812886],
                              [   1.90099992,    1.90099992,   23.51780015],
                              [   0.        ,    0.        ,   23.53474465],
                              [   1.90099992,    0.        ,   24.90825101],
                              [   1.90099992,    1.90099992,   26.15075569],
                              [   0.        ,    0.        ,   26.35462319],
                              [   0.        ,    1.90099992,   27.81524587],
                              [   1.90099992,    1.90099992,   29.15730893],
                              [   1.90099992,    0.        ,   30.46227056],
                              [   0.        ,    0.        ,   31.76819061],
                              [   0.        ,    1.90099992,   33.07008226],
                              [   1.90099992,    1.90099992,   34.42167586],
                              [   1.90099992,    0.        ,   35.77326946],
                              [   0.        ,    0.        ,   37.12486306],
                              [   0.        ,    1.90099992,   38.47645666],
                              [   1.90099992,    1.90099992,   39.82805026],
                              [   1.90099992,    0.        ,   41.17964386],
                              [   0.        ,    0.        ,   42.53123746],
                              [   0.        ,    1.90099992,   43.88283105],
                              [   1.90099992,    1.90099992,   45.23442465],
                              [   1.90099992,    0.        ,   46.58601825],
                              [   0.        ,    0.        ,   47.93761185],
                              [   0.        ,    1.90099992,   49.28920545],
                              [   1.90099992,    1.90099992,   50.64079905],
                              [   1.90099992,    0.        ,   51.99239265],
                              [   0.        ,    0.        ,   53.34398625],
                              [   0.        ,    1.90099992,   54.69557984],
                              [   1.90099992,    1.90099992,   56.04717344],
                              [   1.90099992,    0.        ,   57.39876704],
                              [   0.        ,    0.        ,   58.75036064],
                              [   0.        ,    1.90099992,   60.10195424],
                              [   1.90099992,    1.90099992,   61.45354784],
                              [   1.90099992,    0.        ,   62.80514144],
                              [   0.        ,    0.        ,   64.15673504],
                              [   0.        ,    1.90099992,   65.50832863],
                              [   1.90099992,    1.90099992,   66.85992223],
                              [   1.90099992,    0.        ,   68.21151583],
                              [   0.        ,    0.        ,   69.56310943],
                              [   0.        ,    1.90099992,   70.91470303],
                              [   1.90099992,    1.90099992,   72.26629663],
                              [   1.90099992,    0.        ,   73.61789023],
                              [   0.        ,    0.        ,   74.96948383],
                              [   0.        ,    1.90099992,   76.32107742],
                              [   1.90099992,    1.90099992,   77.67267102],
                              [   1.90099992,    0.        ,   79.02426462],
                              [   0.        ,    0.        ,   80.37585822],
                              [   0.        ,    1.90099992,   81.72745182],
                              [   1.90099992,    1.90099992,   83.07904542],
                              [   1.90099992,    0.        ,   84.43063902],
                              [   0.        ,    0.        ,   85.78223262],
                              [   0.        ,    1.90099992,   87.13382622],
                              [   1.90099992,    1.90099992,   88.48541982],
                              [   1.90099992,    0.        ,   89.83701342],
                              [   0.        ,    0.        ,   91.18860702],
                              [   0.        ,    1.90099992,   92.54020062],
                              [   1.90099992,    1.90099992,   93.89179422],
                              [   1.90099992,    0.        ,   95.24338782],
                              [   0.        ,    0.        ,   96.59498142],
                              [   0.        ,    1.90099992,   97.94657501],
                              [   1.90099992,    1.90099992,   99.29816861],
                              [   1.90099992,    0.        ,  100.64976221],
                              [   0.        ,    0.        ,  102.00135581],
                              [   0.        ,    1.90099992,  103.35294941],
                              [   1.90099992,    1.90099992,  104.70454301],
                              [   1.90099992,    0.        ,  106.05613661],
                              [   0.        ,    0.        ,  107.40773021],
                              [   0.        ,    1.90099992,  108.7593238 ],
                              [   1.90099992,    1.90099992,  110.1109174 ],
                              [   1.90099992,    0.        ,  111.462511  ],
                              [   0.        ,    0.        ,  112.8141046 ],
                              [   0.        ,    1.90099992,  114.1656982 ],
                              [   1.90099992,    1.90099992,  115.5172918 ],
                              [   1.90099992,    0.        ,  116.8688854 ],
                              [   0.        ,    0.        ,  118.220479  ]]*Angstrom

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

# Add tags
central_region.addTags('doping_central_region', [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
                                                 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
                                                 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
                                                 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
                                                 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
                                                 96, 97])

# Add external potential
external_potential = AtomicCompensationCharge([
    ('doping_central_region', 0.000195375596127)
    ])

central_region.setExternalPotential(external_potential)

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

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Basis Set
#----------------------------------------
basis_set = [
    LDABasis.Silicon_SingleZetaPolarized,
    LDABasis.Nickel_SingleZetaPolarized,
    ]

#----------------------------------------
# Exchange-Correlation
#----------------------------------------
exchange_correlation = MGGA.TB09LDA(c=1.09368541059162)

#----------------------------------------
# Numerical Accuracy Settings
#----------------------------------------
left_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(5, 5, 200),
    )

right_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(5, 5, 200),
    )

device_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(5, 5, 200),
    )

#----------------------------------------
# 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 = LCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=left_electrode_numerical_accuracy_parameters,
    poisson_solver=left_electrode_poisson_solver,
    )

right_electrode_calculator = LCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=right_electrode_numerical_accuracy_parameters,
    poisson_solver=right_electrode_poisson_solver,
    )

#----------------------------------------
# Device Calculator
#----------------------------------------
calculator = DeviceLCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=device_numerical_accuracy_parameters,
    electrode_calculators=
        [left_electrode_calculator, right_electrode_calculator],
    )

device_configuration.setCalculator(calculator)
nlprint(device_configuration)
device_configuration.update()
nlsave('long_ndoped_e19_ivcurve.nc', device_configuration)

# -------------------------------------------------------------
# IV Curve
# -------------------------------------------------------------
biases = [0.000000, -0.050000, -0.100000, -0.150000, -0.200000, -0.250000, 
          -0.300000, 0.050000, 0.100000, 0.150000, 0.200000, 0.250000, 
          0.300000]*Volt

iv_curve = IVCurve(
    configuration=device_configuration,
    biases=biases,
    energies=numpy.linspace(-0.5,0.5,201)*eV,
    kpoints=MonkhorstPackGrid(13,13),
    self_energy_calculator=RecursionSelfEnergy(),
    energy_zero_parameter=AverageFermiLevel,
    infinitesimal=1e-06*eV,
    selfconsistent_configurations_filename="ivcurve_selfconsistent_configurations_ndoped_e19.nc",
    )
nlsave('long_ndoped_e19_ivcurve.nc', iv_curve)
nlprint(iv_curve)

