Skip to content

Instantly share code, notes, and snippets.

@dominicrufa
Created December 6, 2021 20:02
Show Gist options
  • Save dominicrufa/d1aa4acd6fba04356417de73961da075 to your computer and use it in GitHub Desktop.
Save dominicrufa/d1aa4acd6fba04356417de73961da075 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "6d8e6503-3bed-4a37-8ff8-c661903d549b",
"metadata": {
"tags": []
},
"source": [
"# Bistable Dimer in WCA Fluid Simulation\n",
"example of how to setup an NVT, BAOAB-type simulation of `openmmtools.testsystems.BistableDimer_WCAFluid`"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "10a2fd4a-8581-4b22-a1b8-b5673fe7e5a8",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Warning: importing 'simtk.openmm' is deprecated. Import 'openmm' instead.\n",
"/home/dominic/anaconda3/envs/aquaregia/lib/python3.9/site-packages/google/colab/data_table.py:30: UserWarning: IPython.utils.traitlets has moved to a top-level traitlets package.\n",
" from IPython.utils import traitlets as _traitlets\n",
"WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
]
}
],
"source": [
"from openmmtools.testsystems import DoubleWellDimer_WCAFluid\n",
"from jax import numpy as jnp\n",
"from jax.config import config\n",
"config.update(\"jax_enable_x64\", True)\n",
"from simtk import unit, openmm\n",
"import numpy\n",
"from aquaregia.utils import Array, ArrayTree"
]
},
{
"cell_type": "markdown",
"id": "52c1e9d4-ba9c-4063-83b0-f25ddc97b8c6",
"metadata": {},
"source": [
"define parameters of the dimer"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "791ce272-d884-4fcd-a6ff-f18a3be4967b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.0*epsilon*((sigma/r)^12 - (sigma/r)^6) + epsilon;sigma = 0.340000;epsilon = 0.997736;\n",
"h*(1 - ((r-r0-w)/w)^2)^2\n",
"[0, 1, (4.932804382097954, 0.38163709642518684, 0.10200000000000001)]\n",
"39.9 Da\n"
]
}
],
"source": [
"_dimer = DoubleWellDimer_WCAFluid()\n",
"print(_dimer.system.getForce(0).getEnergyFunction())\n",
"print(_dimer.system.getForce(1).getEnergyFunction())\n",
"print(_dimer.system.getForce(1).getBondParameters(0))\n",
"print(_dimer.system.getParticleMass(0))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "f84ca7cf-2a98-4d46-ba4d-3cab3200a78e",
"metadata": {},
"outputs": [],
"source": [
"WCA_sigma = 0.34\n",
"WCA_epsilon = 0.997736\n",
"dimer_h, dimer_r0, dimer_w = 4.932804382097954, 0.38163709642518684,0.10200000000000001\n",
"mass = 39.9"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "af848180-d17c-4ffc-8e60-d9f5c7ebf897",
"metadata": {},
"outputs": [],
"source": [
"from openmmtools.constants import kB\n",
"temperature = (0.824 * WCA_epsilon * unit.kilojoule_per_mole / kB).value_in_unit(unit.kelvin)\n",
"reduced_density = 0.96 #as per the paper\n",
"tau = jnp.sqrt(WCA_sigma**2 * mass / WCA_epsilon)\n",
"timestep = 0.002 * tau\n",
"collision_rate = tau ** (-1)"
]
},
{
"cell_type": "markdown",
"id": "5549fcb5-2154-40dd-aaa3-1e46a8332554",
"metadata": {},
"source": [
"function to fix box vectors because they are fucked in `openmmtools`."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "8c11aac1-868b-4f2e-9c85-3702a61086fd",
"metadata": {},
"outputs": [],
"source": [
"def reset_box_vectors(system, reduced_density):\n",
" import numpy\n",
" num_particles = system.getNumParticles()\n",
" volume = num_particles * WCA_sigma**3 / reduced_density\n",
" side_length = volume**(1./3.)\n",
" a = unit.Quantity(numpy.array([1.0, 0.0, 0.0], numpy.float32), unit.nanometer) * side_length\n",
" b = unit.Quantity(numpy.array([0.0, 1.0, 0.0], numpy.float32), unit.nanometer) * side_length\n",
" c = unit.Quantity(numpy.array([0.0, 0.0, 1.0], numpy.float32), unit.nanometer) * side_length\n",
" system.setDefaultPeriodicBoxVectors(a, b, c)"
]
},
{
"cell_type": "markdown",
"id": "0ef1d1b2-f7c8-49da-bfd8-97c7b7ef9315",
"metadata": {},
"source": [
"make a `jax` dimer vacuum potential."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9157aca0-4a63-4849-9a51-f39a91532245",
"metadata": {},
"outputs": [],
"source": [
"def get_bistable_dimer_vacuum_potential():\n",
" import jax_md\n",
" from jax import vmap\n",
" displacement_fn, shift_fn = jax_md.space.free()\n",
" metric = jax_md.space.canonicalize_displacement_or_metric(displacement_fn)\n",
" def bistable_dimer_vacuum_u(R, neighbor_list, parameter_dict):\n",
" \"\"\"\n",
" parameter_dict looks like : {'h' : <float>, 'r0' : <float>, 'w' : <float>}\n",
" \"\"\"\n",
" h, r0, w = parameter_dict['h'], parameter_dict['r0'], parameter_dict['w']\n",
" r = metric(R[0], R[1]) #symmetric 2x2\n",
" energy = h * (1. - ((r - r0 - w)/w)**2)**2\n",
" return energy\n",
" return {'h': dimer_h, 'r0': dimer_r0, 'w': dimer_w}, bistable_dimer_vacuum_u"
]
},
{
"cell_type": "markdown",
"id": "10c01230-c2ea-4a58-9b6c-ebb17b28cb98",
"metadata": {},
"source": [
"make a `jax` dimer potential in a WCA fluid"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "4006a13c-f98e-480e-b753-30311c89a10d",
"metadata": {},
"outputs": [],
"source": [
"def get_bistable_dimer_potential(nparticles=216, reduced_density = reduced_density):\n",
" import jax_md\n",
" from openmmtools.testsystems import DoubleWellDimer_WCAFluid\n",
" from jax import vmap\n",
" from functools import partial\n",
" from aquaregia.tincture import get_periodic_distance_calculator, get_mask\n",
" from aquaregia.openmm import get_box_vectors_from_vec3s, lifted_vacuum_lj\n",
"\n",
" #make the dimer\n",
" dimer = DoubleWellDimer_WCAFluid(nparticles = nparticles)\n",
" reset_box_vectors(dimer.system, reduced_density)\n",
" r_cutoff = r_switch = dimer.system.getForce(0).getCutoffDistance().value_in_unit_system(unit.md_unit_system)\n",
" box = get_box_vectors_from_vec3s(dimer.system.getDefaultPeriodicBoxVectors())\n",
" displacement_fn, shift_fn = jax_md.space.periodic(box)\n",
" metric = jax_md.space.canonicalize_displacement_or_metric(displacement_fn)\n",
" vmetric = get_periodic_distance_calculator(metric, r_cutoff)\n",
" vsigma = vmap(vmap(lambda x, y : 0.5 * (x + y), in_axes = (None, 0)))\n",
" vepsilon = vmap(vmap(lambda x, y : jnp.sqrt(x * y), in_axes = (None, 0)))\n",
" \n",
" #we actually don't want to lift these sterics yet.\n",
" vwlift = vsigma\n",
" steric_fn = partial(lifted_vacuum_lj, w = 0.)\n",
" \n",
" # get the parameters right\n",
" sigmas = Array([WCA_sigma]*nparticles)\n",
" epsilons = Array([WCA_epsilon]*nparticles)\n",
" original_params = {'h': dimer_h, 'r0': dimer_r0, 'w': dimer_w}\n",
" nb_params = {'sigma': sigmas, 'epsilon': epsilons}\n",
" nb_params.update(original_params)\n",
" \n",
" def energy_fn(R, neighbor_list, parameter_dict):\n",
" #steric energy\n",
" sigmas, epsilons = parameter_dict['sigma'], parameter_dict['epsilon']\n",
" drs = vmetric(R, neighbor_list)# + v_wlift(ws, ws[neighbor_list.idx]) #compute lifted drs\n",
" vepsilons = vepsilon(epsilons, epsilons[neighbor_list.idx])\n",
" steric_energies = jnp.vectorize(steric_fn)(drs,\n",
" vsigma(sigmas, sigmas[neighbor_list.idx]),\n",
" vepsilons,\n",
" ) + vepsilons\n",
" \n",
" # we need an overfill mask and a cutoff mask\n",
" overfill_mask = get_mask(neighbor_list)\n",
" cutoff_mask = jnp.where(drs < r_cutoff, True, False)\n",
" \n",
" energies = 0.5 * jnp.sum(jnp.where(jnp.logical_and(overfill_mask, cutoff_mask), steric_energies, 0.))\n",
" \n",
" # now the bond energy\n",
" h, r0, w = parameter_dict['h'], parameter_dict['r0'], parameter_dict['w']\n",
" r = metric(R[0], R[1]) #symmetric 2x2\n",
" _energy = h * (1. - ((r - r0 - w)/w)**2)**2\n",
" return energies + _energy\n",
" \n",
" return nb_params, energy_fn, displacement_fn, shift_fn, box, r_cutoff, metric"
]
},
{
"cell_type": "markdown",
"id": "606b6f09-5455-4436-aacb-8f8836289278",
"metadata": {},
"source": [
"and a harmonic potential if we want to use it."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "7080d2ec-32de-4c0f-b4eb-afc03d093508",
"metadata": {},
"outputs": [],
"source": [
"def get_harmonic_vacuum_potential():\n",
" import jax_md\n",
" from jax import vmap\n",
" displacement_fn, shift_fn = jax_md.space.free()\n",
" metric = jax_md.space.canonicalize_displacement_or_metric(displacement_fn)\n",
" def hookean_vacuum_u(R, neighbor_list, parameter_dict):\n",
" \"\"\"\n",
" parameter_dict looks like : {'h' : <float>, 'r0' : <float>, 'w' : <float>}\n",
" \"\"\"\n",
" k, r0 = parameter_dict['k'], parameter_dict['r0']\n",
" r = metric(R[0], R[1]) #symmetric 2x2\n",
" energy = 0.5 * k * (r - r0)**2\n",
" return energy\n",
" \n",
" return {'k': 620.358, 'r0': 1.}, hookean_vacuum_u"
]
},
{
"cell_type": "markdown",
"id": "53f5304d-d0ad-4aef-9aab-8e2212e33549",
"metadata": {},
"source": [
"let's create an `openmm` object, minimize it, and extract the energy/positions. Then let's see if the `jax` energy function can recover the `openmm` energy with some decent precision."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "e5a25a1f-9770-4bfc-8d48-1bb2c6a47cc9",
"metadata": {},
"outputs": [],
"source": [
"dimer = DoubleWellDimer_WCAFluid(nparticles=216)\n",
"reset_box_vectors(dimer.system, reduced_density)\n",
"jax_posits = jnp.array(dimer.positions.value_in_unit_system(unit.md_unit_system), dtype = jnp.float64)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "cbac60ed-d368-47c8-ba8d-13e4a623ef1a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Quantity(value=Vec3(x=2.067948579788208, y=0.0, z=0.0), unit=nanometer),\n",
" Quantity(value=Vec3(x=0.0, y=2.067948579788208, z=0.0), unit=nanometer),\n",
" Quantity(value=Vec3(x=0.0, y=0.0, z=2.067948579788208), unit=nanometer)]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dimer.system.getDefaultPeriodicBoxVectors()"
]
},
{
"cell_type": "markdown",
"id": "657e4a7f-e796-4d9f-bfc6-0c822d6a30d8",
"metadata": {},
"source": [
"let's make the `jax` bistable dimer potential..."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "a045012f-17b9-4aae-9a57-ec5efc0f5ac6",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/dominic/anaconda3/envs/aquaregia/lib/python3.9/site-packages/jax/experimental/optimizers.py:28: FutureWarning: jax.experimental.optimizers is deprecated, import jax.example_libraries.optimizers instead\n",
" warnings.warn('jax.experimental.optimizers is deprecated, '\n"
]
}
],
"source": [
"dimer_params, dimer_u, disp_fn, shift_fn, box, r_cutoff, metric = get_bistable_dimer_potential()"
]
},
{
"cell_type": "markdown",
"id": "6cb53ab1-9fca-403e-8db7-a563aa5bc529",
"metadata": {},
"source": [
"`openmm` minimization and energy calculation."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "236d254b-c619-4d39-9c07-658fb66f868b",
"metadata": {},
"outputs": [],
"source": [
"from openmmtools.integrators import LangevinIntegrator\n",
"integrator = LangevinIntegrator(timestep = timestep * unit.picoseconds, temperature = temperature * unit.kelvin, collision_rate = collision_rate / unit.picoseconds)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "9beab3eb-1485-4929-9666-85a9eb2e8a62",
"metadata": {},
"outputs": [],
"source": [
"context = openmm.Context(dimer.system, integrator)\n",
"context.setPositions(dimer.positions)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "e424120d-5097-4520-8429-b126c7e68234",
"metadata": {},
"outputs": [],
"source": [
"openmm.LocalEnergyMinimizer.minimize(context, maxIterations = 1000)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "1bd3834c-90cd-4c01-9d38-87f098b92c72",
"metadata": {},
"outputs": [],
"source": [
"context.setVelocitiesToTemperature(temperature * unit.kelvin)"
]
},
{
"cell_type": "markdown",
"id": "100d3aef-3f25-41a9-a591-2297cb4c3bd5",
"metadata": {},
"source": [
"randomize with some MD"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "a3ec1f16-2944-4b5e-82ba-b7d830095fa1",
"metadata": {},
"outputs": [],
"source": [
"integrator.step(10000)"
]
},
{
"cell_type": "markdown",
"id": "bc07f591-0fc3-41a3-a228-f8ac17cf90a1",
"metadata": {},
"source": [
"run a simulation and collect energies, particle positions, and distances between particles 0 and 1"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "7c9d3079-8814-430a-933d-827609ae9655",
"metadata": {},
"outputs": [],
"source": [
"energies = []\n",
"distances = []\n",
"positions = []\n",
"kes = []"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "ddb6a598-eacc-4257-8fec-231d230b8d4c",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|███████████████████████████████████████████████████████████████████████████████| 2000/2000 [08:47<00:00, 3.79it/s]\n"
]
}
],
"source": [
"import tqdm\n",
"for i in tqdm.trange(2000):\n",
" integrator.step(500)\n",
" energies.append(context.getState(getEnergy=True).getPotentialEnergy().value_in_unit_system(unit.md_unit_system))\n",
" kes.append(context.getState(getEnergy=True).getKineticEnergy().value_in_unit_system(unit.md_unit_system))\n",
" _posits = context.getState(getPositions=True).getPositions(asNumpy=True).value_in_unit_system(unit.md_unit_system)\n",
" distances.append(metric(_posits[0], _posits[2]))\n",
" positions.append(_posits)"
]
},
{
"cell_type": "markdown",
"id": "f11da020-1fa7-4b85-b805-7b746aa02e3d",
"metadata": {},
"source": [
"let's plot the potential and kinetic energies"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "1b19dfa3-ff27-4c56-8b72-6e7646f07bbd",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "6b9959bb-6339-4b12-b60f-1a415a8a4643",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'kJ/mol')"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(energies, alpha=0.5, label=f\"potential energy\")\n",
"plt.plot(kes, alpha=0.5, label=f\"kinetic energy\")\n",
"plt.xlabel(f\"iteration\")\n",
"plt.ylabel(f\"kJ/mol\")"
]
},
{
"cell_type": "markdown",
"id": "00adfbef-5b0d-47ca-b030-5b978d9d7d43",
"metadata": {},
"source": [
"let's also plot the distance between particle 1 and 2 as a function of iteration. it should be bistable."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "4b9794bd-f841-4243-9e47-67b8ec54c446",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import jax"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "497c9acb-2ec7-46df-8b4f-958745320734",
"metadata": {},
"outputs": [],
"source": [
"positions = np.array(positions)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "482303e8-3b63-47a7-889b-3cff0cedb51d",
"metadata": {},
"outputs": [],
"source": [
"_ds = jax.vmap(metric, in_axes=(0,0))(positions[:,0], positions[:,1])"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "d2c19cf1-a554-4127-89b8-b654696c6eab",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'r [nm]')"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(_ds)\n",
"plt.xlabel(f\"iteration\")\n",
"plt.ylabel(f\"r [nm]\")"
]
},
{
"cell_type": "markdown",
"id": "5610b78d-bc7d-4759-bf24-3d82fd1adf54",
"metadata": {},
"source": [
"yep, that's bistable."
]
},
{
"cell_type": "markdown",
"id": "2ed5e080-2683-4c91-a055-d9f0f83381be",
"metadata": {},
"source": [
"now, let's pull the positions from the context, get the `openmm` energy, and see if it matches the `jax` energy"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "4232413c-1d77-45a9-ba41-5d9723156103",
"metadata": {},
"outputs": [],
"source": [
"eq_positions = Array(context.getState(getPositions=True).getPositions(asNumpy=True).value_in_unit_system(unit.md_unit_system))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "4e51e554-4288-4fe4-b35a-a2525b725ffd",
"metadata": {},
"outputs": [],
"source": [
"eq_energy = context.getState(getEnergy=True).getPotentialEnergy()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "34476c48-f5de-4045-8a56-19626e857b47",
"metadata": {},
"outputs": [],
"source": [
"eq_forces = context.getState(getForces=True).getForces(asNumpy=True).value_in_unit_system(unit.md_unit_system)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "e36f71ac-c718-4c38-9f28-0fb435b4c20b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Quantity(value=286.77986011629264, unit=kilojoule/mole)"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eq_energy"
]
},
{
"cell_type": "markdown",
"id": "9065ca6c-ad2b-4f37-93fe-99658bba68a9",
"metadata": {},
"source": [
"compute the `jax` energy. to do this, we need a neighbor function to equip the potential function."
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "aeaefac3-87e6-4edf-861f-0a8a23006b91",
"metadata": {},
"outputs": [],
"source": [
"import jax_md\n",
"import jax\n",
"nbr_fn = jax_md.partition.neighbor_list(displacement_or_metric = disp_fn,\n",
" box_size = box,\n",
" r_cutoff = r_cutoff * 1.5,\n",
" dr_threshold = 0.2,\n",
" capacity_multiplier = 1.25)"
]
},
{
"cell_type": "markdown",
"id": "306b868e-b292-461d-9aa9-8099aba83b34",
"metadata": {},
"source": [
"let's also get the miscellaneous parameters we need to equip the potential function/integrator"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "d7799962-aa05-4286-9048-7fb1ceac3180",
"metadata": {},
"outputs": [],
"source": [
"kT = (kB * temperature).value_in_unit_system(unit.md_unit_system)\n",
"masses = jnp.array([dimer.system.getParticleMass(i).value_in_unit_system(unit.md_unit_system) for i in range(dimer.system.getNumParticles())])"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "c4db8a62-f5c1-4951-b7d1-2e36c5b54421",
"metadata": {},
"outputs": [],
"source": [
"init_neighbor_list = nbr_fn.allocate(eq_positions)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "38d71b66-f743-4ca1-b053-ad6fa2c54fd9",
"metadata": {},
"outputs": [],
"source": [
"jax_energy = dimer_u(eq_positions, init_neighbor_list, dimer_params)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "ca76d052-abba-4f1a-972b-129a9cd0094f",
"metadata": {},
"outputs": [],
"source": [
"jax_forces = -1. * jax.grad(dimer_u)(eq_positions,init_neighbor_list, dimer_params)"
]
},
{
"cell_type": "markdown",
"id": "1e551c09-2bfa-4506-8ef0-0bf9c115fafc",
"metadata": {},
"source": [
"let's compute the difference between the `openmm` and `jax` energies..."
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "2936a9f7-c4d2-4fc4-b9dc-a51cc8ee986a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(-1.5791367e-05, dtype=float64)"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eq_energy.value_in_unit_system(unit.md_unit_system) - jax_energy"
]
},
{
"cell_type": "markdown",
"id": "d45fe3cb-c938-4f85-ab4e-cafa03fb0aed",
"metadata": {},
"source": [
"compare forces\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "ba737b61-ab0a-48af-91cc-0247f26b1587",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(2.46459509e-05, dtype=float64)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.sum((eq_forces - jax_forces)**2)"
]
},
{
"cell_type": "markdown",
"id": "17a6442f-2fea-4e24-a503-4f4699478324",
"metadata": {},
"source": [
"mean squared force error also seems small."
]
},
{
"cell_type": "markdown",
"id": "b53ded6d-76a6-4a46-a13b-b545accdbf0e",
"metadata": {},
"source": [
"## `jax` dimer simulation\n",
"now let's run a simulation with `jax` and see if the energy profiles look alright."
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "9e6e455e-d59c-4ec9-a8bd-8b146bbbfa16",
"metadata": {},
"outputs": [],
"source": [
"from aquaregia.integrators import get_folded_equilibrium_integrator, thermalize, make_static_BAOAB_kernel\n",
"import functools"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "dd211a83-8d87-4fcc-8715-dcb14b5cca28",
"metadata": {},
"outputs": [],
"source": [
"integrator = get_folded_equilibrium_integrator(potential_energy_fn = dimer_u,\n",
" neighbor_fns = nbr_fn,\n",
" potential_energy_parameters = dimer_params,\n",
" kT = kT,\n",
" dt = timestep,\n",
" gamma = collision_rate,\n",
" mass = masses,\n",
" shift_fn = shift_fn)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "ecd96d2c-4a68-4f77-a0c7-75135a5d0fe7",
"metadata": {},
"outputs": [],
"source": [
"xs, vs = eq_positions, thermalize(jax.random.PRNGKey(745), masses, kT, 3)\n",
"seed = jax.random.PRNGKey(345)\n",
"neighbor_list = init_neighbor_list\n",
"sequence = jnp.arange(500)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "1137f603-7a2b-4c5e-b168-5e73b28d5e23",
"metadata": {},
"outputs": [],
"source": [
"xs, vs, neighbor_list = integrator(xs, vs, neighbor_list, seed, sequence)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "c0141f1c-fe0e-498e-906f-101dd943d92c",
"metadata": {},
"outputs": [],
"source": [
"allocator = jax.jit(nbr_fn.update)\n",
"jax_us, jax_kes, jax_positions = [], [], []\n",
"from aquaregia.utils import kinetic_energy\n",
"ju_fn, jke_fn = jax.jit(dimer_u), jax.jit(functools.partial(kinetic_energy, mass = masses))"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "4e9f4712-3699-42d2-8812-77d3d9e2c089",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|███████████████████████████████████████████████████████████████████████████████| 1000/1000 [05:16<00:00, 3.16it/s]\n"
]
}
],
"source": [
"import tqdm\n",
"for i in tqdm.trange(1000):\n",
" run_seed, seed = jax.random.split(seed)\n",
" xs, vs, neighbor_list = integrator(xs, vs, neighbor_list, run_seed, sequence)\n",
" if neighbor_list.did_buffer_overflow:\n",
" neighbor_list = nbr_fn.allocate(xs)\n",
" jax_us.append(ju_fn(xs, neighbor_list, dimer_params))\n",
" jax_kes.append(jke_fn(vs))\n",
" jax_positions.append(xs)\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "05994a74-fd41-40ac-8980-ca442cdcd8f2",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "633f0982-c200-44a8-9b98-57f5563ddef2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f29f4729a30>]"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(jax_us)\n",
"plt.plot(jax_kes)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "dc179a2f-09eb-4a02-8712-72c3aedd08b0",
"metadata": {},
"outputs": [],
"source": [
"jax_posits = Array(jax_positions)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "376eba3e-60c2-4c97-8e42-5493d473c89f",
"metadata": {},
"outputs": [],
"source": [
"_jax_ds = jax.vmap(metric, in_axes=(0,0))(jax_posits[:,0], jax_posits[:,1])"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "5f22932e-62c7-487c-a26e-eaeb8ab0a697",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f29f470f9a0>]"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(_jax_ds)"
]
},
{
"cell_type": "markdown",
"id": "b8f446bc-02d6-4fbb-8866-f65e642943f1",
"metadata": {},
"source": [
"that seems to have just about done it..."
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "459f88f4-25ec-46ec-8e8b-fa46fc019b47",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(-1.10211896, dtype=float64)"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.mean(Array(jax_us)) - jnp.mean(Array(energies))"
]
},
{
"cell_type": "markdown",
"id": "5a935068-5738-4cc6-a58c-dc6c2391d5f8",
"metadata": {},
"source": [
"so it looks like the mean potential of the `jax` bistable dimer simulation is close to that of the `openmm` simulation"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "67b863c0-a1c0-49da-a2ee-e7992704ff36",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(13.54468029, dtype=float64)"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.std(Array(jax_us))"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "480333c1-53b3-4c34-a734-fcea9bd99055",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(13.47304597, dtype=float64)"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.std(Array(energies))"
]
},
{
"cell_type": "markdown",
"id": "28e68251-ac1b-4f0b-8b3a-c4bb5ee53d3f",
"metadata": {},
"source": [
"what about the kinetic energies?"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "16db4eca-5737-42f5-84da-47abfc467ce0",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(-1.73147589, dtype=float64)"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.mean(Array(jax_kes)) - jnp.mean(Array(kes))"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "c99fbb9d-c708-43c5-a2ec-3a1eda9bf2b1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(14.73976504, dtype=float64)"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.std(Array(jax_kes))"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "84d929b6-f8d3-4a86-84b3-f8db2788ecc5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(14.73770971, dtype=float64)"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.std(Array(kes))"
]
},
{
"cell_type": "markdown",
"id": "4f5b6515-2ae1-43e3-be2b-6d6bb4ca48f8",
"metadata": {},
"source": [
"those are close, as well."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a04b695b-511f-45db-b559-3728d0c5deb1",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment