def test_vvvr_shadow_work_accumulation(): """When `measure_shadow_work==True`, assert that global `shadow_work` is initialized to zero and reaches a nonzero value after integrating a few dozen steps.""" # test `measure_shadow_work=True` --> accumulation of a nonzero value in global `shadow_work` testsystem = testsystems.HarmonicOscillator() system, topology = testsystem.system, testsystem.topology temperature = 298.0 * unit.kelvin integrator = integrators.VVVRIntegrator(temperature, measure_shadow_work=True) context = openmm.Context(system, integrator) context.setPositions(testsystem.positions) context.setVelocitiesToTemperature(temperature) assert(integrator.get_shadow_work(dimensionless=True) == 0), "Shadow work should initially be zero." assert(integrator.get_shadow_work() / unit.kilojoules_per_mole == 0), "integrator.get_shadow_work() should have units of energy." assert(integrator.shadow_work / unit.kilojoules_per_mole == 0), "integrator.shadow_work should have units of energy." integrator.step(25) assert(integrator.get_shadow_work(dimensionless=True) != 0), "integrator.get_shadow_work() should be nonzero after dynamics" integrator = integrators.VVVRIntegrator(temperature) context = openmm.Context(system, integrator) context.setPositions(testsystem.positions) context.setVelocitiesToTemperature(temperature) integrator.step(25) del context, integrator
def test_external_protocol_work_accumulation(): """When `measure_protocol_work==True`, assert that global `protocol_work` is initialized to zero and reaches a zero value after integrating a few dozen steps without perturbation. By default (`measure_protocol_work=False`), assert that there is no global name for `protocol_work`.""" testsystem = testsystems.HarmonicOscillator() system, topology = testsystem.system, testsystem.topology temperature = 298.0 * unit.kelvin integrator = integrators.ExternalPerturbationLangevinIntegrator(splitting="O V R V O", temperature=temperature) context = openmm.Context(system, integrator) context.setPositions(testsystem.positions) context.setVelocitiesToTemperature(temperature) # Check that initial step accumulates no protocol work assert(integrator.get_protocol_work(dimensionless=True) == 0), "Protocol work should be 0 initially" assert(integrator.get_protocol_work() / unit.kilojoules_per_mole == 0), "Protocol work should have units of energy" integrator.step(1) assert(integrator.get_protocol_work(dimensionless=True) == 0), "There should be no protocol work." # Check that a single step accumulates protocol work pe_1 = context.getState(getEnergy=True).getPotentialEnergy() perturbed_K=99.0 * unit.kilocalories_per_mole / unit.angstroms**2 context.setParameter('testsystems_HarmonicOscillator_K', perturbed_K) pe_2 = context.getState(getEnergy=True).getPotentialEnergy() integrator.step(1) assert (integrator.get_protocol_work(dimensionless=True) != 0), "There should be protocol work after perturbing." assert (integrator.protocol_work == (pe_2 - pe_1)), "The potential energy difference should be equal to protocol work." del context, integrator integrator = integrators.VVVRIntegrator(temperature) context = openmm.Context(system, integrator) context.setPositions(testsystem.positions) context.setVelocitiesToTemperature(temperature) integrator.step(25) del context, integrator
for replicate in range(nreplicates): # Reconstitute System object. print "Reconstituting System object..." system = openmm.System() system.__setstate__(str(ncfile.variables['system'][0])) # Add a barostat to the system. # NOTE: This is added to a new copy of the system to ensure barostat random number seeds are unique. print "Adding barostat..." barostat = openmm.MonteCarloBarostat(pressure, temperature, barostat_frequency) system.addForce(barostat) # Create integrator print "Creating integrator..." integrator = integrators.VVVRIntegrator(temperature, collision_rate, timestep) # Create context. print "Creating Context..." context = openmm.Context(system, integrator) # Set initial conditions. print "Setting initial positions..." context.setPositions(initial_positions) print "Setting initial velocities appropriate for temperature..." context.setVelocitiesToTemperature(temperature) # Allocate storage for data reduced_density_t = np.zeros([niterations + 1], np.float32) reduced_potential_t = np.zeros([niterations + 1], np.float32)