Commit 92a4bbe1 authored by Peter Eastman's avatar Peter Eastman
Browse files

Optimizations to the custom GB models

parent e19cefde
......@@ -1032,6 +1032,8 @@ def readAmberSystem(prmtop_filename=None, prmtop_loader=None, shake=None, gbmode
if units.is_quantity(cutoff):
cutoff = cutoff.value_in_unit(units.nanometers)
gb_parms = prmtop.getGBParms(gbmodel, elements)
if gbmodel != 'OBC2' or implicitSolventKappa != 0:
gb_parms = customgb.convertParameters(gb_parms, gbmodel)
if gbmodel == 'HCT':
gb = customgb.GBSAHCTForce(solventDielectric, soluteDielectric, 'ACE', cutoff, implicitSolventKappa)
elif gbmodel == 'OBC1':
......
......@@ -189,36 +189,37 @@ for i in range (len(d0)):
m0[i]=m0[i]*10
def _createEnergyTerms(force, SA, cutoff, kappa):
def _createEnergyTerms(force, solventDielectric, soluteDielectric, SA, cutoff, kappa):
# Add the energy terms to the CustomGBForce. These are identical for all the GB models.
params = "; solventDielectric="+str(solventDielectric)+"; soluteDielectric="+str(soluteDielectric)+"; kappa="+str(kappa)+"; cutoff="+str(cutoff)
if kappa > 0:
force.addEnergyTerm("-0.5*138.935485*(1/soluteDielectric-exp(-kappa*B)/solventDielectric)*q^2/B",
force.addEnergyTerm("-0.5*138.935485*(1/soluteDielectric-exp(-kappa*B)/solventDielectric)*q^2/B"+params,
CustomGBForce.SingleParticle)
elif kappa < 0:
# Do kappa check here to avoid repeating code everywhere
raise ValueError('kappa/ionic strength must be >= 0')
else:
force.addEnergyTerm("-0.5*138.935485*(1/soluteDielectric-1/solventDielectric)*q^2/B",
force.addEnergyTerm("-0.5*138.935485*(1/soluteDielectric-1/solventDielectric)*q^2/B"+params,
CustomGBForce.SingleParticle)
if SA=='ACE':
force.addEnergyTerm("28.3919551*(radius+0.14)^2*(radius/B)^6", CustomGBForce.SingleParticle)
force.addEnergyTerm("28.3919551*(radius+0.14)^2*(radius/B)^6; radius=or+offset", CustomGBForce.SingleParticle)
elif SA is not None:
raise ValueError('Unknown surface area method: '+SA)
if cutoff is None:
if kappa > 0:
force.addEnergyTerm("-138.935485*(1/soluteDielectric-exp(-kappa*f)/solventDielectric)*q1*q2/f;"
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))", CustomGBForce.ParticlePairNoExclusions)
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))"+params, CustomGBForce.ParticlePairNoExclusions)
else:
force.addEnergyTerm("-138.935485*(1/soluteDielectric-1/solventDielectric)*q1*q2/f;"
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))", CustomGBForce.ParticlePairNoExclusions)
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))"+params, CustomGBForce.ParticlePairNoExclusions)
else:
if kappa > 0:
force.addEnergyTerm("-138.935485*(1/soluteDielectric-kappa/solventDielectric)*q1*q2*(1/f-"+str(1/cutoff)+");"
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))", CustomGBForce.ParticlePairNoExclusions)
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))"+params, CustomGBForce.ParticlePairNoExclusions)
else:
force.addEnergyTerm("-138.935485*(1/soluteDielectric-1/solventDielectric)*q1*q2*(1/f-"+str(1/cutoff)+");"
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))", CustomGBForce.ParticlePairNoExclusions)
"f=sqrt(r^2+B1*B2*exp(-r^2/(4*B1*B2)))"+params, CustomGBForce.ParticlePairNoExclusions)
"""
Amber Equivalent: igb = 1
......@@ -231,22 +232,16 @@ def GBSAHCTForce(solventDielectric=78.5, soluteDielectric=1, SA=None,
custom = CustomGBForce()
custom.addPerParticleParameter("q")
custom.addPerParticleParameter("radius")
custom.addPerParticleParameter("scale")
if kappa > 0: custom.addGlobalParameter('kappa', kappa)
custom.addGlobalParameter("solventDielectric", solventDielectric)
custom.addGlobalParameter("soluteDielectric", soluteDielectric)
custom.addPerParticleParameter("or") # Offset radius
custom.addPerParticleParameter("sr") # Scaled offset radius
custom.addGlobalParameter("offset", 0.009)
custom.addComputedValue("I", "step(r+sr2-or1)*0.5*(1/L-1/U+0.25*(r-sr2^2/r)*(1/(U^2)-1/(L^2))+0.5*log(L/U)/r);"
"U=r+sr2;"
"L=max(or1, D);"
"D=abs(r-sr2);"
"sr2 = scale2*or2;"
"or1 = radius1-offset; or2 = radius2-offset", CustomGBForce.ParticlePairNoExclusions)
"D=abs(r-sr2)", CustomGBForce.ParticlePairNoExclusions)
custom.addComputedValue("B", "1/(1/or-I);"
"or=radius-offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, SA, cutoff, kappa)
custom.addComputedValue("B", "1/(1/or-I)", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, solventDielectric, soluteDielectric, SA, cutoff, kappa)
return custom
"""
......@@ -258,22 +253,17 @@ def GBSAOBC1Force(solventDielectric=78.5, soluteDielectric=1, SA=None,
custom = CustomGBForce()
custom.addPerParticleParameter("q")
custom.addPerParticleParameter("radius")
custom.addPerParticleParameter("scale")
if kappa > 0: custom.addGlobalParameter('kappa', kappa)
custom.addGlobalParameter("solventDielectric", solventDielectric)
custom.addGlobalParameter("soluteDielectric", soluteDielectric)
custom.addPerParticleParameter("or") # Offset radius
custom.addPerParticleParameter("sr") # Scaled offset radius
custom.addGlobalParameter("offset", 0.009)
custom.addComputedValue("I", "step(r+sr2-or1)*0.5*(1/L-1/U+0.25*(r-sr2^2/r)*(1/(U^2)-1/(L^2))+0.5*log(L/U)/r);"
"U=r+sr2;"
"L=max(or1, D);"
"D=abs(r-sr2);"
"sr2 = scale2*or2;"
"or1 = radius1-offset; or2 = radius2-offset", CustomGBForce.ParticlePairNoExclusions)
"D=abs(r-sr2)", CustomGBForce.ParticlePairNoExclusions)
custom.addComputedValue("B", "1/(1/or-tanh(0.8*psi+2.909125*psi^3)/radius);"
"psi=I*or; or=radius-offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, SA, cutoff, kappa)
"psi=I*or; radius=or+offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, solventDielectric, soluteDielectric, SA, cutoff, kappa)
return custom
"""
......@@ -285,22 +275,17 @@ def GBSAOBC2Force(solventDielectric=78.5, soluteDielectric=1, SA=None,
custom = CustomGBForce()
custom.addPerParticleParameter("q")
custom.addPerParticleParameter("radius")
custom.addPerParticleParameter("scale")
if kappa > 0: custom.addGlobalParameter('kappa', kappa)
custom.addGlobalParameter("solventDielectric", solventDielectric)
custom.addGlobalParameter("soluteDielectric", soluteDielectric)
custom.addPerParticleParameter("or") # Offset radius
custom.addPerParticleParameter("sr") # Scaled offset radius
custom.addGlobalParameter("offset", 0.009)
custom.addComputedValue("I", "step(r+sr2-or1)*0.5*(1/L-1/U+0.25*(r-sr2^2/r)*(1/(U^2)-1/(L^2))+0.5*log(L/U)/r);"
"U=r+sr2;"
"L=max(or1, D);"
"D=abs(r-sr2);"
"sr2 = scale2*or2;"
"or1 = radius1-offset; or2 = radius2-offset", CustomGBForce.ParticlePairNoExclusions)
"D=abs(r-sr2)", CustomGBForce.ParticlePairNoExclusions)
custom.addComputedValue("B", "1/(1/or-tanh(psi-0.8*psi^2+4.85*psi^3)/radius);"
"psi=I*or; or=radius-offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, SA, cutoff, kappa)
"psi=I*or; radius=or+offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, solventDielectric, soluteDielectric, SA, cutoff, kappa)
return custom
"""
......@@ -321,15 +306,10 @@ def GBSAGBnForce(solventDielectric=78.5, soluteDielectric=1, SA=None,
custom = CustomGBForce()
custom.addPerParticleParameter("q")
custom.addPerParticleParameter("radius")
custom.addPerParticleParameter("scale")
custom.addPerParticleParameter("or") # Offset radius
custom.addPerParticleParameter("sr") # Scaled offset radius
if kappa > 0: custom.addGlobalParameter('kappa', kappa)
custom.addGlobalParameter("solventDielectric", solventDielectric)
custom.addGlobalParameter("soluteDielectric", soluteDielectric)
custom.addGlobalParameter("offset", 0.009)
custom.addGlobalParameter("neckScale", 0.361825)
custom.addGlobalParameter("neckCut", 0.68)
custom.addTabulatedFunction("getd0", Discrete1DFunction(d0))
custom.addTabulatedFunction("getm0", Discrete1DFunction(m0))
......@@ -341,12 +321,12 @@ def GBSAGBnForce(solventDielectric=78.5, soluteDielectric=1, SA=None,
"U=r+sr2;"
"L=max(or1, D);"
"D=abs(r-sr2);"
"sr2 = scale2*or2;"
"or1 = radius1-offset; or2 = radius2-offset", CustomGBForce.ParticlePairNoExclusions)
"radius1=or1+offset; radius2=or2+offset;"
"neckScale=0.361825; neckCut=0.68", CustomGBForce.ParticlePairNoExclusions)
custom.addComputedValue("B", "1/(1/or-tanh(1.09511284*psi-1.907992938*psi^2+2.50798245*psi^3)/radius);"
"psi=I*or; or=radius-offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, SA, cutoff, kappa)
"psi=I*or; radius=or+offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, solventDielectric, soluteDielectric, SA, cutoff, kappa)
return custom
"""
......@@ -367,18 +347,13 @@ def GBSAGBn2Force(solventDielectric=78.5, soluteDielectric=1, SA=None,
custom = CustomGBForce()
custom.addPerParticleParameter("q")
custom.addPerParticleParameter("radius")
custom.addPerParticleParameter("scale")
custom.addPerParticleParameter("or") # Offset radius
custom.addPerParticleParameter("sr") # Scaled offset radius
custom.addPerParticleParameter("alpha")
custom.addPerParticleParameter("beta")
custom.addPerParticleParameter("gamma")
if kappa > 0: custom.addGlobalParameter('kappa', kappa)
custom.addGlobalParameter("solventDielectric", solventDielectric)
custom.addGlobalParameter("soluteDielectric", soluteDielectric)
custom.addGlobalParameter("offset", 0.0195141)
custom.addGlobalParameter("neckScale", 0.826836)
custom.addGlobalParameter("neckCut", 0.68)
custom.addTabulatedFunction("getd0", Discrete1DFunction(d0))
custom.addTabulatedFunction("getm0", Discrete1DFunction(m0))
......@@ -390,10 +365,24 @@ def GBSAGBn2Force(solventDielectric=78.5, soluteDielectric=1, SA=None,
"U=r+sr2;"
"L=max(or1, D);"
"D=abs(r-sr2);"
"sr2 = scale2*or2;"
"or1 = radius1-offset; or2 = radius2-offset", CustomGBForce.ParticlePairNoExclusions)
"radius1=or1+offset; radius2=or2+offset;"
"neckScale=0.826836; neckCut=0.68", CustomGBForce.ParticlePairNoExclusions)
custom.addComputedValue("B", "1/(1/or-tanh(alpha*psi-beta*psi^2+gamma*psi^3)/radius);"
"psi=I*or; or=radius-offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, SA, cutoff, kappa)
"psi=I*or; radius=or+offset", CustomGBForce.SingleParticle)
_createEnergyTerms(custom, solventDielectric, soluteDielectric, SA, cutoff, kappa)
return custom
def convertParameters(params, gbmodel):
"""Convert the GB parameters from the file into the values expected by the appropriate CustomGBForce."""
newparams = [None]*len(params)
if gbmodel == 'GBn2':
offset = 0.0195141
else:
offset = 0.009
for i in range(len(params)):
newparams[i] = list(params[i])
newparams[i][0] -= offset
newparams[i][1] *= newparams[i][0]
return newparams
\ No newline at end of file
......@@ -100,24 +100,13 @@ class TestAmberPrmtopFile(unittest.TestCase):
for method in methodMap:
system = prmtop2.createSystem(implicitSolvent=implicitSolvent_value,
solventDielectric=50.0, soluteDielectric=0.9, nonbondedMethod=method)
found_matching_solvent_dielectric=False
found_matching_solute_dielectric=False
if implicitSolvent_value in set([HCT, OBC1, GBn]):
for force in system.getForces():
if isinstance(force, CustomGBForce):
self.assertEqual(force.getNonbondedMethod(), methodMap[method])
for j in range(force.getNumGlobalParameters()):
if (force.getGlobalParameterName(j) == 'solventDielectric' and
force.getGlobalParameterDefaultValue(j) == 50.0):
found_matching_solvent_dielectric = True
if (force.getGlobalParameterName(j) == 'soluteDielectric' and
force.getGlobalParameterDefaultValue(j) == 0.9):
found_matching_solute_dielectric = True
if isinstance(force, NonbondedForce):
self.assertEqual(force.getReactionFieldDielectric(), 1.0)
self.assertEqual(force.getNonbondedMethod(), methodMap[method])
self.assertTrue(found_matching_solvent_dielectric and
found_matching_solute_dielectric)
else:
for force in system.getForces():
if isinstance(force, GBSAOBCForce):
......@@ -240,6 +229,25 @@ class TestAmberPrmtopFile(unittest.TestCase):
# Make sure the energy is relatively close to the value we get with
# Amber using this force field.
self.assertAlmostEqual(-7307.2735621/ene, 1, places=3)
def test_ImplicitSolventForces(self):
"""Compute forces for different implicit solvent types, and compare them to ones generated with a previous version of OpenMM to ensure they haven't changed."""
solventType = [HCT, OBC1, OBC2, GBn, GBn2]
nonbondedMethod = [NoCutoff, CutoffNonPeriodic, CutoffNonPeriodic, NoCutoff, NoCutoff]
salt = [0.0, 0.0, 0.5, 0.5, 0.0]*(moles/liter)
file = ['HCT_NoCutoff', 'OBC1_NonPeriodic', 'OBC2_NonPeriodic_Salt', 'GBn_NoCutoff_Salt', 'GBn2_NoCutoff']
pdb = PDBFile('systems/alanine-dipeptide-implicit.pdb')
for i in range(5):
system = prmtop2.createSystem(implicitSolvent=solventType[i], nonbondedMethod=nonbondedMethod[i], implicitSolventSaltConc=salt[i])
integrator = VerletIntegrator(0.001)
context = Context(system, integrator, Platform.getPlatformByName("CPU"))
context.setPositions(pdb.positions)
state1 = context.getState(getForces=True)
state2 = XmlSerializer.deserialize(open('systems/alanine-dipeptide-implicit-forces/'+file[i]+'.xml').read())
for f1, f2, in zip(state1.getForces().value_in_unit(kilojoules_per_mole/nanometer), state2.getForces().value_in_unit(kilojoules_per_mole/nanometer)):
diff = norm(f1-f2)
self.assertTrue(diff < 0.1 or diff/norm(f1) < 1e-4)
if __name__ == '__main__':
unittest.main()
<?xml version="1.0" ?>
<State time="0" type="State" version="1">
<PeriodicBoxVectors>
<A x="2" y="0" z="0"/>
<B x="0" y="2" z="0"/>
<C x="0" y="0" z="2"/>
</PeriodicBoxVectors>
<Forces>
<Force x="125.03448115289211" y="43.32996869087219" z="-.32721251249313354"/>
<Force x="341.6234832406044" y="347.617433026433" z="-.8306254320777953"/>
<Force x="1.465131115168333" y="-51.00541362911463" z="-38.11954540386796"/>
<Force x="2.7838090173900127" y="-50.54201374202967" z="37.45753550902009"/>
<Force x="-694.3128572702408" y="-40.11703059077263" z="141.99350219080225"/>
<Force x="-507.0770571231842" y="-589.0909288525581" z="389.5440996333491"/>
<Force x="30.07020881283097" y="-865.4282982449513" z="-253.73720738082193"/>
<Force x="-46.64711940288544" y="-11.553307116031647" z="-1.14782332489267"/>
<Force x="412.9440284720622" y="393.1155642759986" z="63.61426969873719"/>
<Force x="-27.9816143065691" y="24.851514041423798" z="52.195745466742665"/>
<Force x="7.146615496603772" y="-242.70665084780194" z="-305.01612206571735"/>
<Force x="25.575431060045958" y="-15.982945490628481" z="-64.17020486621186"/>
<Force x="93.36584681086242" y="-178.10863384790719" z="-121.07110506272875"/>
<Force x="418.07980923354626" y="303.29553681379184" z="-342.0748033244163"/>
<Force x="214.27255564928055" y="-102.44735606014729" z="291.2024629737716"/>
<Force x="-420.52409839630127" y="128.17991256713867" z="2.5522894316818565"/>
<Force x="-241.46922235935926" y="416.7907632468268" z="152.65439392975532"/>
<Force x="-52.96275818347931" y="-151.0294795036316" z="-1.817022401606664"/>
<Force x="246.45249317586422" y="187.45216877479106" z="-1.6977270720526576"/>
<Force x="76.24567371606827" y="320.694318652153" z="-.5214127898216248"/>
<Force x="-1.9259837809950113" y="67.05363237857819" z="8.533471319824457"/>
<Force x="-2.1587012950330973" y="65.63135588169098" z="-9.216962072998285"/>
</Forces>
</State>
<?xml version="1.0" ?>
<State time="0" type="State" version="1">
<PeriodicBoxVectors>
<A x="2" y="0" z="0"/>
<B x="0" y="2" z="0"/>
<C x="0" y="0" z="2"/>
</PeriodicBoxVectors>
<Forces>
<Force x="116.92173205316067" y="35.74797606468201" z="-.31320083141326904"/>
<Force x="346.4335723519325" y="347.91397757828236" z="-.7274334602989256"/>
<Force x="-3.8193766362965107" y="-50.163410760462284" z="-34.13527924194932"/>
<Force x="-2.5832430608570576" y="-49.72161541134119" z="33.492162469774485"/>
<Force x="-678.0981813669205" y="-43.59890314936638" z="144.39658980676904"/>
<Force x="-506.10328698158264" y="-589.8690050244331" z="388.1552735015284"/>
<Force x="22.236811901209876" y="-862.8642609219532" z="-255.22323748259805"/>
<Force x="-45.493120074272156" y="-14.552918016910553" z="-1.145501604769379"/>
<Force x="411.3508411399089" y="390.2969187987037" z="66.42137118685059"/>
<Force x="-25.265792086720467" y="27.495839297771454" z="54.14952242234722"/>
<Force x="3.733357897726819" y="-243.36420928896405" z="-297.93731590383686"/>
<Force x="25.430794905871153" y="-14.971891451627016" z="-70.3868496301584"/>
<Force x="97.456183610484" y="-176.72447475977242" z="-122.43685823655687"/>
<Force x="422.9076767414808" y="300.37319069867954" z="-346.16921898908913"/>
<Force x="203.8950589299202" y="-90.0563190728426" z="292.4585710193496"/>
<Force x="-417.8394365310669" y="132.75754928588867" z="2.3947719985153526"/>
<Force x="-232.2461846396327" y="410.49045501928777" z="152.14686514786445"/>
<Force x="-57.324524998664856" y="-151.90891790390015" z="-2.435667592799291"/>
<Force x="241.87253235280514" y="184.33851583022624" z="-1.5684559224173427"/>
<Force x="75.61852604150772" y="324.36484706401825" z="-.5052977800369263"/>
<Force x=".5770832356065512" y="67.66817677021027" z="11.481010410934687"/>
<Force x=".3389774616807699" y="66.34845554828644" z="-12.111703846603632"/>
</Forces>
</State>
<?xml version="1.0" ?>
<State time="0" type="State" version="1">
<PeriodicBoxVectors>
<A x="2" y="0" z="0"/>
<B x="0" y="2" z="0"/>
<C x="0" y="0" z="2"/>
</PeriodicBoxVectors>
<Forces>
<Force x="119.87015162408352" y="35.32908082008362" z="-.2700755298137665"/>
<Force x="317.75814777612686" y="347.0047370940447" z="-.36405922705307603"/>
<Force x="-1.5870520360767841" y="-49.64923916012049" z="-32.16182732954621"/>
<Force x="-.6230551488697529" y="-49.28765354305506" z="31.62008560076356"/>
<Force x="-662.1668611764908" y="-41.318858593702316" z="142.827594331"/>
<Force x="-499.81304955482483" y="-628.789857685566" z="396.9687448188197"/>
<Force x="9.883120800135657" y="-860.5162613491993" z="-256.9060352721717"/>
<Force x="-47.38457667827606" y="-20.238594591617584" z="-1.099657526705414"/>
<Force x="425.8578887931071" y="385.30582945467904" z="62.49412080156617"/>
<Force x="-27.185586169362068" y="24.652142703533173" z="56.237679122481495"/>
<Force x="6.795258990256116" y="-237.71378814638592" z="-303.22915097349323"/>
<Force x="23.833146285265684" y="-15.633165407925844" z="-65.40645025996491"/>
<Force x="94.45341509394348" y="-180.38257107324898" z="-123.42125898576342"/>
<Force x="425.9342289417982" y="308.1854618168436" z="-349.6926793772727"/>
<Force x="189.02624255418777" y="-87.48103220760822" z="291.035372557817"/>
<Force x="-438.08852100372314" y="149.00048446655273" z="1.9025959426071495"/>
<Force x="-214.21626215428114" y="412.8787807105109" z="150.88754918030463"/>
<Force x="-49.139330983161926" y="-146.01251077651978" z=".8237868959549814"/>
<Force x="250.3118935674429" y="196.49128634948283" z="-1.326529967598617"/>
<Force x="79.39004474878311" y="327.3214110136032" z="-.41108113527297974"/>
<Force x="-1.35963093675673" y="65.87895834445953" z="11.501466009765863"/>
<Force x="-1.5495685283094645" y="64.97552835941315" z="-12.010117743164301"/>
</Forces>
</State>
<?xml version="1.0" ?>
<State time="0" type="State" version="1">
<PeriodicBoxVectors>
<A x="2" y="0" z="0"/>
<B x="0" y="2" z="0"/>
<C x="0" y="0" z="2"/>
</PeriodicBoxVectors>
<Forces>
<Force x="118.75197611749172" y="37.31967115402222" z="-.27059119939804077"/>
<Force x="319.6333022713661" y="341.64345021545887" z="-.5288973026908934"/>
<Force x=".2122395746409893" y="-48.4974714294076" z="-33.63206410780549"/>
<Force x="1.172732662409544" y="-48.143215753138065" z="33.092639449983835"/>
<Force x="-684.7492891550064" y="-22.71616694331169" z="142.82319979975"/>
<Force x="-480.4688265323639" y="-646.0529344677925" z="396.2935791655909"/>
<Force x="19.13356330501847" y="-860.4653923611622" z="-259.51502784877084"/>
<Force x="-55.92518413066864" y="-27.145088732242584" z="-.7603530795313418"/>
<Force x="429.2403093329631" y="382.1770090353675" z="60.34707065927796"/>
<Force x="-26.955144122242928" y="24.935925662517548" z="56.52590095857158"/>
<Force x="3.497140398947522" y="-239.83717452944256" z="-301.7230455505196"/>
<Force x="24.14258260652423" y="-15.982009936124086" z="-62.18898533610627"/>
<Force x="92.46831530146301" y="-180.48632702417672" z="-122.92353540635668"/>
<Force x="424.0495262593031" y="312.01640206342563" z="-348.84565827436745"/>
<Force x="204.3266766667366" y="-102.10523875057697" z="290.7208612586837"/>
<Force x="-454.11176013946533" y="168.45798873901367" z="1.5088972502853721"/>
<Force x="-223.03344660252333" y="420.29524646978825" z="149.7152159397956"/>
<Force x="-39.53340256214142" y="-150.4378457069397" z="1.7263585741166025"/>
<Force x="248.08668254315853" y="195.30956656951457" z="-1.4342415807768703"/>
<Force x="83.9709010720253" y="328.7274760007858" z="-.4131510257720947"/>
<Force x="-1.8617023173719645" y="65.95496952533722" z="9.68197262659669"/>
<Force x="-2.0471442881971598" y="65.03140318393707" z="-10.200121019035578"/>
</Forces>
</State>
<?xml version="1.0" ?>
<State time="0" type="State" version="1">
<PeriodicBoxVectors>
<A x="2" y="0" z="0"/>
<B x="0" y="2" z="0"/>
<C x="0" y="0" z="2"/>
</PeriodicBoxVectors>
<Forces>
<Force x="118.3535195440054" y="35.969449162483215" z="-.281414270401001"/>
<Force x="314.4263282418251" y="344.44179029762745" z="-.434397476259619"/>
<Force x="-1.4066988714039326" y="-49.76428470760584" z="-32.37674808874726"/>
<Force x="-.40957896783947945" y="-49.397793389856815" z="31.823710206896067"/>
<Force x="-657.3909059762955" y="-38.007091015577316" z="141.8415627987124"/>
<Force x="-493.7057650089264" y="-643.0512407422066" z="398.3075271293055"/>
<Force x="7.296756054041907" y="-855.5627281765919" z="-257.9519661345985"/>
<Force x="-53.50385844707489" y="-24.334915697574615" z="-1.1155095011927187"/>
<Force x="429.9477740279399" y="379.88140909792855" z="60.92471059667878"/>
<Force x="-26.743043139576912" y="21.195145785808563" z="59.63117956975475"/>
<Force x="5.737775317160413" y="-236.0452548211906" z="-302.6426021682564"/>
<Force x="23.517739962786436" y="-16.610735941678286" z="-63.854551303666085"/>
<Force x="94.2509424071759" y="-182.99365315027535" z="-125.87754732347094"/>
<Force x="424.38538555800915" y="311.03262597089633" z="-349.64496991224587"/>
<Force x="177.18182879686356" y="-78.61917002499104" z="287.95103532331996"/>
<Force x="-442.6554002761841" y="158.27599716186523" z="2.4879631453659385"/>
<Force x="-211.27339106053114" y="403.45306001883" z="150.30480124405585"/>
<Force x="-37.10933029651642" y="-140.19635248184204" z="3.2473717445973307"/>
<Force x="249.92661701142788" y="200.21128232497722" z="-1.3900556145235896"/>
<Force x="83.43381077051163" y="328.46902453899384" z="-.4314945936203003"/>
<Force x="-2.0295280162245035" y="66.29071056842804" z="10.737368497997522"/>
<Force x="-2.2310355845838785" y="65.36275541782379" z="-11.255987975746393"/>
</Forces>
</State>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment