[e1a46d] | 1 | #!@PYTHON@
|
---|
| 2 | #
|
---|
| 3 | # Create the steps from bcc to fcc
|
---|
| 4 | #
|
---|
| 5 | # Note: PCP config file should contain two configurations which are linearly interpolated in the given amount of steps
|
---|
| 6 |
|
---|
| 7 | import sys, string, re, math, os
|
---|
| 8 | wrerr = sys.stderr.write
|
---|
| 9 |
|
---|
| 10 | if len(sys.argv) < 3:
|
---|
| 11 | wrerr("Usage: "+sys.argv[0]+" <config> <steps>\n")
|
---|
| 12 | sys.exit(1)
|
---|
| 13 |
|
---|
| 14 | config = open(sys.argv[1], "r")
|
---|
| 15 | steps = int(sys.argv[2])
|
---|
| 16 |
|
---|
| 17 | # find the lines where source and target configuration start
|
---|
| 18 | nr=0
|
---|
| 19 | source=0
|
---|
| 20 | target=0
|
---|
| 21 | box=0
|
---|
| 22 | boxlength = []
|
---|
| 23 | for line in config:
|
---|
| 24 | nr=nr+1
|
---|
| 25 | if re.compile("BoxLength").match(line):
|
---|
| 26 | box=nr
|
---|
| 27 | if box != 0 and nr > box and nr < box+4:
|
---|
| 28 | numbers = line.split()
|
---|
| 29 | for j in range(len(numbers)):
|
---|
| 30 | boxlength.append(float(numbers[j]))
|
---|
| 31 | if re.compile("Ion_Type[0-9]+[_]+").match(line) and source == 0:
|
---|
| 32 | source=nr
|
---|
| 33 | if "# ====== MD step" in line:
|
---|
| 34 | target=nr+1
|
---|
| 35 | if target == 0:
|
---|
| 36 | wrerr("Could find only a single geometry, need at least two!\n")
|
---|
| 37 | sys.exit(1)
|
---|
| 38 | print "Changing from config starting at line %d to the one starting at line %d ..." % (source, target)
|
---|
| 39 |
|
---|
| 40 | #for i in range(len(boxlength)):
|
---|
| 41 | # print "%lg\t" % (boxlength[i])
|
---|
| 42 | # parse the source configuration
|
---|
| 43 | config.seek(0)
|
---|
| 44 | n=0
|
---|
| 45 | nr=0
|
---|
| 46 | sourcepos = []
|
---|
| 47 | sourcemax = [0., 0., 0.]
|
---|
| 48 | for line in config:
|
---|
| 49 | nr=nr+1
|
---|
| 50 | if source > nr:
|
---|
| 51 | continue
|
---|
| 52 | else:
|
---|
| 53 | if re.compile("Ion_Type[0-9]+[_]+").match(line):
|
---|
| 54 | words = line.split()
|
---|
| 55 | print words
|
---|
| 56 | sourcepos.append(words[0]+"="+words[1]+"="+words[2]+"="+words[3])
|
---|
| 57 | for j in range(3):
|
---|
| 58 | if sourcemax[j] < float(words[j+1]):
|
---|
| 59 | sourcemax[j] = float(words[j+1])
|
---|
| 60 | n=n+1
|
---|
| 61 | else:
|
---|
| 62 | if "#" in line: # we break on the next comment line after source
|
---|
| 63 | break
|
---|
| 64 | print "I found ",n," atoms in source config."
|
---|
| 65 |
|
---|
| 66 | # parse the target configuration
|
---|
| 67 | config.seek(0)
|
---|
| 68 | n=0
|
---|
| 69 | nr=0
|
---|
| 70 | targetpos = []
|
---|
| 71 | targetmax= [0., 0., 0.]
|
---|
| 72 | for line in config:
|
---|
| 73 | nr=nr+1
|
---|
| 74 | if target > nr:
|
---|
| 75 | continue
|
---|
| 76 | else:
|
---|
| 77 | if re.compile("Ion_Type[0-9]+[_]+").match(line):
|
---|
| 78 | words = line.split()
|
---|
| 79 | print words
|
---|
| 80 | targetpos.append(words[0]+"="+words[1]+"="+words[2]+"="+words[3])
|
---|
| 81 | for j in range(3):
|
---|
| 82 | if targetmax[j] < float(words[j+1]):
|
---|
| 83 | targetmax[j] = float(words[j+1])
|
---|
| 84 | n=n+1
|
---|
| 85 | else:
|
---|
| 86 | if "#" in line: # we break on the next comment line after source
|
---|
| 87 | break
|
---|
| 88 | print "I found ",n," atoms in target config."
|
---|
| 89 | targetmax[2] = 2.64357
|
---|
| 90 | # Now as we have the two configs, we need go through the steps desired and write the output files
|
---|
| 91 | diff = [0., 0., 0.]
|
---|
| 92 | BoxLength = [0., 0., 0., 0., 0., 0.]
|
---|
| 93 | for i in range(steps+1):
|
---|
| 94 | # change the boxlength
|
---|
| 95 | if i == 0:
|
---|
| 96 | for j in range(6):
|
---|
| 97 | BoxLength[j] = boxlength[j]
|
---|
| 98 | else:
|
---|
| 99 | BoxLength[0] = boxlength[0] + boxlength[0]*(targetmax[0]/sourcemax[0]-1.)*(float(i)/float(steps))
|
---|
| 100 | BoxLength[1] = boxlength[1] + boxlength[1]*(targetmax[0]/sourcemax[0]-1.)*(float(i)/float(steps))
|
---|
| 101 | BoxLength[2] = boxlength[2] + boxlength[2]*(targetmax[1]/sourcemax[1]-1.)*(float(i)/float(steps))
|
---|
| 102 | BoxLength[3] = boxlength[3] + boxlength[3]*(targetmax[0]/sourcemax[0]-1.)*(float(i)/float(steps))
|
---|
| 103 | BoxLength[4] = boxlength[4] + boxlength[4]*(targetmax[0]/sourcemax[0]-1.)*(float(i)/float(steps))
|
---|
| 104 | BoxLength[5] = boxlength[5] + boxlength[5]*(targetmax[2]/sourcemax[2]-1.)*(float(i)/float(steps))
|
---|
| 105 | # write the initial config file to the new destination
|
---|
| 106 | newdir="step%02d" % (i)
|
---|
| 107 | if not os.path.isdir(newdir):
|
---|
| 108 | if os.path.isfile(newdir):
|
---|
| 109 | raise OSError("a file with the same name as the desired " \
|
---|
| 110 | "dir, '%s', already exists." % newdir)
|
---|
| 111 | else:
|
---|
| 112 | os.mkdir(newdir)
|
---|
| 113 | output = file("step%02d/%s" % (i,sys.argv[1]),"w")
|
---|
| 114 | config.seek(0)
|
---|
| 115 | nr=0
|
---|
| 116 | for line in config:
|
---|
| 117 | nr=nr+1
|
---|
| 118 | if box < nr and box+4 > nr:
|
---|
| 119 | j=nr-box-1
|
---|
| 120 | for m in range(j+1):
|
---|
| 121 | if j==2:
|
---|
| 122 | j=j+1
|
---|
| 123 | output.write("%lg\t" % (BoxLength[j+m]))
|
---|
| 124 | else:
|
---|
| 125 | output.write("%lg\t" % (BoxLength[j+m]))
|
---|
| 126 | output.write("\n")
|
---|
| 127 | continue
|
---|
| 128 | output.write(line)
|
---|
| 129 | if source <= nr+1:
|
---|
| 130 | break
|
---|
| 131 | # add the shifted coordinates
|
---|
| 132 | for j in range(n):
|
---|
| 133 | sourceatoms = sourcepos[j].split("=")
|
---|
| 134 | targetatoms = targetpos[j].split("=")
|
---|
| 135 | for m in range(3):
|
---|
| 136 | diff[m] = (float(targetatoms[m+1])-float(sourceatoms[m+1]))*float(i)/float(steps)
|
---|
| 137 | output.write("%s\t%2.10f\t%2.10f\t%2.10f\t#\n" % (sourceatoms[0], float(sourceatoms[1])+diff[0], float(sourceatoms[2])+diff[1], float(sourceatoms[3])+diff[2]))
|
---|
| 138 | output.close()
|
---|
| 139 | config.close()
|
---|