def run_simulation(self, label, liq, AGrad=True): """ Submit a simulation to the Work Queue or run it locally. Inputs: label = The name of the molecule (and hopefully the folder name that you're running in) liq = True/false flag indicating whether to run in liquid or gas phase """ wq = getWorkQueue() # Create a dictionary of MD options that the script will read. md_opts = OrderedDict() md_opts['temperature'] = self.hfe_temperature md_opts['pressure'] = self.hfe_pressure md_opts['minimize'] = True if liq: sdnm = 'liq' md_opts['nequil'] = self.liquid_eq_steps md_opts['nsteps'] = self.liquid_md_steps md_opts['timestep'] = self.liquid_timestep md_opts['sample'] = self.liquid_interval else: sdnm = 'gas' md_opts['nequil'] = self.gas_eq_steps md_opts['nsteps'] = self.gas_md_steps md_opts['timestep'] = self.gas_timestep md_opts['sample'] = self.gas_interval eng_opts = deepcopy(self.engine_opts) # Enforce implicit solvent in the liquid simulation. # We need to be more careful with this when running explicit solvent. eng_opts['implicit_solvent'] = liq eng_opts['coords'] = os.path.basename(self.molecules[label]) if not os.path.exists(sdnm): os.makedirs(sdnm) os.chdir(sdnm) if not os.path.exists('md_result.p'): # Link in a bunch of files... what were these again? link_dir_contents(os.path.join(self.root,self.rundir),os.getcwd()) # Link in the scripts required to run the simulation for f in self.scripts: LinkFile(os.path.join(os.path.split(__file__)[0],"data",f),os.path.join(os.getcwd(),f)) # Link in the coordinate file. LinkFile(self.molecules[label], './%s' % os.path.basename(self.molecules[label])) # Store names of previous trajectory files. self.last_traj += [os.path.join(os.getcwd(), i) for i in self.extra_output] # Write target, engine and simulation options to disk. lp_dump((self.OptionDict, eng_opts, md_opts), 'simulation.p') # Execute the script for running molecular dynamics. cmdstr = '%s python md_ism_hfe.py %s' % (self.prefix, "-g" if AGrad else "") if wq == None: logger.info("Running condensed phase simulation locally.\n") logger.info("You may tail -f %s/npt.out in another terminal window\n" % os.getcwd()) _exec(cmdstr, copy_stderr=True, outfnm='md.out') else: queue_up(wq, command = cmdstr+' &> md.out', tag='%s:%s/%s' % (self.name, label, "liq" if liq else "gas"), input_files = self.scripts + ['simulation.p', 'forcefield.p', os.path.basename(self.molecules[label])], output_files = ['md_result.p', 'md.out'] + self.extra_output, tgt=self, verbose=False, print_time=3600) os.chdir('..')
def npt_simulation(self, temperature, pressure, simnum): """ Submit a NPT simulation to the Work Queue. """ wq = getWorkQueue() if not (os.path.exists('npt_result.p') or os.path.exists('npt_result.p.bz2')): link_dir_contents(os.path.join(self.root,self.rundir),os.getcwd()) if wq == None: print "Running condensed phase simulation locally." print "You may tail -f %s/npt.out in another terminal window" % os.getcwd() # if GoodStep() and (temperature, pressure) in self.DynDict_New: # self.DynDict[(temperature, pressure)] = self.DynDict_New[(temperature, pressure)] # if (temperature, pressure) in self.DynDict: # dynsrc = self.DynDict[(temperature, pressure)] # dyndest = os.path.join(os.getcwd(), 'liquid.dyn') # print "Copying .dyn file: %s to %s" % (dynsrc, dyndest) # shutil.copy2(dynsrc,dyndest) cmdstr = 'python npt.py gromacs %i %.3f %.3f %.3f %.3f %s --liquid_equ_steps %i &> npt.out' % \ (self.liquid_prod_steps, self.liquid_timestep, self.liquid_interval, temperature, pressure, " --minimize_energy" if self.minimize_energy else "", self.liquid_equ_steps) _exec(cmdstr) # self.DynDict_New[(temperature, pressure)] = os.path.join(os.getcwd(),'liquid.dyn') else: # This part of the code has never been used before # Still need to figure out where to specify GROMACS location on each cluster # queue_up(wq, # command = 'python npt.py liquid.xyz %.3f %.3f &> npt.out' % (temperature, pressure), # input_files = ['liquid.xyz','liquid.key','mono.xyz','mono.key','forcebalance.p','npt.py'], # output_files = ['npt_result.p.bz2', 'npt.py'] + self.FF.fnms, # tgt=self) raise RuntimeError('Remote GROMACS execution is not yet enabled')
def run_simulation(self, label, liq, AGrad=True): """ Submit a simulation to the Work Queue or run it locally. Inputs: label = The name of the molecule (and hopefully the folder name that you're running in) liq = True/false flag indicating whether to run in liquid or gas phase """ wq = getWorkQueue() # Create a dictionary of MD options that the script will read. md_opts = OrderedDict() md_opts['temperature'] = self.hfe_temperature md_opts['pressure'] = self.hfe_pressure md_opts['minimize'] = True if liq: sdnm = 'liq' md_opts['nequil'] = self.liquid_eq_steps md_opts['nsteps'] = self.liquid_md_steps md_opts['timestep'] = self.liquid_timestep md_opts['sample'] = self.liquid_interval else: sdnm = 'gas' md_opts['nequil'] = self.gas_eq_steps md_opts['nsteps'] = self.gas_md_steps md_opts['timestep'] = self.gas_timestep md_opts['sample'] = self.gas_interval eng_opts = deepcopy(self.engine_opts) # Enforce implicit solvent in the liquid simulation. # We need to be more careful with this when running explicit solvent. eng_opts['implicit_solvent'] = liq eng_opts['coords'] = os.path.basename(self.molecules[label]) if not os.path.exists(sdnm): os.makedirs(sdnm) os.chdir(sdnm) if not os.path.exists('md_result.p'): # Link in a bunch of files... what were these again? link_dir_contents(os.path.join(self.root,self.rundir),os.getcwd()) # Link in the scripts required to run the simulation for f in self.scripts: LinkFile(os.path.join(os.path.split(__file__)[0],"data",f),os.path.join(os.getcwd(),f)) # Link in the coordinate file. LinkFile(self.molecules[label], './%s' % os.path.basename(self.molecules[label])) # Store names of previous trajectory files. self.last_traj += [os.path.join(os.getcwd(), i) for i in self.extra_output] # Write target, engine and simulation options to disk. lp_dump((self.OptionDict, eng_opts, md_opts), 'simulation.p') # Execute the script for running molecular dynamics. cmdstr = '%s python md_ism_hfe.py %s' % (self.prefix, "-g" if AGrad else "") if wq is None: logger.info("Running condensed phase simulation locally.\n") logger.info("You may tail -f %s/npt.out in another terminal window\n" % os.getcwd()) _exec(cmdstr, copy_stderr=True, outfnm='md.out') else: queue_up(wq, command = cmdstr+' &> md.out', tag='%s:%s/%s' % (self.name, label, "liq" if liq else "gas"), input_files = self.scripts + ['simulation.p', 'forcefield.p', os.path.basename(self.molecules[label])], output_files = ['md_result.p', 'md.out'] + self.extra_output, tgt=self, verbose=False, print_time=3600) os.chdir('..')
def submit_jobs(self, mvals, AGrad=True, AHess=True): """This routine is called by Objective.stage() and will run before "get". It submits the jobs and the stage() function will wait for jobs to complete. Parameters ---------- mvals : list Mathematical parameter values. AGrad : Boolean Switch to turn on analytic gradient. AHess : Boolean Switch to turn on analytic Hessian. Returns ------- Nothing. """ # Set up and run the simulation chain on all points. for pt in self.points: # Create subdir try: os.makedirs(str(pt.idnr)) except OSError as exception: if exception.errno != errno.EEXIST: raise # Goto subdir os.chdir(str(pt.idnr)) # Link dir contents from target subdir to current temp directory. for f in self.scripts: LinkFile(os.path.join(self.root, self.tempdir, f), os.path.join(os.getcwd(), f)) link_dir_contents(os.path.join(self.root, self.tgtdir, str(pt.idnr)), os.getcwd()) # Dump the force field to a pickle file with wopen('forcebalance.p') as f: lp_dump((self.FF, mvals, self.OptionDict, AGrad), f) # Run the simulation chain for point. cmdstr = ("%s python md_chain.py " % self.mdpfx + " ".join(self.quantities) + " " + "--engine %s " % self.engname + "--length %d " % self.n_sim_chain + "--name %s " % self.simpfx + "--temperature %f " % pt.temperature + "--pressure %f " % pt.pressure + "--nequil %d " % self.eq_steps + "--nsteps %d " % self.md_steps) _exec(cmdstr, copy_stderr=True, outfnm='md_chain.out') os.chdir('..')
def submit_jobs(self, mvals, AGrad=True, AHess=True): """This routine is called by Objective.stage() and will run before "get". It submits the jobs and the stage() function will wait for jobs to complete. Parameters ---------- mvals : list Mathematical parameter values. AGrad : Boolean Switch to turn on analytic gradient. AHess : Boolean Switch to turn on analytic Hessian. Returns ------- Nothing. """ # Set up and run the simulation chain on all points. for pt in self.points: # Create subdir try: os.makedirs(str(pt.idnr)) except OSError as exception: if exception.errno != errno.EEXIST: raise # Goto subdir os.chdir(str(pt.idnr)) # Link dir contents from target subdir to current temp directory. for f in self.scripts: LinkFile(os.path.join(self.root, self.tempdir, f), os.path.join(os.getcwd(), f)) link_dir_contents(os.path.join(self.root, self.tgtdir, str(pt.idnr)), os.getcwd()) # Dump the force field to a pickle file lp_dump((self.FF, mvals, self.OptionDict, AGrad), 'forcebalance.p') # Run the simulation chain for point. cmdstr = ("%s python md_chain.py " % self.mdpfx + " ".join(self.quantities) + " " + "--engine %s " % self.engname + "--length %d " % self.n_sim_chain + "--name %s " % self.simpfx + "--temperature %f " % pt.temperature + "--pressure %f " % pt.pressure + "--nequil %d " % self.eq_steps + "--nsteps %d " % self.md_steps) _exec(cmdstr, copy_stderr=True, outfnm='md_chain.out') os.chdir('..')
def link_from_tempdir(self, absdestdir): link_dir_contents(os.path.join(self.root, self.tempdir), absdestdir)
def link_from_tempdir(self,absdestdir): link_dir_contents(os.path.join(self.root,self.tempdir), absdestdir)