root / prepareQMX / prepareQMX.new.py @ 10
Historique | Voir | Annoter | Télécharger (9,57 ko)
1 |
#!/usr/bin/env python
|
---|---|
2 |
|
3 |
# command line interface for setup of QMX calculations
|
4 |
#
|
5 |
# Torsten Kerber, ENS LYON: 2011, 07, 11
|
6 |
#
|
7 |
# This work is supported by Award No. UK-C0017, made by King Abdullah
|
8 |
# University of Science and Technology (KAUST)
|
9 |
|
10 |
#---------------------------------------------------------------------------------------------------
|
11 |
import os, sys |
12 |
from copy import deepcopy |
13 |
from optparse import OptionParser |
14 |
|
15 |
#---------------------------------------------------------------------------------------------------
|
16 |
from qmxEMBED import embedDefinitions |
17 |
from qmxJOB import jobDefinitions |
18 |
from qmxSTR import strDefinitions |
19 |
from qmxCALC import calcDefinitions, QmxCalcDefinition |
20 |
|
21 |
from qmxWRITE import writeData |
22 |
|
23 |
#---------------------------------------------------------------------------------------------------
|
24 |
#---------------------------------------------------------------------------------------------------
|
25 |
#---------------------------------------------------------------------------------------------------
|
26 |
def getline(section, subsection, lines): |
27 |
nline = -1
|
28 |
for iline in xrange(len(lines)): |
29 |
if lines[iline][0].strip() == subsection: |
30 |
if nline != -1: |
31 |
sys.stderr.write("section: <"+section+separator+subsection+"> has been definied more than once\n") |
32 |
sys.exit(1)
|
33 |
nline = iline |
34 |
if nline == -1: |
35 |
return None |
36 |
return lines[nline][1].strip() |
37 |
|
38 |
#---------------------------------------------------------------------------------------------------
|
39 |
def analyzeSection(definitions, section, lines): |
40 |
line = getline(section, "program", lines)
|
41 |
if line is None: |
42 |
print "section <" + section + "> does not contain program" |
43 |
sys.exit(1)
|
44 |
|
45 |
myDefinition = None
|
46 |
for definition in definitions: |
47 |
if definition.name == line:
|
48 |
myDefinition = deepcopy(definition) |
49 |
break
|
50 |
|
51 |
if myDefinition is None: |
52 |
print "the program <" + line + "> is not defined for the section <" + section + ">" |
53 |
sys.exit(1)
|
54 |
|
55 |
myDefinition.system = section |
56 |
|
57 |
subsections = [] |
58 |
for line in lines: |
59 |
subsections.append(line[0].strip().lower())
|
60 |
|
61 |
for subsection in subsections: |
62 |
line = getline(section, subsection, lines) |
63 |
if line is None: |
64 |
print "input error in <"+section+"."+subsection+">" |
65 |
sys.exit(1)
|
66 |
if subsection == "program": |
67 |
continue
|
68 |
if subsection == "options": |
69 |
subsection = 'class.options'
|
70 |
|
71 |
myDefinition.keywords[subsection] = line |
72 |
print subsection, myDefinition.keywords[subsection]
|
73 |
|
74 |
return myDefinition
|
75 |
|
76 |
#---------------------------------------------------------------------------------------------------
|
77 |
#--- setting default values ------------------------------------------------------------------------
|
78 |
#---------------------------------------------------------------------------------------------------
|
79 |
|
80 |
#define separators
|
81 |
separator=":"
|
82 |
subseparator="."
|
83 |
lineseparator="\n"
|
84 |
|
85 |
#--- parse arguments -------------------------------------------------------------------------------
|
86 |
#parse arguments (python 2.6)
|
87 |
parser = OptionParser() |
88 |
parser.add_option("-i", "--infile", dest="inputFile", help="specifies the input file", metavar="FILE", default="qmx.in") |
89 |
parser.add_option("-o", "--outfile", dest="outputFile", help="specifies the output file", metavar="FILE") |
90 |
parser.add_option("-f", action="store_true", dest="overwrite") |
91 |
(options, args) = parser.parse_args() |
92 |
|
93 |
#--- check wether output file exists ---------------------------------------------------------------
|
94 |
if options.outputFile is not None and os.path.exists(options.outputFile) and not options.overwrite: |
95 |
sys.stderr.write(lineseparator+"the output file <"+options.outputFile+"> already exists"+lineseparator) |
96 |
sys.exit(1)
|
97 |
|
98 |
#--- read intput file ------------------------------------------------------------------------------
|
99 |
file=open(options.inputFile, "r") |
100 |
lines = file.readlines()
|
101 |
file.close()
|
102 |
|
103 |
#--- remove comments -------------------------------------------------------------------------------
|
104 |
for iline in xrange(len(lines)): |
105 |
lines[iline] = lines[iline].split("#")[0] |
106 |
|
107 |
#--- collect data in class -------------------------------------------------------------------------
|
108 |
definitions=[] |
109 |
definitions.append(QmxCalcDefinition()) |
110 |
|
111 |
#--- analyze the input file ------------------------------------------------------------------------
|
112 |
for section in "high-level", "low-level", "cluster", "system", "job": |
113 |
#search lines for section
|
114 |
lines_section=[] |
115 |
for line in lines: |
116 |
line = line.split(separator) |
117 |
if line[0].find(section) >= 0: |
118 |
line[0] = line[0].replace(section+subseparator, "") |
119 |
lines_section.append(line) |
120 |
|
121 |
#calculators
|
122 |
if section == "high-level" or section == "low-level": |
123 |
definitions.append(analyzeSection(calcDefinitions, section, lines_section)) |
124 |
|
125 |
#structures (atoms)
|
126 |
if section == "cluster" or section == "system": |
127 |
definitions.append(analyzeSection(strDefinitions, section, lines_section)) |
128 |
|
129 |
#job
|
130 |
if section == "job": |
131 |
definitions.append(analyzeSection(jobDefinitions, section, lines_section)) |
132 |
|
133 |
#embed
|
134 |
if section == "embed": |
135 |
definitions.append(analyzeSection(embedDefinitions, section, lines_section)) |
136 |
|
137 |
output = None
|
138 |
if options.outputFile is None: |
139 |
output=sys.stdout |
140 |
else:
|
141 |
output=open(options.outputFile, "w") |
142 |
|
143 |
writeData(output, definitions) |
144 |
output.close() |
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
#
|
153 |
##--- write header ----------------------------------------------------------------------------------
|
154 |
#output.write("#!/usr/bin/env python\n")
|
155 |
#
|
156 |
##--- write import lines ----------------------------------------------------------------------------
|
157 |
#xlines=[]
|
158 |
#for data in data_collection:
|
159 |
# value = data.str_import
|
160 |
# if value is None or value in xlines:
|
161 |
# continue
|
162 |
# xlines.append(value)
|
163 |
# output.write(value+lineseparator)
|
164 |
#output.write(lineseparator)
|
165 |
#
|
166 |
##--- define the methods ----------------------------------------------------------------------------
|
167 |
#for system in 'high', 'low':
|
168 |
# for data in data_collection:
|
169 |
# if data.__name__ == system+"-level":
|
170 |
# output.write(system+"Level = "+data.str_class+"("+data.str_option+")"+lineseparator)
|
171 |
#output.write(lineseparator)
|
172 |
#
|
173 |
##--- qmx class (substraction scheme ----------------------------------------------------------------
|
174 |
#for data in data_collection:
|
175 |
# if data.__name__ == "qmx":
|
176 |
# output.write("qmx = "+data.str_class+"("+data.str_option+")"+lineseparator)
|
177 |
#output.write(lineseparator)
|
178 |
#
|
179 |
##--- read all the systems --------------------------------------------------------------------------
|
180 |
#for system in "cluster", "system":
|
181 |
# for data in data_collection:
|
182 |
# if data.__name__ == system:
|
183 |
# if data.str_structure is None:
|
184 |
# continue
|
185 |
# output.write(system+" = "+data.str_class+"(\""+data.str_structure+"\")"+lineseparator)
|
186 |
#output.write(lineseparator)
|
187 |
#
|
188 |
##--- embeding class --------------------------------------------------------------------------------
|
189 |
#for data in data_collection:
|
190 |
# if data.__name__ == "embed":
|
191 |
# output.write("embed = "+data.str_class+"("+data.str_option+")"+lineseparator)
|
192 |
# for method in data.str_methods:
|
193 |
# output.write("embed."+method+lineseparator)
|
194 |
#output.write(lineseparator)
|
195 |
#
|
196 |
##--- dynamics class --------------------------------------------------------------------------------
|
197 |
#for data in data_collection:
|
198 |
# if data.__name__ == "dynamics":
|
199 |
# output.write("dyn="+data.str_class+"(embed)"+lineseparator)
|
200 |
# output.write("dyn.run("+data.str_option+")"+lineseparator)
|
201 |
#
|
202 |
#
|
203 |
#
|
204 |
#
|
205 |
#
|
206 |
#def getline(section, subsection, lines):
|
207 |
# nline = -1
|
208 |
# for iline in xrange(len(lines)):
|
209 |
# if lines[iline][0].strip() == subsection:
|
210 |
# if nline != -1:
|
211 |
# sys.stderr.write("section: <"+section+separator+subsection+"> has been definied more than once\n")
|
212 |
# sys.exit(1)
|
213 |
# nline = iline
|
214 |
# if nline == -1:
|
215 |
# return None
|
216 |
# return lines[nline][1].strip()
|
217 |
#
|
218 |
##def analyzeAtoms(section, lines):
|
219 |
## data = Data(section)
|
220 |
## line = getline(section, "program", lines)
|
221 |
## if line is None:
|
222 |
## line=""
|
223 |
## if line.lower() == "turbomole":
|
224 |
## data.str_import = "from ase.io.turbomole import read_turbomole"
|
225 |
## data.str_class = "read_turbomole"
|
226 |
## elif line.lower() == "vasp":
|
227 |
## data.str_import = "from ase.io.vasp import read_vasp"
|
228 |
## data.str_class = "read_vasp"
|
229 |
##
|
230 |
## data.str_structure = getline(section, "structure", lines)
|
231 |
## return data
|
232 |
##
|
233 |
##def analyzeCalculator(section, lines):
|
234 |
## data = Data(section)
|
235 |
## #read programs
|
236 |
## line = getline(section, "program", lines)
|
237 |
## if line.lower() == "turbomole":
|
238 |
## data.str_import = "from ase.calculators.turbomole import Turbomole"
|
239 |
## data.str_class = "Turbomole"
|
240 |
## elif line.lower() == "vasp":
|
241 |
## data.str_import = "from ase.calculators.vasp import Vasp"
|
242 |
## data.str_class = "Vasp"
|
243 |
##
|
244 |
## str = getline(section, "class", lines)
|
245 |
## if str is not None:
|
246 |
## data.str_class = str
|
247 |
##
|
248 |
## str = getline(section, "import", lines)
|
249 |
## if str is not None:
|
250 |
## data.str_import = str
|
251 |
##
|
252 |
## str = getline(section, "options", lines)
|
253 |
## if str is not None:
|
254 |
## data.str_option = str
|
255 |
## return data
|
256 |
##
|
257 |
##def analyzeDynamics(section, lines):
|
258 |
## data = Data(section)
|
259 |
## line = getline(section, "method", lines)
|
260 |
## if line.lower() == "optimizer":
|
261 |
## data.str_import = "from ase.optimize import QuasiNewton"
|
262 |
## data.str_class = "QuasiNewton"
|
263 |
## return data
|
264 |
|