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

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

# Set up lattice
vector_a = [2.88902617589, 0.0, 0.0]*Angstrom
vector_b = [0.0, 14.4451308795, 0.0]*Angstrom
vector_c = [0.0, 0.0, 4.0857]*Angstrom
left_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

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

# Define coordinates
left_electrode_coordinates = [[  0.            ,   0.            ,   1.021425      ],
                              [  0.            ,   2.889026175894,   1.021425      ],
                              [  0.            ,   5.778052351788,   1.021425      ],
                              [  0.            ,   8.667078527682,   1.021425      ],
                              [  0.            ,  11.556104703576,   1.021425      ],
                              [  1.444513087947,   1.444513087947,   3.064275      ],
                              [  1.444513087947,   4.333539263841,   3.064275      ],
                              [  1.444513087947,   7.222565439735,   3.064275      ],
                              [  1.444513087947,  10.111591615629,   3.064275      ],
                              [  1.444513087947,  13.000617791522,   3.064275      ]]*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 = [2.88902617589, 0.0, 0.0]*Angstrom
vector_b = [0.0, 14.4451308795, 0.0]*Angstrom
vector_c = [0.0, 0.0, 7.06373620597]*Angstrom
right_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

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

# Define coordinates
right_electrode_coordinates = [[  0.            ,   1.605014542163,   1.177289367661],
                               [  1.444513087947,   4.012536355408,   1.177289367661],
                               [  0.            ,   6.420058168653,   1.177289367661],
                               [  1.444513087947,   8.827579981898,   1.177289367661],
                               [  0.            ,  11.235101795143,   1.177289367661],
                               [  1.444513087947,  13.642623608388,   1.177289367661],
                               [  1.444513087947,   0.802507271082,   3.531868102984],
                               [  0.            ,   3.210029084327,   3.531868102984],
                               [  1.444513087947,   5.617550897571,   3.531868102984],
                               [  0.            ,   8.025072710816,   3.531868102984],
                               [  1.444513087947,  10.432594524061,   3.531868102984],
                               [  0.            ,  12.840116337306,   3.531868102984],
                               [  0.            ,   0.            ,   5.886446838306],
                               [  1.444513087947,   2.407521813245,   5.886446838306],
                               [  0.            ,   4.81504362649 ,   5.886446838306],
                               [  1.444513087947,   7.222565439735,   5.886446838306],
                               [  0.            ,   9.63008725298 ,   5.886446838306],
                               [  1.444513087947,  12.037609066224,   5.886446838306]]*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 = [2.88902617589, 0.0, 0.0]*Angstrom
vector_b = [0.0, 14.4451308795, 0.0]*Angstrom
vector_c = [0.0, 0.0, 54.9678591915]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
central_region_elements = [Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
                           Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
                           Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
                           Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
                           Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
                           Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
                           Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
                           Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
                           Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold, Gold, Gold, Gold]

# Define coordinates
central_region_coordinates = [[  0.            ,   0.            ,   1.021425      ],
                              [  0.            ,   2.889026175894,   1.021425      ],
                              [  0.            ,   5.778052351788,   1.021425      ],
                              [  0.            ,   8.667078527682,   1.021425      ],
                              [  0.            ,  11.556104703576,   1.021425      ],
                              [  1.444513087947,   1.444513087947,   3.064275      ],
                              [  1.444513087947,   4.333539263841,   3.064275      ],
                              [  1.444513087947,   7.222565439735,   3.064275      ],
                              [  1.444513087947,  10.111591615629,   3.064275      ],
                              [  1.444513087947,  13.000617791522,   3.064275      ],
                              [  0.            ,   0.            ,   5.107125      ],
                              [  0.            ,   2.889026175894,   5.107125      ],
                              [  0.            ,   5.778052351788,   5.107125      ],
                              [  0.            ,   8.667078527682,   5.107125      ],
                              [  0.            ,  11.556104703576,   5.107125      ],
                              [  1.444513087947,   1.444513087947,   7.149975      ],
                              [  1.444513087947,   4.333539263841,   7.149975      ],
                              [  1.444513087947,   7.222565439735,   7.149975      ],
                              [  1.444513087947,  10.111591615629,   7.149975      ],
                              [  1.444513087947,  13.000617791522,   7.149975      ],
                              [  0.            ,   0.            ,   9.192825      ],
                              [  0.            ,   2.889026175894,   9.192825      ],
                              [  0.            ,   5.778052351788,   9.192825      ],
                              [  0.            ,   8.667078527682,   9.192825      ],
                              [  0.            ,  11.556104703576,   9.192825      ],
                              [  1.444513087947,   1.444513087947,  11.235675      ],
                              [  1.444513087947,   4.333539263841,  11.235675      ],
                              [  1.444513087947,   7.222565439735,  11.235675      ],
                              [  1.444513087947,  10.111591615629,  11.235675      ],
                              [  1.444513087947,  13.000617791522,  11.235675      ],
                              [  0.            ,   0.            ,  13.278525      ],
                              [  0.            ,   2.889026175894,  13.278525      ],
                              [  0.            ,   5.778052351788,  13.278525      ],
                              [  0.            ,   8.667078527682,  13.278525      ],
                              [  0.            ,  11.556104703576,  13.278525      ],
                              [  1.444513087947,   1.444513087947,  15.321375      ],
                              [  1.444513087947,   4.333539263841,  15.321375      ],
                              [  1.444513087947,   7.222565439735,  15.321375      ],
                              [  1.444513087947,  10.111591615629,  15.321375      ],
                              [  1.444513087947,  13.000617791522,  15.321375      ],
                              [  0.            ,   0.            ,  17.364225      ],
                              [  0.            ,   2.889026175894,  17.364225      ],
                              [  0.            ,   5.778052351788,  17.364225      ],
                              [  0.            ,   8.667078527682,  17.364225      ],
                              [  0.            ,  11.556104703576,  17.364225      ],
                              [  1.444513087947,   1.444513087947,  19.407075      ],
                              [  1.444513087947,   4.333539263841,  19.407075      ],
                              [  1.444513087947,   7.222565439735,  19.407075      ],
                              [  1.444513087947,  10.111591615629,  19.407075      ],
                              [  1.444513087947,  13.000617791522,  19.407075      ],
                              [  0.            ,   0.            ,  21.449925      ],
                              [  0.            ,   2.889026175894,  21.449925      ],
                              [  0.            ,   5.778052351788,  21.449925      ],
                              [  0.            ,   8.667078527682,  21.449925      ],
                              [  0.            ,  11.556104703576,  21.449925      ],
                              [  1.444513087947,   1.444513087947,  23.492775      ],
                              [  1.444513087947,   4.333539263841,  23.492775      ],
                              [  1.444513087947,   7.222565439735,  23.492775      ],
                              [  1.444513087947,  10.111591615629,  23.492775      ],
                              [  1.444513087947,  13.000617791522,  23.492775      ],
                              [  0.            ,   0.            ,  25.535625      ],
                              [  0.            ,   2.889026175894,  25.535625      ],
                              [  0.            ,   8.667078527682,  25.535625      ],
                              [  0.            ,  11.556104703576,  25.535625      ],
                              [  0.            ,   1.605014542163,  27.890203735323],
                              [  1.444513087947,   4.012536355408,  27.890203735323],
                              [  0.            ,   6.420058168653,  27.890203735323],
                              [  0.            ,  11.235101795143,  27.890203735323],
                              [  1.444513087947,  13.642623608388,  27.890203735323],
                              [  1.444513087947,   0.802507271082,  30.244782470646],
                              [  0.            ,   3.210029084327,  30.244782470646],
                              [  1.444513087947,   5.617550897571,  30.244782470646],
                              [  0.            ,   8.025072710816,  30.244782470646],
                              [  1.444513087947,  10.432594524061,  30.244782470646],
                              [  0.            ,  12.840116337306,  30.244782470646],
                              [  0.            ,   0.            ,  32.599361205968],
                              [  1.444513087947,   2.407521813245,  32.599361205968],
                              [  0.            ,   4.81504362649 ,  32.599361205968],
                              [  1.444513087947,   7.222565439735,  32.599361205968],
                              [  0.            ,   9.63008725298 ,  32.599361205968],
                              [  1.444513087947,  12.037609066224,  32.599361205968],
                              [  0.            ,   1.605014542163,  34.953939941291],
                              [  1.444513087947,   4.012536355408,  34.953939941291],
                              [  0.            ,   6.420058168653,  34.953939941291],
                              [  1.444513087947,   8.827579981898,  34.953939941291],
                              [  0.            ,  11.235101795143,  34.953939941291],
                              [  1.444513087947,  13.642623608388,  34.953939941291],
                              [  1.444513087947,   0.802507271082,  37.308518676613],
                              [  0.            ,   3.210029084327,  37.308518676613],
                              [  1.444513087947,   5.617550897571,  37.308518676613],
                              [  0.            ,   8.025072710816,  37.308518676613],
                              [  1.444513087947,  10.432594524061,  37.308518676613],
                              [  0.            ,  12.840116337306,  37.308518676613],
                              [  0.            ,   0.            ,  39.663097411936],
                              [  1.444513087947,   2.407521813245,  39.663097411936],
                              [  0.            ,   4.81504362649 ,  39.663097411936],
                              [  1.444513087947,   7.222565439735,  39.663097411936],
                              [  0.            ,   9.63008725298 ,  39.663097411936],
                              [  1.444513087947,  12.037609066224,  39.663097411936],
                              [  0.            ,   1.605014542163,  42.017676147259],
                              [  1.444513087947,   4.012536355408,  42.017676147259],
                              [  0.            ,   6.420058168653,  42.017676147259],
                              [  1.444513087947,   8.827579981898,  42.017676147259],
                              [  0.            ,  11.235101795143,  42.017676147259],
                              [  1.444513087947,  13.642623608388,  42.017676147259],
                              [  1.444513087947,   0.802507271082,  44.372254882581],
                              [  0.            ,   3.210029084327,  44.372254882581],
                              [  1.444513087947,   5.617550897571,  44.372254882581],
                              [  0.            ,   8.025072710816,  44.372254882581],
                              [  1.444513087947,  10.432594524061,  44.372254882581],
                              [  0.            ,  12.840116337306,  44.372254882581],
                              [  0.            ,   0.            ,  46.726833617904],
                              [  1.444513087947,   2.407521813245,  46.726833617904],
                              [  0.            ,   4.81504362649 ,  46.726833617904],
                              [  1.444513087947,   7.222565439735,  46.726833617904],
                              [  0.            ,   9.63008725298 ,  46.726833617904],
                              [  1.444513087947,  12.037609066224,  46.726833617904],
                              [  0.            ,   1.605014542163,  49.081412353226],
                              [  1.444513087947,   4.012536355408,  49.081412353226],
                              [  0.            ,   6.420058168653,  49.081412353226],
                              [  1.444513087947,   8.827579981898,  49.081412353226],
                              [  0.            ,  11.235101795143,  49.081412353226],
                              [  1.444513087947,  13.642623608388,  49.081412353226],
                              [  1.444513087947,   0.802507271082,  51.435991088549],
                              [  0.            ,   3.210029084327,  51.435991088549],
                              [  1.444513087947,   5.617550897571,  51.435991088549],
                              [  0.            ,   8.025072710816,  51.435991088549],
                              [  1.444513087947,  10.432594524061,  51.435991088549],
                              [  0.            ,  12.840116337306,  51.435991088549],
                              [  0.            ,   0.            ,  53.790569823872],
                              [  1.444513087947,   2.407521813245,  53.790569823872],
                              [  0.            ,   4.81504362649 ,  53.790569823872],
                              [  1.444513087947,   7.222565439735,  53.790569823872],
                              [  0.            ,   9.63008725298 ,  53.790569823872],
                              [  1.444513087947,  12.037609066224,  53.790569823872]]*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=[8.1714, 7.06373620597]*Angstrom,
    )

# Add tags
device_configuration.addTags('Left Interface',  [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
                                                 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
                                                 26, 27, 28, 29, 30, 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])
device_configuration.addTags('Right Interface', [ 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,  98,  99, 100, 101, 102, 103,
                                                 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
                                                 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
                                                 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
                                                 134])

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------

potentialSet = EAM_Zhou_2004()
calculator = TremoloXCalculator(parameters=potentialSet)
calculator.setVerletListsDelta(0.25*Angstrom)

device_configuration.setCalculator(calculator)

# -------------------------------------------------------------
# Optimize Device Configuration
# -------------------------------------------------------------
# Parameters for device configuration optimization.
optimize_geometry_parameters = OptimizeGeometryParameters(
     max_forces=0.05*eV/Angstrom,
     max_stress=0.1*GPa,
     max_steps=200,
     max_step_length=0.2*Angstrom,
     optimizer_method=LBFGS(),
)

optimize_device_configuration = OptimizeDeviceConfiguration(
    device_configuration=device_configuration,
    filename=u'Ag100-Au111-default.hdf5',
    object_id='optimizedeviceconfiguration',
    optimization_region_length=10.0*Angstrom,
    optimization_region_center=None,
    passivate_electrode_surfaces=(True, True),
    optimize_geometry_parameters=optimize_geometry_parameters,
    log_filename_prefix='optimizedeviceconfiguration_',
)
optimize_device_configuration.update()
nlprint(optimize_device_configuration)
