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