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

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

# Set up lattice
vector_a = [14.7001670461, 0.0, 0.0]*Angstrom
vector_b = [0.0, 14.7001670461, 0.0]*Angstrom
vector_c = [0.0, 0.0, 7.1043]*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,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Carbon, Carbon]

# Define coordinates
left_electrode_coordinates = [[ 7.350083523047,  5.            ,  0.355215      ],
                              [ 5.314851491073,  6.175041761524,  0.355215      ],
                              [ 9.385315555021,  6.175041761524,  0.355215      ],
                              [ 5.314851491073,  8.525125284571,  0.355215      ],
                              [ 9.385315555021,  8.525125284571,  0.355215      ],
                              [ 7.350083523047,  9.700167046094,  0.355215      ],
                              [ 6.175041761524,  5.314851491073,  1.065645      ],
                              [ 8.525125284571,  5.314851491073,  1.065645      ],
                              [ 5.            ,  7.350083523047,  1.065645      ],
                              [ 9.700167046094,  7.350083523047,  1.065645      ],
                              [ 6.175041761524,  9.385315555021,  1.065645      ],
                              [ 8.525125284571,  9.385315555021,  1.065645      ],
                              [ 6.175041761524,  5.314851491073,  2.486505      ],
                              [ 8.525125284571,  5.314851491073,  2.486505      ],
                              [ 5.            ,  7.350083523047,  2.486505      ],
                              [ 9.700167046094,  7.350083523047,  2.486505      ],
                              [ 6.175041761524,  9.385315555021,  2.486505      ],
                              [ 8.525125284571,  9.385315555021,  2.486505      ],
                              [ 7.350083523047,  5.            ,  3.196935      ],
                              [ 5.314851491073,  6.175041761524,  3.196935      ],
                              [ 9.385315555021,  6.175041761524,  3.196935      ],
                              [ 5.314851491073,  8.525125284571,  3.196935      ],
                              [ 9.385315555021,  8.525125284571,  3.196935      ],
                              [ 7.350083523047,  9.700167046094,  3.196935      ],
                              [ 7.350083523047,  5.            ,  4.617795      ],
                              [ 5.314851491073,  6.175041761524,  4.617795      ],
                              [ 9.385315555021,  6.175041761524,  4.617795      ],
                              [ 5.314851491073,  8.525125284571,  4.617795      ],
                              [ 9.385315555021,  8.525125284571,  4.617795      ],
                              [ 7.350083523047,  9.700167046094,  4.617795      ],
                              [ 6.175041761524,  5.314851491073,  5.328225      ],
                              [ 8.525125284571,  5.314851491073,  5.328225      ],
                              [ 5.            ,  7.350083523047,  5.328225      ],
                              [ 9.700167046094,  7.350083523047,  5.328225      ],
                              [ 6.175041761524,  9.385315555021,  5.328225      ],
                              [ 8.525125284571,  9.385315555021,  5.328225      ],
                              [ 6.175041761524,  5.314851491073,  6.749085      ],
                              [ 8.525125284571,  5.314851491073,  6.749085      ],
                              [ 5.            ,  7.350083523047,  6.749085      ],
                              [ 9.700167046094,  7.350083523047,  6.749085      ],
                              [ 6.175041761524,  9.385315555021,  6.749085      ],
                              [ 8.525125284571,  9.385315555021,  6.749085      ]]*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 = [14.7001670461, 0.0, 0.0]*Angstrom
vector_b = [0.0, 14.7001670461, 0.0]*Angstrom
vector_c = [0.0, 0.0, 7.1043]*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,
                            Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                            Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                            Carbon, Carbon]

# Define coordinates
right_electrode_coordinates = [[ 6.175041761524,  5.314851491073,  0.355215      ],
                               [ 8.525125284571,  5.314851491073,  0.355215      ],
                               [ 5.            ,  7.350083523047,  0.355215      ],
                               [ 9.700167046094,  7.350083523047,  0.355215      ],
                               [ 6.175041761524,  9.385315555021,  0.355215      ],
                               [ 8.525125284571,  9.385315555021,  0.355215      ],
                               [ 6.175041761524,  5.314851491073,  1.776075      ],
                               [ 8.525125284571,  5.314851491073,  1.776075      ],
                               [ 5.            ,  7.350083523047,  1.776075      ],
                               [ 9.700167046094,  7.350083523047,  1.776075      ],
                               [ 6.175041761524,  9.385315555021,  1.776075      ],
                               [ 8.525125284571,  9.385315555021,  1.776075      ],
                               [ 7.350083523047,  5.            ,  2.486505      ],
                               [ 5.314851491073,  6.175041761524,  2.486505      ],
                               [ 9.385315555021,  6.175041761524,  2.486505      ],
                               [ 5.314851491073,  8.525125284571,  2.486505      ],
                               [ 9.385315555021,  8.525125284571,  2.486505      ],
                               [ 7.350083523047,  9.700167046094,  2.486505      ],
                               [ 7.350083523047,  5.            ,  3.907365      ],
                               [ 5.314851491073,  6.175041761524,  3.907365      ],
                               [ 9.385315555021,  6.175041761524,  3.907365      ],
                               [ 5.314851491073,  8.525125284571,  3.907365      ],
                               [ 9.385315555021,  8.525125284571,  3.907365      ],
                               [ 7.350083523047,  9.700167046094,  3.907365      ],
                               [ 6.175041761524,  5.314851491073,  4.617795      ],
                               [ 8.525125284571,  5.314851491073,  4.617795      ],
                               [ 5.            ,  7.350083523047,  4.617795      ],
                               [ 9.700167046094,  7.350083523047,  4.617795      ],
                               [ 6.175041761524,  9.385315555021,  4.617795      ],
                               [ 8.525125284571,  9.385315555021,  4.617795      ],
                               [ 6.175041761524,  5.314851491073,  6.038655      ],
                               [ 8.525125284571,  5.314851491073,  6.038655      ],
                               [ 5.            ,  7.350083523047,  6.038655      ],
                               [ 9.700167046094,  7.350083523047,  6.038655      ],
                               [ 6.175041761524,  9.385315555021,  6.038655      ],
                               [ 8.525125284571,  9.385315555021,  6.038655      ],
                               [ 7.350083523047,  5.            ,  6.749085      ],
                               [ 5.314851491073,  6.175041761524,  6.749085      ],
                               [ 9.385315555021,  6.175041761524,  6.749085      ],
                               [ 5.314851491073,  8.525125284571,  6.749085      ],
                               [ 9.385315555021,  8.525125284571,  6.749085      ],
                               [ 7.350083523047,  9.700167046094,  6.749085      ]]*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 = [14.7001670461, 0.0, 0.0]*Angstrom
vector_b = [0.0, 14.7001670461, 0.0]*Angstrom
vector_c = [0.0, 0.0, 16.33989]*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]

# Define coordinates
central_region_coordinates = [[  7.350083523047,   5.            ,   0.355215      ],
                              [  5.314851491073,   6.175041761524,   0.355215      ],
                              [  9.385315555021,   6.175041761524,   0.355215      ],
                              [  5.314851491073,   8.525125284571,   0.355215      ],
                              [  9.385315555021,   8.525125284571,   0.355215      ],
                              [  7.350083523047,   9.700167046094,   0.355215      ],
                              [  6.175041761524,   5.314851491073,   1.065645      ],
                              [  8.525125284571,   5.314851491073,   1.065645      ],
                              [  5.            ,   7.350083523047,   1.065645      ],
                              [  9.700167046094,   7.350083523047,   1.065645      ],
                              [  6.175041761524,   9.385315555021,   1.065645      ],
                              [  8.525125284571,   9.385315555021,   1.065645      ],
                              [  6.175041761524,   5.314851491073,   2.486505      ],
                              [  8.525125284571,   5.314851491073,   2.486505      ],
                              [  5.            ,   7.350083523047,   2.486505      ],
                              [  9.700167046094,   7.350083523047,   2.486505      ],
                              [  6.175041761524,   9.385315555021,   2.486505      ],
                              [  8.525125284571,   9.385315555021,   2.486505      ],
                              [  7.350083523047,   5.            ,   3.196935      ],
                              [  5.314851491073,   6.175041761524,   3.196935      ],
                              [  9.385315555021,   6.175041761524,   3.196935      ],
                              [  5.314851491073,   8.525125284571,   3.196935      ],
                              [  9.385315555021,   8.525125284571,   3.196935      ],
                              [  7.350083523047,   9.700167046094,   3.196935      ],
                              [  7.350083523047,   5.            ,   4.617795      ],
                              [  5.314851491073,   6.175041761524,   4.617795      ],
                              [  9.385315555021,   6.175041761524,   4.617795      ],
                              [  5.314851491073,   8.525125284571,   4.617795      ],
                              [  9.385315555021,   8.525125284571,   4.617795      ],
                              [  7.350083523047,   9.700167046094,   4.617795      ],
                              [  6.175041761524,   5.314851491073,   5.328225      ],
                              [  8.525125284571,   5.314851491073,   5.328225      ],
                              [  5.            ,   7.350083523047,   5.328225      ],
                              [  9.700167046094,   7.350083523047,   5.328225      ],
                              [  6.175041761524,   9.385315555021,   5.328225      ],
                              [  8.525125284571,   9.385315555021,   5.328225      ],
                              [  6.175041761524,   5.314851491073,   6.749085      ],
                              [  8.525125284571,   5.314851491073,   6.749085      ],
                              [  5.            ,   7.350083523047,   6.749085      ],
                              [  9.700167046094,   7.350083523047,   6.749085      ],
                              [  6.175041761524,   9.385315555021,   6.749085      ],
                              [  8.525125284571,   9.385315555021,   6.749085      ],
                              [  7.350083523047,   5.            ,   7.459515      ],
                              [  5.314851491073,   6.175041761524,   7.459515      ],
                              [  9.385315555021,   6.175041761524,   7.459515      ],
                              [  5.314851491073,   8.525125284571,   7.459515      ],
                              [  9.385315555021,   8.525125284571,   7.459515      ],
                              [  7.350083523047,   9.700167046094,   7.459515      ],
                              [  7.350083523047,   5.            ,   8.880375      ],
                              [  5.314851491073,   6.175041761524,   8.880375      ],
                              [  9.385315555021,   6.175041761524,   8.880375      ],
                              [  5.314851491073,   8.525125284571,   8.880375      ],
                              [  9.385315555021,   8.525125284571,   8.880375      ],
                              [  7.350083523047,   9.700167046094,   8.880375      ],
                              [  6.175041761524,   5.314851491073,   9.590805      ],
                              [  8.525125284571,   5.314851491073,   9.590805      ],
                              [  5.            ,   7.350083523047,   9.590805      ],
                              [  9.700167046094,   7.350083523047,   9.590805      ],
                              [  6.175041761524,   9.385315555021,   9.590805      ],
                              [  8.525125284571,   9.385315555021,   9.590805      ],
                              [  6.175041761524,   5.314851491073,  11.011665      ],
                              [  8.525125284571,   5.314851491073,  11.011665      ],
                              [  5.            ,   7.350083523047,  11.011665      ],
                              [  9.700167046094,   7.350083523047,  11.011665      ],
                              [  6.175041761524,   9.385315555021,  11.011665      ],
                              [  8.525125284571,   9.385315555021,  11.011665      ],
                              [  7.350083523047,   5.            ,  11.722095      ],
                              [  5.314851491073,   6.175041761524,  11.722095      ],
                              [  9.385315555021,   6.175041761524,  11.722095      ],
                              [  5.314851491073,   8.525125284571,  11.722095      ],
                              [  9.385315555021,   8.525125284571,  11.722095      ],
                              [  7.350083523047,   9.700167046094,  11.722095      ],
                              [  7.350083523047,   5.            ,  13.142955      ],
                              [  5.314851491073,   6.175041761524,  13.142955      ],
                              [  9.385315555021,   6.175041761524,  13.142955      ],
                              [  5.314851491073,   8.525125284571,  13.142955      ],
                              [  9.385315555021,   8.525125284571,  13.142955      ],
                              [  7.350083523047,   9.700167046094,  13.142955      ],
                              [  6.175041761524,   5.314851491073,  13.853385      ],
                              [  8.525125284571,   5.314851491073,  13.853385      ],
                              [  5.            ,   7.350083523047,  13.853385      ],
                              [  9.700167046094,   7.350083523047,  13.853385      ],
                              [  6.175041761524,   9.385315555021,  13.853385      ],
                              [  8.525125284571,   9.385315555021,  13.853385      ],
                              [  6.175041761524,   5.314851491073,  15.274245      ],
                              [  8.525125284571,   5.314851491073,  15.274245      ],
                              [  5.            ,   7.350083523047,  15.274245      ],
                              [  9.700167046094,   7.350083523047,  15.274245      ],
                              [  6.175041761524,   9.385315555021,  15.274245      ],
                              [  8.525125284571,   9.385315555021,  15.274245      ],
                              [  7.350083523047,   5.            ,  15.984675      ],
                              [  5.314851491073,   6.175041761524,  15.984675      ],
                              [  9.385315555021,   6.175041761524,  15.984675      ],
                              [  5.314851491073,   8.525125284571,  15.984675      ],
                              [  9.385315555021,   8.525125284571,  15.984675      ],
                              [  7.350083523047,   9.700167046094,  15.984675      ]]*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.1043, 7.1043]*Angstrom,
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Basis Set
#----------------------------------------
basis_set = [
    GGABasis.Carbon_SingleZeta,
    GGABasis.Hydrogen_SingleZeta,
    ]

#----------------------------------------
# Numerical Accuracy Settings
#----------------------------------------
left_electrode_k_point_sampling = MonkhorstPackGrid(
    nc=11,
    )
left_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=left_electrode_k_point_sampling,
    density_mesh_cutoff=40.0*Hartree,
    )

right_electrode_k_point_sampling = MonkhorstPackGrid(
    nc=11,
    )
right_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=right_electrode_k_point_sampling,
    density_mesh_cutoff=40.0*Hartree,
    )

device_k_point_sampling = MonkhorstPackGrid(
    nc=11,
    )
device_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=device_k_point_sampling,
    density_mesh_cutoff=40.0*Hartree,
    )

#----------------------------------------
# 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()]]
    )

#----------------------------------------
# Contour Integral Settings
#----------------------------------------
equilibrium_contour = SemiCircleContour(
    integral_lower_bound=1.84481605655*Hartree,
    circle_points=30,
    )
contour_parameters = ContourParameters(
    equilibrium_contour=equilibrium_contour,
    )

#----------------------------------------
# Electrode Calculators
#----------------------------------------
left_electrode_calculator = LCAOCalculator(
    basis_set=basis_set,
    numerical_accuracy_parameters=left_electrode_numerical_accuracy_parameters,
    poisson_solver=left_electrode_poisson_solver,
    )

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

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

device_configuration.setCalculator(calculator)

nlsave('setup_cnt_device.py', device_configuration)
