# Define a prestep function which can expand the system

class StressStrainUtility:
    """ Perform a strain of a configuration over time. """
    def __init__(self, delta=0.0001, skip=0):
        """
        @param delta The strain to apply in each step
        @param  first steps to "skip" strain
        """
        self.__delta = [0.0,0.0,delta]*Angstrom
        self.__skip = skip
        self.stresses = []
        self.lengths = []

    def __call__(self, step, time, configuration, forces, stress):
        """
        Strainer call.
        """
        # Get the lattice vectors.
        u1, u2, u3 = configuration.primitiveVectors()

        # Don't apply strain in the earliest MD steps
        if step < self.__skip:
            return

        # Store the history
        self.stresses.append( stress[2,2].inUnitsOf(eV/Angstrom**3) )
        self.lengths.append( u3[2].inUnitsOf(Angstrom) )

        # Increase the lattice vectors.
        u3 = u3 + self.__delta

        # Set the new lattice.
        configuration.setBravaisLattice(UnitCell(u1,u2,u3))

        # Move all the atoms that are constrained on the right side.
        constraints = configuration.indicesFromTags("Right")
        for c in constraints:
            xyz = numpy.array(configuration.cartesianCoordinates()[c]) + numpy.array(self.__delta)
            configuration.setCartesianCoordinates(indices=[c], cartesian_coordinates=[xyz]*Angstrom)

    def length(self):
        return numpy.array(self.lengths)*Angstrom

    def stress(self):
        return numpy.array(self.stresses)*eV/Angstrom**3

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

# Set up lattice
vector_a = [10.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 22.149015394, 0.0]*Angstrom
vector_c = [0.0, 0.0, 42.6258]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
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,
            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,
            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,
            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
fractional_coordinates = [[ 0.561213158171,  0.343262978113,  0.016666666667],
                          [ 0.323743735772,  0.362167776144,  0.016666666667],
                          [ 0.770040263554,  0.39769717456 ,  0.016666666667],
                          [ 0.168746578274,  0.445565803552,  0.016666666667],
                          [ 0.852512528457,  0.5           ,  0.016666666667],
                          [ 0.168746578274,  0.554434196447,  0.016666666667],
                          [ 0.770040263554,  0.602302825439,  0.016666666667],
                          [ 0.323743735772,  0.637832223855,  0.016666666667],
                          [ 0.561213158171,  0.656737021887,  0.016666666667],
                          [ 0.438786841829,  0.343262978113,  0.033333333333],
                          [ 0.676256264229,  0.362167776144,  0.033333333333],
                          [ 0.229959736446,  0.39769717456 ,  0.033333333333],
                          [ 0.831253421726,  0.445565803552,  0.033333333333],
                          [ 0.147487471543,  0.5           ,  0.033333333333],
                          [ 0.831253421726,  0.554434196447,  0.033333333333],
                          [ 0.229959736446,  0.602302825439,  0.033333333333],
                          [ 0.676256264229,  0.637832223855,  0.033333333333],
                          [ 0.438786841829,  0.656737021887,  0.033333333333],
                          [ 0.438786841829,  0.343262978113,  0.066666666667],
                          [ 0.676256264229,  0.362167776144,  0.066666666667],
                          [ 0.229959736446,  0.39769717456 ,  0.066666666667],
                          [ 0.831253421726,  0.445565803552,  0.066666666667],
                          [ 0.147487471543,  0.5           ,  0.066666666667],
                          [ 0.831253421726,  0.554434196447,  0.066666666667],
                          [ 0.229959736446,  0.602302825439,  0.066666666667],
                          [ 0.676256264229,  0.637832223855,  0.066666666667],
                          [ 0.438786841829,  0.656737021887,  0.066666666667],
                          [ 0.561213158171,  0.343262978113,  0.083333333333],
                          [ 0.323743735772,  0.362167776144,  0.083333333333],
                          [ 0.770040263554,  0.39769717456 ,  0.083333333333],
                          [ 0.168746578274,  0.445565803552,  0.083333333333],
                          [ 0.852512528457,  0.5           ,  0.083333333333],
                          [ 0.168746578274,  0.554434196447,  0.083333333333],
                          [ 0.770040263554,  0.602302825439,  0.083333333333],
                          [ 0.323743735772,  0.637832223855,  0.083333333333],
                          [ 0.561213158171,  0.656737021887,  0.083333333333],
                          [ 0.561213158171,  0.343262978113,  0.116666666667],
                          [ 0.323743735772,  0.362167776144,  0.116666666667],
                          [ 0.770040263554,  0.39769717456 ,  0.116666666667],
                          [ 0.168746578274,  0.445565803552,  0.116666666667],
                          [ 0.852512528457,  0.5           ,  0.116666666667],
                          [ 0.168746578274,  0.554434196447,  0.116666666667],
                          [ 0.770040263554,  0.602302825439,  0.116666666667],
                          [ 0.323743735772,  0.637832223855,  0.116666666667],
                          [ 0.561213158171,  0.656737021887,  0.116666666667],
                          [ 0.438786841829,  0.343262978113,  0.133333333333],
                          [ 0.676256264229,  0.362167776144,  0.133333333333],
                          [ 0.229959736446,  0.39769717456 ,  0.133333333333],
                          [ 0.831253421726,  0.445565803552,  0.133333333333],
                          [ 0.147487471543,  0.5           ,  0.133333333333],
                          [ 0.831253421726,  0.554434196447,  0.133333333333],
                          [ 0.229959736446,  0.602302825439,  0.133333333333],
                          [ 0.676256264229,  0.637832223855,  0.133333333333],
                          [ 0.438786841829,  0.656737021887,  0.133333333333],
                          [ 0.438786841829,  0.343262978113,  0.166666666667],
                          [ 0.676256264229,  0.362167776144,  0.166666666667],
                          [ 0.229959736446,  0.39769717456 ,  0.166666666667],
                          [ 0.831253421726,  0.445565803552,  0.166666666667],
                          [ 0.147487471543,  0.5           ,  0.166666666667],
                          [ 0.831253421726,  0.554434196447,  0.166666666667],
                          [ 0.229959736446,  0.602302825439,  0.166666666667],
                          [ 0.676256264229,  0.637832223855,  0.166666666667],
                          [ 0.438786841829,  0.656737021887,  0.166666666667],
                          [ 0.561213158171,  0.343262978113,  0.183333333333],
                          [ 0.323743735772,  0.362167776144,  0.183333333333],
                          [ 0.770040263554,  0.39769717456 ,  0.183333333333],
                          [ 0.168746578274,  0.445565803552,  0.183333333333],
                          [ 0.852512528457,  0.5           ,  0.183333333333],
                          [ 0.168746578274,  0.554434196447,  0.183333333333],
                          [ 0.770040263554,  0.602302825439,  0.183333333333],
                          [ 0.323743735772,  0.637832223855,  0.183333333333],
                          [ 0.561213158171,  0.656737021887,  0.183333333333],
                          [ 0.561213158171,  0.343262978113,  0.216666666667],
                          [ 0.323743735772,  0.362167776144,  0.216666666667],
                          [ 0.770040263554,  0.39769717456 ,  0.216666666667],
                          [ 0.168746578274,  0.445565803552,  0.216666666667],
                          [ 0.852512528457,  0.5           ,  0.216666666667],
                          [ 0.168746578274,  0.554434196447,  0.216666666667],
                          [ 0.770040263554,  0.602302825439,  0.216666666667],
                          [ 0.323743735772,  0.637832223855,  0.216666666667],
                          [ 0.561213158171,  0.656737021887,  0.216666666667],
                          [ 0.438786841829,  0.343262978113,  0.233333333333],
                          [ 0.676256264229,  0.362167776144,  0.233333333333],
                          [ 0.229959736446,  0.39769717456 ,  0.233333333333],
                          [ 0.831253421726,  0.445565803552,  0.233333333333],
                          [ 0.147487471543,  0.5           ,  0.233333333333],
                          [ 0.831253421726,  0.554434196447,  0.233333333333],
                          [ 0.229959736446,  0.602302825439,  0.233333333333],
                          [ 0.676256264229,  0.637832223855,  0.233333333333],
                          [ 0.438786841829,  0.656737021887,  0.233333333333],
                          [ 0.438786841829,  0.343262978113,  0.266666666667],
                          [ 0.676256264229,  0.362167776144,  0.266666666667],
                          [ 0.229959736446,  0.39769717456 ,  0.266666666667],
                          [ 0.831253421726,  0.445565803552,  0.266666666667],
                          [ 0.147487471543,  0.5           ,  0.266666666667],
                          [ 0.831253421726,  0.554434196447,  0.266666666667],
                          [ 0.229959736446,  0.602302825439,  0.266666666667],
                          [ 0.676256264229,  0.637832223855,  0.266666666667],
                          [ 0.438786841829,  0.656737021887,  0.266666666667],
                          [ 0.561213158171,  0.343262978113,  0.283333333333],
                          [ 0.323743735772,  0.362167776144,  0.283333333333],
                          [ 0.770040263554,  0.39769717456 ,  0.283333333333],
                          [ 0.168746578274,  0.445565803552,  0.283333333333],
                          [ 0.852512528457,  0.5           ,  0.283333333333],
                          [ 0.168746578274,  0.554434196447,  0.283333333333],
                          [ 0.770040263554,  0.602302825439,  0.283333333333],
                          [ 0.323743735772,  0.637832223855,  0.283333333333],
                          [ 0.561213158171,  0.656737021887,  0.283333333333],
                          [ 0.561213158171,  0.343262978113,  0.316666666667],
                          [ 0.323743735772,  0.362167776144,  0.316666666667],
                          [ 0.770040263554,  0.39769717456 ,  0.316666666667],
                          [ 0.168746578274,  0.445565803552,  0.316666666667],
                          [ 0.852512528457,  0.5           ,  0.316666666667],
                          [ 0.168746578274,  0.554434196447,  0.316666666667],
                          [ 0.770040263554,  0.602302825439,  0.316666666667],
                          [ 0.323743735772,  0.637832223855,  0.316666666667],
                          [ 0.561213158171,  0.656737021887,  0.316666666667],
                          [ 0.438786841829,  0.343262978113,  0.333333333333],
                          [ 0.676256264229,  0.362167776144,  0.333333333333],
                          [ 0.229959736446,  0.39769717456 ,  0.333333333333],
                          [ 0.831253421726,  0.445565803552,  0.333333333333],
                          [ 0.147487471543,  0.5           ,  0.333333333333],
                          [ 0.831253421726,  0.554434196447,  0.333333333333],
                          [ 0.229959736446,  0.602302825439,  0.333333333333],
                          [ 0.676256264229,  0.637832223855,  0.333333333333],
                          [ 0.438786841829,  0.656737021887,  0.333333333333],
                          [ 0.43701741102 ,  0.341667993101,  0.366630480403],
                          [ 0.43701741102 ,  0.658332006898,  0.366630480403],
                          [ 0.225643548217,  0.603492957984,  0.366659326665],
                          [ 0.225643548217,  0.396507042015,  0.366659326665],
                          [ 0.14257974449 ,  0.5           ,  0.36668501257 ],
                          [ 0.677735413175,  0.638565616965,  0.366947432238],
                          [ 0.677735413175,  0.361434383034,  0.366947432238],
                          [ 0.835223035945,  0.554592446901,  0.36751937722 ],
                          [ 0.835223035945,  0.445407553098,  0.36751937722 ],
                          [ 0.31956284527 ,  0.359926326586,  0.383226554079],
                          [ 0.31956284527 ,  0.640073673413,  0.383226554079],
                          [ 0.560751739099,  0.658442899984,  0.383247042634],
                          [ 0.560751739099,  0.341557100015,  0.383247042634],
                          [ 0.162522612345,  0.444716574035,  0.383291981909],
                          [ 0.162522612345,  0.555283425964,  0.383291981909],
                          [ 0.772672895077,  0.603019974213,  0.38427317771 ],
                          [ 0.772672895077,  0.396980025786,  0.38427317771 ],
                          [ 0.857785654398,  0.5           ,  0.385277022226],
                          [ 0.559153129378,  0.340711992863,  0.416534149551],
                          [ 0.559153129378,  0.659288007136,  0.416534149551],
                          [ 0.318123979005,  0.640495460188,  0.416628049154],
                          [ 0.318123979005,  0.359504539811,  0.416628049154],
                          [ 0.161670687346,  0.555363295531,  0.416708655703],
                          [ 0.161670687346,  0.444636704468,  0.416708655703],
                          [ 0.772877378948,  0.603486590109,  0.418107780605],
                          [ 0.772877378948,  0.39651340989 ,  0.418107780605],
                          [ 0.859822585846,  0.5           ,  0.419948922799],
                          [ 0.434758793072,  0.660079748949,  0.433159063291],
                          [ 0.434758793072,  0.33992025105 ,  0.433159063291],
                          [ 0.223265908051,  0.395779724199,  0.433259964904],
                          [ 0.223265908051,  0.6042202758  ,  0.433259964904],
                          [ 0.140543641413,  0.5           ,  0.433296409968],
                          [ 0.675963543668,  0.358529912543,  0.433350637947],
                          [ 0.675963543668,  0.641470087456,  0.433350637947],
                          [ 0.839250214219,  0.443461010372,  0.43678633072 ],
                          [ 0.83925021422 ,  0.556538989627,  0.43678633072 ],
                          [ 0.675415322918,  0.647292784207,  0.466388957915],
                          [ 0.675415322918,  0.352707215792,  0.466388957915],
                          [ 0.433377248879,  0.338653412953,  0.466604466158],
                          [ 0.433377248879,  0.661346587046,  0.466604466158],
                          [ 0.223416358706,  0.395739018965,  0.4666956432  ],
                          [ 0.223416358706,  0.604260981034,  0.4666956432  ],
                          [ 0.140948399187,  0.5           ,  0.466715642098],
                          [ 0.849331289035,  0.434264894249,  0.470670601109],
                          [ 0.849331289036,  0.565735105751,  0.470670601109],
                          [ 0.55748812413 ,  0.664089989132,  0.483216931981],
                          [ 0.55748812413 ,  0.335910010867,  0.483216931981],
                          [ 0.777961931525,  0.381942129953,  0.483237713675],
                          [ 0.777961931525,  0.618057870047,  0.483237713675],
                          [ 0.31762421876 ,  0.358979211266,  0.483269732301],
                          [ 0.31762421876 ,  0.641020788733,  0.483269732301],
                          [ 0.162266479031,  0.444651163901,  0.483291182825],
                          [ 0.16226647903 ,  0.555348836099,  0.483291182825],
                          [ 0.886275632732,  0.46815240933 ,  0.5           ],
                          [ 0.886275632733,  0.531847590669,  0.5           ],
                          [ 0.162266479031,  0.444651163901,  0.516708817175],
                          [ 0.16226647903 ,  0.555348836099,  0.516708817175],
                          [ 0.31762421876 ,  0.358979211266,  0.516730267699],
                          [ 0.31762421876 ,  0.641020788733,  0.516730267699],
                          [ 0.777961931525,  0.618057870047,  0.516762286325],
                          [ 0.777961931524,  0.381942129952,  0.516762286325],
                          [ 0.55748812413 ,  0.335910010867,  0.516783068019],
                          [ 0.55748812413 ,  0.664089989132,  0.516783068019],
                          [ 0.849331289035,  0.434264894249,  0.529329398891],
                          [ 0.849331289036,  0.565735105751,  0.529329398891],
                          [ 0.140948399187,  0.5           ,  0.533284357902],
                          [ 0.223416358706,  0.395739018965,  0.5333043568  ],
                          [ 0.223416358706,  0.604260981034,  0.5333043568  ],
                          [ 0.433377248879,  0.338653412953,  0.533395533842],
                          [ 0.433377248879,  0.661346587046,  0.533395533842],
                          [ 0.675415322918,  0.352707215792,  0.533611042085],
                          [ 0.675415322918,  0.647292784207,  0.533611042085],
                          [ 0.839250214219,  0.443461010372,  0.56321366928 ],
                          [ 0.83925021422 ,  0.556538989627,  0.56321366928 ],
                          [ 0.675963543668,  0.641470087456,  0.566649362053],
                          [ 0.675963543668,  0.358529912543,  0.566649362053],
                          [ 0.140543641413,  0.5           ,  0.566703590032],
                          [ 0.223265908051,  0.395779724199,  0.566740035096],
                          [ 0.223265908051,  0.6042202758  ,  0.566740035096],
                          [ 0.434758793072,  0.33992025105 ,  0.566840936709],
                          [ 0.434758793072,  0.660079748949,  0.566840936709],
                          [ 0.859822585846,  0.5           ,  0.580051077201],
                          [ 0.772877378948,  0.39651340989 ,  0.581892219395],
                          [ 0.772877378948,  0.603486590109,  0.581892219395],
                          [ 0.161670687346,  0.444636704468,  0.583291344297],
                          [ 0.161670687346,  0.555363295531,  0.583291344297],
                          [ 0.318123979005,  0.359504539811,  0.583371950846],
                          [ 0.318123979005,  0.640495460188,  0.583371950846],
                          [ 0.559153129378,  0.340711992863,  0.583465850449],
                          [ 0.559153129378,  0.659288007136,  0.583465850449],
                          [ 0.857785654398,  0.5           ,  0.614722977774],
                          [ 0.772672895077,  0.396980025786,  0.61572682229 ],
                          [ 0.772672895077,  0.603019974213,  0.61572682229 ],
                          [ 0.162522612345,  0.444716574035,  0.616708018091],
                          [ 0.162522612345,  0.555283425964,  0.616708018091],
                          [ 0.560751739099,  0.341557100015,  0.616752957366],
                          [ 0.560751739099,  0.658442899984,  0.616752957366],
                          [ 0.31956284527 ,  0.359926326586,  0.616773445921],
                          [ 0.31956284527 ,  0.640073673413,  0.616773445921],
                          [ 0.835223035945,  0.445407553098,  0.63248062278 ],
                          [ 0.835223035945,  0.554592446901,  0.63248062278 ],
                          [ 0.677735413175,  0.361434383034,  0.633052567762],
                          [ 0.677735413175,  0.638565616965,  0.633052567762],
                          [ 0.14257974449 ,  0.5           ,  0.63331498743 ],
                          [ 0.225643548217,  0.396507042015,  0.633340673335],
                          [ 0.225643548217,  0.603492957984,  0.633340673335],
                          [ 0.43701741102 ,  0.658332006898,  0.633369519597],
                          [ 0.43701741102 ,  0.341667993101,  0.633369519597],
                          [ 0.438786841829,  0.343262978113,  0.666666666667],
                          [ 0.676256264229,  0.362167776144,  0.666666666667],
                          [ 0.229959736446,  0.39769717456 ,  0.666666666667],
                          [ 0.831253421726,  0.445565803552,  0.666666666667],
                          [ 0.147487471543,  0.5           ,  0.666666666667],
                          [ 0.831253421726,  0.554434196447,  0.666666666667],
                          [ 0.229959736446,  0.602302825439,  0.666666666667],
                          [ 0.676256264229,  0.637832223855,  0.666666666667],
                          [ 0.438786841829,  0.656737021887,  0.666666666667],
                          [ 0.561213158171,  0.343262978113,  0.683333333333],
                          [ 0.323743735772,  0.362167776144,  0.683333333333],
                          [ 0.770040263554,  0.39769717456 ,  0.683333333333],
                          [ 0.168746578274,  0.445565803552,  0.683333333333],
                          [ 0.852512528457,  0.5           ,  0.683333333333],
                          [ 0.168746578274,  0.554434196447,  0.683333333333],
                          [ 0.770040263554,  0.602302825439,  0.683333333333],
                          [ 0.323743735772,  0.637832223855,  0.683333333333],
                          [ 0.561213158171,  0.656737021887,  0.683333333333],
                          [ 0.561213158171,  0.343262978113,  0.716666666667],
                          [ 0.323743735772,  0.362167776144,  0.716666666667],
                          [ 0.770040263554,  0.39769717456 ,  0.716666666667],
                          [ 0.168746578274,  0.445565803552,  0.716666666667],
                          [ 0.852512528457,  0.5           ,  0.716666666667],
                          [ 0.168746578274,  0.554434196447,  0.716666666667],
                          [ 0.770040263554,  0.602302825439,  0.716666666667],
                          [ 0.323743735772,  0.637832223855,  0.716666666667],
                          [ 0.561213158171,  0.656737021887,  0.716666666667],
                          [ 0.438786841829,  0.343262978113,  0.733333333333],
                          [ 0.676256264229,  0.362167776144,  0.733333333333],
                          [ 0.229959736446,  0.39769717456 ,  0.733333333333],
                          [ 0.831253421726,  0.445565803552,  0.733333333333],
                          [ 0.147487471543,  0.5           ,  0.733333333333],
                          [ 0.831253421726,  0.554434196447,  0.733333333333],
                          [ 0.229959736446,  0.602302825439,  0.733333333333],
                          [ 0.676256264229,  0.637832223855,  0.733333333333],
                          [ 0.438786841829,  0.656737021887,  0.733333333333],
                          [ 0.438786841829,  0.343262978113,  0.766666666667],
                          [ 0.676256264229,  0.362167776144,  0.766666666667],
                          [ 0.229959736446,  0.39769717456 ,  0.766666666667],
                          [ 0.831253421726,  0.445565803552,  0.766666666667],
                          [ 0.147487471543,  0.5           ,  0.766666666667],
                          [ 0.831253421726,  0.554434196447,  0.766666666667],
                          [ 0.229959736446,  0.602302825439,  0.766666666667],
                          [ 0.676256264229,  0.637832223855,  0.766666666667],
                          [ 0.438786841829,  0.656737021887,  0.766666666667],
                          [ 0.561213158171,  0.343262978113,  0.783333333333],
                          [ 0.323743735772,  0.362167776144,  0.783333333333],
                          [ 0.770040263554,  0.39769717456 ,  0.783333333333],
                          [ 0.168746578274,  0.445565803552,  0.783333333333],
                          [ 0.852512528457,  0.5           ,  0.783333333333],
                          [ 0.168746578274,  0.554434196447,  0.783333333333],
                          [ 0.770040263554,  0.602302825439,  0.783333333333],
                          [ 0.323743735772,  0.637832223855,  0.783333333333],
                          [ 0.561213158171,  0.656737021887,  0.783333333333],
                          [ 0.561213158171,  0.343262978113,  0.816666666667],
                          [ 0.323743735772,  0.362167776144,  0.816666666667],
                          [ 0.770040263554,  0.39769717456 ,  0.816666666667],
                          [ 0.168746578274,  0.445565803552,  0.816666666667],
                          [ 0.852512528457,  0.5           ,  0.816666666667],
                          [ 0.168746578274,  0.554434196447,  0.816666666667],
                          [ 0.770040263554,  0.602302825439,  0.816666666667],
                          [ 0.323743735772,  0.637832223855,  0.816666666667],
                          [ 0.561213158171,  0.656737021887,  0.816666666667],
                          [ 0.438786841829,  0.343262978113,  0.833333333333],
                          [ 0.676256264229,  0.362167776144,  0.833333333333],
                          [ 0.229959736446,  0.39769717456 ,  0.833333333333],
                          [ 0.831253421726,  0.445565803552,  0.833333333333],
                          [ 0.147487471543,  0.5           ,  0.833333333333],
                          [ 0.831253421726,  0.554434196447,  0.833333333333],
                          [ 0.229959736446,  0.602302825439,  0.833333333333],
                          [ 0.676256264229,  0.637832223855,  0.833333333333],
                          [ 0.438786841829,  0.656737021887,  0.833333333333],
                          [ 0.438786841829,  0.343262978113,  0.866666666667],
                          [ 0.676256264229,  0.362167776144,  0.866666666667],
                          [ 0.229959736446,  0.39769717456 ,  0.866666666667],
                          [ 0.831253421726,  0.445565803552,  0.866666666667],
                          [ 0.147487471543,  0.5           ,  0.866666666667],
                          [ 0.831253421726,  0.554434196447,  0.866666666667],
                          [ 0.229959736446,  0.602302825439,  0.866666666667],
                          [ 0.676256264229,  0.637832223855,  0.866666666667],
                          [ 0.438786841829,  0.656737021887,  0.866666666667],
                          [ 0.561213158171,  0.343262978113,  0.883333333333],
                          [ 0.323743735772,  0.362167776144,  0.883333333333],
                          [ 0.770040263554,  0.39769717456 ,  0.883333333333],
                          [ 0.168746578274,  0.445565803552,  0.883333333333],
                          [ 0.852512528457,  0.5           ,  0.883333333333],
                          [ 0.168746578274,  0.554434196447,  0.883333333333],
                          [ 0.770040263554,  0.602302825439,  0.883333333333],
                          [ 0.323743735772,  0.637832223855,  0.883333333333],
                          [ 0.561213158171,  0.656737021887,  0.883333333333],
                          [ 0.561213158171,  0.343262978113,  0.916666666667],
                          [ 0.323743735772,  0.362167776144,  0.916666666667],
                          [ 0.770040263554,  0.39769717456 ,  0.916666666667],
                          [ 0.168746578274,  0.445565803552,  0.916666666667],
                          [ 0.852512528457,  0.5           ,  0.916666666667],
                          [ 0.168746578274,  0.554434196447,  0.916666666667],
                          [ 0.770040263554,  0.602302825439,  0.916666666667],
                          [ 0.323743735772,  0.637832223855,  0.916666666667],
                          [ 0.561213158171,  0.656737021887,  0.916666666667],
                          [ 0.438786841829,  0.343262978113,  0.933333333333],
                          [ 0.676256264229,  0.362167776144,  0.933333333333],
                          [ 0.229959736446,  0.39769717456 ,  0.933333333333],
                          [ 0.831253421726,  0.445565803552,  0.933333333333],
                          [ 0.147487471543,  0.5           ,  0.933333333333],
                          [ 0.831253421726,  0.554434196447,  0.933333333333],
                          [ 0.229959736446,  0.602302825439,  0.933333333333],
                          [ 0.676256264229,  0.637832223855,  0.933333333333],
                          [ 0.438786841829,  0.656737021887,  0.933333333333],
                          [ 0.438786841829,  0.343262978113,  0.966666666667],
                          [ 0.676256264229,  0.362167776144,  0.966666666667],
                          [ 0.229959736446,  0.39769717456 ,  0.966666666667],
                          [ 0.831253421726,  0.445565803552,  0.966666666667],
                          [ 0.147487471543,  0.5           ,  0.966666666667],
                          [ 0.831253421726,  0.554434196447,  0.966666666667],
                          [ 0.229959736446,  0.602302825439,  0.966666666667],
                          [ 0.676256264229,  0.637832223855,  0.966666666667],
                          [ 0.438786841829,  0.656737021887,  0.966666666667],
                          [ 0.561213158171,  0.343262978113,  0.983333333333],
                          [ 0.323743735772,  0.362167776144,  0.983333333333],
                          [ 0.770040263554,  0.39769717456 ,  0.983333333333],
                          [ 0.168746578274,  0.445565803552,  0.983333333333],
                          [ 0.852512528457,  0.5           ,  0.983333333333],
                          [ 0.168746578274,  0.554434196447,  0.983333333333],
                          [ 0.770040263554,  0.602302825439,  0.983333333333],
                          [ 0.323743735772,  0.637832223855,  0.983333333333],
                          [ 0.561213158171,  0.656737021887,  0.983333333333]]

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

# Add tags
bulk_configuration.addTags('Left',  [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
                                     13, 14, 15, 16, 17])
bulk_configuration.addTags('Right', [342, 343, 344, 345, 346, 347, 348, 349, 350, 351,
                                     352, 353, 354, 355, 356, 357, 358, 359])

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

potentialSet = Tersoff_C_2010()
calculator = TremoloXCalculator(parameters=potentialSet)

bulk_configuration.setCalculator(calculator)
nlprint(bulk_configuration)
bulk_configuration.update()
nlsave('mdtrajectory_cnt.hdf5', bulk_configuration)

# -------------------------------------------------------------
# Molecular Dynamics
# -------------------------------------------------------------

initial_velocity = MaxwellBoltzmannDistribution(
    temperature=300.0*Kelvin,
    remove_center_of_mass_momentum=False
)

method = NVTBerendsen(
    time_step=1*femtoSecond,
    reservoir_temperature=300*Kelvin,
    thermostat_timescale=100*femtoSecond,
    initial_velocity=initial_velocity
)

strainer = StressStrainUtility()

md_trajectory = MolecularDynamics(
    bulk_configuration,
    constraints=bulk_configuration.indicesFromTags(["Left","Right"]),
    trajectory_filename='mdtrajectory_cnt.hdf5',
    steps=20000,
    log_interval=200,
    method=method,
    pre_step_hook=strainer,
    write_stresses=True
)

bulk_configuration = md_trajectory.lastImage()

# -------------------------------------------------------------
# Finding Young's Modulus
# -------------------------------------------------------------

# Find center of cnt from mean x- and y-coordinates
coords = bulk_configuration.cartesianCoordinates()
x_coords = coords[:,0]
y_coords = coords[:,1]
x_0 = numpy.sum(x_coords)/len(x_coords)
y_0 = numpy.sum(y_coords)/len(y_coords)

# Find radius by mean distance from center to atoms' x- and y-coordinates
radius = numpy.sum( ( (x_coords - x_0)**2 + (y_coords - y_0)**2 )**(1/2.0) ) / len(x_coords)

# Find cross-sectional area by multiplying circumference with length of a pi-bond
pi_bond = 1.35
circumference = radius * 2 * numpy.pi
area = circumference * pi_bond

# Find volumes of CNT and of whole cell
volume_cnt = area * strainer.lengths[-1]

u1, u2, u3 = bulk_configuration.bravaisLattice().primitiveVectors()
volume_cell = u1[0] * u2[1] * u3[2]

# Factor the stresses to the volume of the CNT
stresses_factored = numpy.array(strainer.stresses * (volume_cell / volume_cnt) )*eV/Angstrom**3

# Calculate the strain
strain = (strainer.length() - strainer.length()[0] ) / strainer.length()[0]

# Calculate Young's modulus in TPa
modulus = (stresses_factored[-1].inUnitsOf(Pa) - stresses_factored[0].inUnitsOf(Pa) ) / float(strain[-1]) / 1e12
print("Young's Modulus: {} TPa".format(modulus))

# Save the result to a file.
print(strainer.length())
nlsave("mdtrajectory_cnt.hdf5", md_trajectory, "MD")
nlsave("mdtrajectory_cnt.hdf5",strainer.length(), "C length")
nlsave("mdtrajectory_cnt.hdf5",strainer.stress(), "C stress")
nlsave("mdtrajectory_cnt.hdf5",stresses_factored, "C stresses factored")

# Plot stress-strain curve.
import pylab
pylab.figure()
pylab.plot(strain * 100, stresses_factored.inUnitsOf(GPa))
pylab.title('CNT with Stone-Wales defect')
pylab.xlabel('Strain (%)')
pylab.ylabel('Stress (GPa)')
pylab.grid(True)
pylab.savefig("mdtrajectory_cnt_fig.png")
