#!/usr/bin/env python -i # preceeding line should have path for Python on your machine # gui.py # Purpose: control a continuously running LAMMPS simulation via a Tkinter GUI # Syntax: gui.py in.lammps Nfreq # in.lammps = LAMMPS input script # Nfreq = query GUI every this many steps # IMPORTANT: this script cannot yet be run in parallel via Pypar, # because I can't seem to do a MPI-style broadcast in Pypar import sys,time # methods called by GUI def go(): global runflag runflag = 1 def stop(): global runflag runflag = 0 def settemp(value): global temptarget temptarget = slider.get() def quit(): global breakflag breakflag = 1 # parse command line argv = sys.argv if len(argv) != 3: print "Syntax: gui.py in.lammps Nfreq" sys.exit() infile = sys.argv[1] nfreq = int(sys.argv[2]) me = 0 # uncomment if running in parallel via Pypar #import pypar #me = pypar.rank() #nprocs = pypar.size() from lammps import lammps lmp = lammps() # run infile all at once # assumed to have no run command in it lmp.file(infile) lmp.command("thermo %d" % nfreq) # display GUI with go/stop/quit buttons and slider for temperature # just proc 0 handles GUI breakflag = 0 runflag = 0 temptarget = 1.0 if me == 0: from Tkinter import * tkroot = Tk() tkroot.withdraw() root = Toplevel(tkroot) root.title("LAMMPS GUI") frame = Frame(root) Button(frame,text="Go",command=go).pack(side=LEFT) Button(frame,text="Stop",command=stop).pack(side=LEFT) slider = Scale(frame,from_=0.0,to=5.0,resolution=0.1, orient=HORIZONTAL,label="Temperature") slider.bind('',settemp) slider.set(temptarget) slider.pack(side=LEFT) Button(frame,text="Quit",command=quit).pack(side=RIGHT) frame.pack() tkroot.update() # endless loop, checking status of GUI settings every Nfreq steps # run with pre yes/no and post yes/no depending on go/stop status # re-invoke fix langevin with new seed when temperature slider changes # after re-invoke of fix langevin, run with pre yes running = 0 temp = temptarget seed = 12345 lmp.command("fix 2 all langevin %g %g 0.1 %d" % (temp,temp,seed)) while 1: if me == 0: tkroot.update() if temp != temptarget: temp = temptarget seed += me+1 lmp.command("fix 2 all langevin %g %g 0.1 %d" % (temp,temp,seed)) running = 0 if runflag and running: lmp.command("run %d pre no post no" % nfreq) elif runflag and not running: lmp.command("run %d pre yes post no" % nfreq) elif not runflag and running: lmp.command("run %d pre no post yes" % nfreq) if breakflag: break if runflag: running = 1 else: running = 0 time.sleep(0.01) # uncomment if running in parallel via Pypar #print "Proc %d out of %d procs has" % (me,nprocs), lmp #pypar.finalize()