Statistiques
| Révision :

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