# -------------------------------------------------------------
# Nudged Elastic Band Configuration
# -------------------------------------------------------------

# Setup the configuration list
configuration_list = []

# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [11.4894163263, 6.878080409e-07, -5.86872437369e-08]*Angstrom
vector_b = [2.87235421464, 2.87142020372, 4.72476889627e-07]*Angstrom
vector_c = [-2.8867564457e-08, 9.74556142711e-07, 5.74568489455]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Cadmium, Cadmium, Cadmium, Cadmium, Selenium, Selenium, Selenium,
            Selenium]

# Define coordinates
fractional_coordinates = [[ 0.125008063924,  0.49996633744 ,  0.249999773655],
                          [ 0.625009594535,  0.499963292276,  0.249999763731],
                          [ 0.374991699745,  0.50003405177 ,  0.749995473668],
                          [ 0.87499121277 ,  0.50003473766 ,  0.749995659537],
                          [ 0.375002038846,  0.499991844314,  0.250003463042],
                          [ 0.875002415953,  0.499990827322,  0.250002564712],
                          [ 0.125000202945,  0.50000370022 ,  0.750009316336],
                          [ 0.624995940539,  0.500011964325,  0.750008396313]]

# Set up configuration
configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# Append to the list of configurations
configuration_list.append(configuration)

# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [11.0987285699, 5.89549749342e-07, -5.03033517745e-08]*Angstrom
vector_b = [2.77468222923, 3.00276790684, 4.04980191109e-07]*Angstrom
vector_c = [5.20820332257e-09, 8.0338330661e-07, 5.9190210633]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Cadmium, Cadmium, Cadmium, Cadmium, Selenium, Selenium, Selenium,
            Selenium]

# Define coordinates
fractional_coordinates = [[ 0.130959330474,  0.476161538826,  0.241632602883],
                          [ 0.630960616185,  0.476158963462,  0.241630281176],
                          [ 0.36904050333 ,  0.523838676757,  0.74162737097 ],
                          [ 0.869040119214,  0.523839236116,  0.741627178371],
                          [ 0.36904953618 ,  0.523802323991,  0.258372353278],
                          [ 0.869049576758,  0.523801741042,  0.258371199736],
                          [ 0.130952543695,  0.476193620326,  0.758377501739],
                          [ 0.63094894342 ,  0.476200654806,  0.758375922844]]

# Set up configuration
configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# Append to the list of configurations
configuration_list.append(configuration)

# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [10.7080408135, 4.91291457785e-07, -4.19194598121e-08]*Angstrom
vector_b = [2.67701024381, 3.13411560997, 3.37483492591e-07]*Angstrom
vector_c = [3.92839711021e-08, 6.32210470508e-07, 6.09235723205]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Cadmium, Cadmium, Cadmium, Cadmium, Selenium, Selenium, Selenium,
            Selenium]

# Define coordinates
fractional_coordinates = [[ 0.136910597024,  0.452356740213,  0.233265432111],
                          [ 0.636911637836,  0.452354634649,  0.233260798621],
                          [ 0.363089306914,  0.547643301743,  0.733259268271],
                          [ 0.863089025657,  0.547643734573,  0.733258697204],
                          [ 0.363097033515,  0.547612803668,  0.266741243514],
                          [ 0.863096737564,  0.547612654761,  0.26673983476 ],
                          [ 0.136904884446,  0.452383540432,  0.766745687142],
                          [ 0.636901946301,  0.452389345288,  0.766743449374]]

# Set up configuration
configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# Append to the list of configurations
configuration_list.append(configuration)

# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [10.3173530572, 3.93033166228e-07, -3.35355678497e-08]*Angstrom
vector_b = [2.57933825839, 3.2654633131, 2.69986794073e-07]*Angstrom
vector_c = [7.33597388817e-08, 4.61037634406e-07, 6.2656934008]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Cadmium, Cadmium, Cadmium, Cadmium, Selenium, Selenium, Selenium,
            Selenium]

# Define coordinates
fractional_coordinates = [[ 0.142861863574,  0.428551941599,  0.224898261338],
                          [ 0.642862659486,  0.428550305836,  0.224891316065],
                          [ 0.357138110499,  0.571447926729,  0.724891165573],
                          [ 0.8571379321  ,  0.571448233029,  0.724890216038],
                          [ 0.35714453085 ,  0.571423283345,  0.27511013375 ],
                          [ 0.857143898369,  0.571423568481,  0.275108469783],
                          [ 0.142857225196,  0.428573460539,  0.775113872545],
                          [ 0.642854949182,  0.42857803577 ,  0.775110975904]]

# Set up configuration
configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# Append to the list of configurations
configuration_list.append(configuration)

# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [9.92666530078, 2.94774874671e-07, -2.51516758872e-08]*Angstrom
vector_b = [2.48166627298, 3.39681101622, 2.02490095555e-07]*Angstrom
vector_c = [1.07435506661e-07, 2.89864798305e-07, 6.43902956955]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Cadmium, Cadmium, Cadmium, Cadmium, Selenium, Selenium, Selenium,
            Selenium]

# Define coordinates
fractional_coordinates = [[ 0.148813130124,  0.404747142985,  0.216531090566],
                          [ 0.648813681137,  0.404745977023,  0.21652183351 ],
                          [ 0.351186914083,  0.595252551716,  0.716523062874],
                          [ 0.851186838544,  0.595252731485,  0.716521734871],
                          [ 0.351192028185,  0.595233763022,  0.283479023986],
                          [ 0.851191059174,  0.5952344822  ,  0.283477104807],
                          [ 0.148809565946,  0.404763380645,  0.783482057947],
                          [ 0.648807952064,  0.404766726251,  0.783478502434]]

# Set up configuration
configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# Append to the list of configurations
configuration_list.append(configuration)

# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [9.5359775444, 1.96516583114e-07, -1.67677839248e-08]*Angstrom
vector_b = [2.38399428756, 3.52815871935, 1.34993397036e-07]*Angstrom
vector_c = [1.41511274441e-07, 1.18691962203e-07, 6.6123657383]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Cadmium, Cadmium, Cadmium, Cadmium, Selenium, Selenium, Selenium,
            Selenium]

# Define coordinates
fractional_coordinates = [[ 0.154764396674,  0.380942344371,  0.208163919794],
                          [ 0.654764702787,  0.38094164821 ,  0.208152350955],
                          [ 0.345235717668,  0.619057176702,  0.708154960176],
                          [ 0.845235744987,  0.619057229941,  0.708153253704],
                          [ 0.345239525519,  0.619044242698,  0.291847914222],
                          [ 0.84523821998 ,  0.619045395919,  0.29184573983 ],
                          [ 0.154761906696,  0.380953300751,  0.79185024335 ],
                          [ 0.654760954945,  0.380955416733,  0.791846028964]]

# Set up configuration
configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# Append to the list of configurations
configuration_list.append(configuration)

# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [9.14528978803, 9.82582915571e-08, -8.38389196241e-09]*Angstrom
vector_b = [2.28632230215, 3.65950642248, 6.74966985182e-08]*Angstrom
vector_c = [1.7558704222e-07, -5.24808738984e-08, 6.78570190705]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Cadmium, Cadmium, Cadmium, Cadmium, Selenium, Selenium, Selenium,
            Selenium]

# Define coordinates
fractional_coordinates = [[ 0.160715663224,  0.357137545757,  0.199796749021],
                          [ 0.660715724438,  0.357137319396,  0.199782868399],
                          [ 0.339284521252,  0.642861801689,  0.699786857478],
                          [ 0.839284651431,  0.642861728398,  0.699784772538],
                          [ 0.339287022854,  0.642854722375,  0.300216804457],
                          [ 0.839285380785,  0.642856309639,  0.300214374854],
                          [ 0.160714247447,  0.357143220857,  0.800218428753],
                          [ 0.660713957826,  0.357144107215,  0.800213555495]]

# Set up configuration
configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# Append to the list of configurations
configuration_list.append(configuration)

# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [8.75460203165, 0.0, 0.0]*Angstrom
vector_b = [2.18865031673, 3.7908541256, 0.0]*Angstrom
vector_c = [2.0966281e-07, -2.2365371e-07, 6.9590380758]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Cadmium, Cadmium, Cadmium, Cadmium, Selenium, Selenium, Selenium,
            Selenium]

# Define coordinates
fractional_coordinates = [[ 0.166666929775,  0.333332747144,  0.191429578249],
                          [ 0.666666746088,  0.333332990583,  0.191413385844],
                          [ 0.333333324837,  0.666666426675,  0.691418754779],
                          [ 0.833333557874,  0.666666226854,  0.691416291371],
                          [ 0.333334520189,  0.666665202052,  0.308585694693],
                          [ 0.833332541591,  0.666667223358,  0.308583009878],
                          [ 0.166666588197,  0.333333140964,  0.808586614156],
                          [ 0.666666960707,  0.333332797696,  0.808581082025]]

# Set up configuration
configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# Append to the list of configurations
configuration_list.append(configuration)

# Construct the Nudged Elastic Band object
neb_configuration = NudgedElasticBand(
    configuration_list,
    generate_images=False)

# Unreference the temporary configuration variable
del configuration

# Define the Rabani potential.
potentialSet = TremoloXPotentialSet(name = 'StillingerWeber_CdTeZnSeHgS_2013')
potentialSet.addParticleType(ParticleType(
    symbol='Cd',
    mass=112.411*atomic_mass_unit,
    charge=1.18*elementary_charge,
    sigma=1.98*Ang,
    epsilon=(16.8*Kelvin*boltzmann_constant).convertTo(eV),
    atomicNumber=48))
potentialSet.addParticleType(ParticleType(
    symbol='Se',
    mass=78.96*atomic_mass_unit,
    charge=-1.18*elementary_charge,
    sigma=5.24*Ang,
    epsilon=(14.9*Kelvin*boltzmann_constant).convertTo(eV),
    atomicNumber=34))

potential = LennardJonesSplinePotential('Cd', 'Cd', r_cut=10.0*Ang, r_i=8.0*Ang)
potentialSet.addPotential(potential)
potential = LennardJonesSplinePotential('Cd', 'Se', r_cut=10.0*Ang, r_i=8.0*Ang)
potentialSet.addPotential(potential)
potential = LennardJonesSplinePotential('Se', 'Se', r_cut=10.0*Ang, r_i=8.0*Ang)
potentialSet.addPotential(potential)
potentialSet.setCoulombSolver(CoulombEwald(alpha=0.1*Angstrom**-1, epsilon=1.0e-10))
calculator = TremoloXCalculator(parameters=potentialSet)
calculator.setInternalOrdering("default")
calculator.setVerletListsDelta(0.0*Angstrom)

neb_configuration.setCalculator(calculator)
neb_configuration.update()
nlsave('cdse_neb_concerted.hdf5', neb_configuration)

# Perform a VC-NEB optimization
neb_configuration = OptimizeNudgedElasticBand(
    neb_configuration,
    max_forces=0.01*eV/Ang,
    max_stress=0.01*GPa,
    max_steps=500,
    climbing_image=True,
    optimize_cell=True,
)

nlsave('cdse_neb_concerted.hdf5', neb_configuration)
