From 49b72ac36e14dbb8baab462df03c8621b999adbf Mon Sep 17 00:00:00 2001 From: sjplimp <sjplimp@f3b2605a-c512-4ea7-a41b-209d697bcdaa> Date: Tue, 22 Feb 2011 22:32:28 +0000 Subject: [PATCH] git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@5712 f3b2605a-c512-4ea7-a41b-209d697bcdaa --- tools/eff/README | 5 +++- tools/eff/VMD-input.py | 33 ++++++++++++++-------- tools/eff/cfg2lammps.py | 57 ++++++++++++++++++++++++++++++++------ tools/eff/lmp2radii.py | 10 +++---- tools/eff/lmp2radii.pyx | 8 +++--- tools/eff/lmp2radii_col.py | 6 ++-- tools/eff/lmp2xyz.py | 57 ++++++++++++++++++++++++++++++-------- tools/eff/radii.vmd | 35 +++++++++++++++++++---- 8 files changed, 162 insertions(+), 49 deletions(-) diff --git a/tools/eff/README b/tools/eff/README index edc52edaa0..9c68472c5d 100644 --- a/tools/eff/README +++ b/tools/eff/README @@ -5,9 +5,12 @@ generating LAMMPS structure files: - h2.pl: rectangular lattice of hydrogen atoms - Diamond.pl: diamond A4 box - Li-hydride: Lithium hydride solid box -- Li-solid: Lithium solid box +- Li-solid: Lithium solid box (Li-solid-angstromg produces data file in Angstroms) - Uniform-electron-gas.pl: uniform electron gas on an NaCl lattice +- bohr2ang.py: converts an eFF structure file described in bohr to + its corresponding version in Angstroms + And other useful scripts for processing pEFF related information are included, such as: diff --git a/tools/eff/VMD-input.py b/tools/eff/VMD-input.py index 2d6c5f7233..bb1fa905aa 100644 --- a/tools/eff/VMD-input.py +++ b/tools/eff/VMD-input.py @@ -12,8 +12,8 @@ ajaramil@wag.caltech.edu Project: pEFF Version: August 2009 -Usage: python VMD-input.py lammps_dump_filename radii_column_number -Example: python VMD-input.py dump.lammpstrj 6 +Usage: python VMD-input.py lammps_dump_filename radii_column xpos_column +Example: python VMD-input.py dump.lammpstrj 5 6 1. Extracts the electron radii from a lammps trajectory dump into %s.out 2. Creates %s.xyz file @@ -28,20 +28,31 @@ def printHelp(input): Info%(input,input,input) if __name__ == '__main__': - + # if no input, print help and exit if len(sys.argv) < 2: - print "Usage: python VMD-input.py lammps_dump_filename radii_column_number\n" + print "Usage: python VMD-input.py lammps_dump_filename radii_column xpos_column\n" sys.exit(1) else: infile=sys.argv[1] + workdir=os.getcwd() + tools=sys.argv[0].split('VMD-input.py')[0] # set defaults outfile = infile.split('.')[0] - if len(sys.argv) == 2: + print sys.argv + if len(sys.argv) == 4: column = int(sys.argv[2]) - else: - column=6 # default = radius for dump -> id type x y z spin radius + xpos = int(sys.argv[3]) + print "Assuming xpos=eradius+1" + elif len(sys.argv) == 3: + column = int(sys.argv[2]) + xpos = column+1 + print "Assuming xpos=eradius+1" + elif len(sys.argv) == 2: + column=5 # default = radius for dump -> id type q spin eradius x y z + xpos=6 + else: print "Incorrect number of arguments" # check for input: opts, argv = getopt(sys.argv[1:], 'c:o:ha') @@ -54,12 +65,12 @@ if __name__ == '__main__': outfile=arg if opt == '-c': # select column from lammpstrj file to tabulate column=int(arg) - + print column,xpos makeradii(infile,outfile+".out",column,True) - lmp2xyz(infile,outfile+".xyz") + lmp2xyz(infile,outfile+".xyz",xpos) print "Creating %s file ..."%(outfile+".vmd") - os.system("cat %s | sed 's/xyzfile/%s/' > %s"%("radii.vmd",outfile+".xyz","temp")) - os.system("cat %s | sed 's/radiifile/%s/' > %s; rm temp"%("temp",outfile+".out",outfile+".vmd")) + os.system("cat %s | sed 's/xyzfile/%s/' > %s"%(tools+"radii.vmd",outfile+".xyz","temp")) + os.system("cat %s | sed 's/radiifile/%s/' > %s; rm temp"%("temp",outfile+".out",workdir+'/'+outfile+".vmd")) print "Done !! (you can now source %s using VMD's console) \n"%(outfile+".vmd") print "NOTE: In VMD, set graphics representation for electrons to transparency," diff --git a/tools/eff/cfg2lammps.py b/tools/eff/cfg2lammps.py index 4e200c9723..1bf364aa93 100644 --- a/tools/eff/cfg2lammps.py +++ b/tools/eff/cfg2lammps.py @@ -12,6 +12,8 @@ Version: August 2009 Reads in an eff .cfg file and produces the corresponding lammps data and input files NOTE: Unsupported functions will be reported in the output log + +12/2010: Added support for fixed-core and pseudo-core structures """ # import essentials: @@ -38,15 +40,31 @@ units electron newton on boundary %s -atom_style hybrid charge electron +atom_style electron read_data data.${sname} pair_style eff/cut %s pair_coeff * * +compute energies all pair eff/cut +variable eke equal c_energies[1] +variable epauli equal c_energies[2] +variable estatics equal c_energies[3] +variable errestrain equal c_energies[4] + +communicate single vel yes + +compute peratom all stress/atom +compute p all reduce sum c_peratom[1] c_peratom[2] c_peratom[3] +variable press equal -(c_p[1]+c_p[2]+c_p[3])/(3*vol) + +compute effTemp all temp/eff +compute effPress all pressure effTemp + thermo %s -thermo_style multi +thermo_style custom step etotal pe ke v_eke v_epauli v_estatics v_errestrain temp press v_press +thermo_modify temp effTemp press effPress """ #%(date,name,boundary,cutoff,period) @@ -55,7 +73,7 @@ minimize=""" min_style cg dump 1 %s xyz %s ${sname}.min.xyz -dump 2 %s custom %s ${sname}.min.lammpstrj id type x y z radius fx fy fz rf +dump 2 %s custom %s ${sname}.min.lammpstrj id type q spin eradius x y z fx fy fz erforce min_modify line quadratic minimize 0 1.0e-5 %s %s @@ -77,7 +95,7 @@ timestep %s fix %s -dump 1 %s custom %s ${sname}.%s.lammpstrj id type x y z spin radius +dump 1 %s custom %s ${sname}.%s.lammpstrj id type q spin eradius x y z dump 2 %s custom %s ${sname}.%s.xyz run %s @@ -114,8 +132,10 @@ def generate_lammps_input(infile): lines = fin.xreadlines() print 7*"\b"+"[DONE]" + numcores=0 numnuclei=0 numelec=0 + cores={} nuclei={} electrons={} masses=[] @@ -132,6 +152,9 @@ def generate_lammps_input(infile): if line.find("@params")==0: flag='params' continue + elif line.find("@cores")==0: + flag='cores' + continue elif line.find("@nuclei")==0: flag='nuclei' continue @@ -198,7 +221,7 @@ def generate_lammps_input(infile): if line.find("set_limit_stiffness")>=0: continue if line.find("output_position")>=0: - dump_pos="dump\t1 all custom %s ${sname}.lammpstrj id type x y z spin radius "%(period) + dump_pos="dump\t1 all custom %s ${sname}.lammpstrj id type q spin eradius x y z "%(period) if line.find("output_velocities")>=0: dump_pos+="vx vy vz " if line.find("output_energy_forces")>=0: @@ -232,6 +255,22 @@ def generate_lammps_input(infile): cutoff=line.split()[2] continue + if flag=='cores' and len(line)>1: + numcores+=1 + ln=line.split() + nc=' '.join(ln[0:3]) + q=ln[3] + spin='3' + radius=ln[4] + m=q2m[int(float(q))] + if m not in masses: + masses.append(m) + massstr+="%d %s\n"%(types,m) + q2type[q]=types + types+=1 + cores[numcores]=[nc,q,spin,radius] + continue + if flag=='nuclei' and len(line)>1: numnuclei+=1 ln=line.split() @@ -282,15 +321,17 @@ def generate_lammps_input(infile): print "Writing datafile to %s ... "%('data.'+infile), sys.stdout.flush() print "\b"*19+"General section ", - datafile.writelines("Created using cfg2lammps (c) AJB-2009\n\n%d atoms\n%d atom types\n\n%s%s%s\n"%(numnuclei+numelec,types,xbound,ybound,zbound)) + datafile.writelines("Created using cfg2lammps (c) AJB-2009\n\n%d atoms\n%d atom types\n\n%s%s%s\n"%(numcores+numnuclei+numelec,types,xbound,ybound,zbound)) print "\b"*19+"Masses section ", datafile.writelines(massstr) print "\b"*19+"Atoms section ", datafile.writelines("Atoms\n\n") + for n in range(numcores): + datafile.writelines("%d %d %2.2f %s %s %s\n"%(n+1,q2type[cores[n+1][1]],float(cores[n+1][1]),cores[n+1][2],cores[n+1][3],cores[n+1][0])) for n in range(numnuclei): - datafile.writelines("%d %d %s %s 0 0.0\n"%(n+1,q2type[nuclei[n+1][1]],nuclei[n+1][0],nuclei[n+1][1])) + datafile.writelines("%d %d %2.2f 0 0.0 %s\n"%(n+numcores+1,q2type[nuclei[n+1][1]],float(nuclei[n+1][1]),nuclei[n+1][0])) for e in range(numelec): - datafile.write("%d %d %s 0.0 %s %s\n"%(e+numnuclei+1,types,electrons[e+1][0],electrons[e+1][1],electrons[e+1][2])) + datafile.write("%d %d 0.0 %s %s %s\n"%(e+numnuclei+numcores+1,types,electrons[e+1][1],electrons[e+1][2],electrons[e+1][0])) print "\b"*19+"Velocities section\n", datafile.writelines(vels) datafile.writelines("\n") diff --git a/tools/eff/lmp2radii.py b/tools/eff/lmp2radii.py index 28c23d6289..488d19932c 100644 --- a/tools/eff/lmp2radii.py +++ b/tools/eff/lmp2radii.py @@ -11,9 +11,9 @@ Version: August 2009 Extracts the electron radii from a lammps trajectory dump of style custom: -dump 1 all custom period dump_file id type x y z spin radius ... +dump 1 all custom period dump_file id type q spin eradius x y z... -NOTE: The radius must be the 6th column per trajectory entry in the dump file +NOTE: The radius must be the 5th column per trajectory entry in the dump file """ @@ -45,7 +45,7 @@ def makeradii(infile): tmp=open("atoms",'r') atoms=int(tmp.readlines()[1].split()[0]) tmp.close() - os.system("rm -rf frames atoms") + os.system("rm -rf frames atoms lines") arry=numpy.zeros((atoms,frames),dtype=float) framecnt=0 header=9 @@ -59,8 +59,8 @@ def makeradii(infile): elif (i >= lo) and (i < hi): lparse=line.split() id=int(lparse[0]) - r=float(lparse[6]) - if (r!=0): + r=float(lparse[4]) + if (r!=0.0): arry[id-1][framecnt]=r if (framecnt==0): ecount+=1 if (i==lo+1): diff --git a/tools/eff/lmp2radii.pyx b/tools/eff/lmp2radii.pyx index f114f243ca..5e109fea15 100644 --- a/tools/eff/lmp2radii.pyx +++ b/tools/eff/lmp2radii.pyx @@ -11,9 +11,9 @@ Version: August 2009 Extracts the electron radii from a lammps trajectory dump of style custom: -dump 1 all custom period dump_file id type x y z spin radius ... +dump 1 all custom period dump_file id type q spin eradius x y z... -NOTE: The radius must be the 6th column per trajectory entry in the dump file +NOTE: The radius must be the 5th column per trajectory entry in the dump file """ @@ -59,7 +59,7 @@ def makeradii(infile): elif (i >= lo) and (i < hi): lparse=line.split() id=int(lparse[0]) - r=float(lparse[6]) + r=float(lparse[4]) if (r!=0): arry[id-1][framecnt]=r if (framecnt==0): ecount+=1 @@ -87,7 +87,7 @@ def makeradii(infile): fout.writelines("%f\t"%(arry[a][f])) fout.writelines("\n") print - print "DONE .... GOODBYE !!" + print "Done !! (generated radii/frame table) \n" fout.close() fin.close() diff --git a/tools/eff/lmp2radii_col.py b/tools/eff/lmp2radii_col.py index d5505116e9..653fccbb66 100644 --- a/tools/eff/lmp2radii_col.py +++ b/tools/eff/lmp2radii_col.py @@ -11,7 +11,7 @@ Version: August 2009 Extracts the electron radii from a lammps trajectory dump of style custom: -dump 1 all custom period dump_file id type x y z spin radius ... +dump 1 all custom period dump_file id type spin eradius x y z ... NOTE: The radius must be the "column" per trajectory entry in the dump file @@ -59,7 +59,7 @@ def makeradii(infile,outfile,column,True): elif (i >= lo) and (i < hi): lparse=line.split() id=int(lparse[0]) - r=float(lparse[column]) + r=float(lparse[column-1]) if (r!=0): arry[id-1][framecnt]=r if (framecnt==0): ecount+=1 @@ -96,7 +96,7 @@ if __name__ == '__main__': # set defaults outfile = "" flag_all = False - column=6 # default = radius + column=5 # default = radius # check for input: opts, argv = getopt(sys.argv[1:], 'c:o:ha') diff --git a/tools/eff/lmp2xyz.py b/tools/eff/lmp2xyz.py index 704188118c..8fa9660ec1 100644 --- a/tools/eff/lmp2xyz.py +++ b/tools/eff/lmp2xyz.py @@ -15,15 +15,35 @@ Usage: python lmp2xyz.py lammps_dump_filename xyz_filename """ import os, sys -from math import log10 +from math import log10,floor from numpy import zeros -mass={"1.00794":"H","4.002602":"He","6.941":"Li","9.012182":"Be","10.811":"B","12.0107":"C","1.00":"Au","0.0005486":"Au"} +masses={"1.00794":"H","4.002602":"He","6.941":"Li","9.012182":"Be","10.811":"B","12.0107":"C","1.00":"Au","0.0005486":"Au"} +mass_floor={1:"H",4:"He",6:"Li",9:"Be",10:"B",12:"C",0:"Au",28:"Si"} -def lmp2xyz(lammps,xyz): +def lmp2xyz(lammps,xyz,xpos): print "\nGenerating %s file"%(xyz) fin=open(lammps,'r') fout=open(xyz,'w') + data=raw_input("Do you have a corresponding data file? please enter filename or 'n': ") + count=1 + if data!='n': + dataf=open(data,'r') + datafile=dataf.readlines() + dataf.close() + for line in datafile: + if line.find("atom types")>=0: + numtypes=int(line.split()[0]) + mass=zeros(numtypes,dtype=float) + elif line.find("Masses")>=0: + count+=1+datafile.index(line) + elif line.find("Atoms")>=0: + break + for i in range(numtypes): + mass[i]=float(datafile[count].split()[1]) + count+=1 + else: + print "\nWill continue without a data file specification" header=9 lines=fin.readlines() numatoms=lines[3].split()[0] @@ -31,13 +51,15 @@ def lmp2xyz(lammps,xyz): tmp=open('lines','r') tlines=tmp.readline() tmp.close() + os.system("rm lines") flines=int(tlines.split()[0]) snaps=flines/(int(numatoms)+header) countsnap=1 - coords=zeros((int(numatoms),4),dtype=float) + if data!='n': coords={} + else: coords=zeros((int(numatoms),4),dtype=float) sys.stdout.write("Writing [%d]: "%(snaps)) sys.stdout.flush() - read_atoms=1 + read_atoms=0 for line in lines: if line.find('ITEM: TIMESTEP')==0: read_atom_flag=False @@ -53,14 +75,23 @@ def lmp2xyz(lammps,xyz): read_atoms+=1 parse=line.split() if parse[0]!="": - coords[int(parse[0])-1][0]=int(parse[1]) - coords[int(parse[0])-1][1]=float(parse[2]) - coords[int(parse[0])-1][2]=float(parse[3]) - coords[int(parse[0])-1][3]=float(parse[4]) +# print [mass_floor[int(floor(mass[int(parse[1])-1]))],float(parse[xpos-1]),float(parse[xpos]),float(parse[xpos+1])] + if data!='n': + if mass[int(parse[1])-1]==1.0: + type='Au' + else: + type=mass_floor[int(floor(mass[int(parse[1])-1]))] + coords[int(parse[0])-1]=[type,float(parse[xpos-1]),float(parse[xpos]),float(parse[xpos+1])] + else: + coords[int(parse[0])-1][0]=int(parse[1]) + coords[int(parse[0])-1][1]=float(parse[xpos-1]) + coords[int(parse[0])-1][2]=float(parse[xpos]) + coords[int(parse[0])-1][3]=float(parse[xpos+1]) if read_atoms==int(numatoms): read_atoms=0 for i in range(int(numatoms)): - fout.writelines("%d %2.4f %2.4f %2.4f\n"%(coords[i][0],coords[i][1],coords[i][2],coords[i][3])) + if data!='n': fout.writelines("%s %2.4f %2.4f %2.4f\n"%(coords[i][0],coords[i][1],coords[i][2],coords[i][3])) + else: fout.writelines("%d %2.4f %2.4f %2.4f\n"%(coords[i][0],coords[i][1],coords[i][2],coords[i][3])) print "\nDone converting to xyz!!\n" fin.close() @@ -76,6 +107,8 @@ if __name__ == '__main__': inputfile=sys.argv[1] outfile=sys.argv[2] - - lmp2xyz(inputfile,outfile.split()[0]) + if len(sys.argv)==4: + xpos=sys.arv[3]-1 + else: xpos=5 + lmp2xyz(inputfile,outfile.split()[0],xpos) diff --git a/tools/eff/radii.vmd b/tools/eff/radii.vmd index d6d211233b..0dfc6e3dc0 100644 --- a/tools/eff/radii.vmd +++ b/tools/eff/radii.vmd @@ -171,7 +171,7 @@ proc do_radii {args} { foreach elec $data_array(0) r $data_array($fr) { set s [atomselect $molid "index [expr {$elec -1}]"] #set nr [expr {exp($r)}] - set nr $r + set nr [expr $r*1.5] $s set radius $nr $s delete #puts stderr "$fr $elec $nr" @@ -192,9 +192,6 @@ global data_array molid set xyz xyzfile set data radiifile -# switch default rep to VDW. -mol default style VDW - # load nuclear and electron xyz trajectory #set xyz [lindex $::argv 0] @@ -202,7 +199,35 @@ mol default style VDW #set datafile [lindex $::argv 1] set molid [mol new $xyz waitfor all] -mol modstyle 0 [molinfo top] VDW 1.0 32.0 +#mol modstyle 0 [molinfo top] VDW 0.2 32.0 + +set s [atomselect $molid "all"] +$s set radius 0.1 +$s delete + +color Display Background white +display projection orthographic + +# switch default rep to VDW. +mol default style VDW +mol delrep 0 $molid +mol selection "name H He Li Be B C Si" +mol addrep $molid +mol modstyle 0 $molid VDW 2.0 32.0 +# spin +1 +mol material Transparent +mol selection "name Au" +mol addrep $molid +mol modstyle 1 $molid VDW 0.4 32.0 +# spin -1 +#mol material Transparent +mol selection "name Tl" +mol addrep $molid +mol modstyle 2 $molid VDW 0.4 32.0 +mol material Opaque +mol selection "name H He Li Be B C Si" +mol addrep $molid +mol modstyle 3 $molid DynamicBonds 1.6 0.1 32 puts "Starting ..." readFile $data -- GitLab