# -*- coding: utf-8 -*-
# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------

# Set up lattice
vector_a = [16.646425, 0.0, 0.0]*Angstrom
vector_b = [-8.32321249999, 14.4162269322, 0.0]*Angstrom
vector_c = [0.0, 0.0, 21.326457581]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum, Platinum, Platinum, Platinum, Platinum, Platinum,
            Platinum]

# Define coordinates
fractional_coordinates = [[ 0.055555555556,  0.111111111111,  0.10621977455 ],
                          [ 0.222222222222,  0.111111111111,  0.10621977455 ],
                          [ 0.388888888889,  0.111111111111,  0.10621977455 ],
                          [ 0.555555555556,  0.111111111111,  0.10621977455 ],
                          [ 0.722222222222,  0.111111111111,  0.10621977455 ],
                          [ 0.888888888889,  0.111111111111,  0.10621977455 ],
                          [ 0.055555555556,  0.277777777778,  0.10621977455 ],
                          [ 0.222222222222,  0.277777777778,  0.10621977455 ],
                          [ 0.388888888889,  0.277777777778,  0.10621977455 ],
                          [ 0.555555555556,  0.277777777778,  0.10621977455 ],
                          [ 0.722222222222,  0.277777777778,  0.10621977455 ],
                          [ 0.888888888889,  0.277777777778,  0.10621977455 ],
                          [ 0.055555555556,  0.444444444444,  0.10621977455 ],
                          [ 0.222222222222,  0.444444444444,  0.10621977455 ],
                          [ 0.388888888889,  0.444444444444,  0.10621977455 ],
                          [ 0.555555555556,  0.444444444444,  0.10621977455 ],
                          [ 0.722222222222,  0.444444444444,  0.10621977455 ],
                          [ 0.888888888889,  0.444444444444,  0.10621977455 ],
                          [ 0.055555555556,  0.611111111111,  0.10621977455 ],
                          [ 0.222222222222,  0.611111111111,  0.10621977455 ],
                          [ 0.388888888889,  0.611111111111,  0.10621977455 ],
                          [ 0.555555555556,  0.611111111111,  0.10621977455 ],
                          [ 0.722222222222,  0.611111111111,  0.10621977455 ],
                          [ 0.888888888889,  0.611111111111,  0.10621977455 ],
                          [ 0.055555555556,  0.777777777778,  0.10621977455 ],
                          [ 0.222222222222,  0.777777777778,  0.10621977455 ],
                          [ 0.388888888889,  0.777777777778,  0.10621977455 ],
                          [ 0.555555555556,  0.777777777778,  0.10621977455 ],
                          [ 0.722222222222,  0.777777777778,  0.10621977455 ],
                          [ 0.888888888889,  0.777777777778,  0.10621977455 ],
                          [ 0.055555555556,  0.944444444444,  0.10621977455 ],
                          [ 0.222222222222,  0.944444444444,  0.10621977455 ],
                          [ 0.388888888889,  0.944444444444,  0.10621977455 ],
                          [ 0.555555555556,  0.944444444444,  0.10621977455 ],
                          [ 0.722222222222,  0.944444444444,  0.10621977455 ],
                          [ 0.888888888889,  0.944444444444,  0.10621977455 ],
                          [ 0.000226807104,  0.000057875462,  0.212957342554],
                          [ 0.1665498202  , -0.000072225052,  0.213294798732],
                          [ 0.333173398868,  0.000159934466,  0.212690477142],
                          [ 0.499697158812, -0.000492389747,  0.213281802769],
                          [ 0.666917204855,  0.000202526408,  0.2124198855  ],
                          [ 0.833873824125,  0.000198213493,  0.212123369397],
                          [ 0.000125219109,  0.167032161884,  0.213034121588],
                          [ 0.166689106049,  0.166644227284,  0.213422578363],
                          [ 0.333405558386,  0.166783513134,  0.213294798732],
                          [ 0.499766434426,  0.166486427943,  0.212979063596],
                          [ 0.666521716357,  0.166403494494,  0.212795707393],
                          [ 0.833742551658,  0.167112984582,  0.212521599186],
                          [-0.000154326507,  0.33348765984 ,  0.213320067478],
                          [ 0.166301171449,  0.333208114225,  0.213034121588],
                          [ 0.333275457871,  0.333106526229,  0.212957342554],
                          [ 0.500169773591,  0.333073983426,  0.213071445019],
                          [ 0.666737670072,  0.333200197506,  0.212854170252],
                          [ 0.8334762873  ,  0.333624688356,  0.212943876091],
                          [-0.000291355022,  0.499857046033,  0.212943876091],
                          [ 0.166220348751,  0.499590781676,  0.212521599186],
                          [ 0.33313511984 ,  0.499459509208,  0.212123369397],
                          [ 0.500185914573,  0.499723106796,  0.212348843097],
                          [ 0.666843950707,  0.499742296271,  0.212937651166],
                          [ 0.833263923839,  0.500069409495,  0.212832110441],
                          [ 0.000133135828,  0.666595663261,  0.212854170251],
                          [ 0.16692983884 ,  0.666811616976,  0.212795707393],
                          [ 0.333130806925,  0.666416128478,  0.2124198855  ],
                          [ 0.499694891549,  0.666689265423,  0.212082523144],
                          [ 0.666786880922,  0.666546452411,  0.21221766124 ],
                          [ 0.833591037062,  0.666489382626,  0.212937651166],
                          [ 0.000259349907,  0.833163559742,  0.213071445019],
                          [ 0.16684690539 ,  0.833566898907,  0.212979063596],
                          [ 0.33382572308 ,  0.833636174521,  0.213281802769],
                          [ 0.499841161374,  0.833492171959,  0.213111429333],
                          [ 0.666644067911,  0.833638441784,  0.212082523144],
                          [ 0.833610226537,  0.83314741876 ,  0.212348843097],
                          [ 0.110818500675,  0.055096949888,  0.318817357301],
                          [ 0.277720756341,  0.055612576992,  0.318292731222],
                          [ 0.443712511578,  0.054888162345,  0.31774049646 ],
                          [ 0.610790480742,  0.054403394682,  0.317652081492],
                          [ 0.779118628009,  0.05596059045 ,  0.316254564139],
                          [ 0.944862251124,  0.056202175621,  0.317492084274],
                          [ 0.111073410793,  0.22225992254 ,  0.31854419333 ],
                          [ 0.278236383445,  0.222514832658,  0.318817357301],
                          [ 0.444729802774,  0.222395446075,  0.318950979773],
                          [ 0.610814774861,  0.221921061669,  0.317507995065],
                          [ 0.778033654963,  0.22249834792 ,  0.317198379173],
                          [ 0.944242881119,  0.222521708834,  0.31861958654 ],
                          [ 0.110811624499,  0.389090452214,  0.31861958654 ],
                          [ 0.277131157712,  0.388471082209,  0.317492084274],
                          [ 0.444822819156,  0.388841821777,  0.317606793093],
                          [ 0.611427210921,  0.38851320443 ,  0.318337039449],
                          [ 0.777930594203,  0.389460177488,  0.31786517137 ],
                          [ 0.944326603694,  0.38900672964 ,  0.318987903693],
                          [ 0.110834985414,  0.55529967837 ,  0.317198379173],
                          [ 0.277372742883,  0.554214705324,  0.316254564139],
                          [ 0.444593094099,  0.555443912753,  0.315874469959],
                          [ 0.611412279252,  0.555682396824,  0.317023344467],
                          [ 0.777743558639,  0.555589774694,  0.318374635382],
                          [ 0.943873155846,  0.555402739131,  0.31786517137 ],
                          [ 0.111412271665,  0.722518558473,  0.317507995065],
                          [ 0.278929938652,  0.722542852592,  0.317652081492],
                          [ 0.443636383948,  0.721831317076,  0.317279545541],
                          [ 0.610974604266,  0.722358729068,  0.315586932234],
                          [ 0.777650936509,  0.721921054081,  0.317023344467],
                          [ 0.944820128903,  0.721906122412,  0.318337039449],
                          [ 0.110937887258,  0.888603530559,  0.318950979774],
                          [ 0.278445170988,  0.889620821755,  0.31774049646 ],
                          [ 0.445046405994,  0.88828692734 ,  0.320381590022],
                          [ 0.611502016258,  0.889696949385,  0.317279545541],
                          [ 0.77788942058 ,  0.888740239234,  0.315874469959],
                          [ 0.944491511557,  0.888510514177,  0.317606793093],
                          [ 0.055146104225,  0.110692907698,  0.425256329559],
                          [ 0.222308941692,  0.111024391641,  0.42517270049 ],
                          [ 0.3892713168  ,  0.111152196357,  0.425114568602],
                          [ 0.554953000491,  0.109708581171,  0.421935330867],
                          [ 0.723174784513,  0.109917656766,  0.420779399355],
                          [ 0.888926496451,  0.111024007556,  0.425262258365],
                          [ 0.055215727794,  0.27811760554 ,  0.425144603061],
                          [ 0.222640425636,  0.278187229108,  0.425256329559],
                          [ 0.390638166676,  0.280200458307,  0.426397471882],
                          [ 0.556485313525,  0.277508029239,  0.426303095696],
                          [ 0.72234117094 ,  0.278090625746,  0.422290154414],
                          [ 0.887463188045,  0.277296613959,  0.426238608102],
                          [ 0.056036719375,  0.445870145288,  0.426238608102],
                          [ 0.222309325777,  0.444406836883,  0.425262258365],
                          [ 0.388566536535,  0.445350730844,  0.421329001259],
                          [ 0.557039749406,  0.446177403736,  0.423169739262],
                          [ 0.722095230003,  0.44488613944 ,  0.425631787714],
                          [ 0.888639334418,  0.444693998915,  0.425398544438],
                          [ 0.055242707588,  0.610992162394,  0.422290154414],
                          [ 0.223415676567,  0.610158548821,  0.420779399355],
                          [ 0.387973861147,  0.609176302405,  0.421028550692],
                          [ 0.555318835583,  0.612407269925,  0.420417257754],
                          [ 0.721652794621,  0.611680538712,  0.42380995177 ],
                          [ 0.888447193893,  0.61123810333 ,  0.425631787714],
                          [ 0.055825304094,  0.776848019808,  0.426303095696],
                          [ 0.223624752162,  0.778380332842,  0.421935330867],
                          [ 0.389370894537,  0.775378409674,  0.428888439055],
                          [ 0.555764857106,  0.777568476228,  0.419941943731],
                          [ 0.720926063409,  0.77801449775 ,  0.420417257754],
                          [ 0.887155929597,  0.776293583928,  0.423169739262],
                          [ 0.053132875026,  0.942695166657,  0.426397471882],
                          [ 0.222181136976,  0.944062016533,  0.425114568602],
                          [ 0.389681571963,  0.943651761371,  0.425892342233],
                          [ 0.557954923659,  0.943962438796,  0.428888439055],
                          [ 0.724157030928,  0.945359472187,  0.421028550692],
                          [ 0.887982602489,  0.944766796799,  0.421329001259],
                          [ 0.663869215142, -0.159318974778,  0.527135142406],
                          [ 0.667986298432,  0.16202082192 ,  0.52747531414 ],
                          [ 0.494256781527,  0.49745847521 ,  0.527937523563],
                          [ 0.492652308111,  0.669464118192,  0.527135142406],
                          [ 0.171312511413,  0.665347034902,  0.52747531414 ],
                          [ 0.665022776926,  0.668310556408,  0.528124315299],
                          [-0.164125141877,  0.839076551806,  0.527937523563]]

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

# Add tags
bulk_configuration.addTags('Selection 0', [ 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])
bulk_configuration.addTags('Selection 1', [ 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])
# Morse-potential
potentialSet = TremoloXPotentialSet(name='Pt-Morse')
potentialSet.addParticleType(ParticleType.fromElement(Platinum))
potentialSet.addPotential(MorsePotential(
    'Pt',
    'Pt',
    r_0=2.897*Angstrom,
    k=1.6047*Angstrom**-1,
    E_0=0.7102*eV,
    r_i=6.5*Angstrom,
    r_cut=9.5*Angstrom)
)
calculator = TremoloXCalculator(parameters=potentialSet)
bulk_configuration.setCalculator(calculator)

# -------------------------------------------------------------
# Adaptive Kinetic Monte Carlo
# -------------------------------------------------------------
htst_parameters = HTSTParameters(
    assumed_prefactor=1e+13*1/Second,
    )

if os.path.isfile('akmc_markov_chain.hdf5'):
    markov_chain = nlread('akmc_markov_chain.hdf5')[-1]
else:
    markov_chain = MarkovChain(
        configuration=bulk_configuration,
        configuration_energy=TotalEnergy(bulk_configuration).evaluate(),
        )

if os.path.isfile('akmc_kmc.hdf5'):
    kmc = nlread('akmc_kmc.hdf5')[-1]
else:
    kmc = None

constraints = [ 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]

akmc = AdaptiveKineticMonteCarlo(
    markov_chain=markov_chain,
    kmc_temperature=300.0*Kelvin,
    md_temperature=2000.0*Kelvin,
    calculator=bulk_configuration.calculator(),
    kmc=kmc,
    superbasin_threshold=20,
    htst_parameters=htst_parameters,
    constraints=constraints,
    confidence=0.99,
    filename_prefix='akmc',
    )

akmc.run(max_searches=200, max_kmc_steps=10000)
