Statistiques
| Révision :

root / prepareQMX.py @ 6

Historique | Voir | Annoter | Télécharger (7,18 ko)

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