Statistiques
| Révision :

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)