root / prepareQMX / prepareQMX.py @ 10
Historique | Voir | Annoter | Télécharger (7,3 ko)
1 | 10 | tkerber | #!/usr/bin/env python
|
---|---|---|---|
2 | 10 | tkerber | import os, sys |
3 | 10 | tkerber | from optparse import OptionParser |
4 | 10 | tkerber | |
5 | 10 | tkerber | class Data: |
6 | 10 | tkerber | def __init__(self, name): |
7 | 10 | tkerber | self.__name__ = name
|
8 | 10 | tkerber | self.str_option = "" |
9 | 10 | tkerber | self.str_import = None |
10 | 10 | tkerber | self.str_class = None |
11 | 10 | tkerber | self.str_methods = []
|
12 | 10 | tkerber | self.str_structure = None |
13 | 10 | tkerber | |
14 | 10 | tkerber | def __str__(self): |
15 | 10 | tkerber | return self.__name__ |
16 | 10 | tkerber | |
17 | 10 | tkerber | def getline(section, subsection, lines): |
18 | 10 | tkerber | nline = -1
|
19 | 10 | tkerber | for iline in xrange(len(lines)): |
20 | 10 | tkerber | if lines[iline][0].strip() == subsection: |
21 | 10 | tkerber | if nline != -1: |
22 | 10 | tkerber | sys.stderr.write("section: <"+section+separator+subsection+"> has been definied more than once\n") |
23 | 10 | tkerber | sys.exit(1)
|
24 | 10 | tkerber | nline = iline |
25 | 10 | tkerber | if nline == -1: |
26 | 10 | tkerber | return None |
27 | 10 | tkerber | return lines[nline][1].strip() |
28 | 10 | tkerber | |
29 | 10 | tkerber | def analyzeAtoms(section, lines): |
30 | 10 | tkerber | data = Data(section) |
31 | 10 | tkerber | line = getline(section, "program", lines)
|
32 | 10 | tkerber | if line is None: |
33 | 10 | tkerber | line=""
|
34 | 10 | tkerber | if line.lower() == "turbomole": |
35 | 10 | tkerber | data.str_import = "from ase.io.turbomole import read_turbomole"
|
36 | 10 | tkerber | data.str_class = "read_turbomole"
|
37 | 10 | tkerber | elif line.lower() == "vasp": |
38 | 10 | tkerber | data.str_import = "from ase.io.vasp import read_vasp"
|
39 | 10 | tkerber | data.str_class = "read_vasp"
|
40 | 10 | tkerber | |
41 | 10 | tkerber | data.str_structure = getline(section, "structure", lines)
|
42 | 10 | tkerber | return data
|
43 | 10 | tkerber | |
44 | 10 | tkerber | def analyzeCalculator(section, lines): |
45 | 10 | tkerber | data = Data(section) |
46 | 10 | tkerber | #read programs
|
47 | 10 | tkerber | line = getline(section, "program", lines)
|
48 | 10 | tkerber | if line.lower() == "turbomole": |
49 | 10 | tkerber | data.str_import = "from ase.calculators.turbomole import Turbomole"
|
50 | 10 | tkerber | data.str_class = "Turbomole"
|
51 | 10 | tkerber | elif line.lower() == "vasp": |
52 | 10 | tkerber | data.str_import = "from ase.calculators.vasp import Vasp"
|
53 | 10 | tkerber | data.str_class = "Vasp"
|
54 | 10 | tkerber | |
55 | 10 | tkerber | str = getline(section, "class", lines)
|
56 | 10 | tkerber | if str is not None: |
57 | 10 | tkerber | data.str_class = str
|
58 | 10 | tkerber | |
59 | 10 | tkerber | str = getline(section, "import", lines)
|
60 | 10 | tkerber | if str is not None: |
61 | 10 | tkerber | data.str_import = str
|
62 | 10 | tkerber | |
63 | 10 | tkerber | str = getline(section, "options", lines)
|
64 | 10 | tkerber | if str is not None: |
65 | 10 | tkerber | data.str_option = str
|
66 | 10 | tkerber | return data
|
67 | 10 | tkerber | |
68 | 10 | tkerber | def analyzeDynamics(section, lines): |
69 | 10 | tkerber | data = Data(section) |
70 | 10 | tkerber | line = getline(section, "method", lines)
|
71 | 10 | tkerber | if line.lower() == "optimizer": |
72 | 10 | tkerber | data.str_import = "from ase.optimize import QuasiNewton"
|
73 | 10 | tkerber | data.str_class = "QuasiNewton"
|
74 | 10 | tkerber | return data
|
75 | 10 | tkerber | |
76 | 10 | tkerber | #--- setting default values ------------------------------------------------------------------------
|
77 | 10 | tkerber | #define separators
|
78 | 10 | tkerber | separator=":"
|
79 | 10 | tkerber | subseparator="."
|
80 | 10 | tkerber | lineseparator="\n"
|
81 | 10 | tkerber | |
82 | 10 | tkerber | #--- parse arguments -------------------------------------------------------------------------------
|
83 | 10 | tkerber | #parse arguments (python 2.6)
|
84 | 10 | tkerber | parser = OptionParser() |
85 | 10 | tkerber | parser.add_option("-i", "--infile", dest="inputFile", help="specifies the input file", metavar="FILE", default="qmx.in") |
86 | 10 | tkerber | parser.add_option("-o", "--outfile", dest="outputFile", help="specifies the output file", metavar="FILE") |
87 | 10 | tkerber | parser.add_option("-f", action="store_true", dest="overwrite") |
88 | 10 | tkerber | (options, args) = parser.parse_args() |
89 | 10 | tkerber | |
90 | 10 | tkerber | file=open(options.inputFile, "r") |
91 | 10 | tkerber | lines = file.readlines()
|
92 | 10 | tkerber | file.close()
|
93 | 10 | tkerber | |
94 | 10 | tkerber | |
95 | 10 | tkerber | #--- split intput file -----------------------------------------------------------------------------
|
96 | 10 | tkerber | |
97 | 10 | tkerber | #--- remove comments -------------------------------------------------------------------------------
|
98 | 10 | tkerber | for iline in xrange(len(lines)): |
99 | 10 | tkerber | lines[iline] = lines[iline].split("#")[0] |
100 | 10 | tkerber | |
101 | 10 | tkerber | #--- collect data in class -------------------------------------------------------------------------
|
102 | 10 | tkerber | data_collection=[] |
103 | 10 | tkerber | |
104 | 10 | tkerber | #--- settings for QMX class ------------------------------------------------------------------------
|
105 | 10 | tkerber | data = Data("qmx")
|
106 | 10 | tkerber | data.str_class = "Qmx"
|
107 | 10 | tkerber | data.str_import = "from ase.calculators.qmx import Qmx"
|
108 | 10 | tkerber | data.str_option = "highLevel, lowLevel"
|
109 | 10 | tkerber | |
110 | 10 | tkerber | data_collection.append(data) |
111 | 10 | tkerber | |
112 | 10 | tkerber | #--- settings for Embed class ----------------------------------------------------------------------
|
113 | 10 | tkerber | data = Data("embed")
|
114 | 10 | tkerber | data.str_class = "Embed"
|
115 | 10 | tkerber | data.str_import = "from ase.embed import Embed"
|
116 | 10 | tkerber | data.str_option = "system, cluster"
|
117 | 10 | tkerber | data.str_methods = ["embed()", "set_calculator(qmx)"] |
118 | 10 | tkerber | |
119 | 10 | tkerber | data_collection.append(data) |
120 | 10 | tkerber | |
121 | 10 | tkerber | |
122 | 10 | tkerber | #--- analyze the input file ------------------------------------------------------------------------
|
123 | 10 | tkerber | for section in "high-level", "low-level", "cluster", "system", "dynamics": |
124 | 10 | tkerber | #search lines for section
|
125 | 10 | tkerber | lines_section=[] |
126 | 10 | tkerber | for line in lines: |
127 | 10 | tkerber | line = line.split(separator) |
128 | 10 | tkerber | if line[0].find(section) >= 0: |
129 | 10 | tkerber | line[0] = line[0].replace(section+subseparator, "") |
130 | 10 | tkerber | lines_section.append(line) |
131 | 10 | tkerber | |
132 | 10 | tkerber | #calculators
|
133 | 10 | tkerber | if section == "high-level" or section == "low-level": |
134 | 10 | tkerber | data_collection.append(analyzeCalculator(section, lines_section)) |
135 | 10 | tkerber | |
136 | 10 | tkerber | #systems
|
137 | 10 | tkerber | if section == "cluster" or section == "system": |
138 | 10 | tkerber | data_collection.append(analyzeAtoms(section, lines_section)) |
139 | 10 | tkerber | |
140 | 10 | tkerber | #dynamics
|
141 | 10 | tkerber | if section == "dynamics": |
142 | 10 | tkerber | data_collection.append(analyzeDynamics(section, lines_section)) |
143 | 10 | tkerber | |
144 | 10 | tkerber | #--- write output file -----------------------------------------------------------------------------
|
145 | 10 | tkerber | if options.outputFile is not None and os.path.exists(options.outputFile) and not options.overwrite: |
146 | 10 | tkerber | sys.stderr.write(lineseparator+"the output file <"+options.outputFile+"> already exists"+lineseparator) |
147 | 10 | tkerber | sys.exit(1)
|
148 | 10 | tkerber | |
149 | 10 | tkerber | output = None
|
150 | 10 | tkerber | if options.outputFile is None: |
151 | 10 | tkerber | output=sys.stdout |
152 | 10 | tkerber | else:
|
153 | 10 | tkerber | output=open(options.outputFile, "w") |
154 | 10 | tkerber | |
155 | 10 | tkerber | #--- write header ----------------------------------------------------------------------------------
|
156 | 10 | tkerber | output.write("#!/usr/bin/env python\n")
|
157 | 10 | tkerber | |
158 | 10 | tkerber | #--- write import lines ----------------------------------------------------------------------------
|
159 | 10 | tkerber | xlines=[] |
160 | 10 | tkerber | for data in data_collection: |
161 | 10 | tkerber | value = data.str_import |
162 | 10 | tkerber | if value is None or value in xlines: |
163 | 10 | tkerber | continue
|
164 | 10 | tkerber | xlines.append(value) |
165 | 10 | tkerber | output.write(value+lineseparator) |
166 | 10 | tkerber | output.write(lineseparator) |
167 | 10 | tkerber | |
168 | 10 | tkerber | #--- define the methods ----------------------------------------------------------------------------
|
169 | 10 | tkerber | for system in 'high', 'low': |
170 | 10 | tkerber | for data in data_collection: |
171 | 10 | tkerber | if data.__name__ == system+"-level": |
172 | 10 | tkerber | output.write(system+"Level = "+data.str_class+"("+data.str_option+")"+lineseparator) |
173 | 10 | tkerber | output.write(lineseparator) |
174 | 10 | tkerber | |
175 | 10 | tkerber | #--- qmx class (substraction scheme ----------------------------------------------------------------
|
176 | 10 | tkerber | for data in data_collection: |
177 | 10 | tkerber | if data.__name__ == "qmx": |
178 | 10 | tkerber | output.write("qmx = "+data.str_class+"("+data.str_option+")"+lineseparator) |
179 | 10 | tkerber | output.write(lineseparator) |
180 | 10 | tkerber | |
181 | 10 | tkerber | #--- read all the systems --------------------------------------------------------------------------
|
182 | 10 | tkerber | for system in "cluster", "system": |
183 | 10 | tkerber | for data in data_collection: |
184 | 10 | tkerber | if data.__name__ == system:
|
185 | 10 | tkerber | if data.str_structure is None: |
186 | 10 | tkerber | continue
|
187 | 10 | tkerber | output.write(system+" = "+data.str_class+"(\""+data.str_structure+"\")"+lineseparator) |
188 | 10 | tkerber | output.write(lineseparator) |
189 | 10 | tkerber | |
190 | 10 | tkerber | #--- embeding class --------------------------------------------------------------------------------
|
191 | 10 | tkerber | for data in data_collection: |
192 | 10 | tkerber | if data.__name__ == "embed": |
193 | 10 | tkerber | output.write("embed = "+data.str_class+"("+data.str_option+")"+lineseparator) |
194 | 10 | tkerber | for method in data.str_methods: |
195 | 10 | tkerber | output.write("embed."+method+lineseparator)
|
196 | 10 | tkerber | output.write(lineseparator) |
197 | 10 | tkerber | |
198 | 10 | tkerber | #--- dynamics class --------------------------------------------------------------------------------
|
199 | 10 | tkerber | for data in data_collection: |
200 | 10 | tkerber | if data.__name__ == "dynamics": |
201 | 10 | tkerber | output.write("dyn="+data.str_class+"(embed)"+lineseparator) |
202 | 10 | tkerber | output.write("dyn.run("+data.str_option+")"+lineseparator) |
203 | 10 | tkerber | |
204 | 10 | tkerber | output.close() |
205 | 10 | tkerber | sys.exit(0) |