Statistiques
| Révision :

root / prepareQMX / prepareQMX.new.py @ 10

Historique | Voir | Annoter | Télécharger (9,57 ko)

1
#!/usr/bin/env python
2

    
3
# command line interface for setup of QMX calculations
4
#
5
# Torsten Kerber, ENS LYON: 2011, 07, 11
6
#
7
# This work is supported by Award No. UK-C0017, made by King Abdullah
8
# University of Science and Technology (KAUST)
9

    
10
#---------------------------------------------------------------------------------------------------
11
import os, sys
12
from copy import deepcopy
13
from optparse import OptionParser
14

    
15
#---------------------------------------------------------------------------------------------------
16
from qmxEMBED import embedDefinitions
17
from qmxJOB  import jobDefinitions
18
from qmxSTR  import strDefinitions
19
from qmxCALC import calcDefinitions, QmxCalcDefinition
20

    
21
from qmxWRITE import writeData
22

    
23
#---------------------------------------------------------------------------------------------------
24
#---------------------------------------------------------------------------------------------------
25
#---------------------------------------------------------------------------------------------------
26
def getline(section, subsection, lines):
27
    nline = -1
28
    for iline in xrange(len(lines)):
29
        if lines[iline][0].strip() == subsection:
30
            if nline != -1:
31
                sys.stderr.write("section: <"+section+separator+subsection+"> has been definied more than once\n")
32
                sys.exit(1)
33
            nline = iline
34
    if nline == -1:
35
        return None
36
    return lines[nline][1].strip()
37

    
38
#---------------------------------------------------------------------------------------------------
39
def analyzeSection(definitions, section, lines):
40
    line = getline(section, "program", lines)
41
    if line is None:
42
        print "section <" + section + "> does not contain program"
43
        sys.exit(1)
44
        
45
    myDefinition = None
46
    for definition in definitions:
47
        if definition.name == line:
48
            myDefinition = deepcopy(definition)
49
            break
50
            
51
    if myDefinition is None:
52
        print "the program <" + line + "> is not defined for the section <" + section + ">"
53
        sys.exit(1)
54
        
55
    myDefinition.system = section
56

    
57
    subsections = []
58
    for line in lines:
59
        subsections.append(line[0].strip().lower())
60

    
61
    for subsection in subsections:
62
        line = getline(section, subsection, lines)
63
        if line is None:
64
            print "input error in <"+section+"."+subsection+">"
65
            sys.exit(1)
66
        if subsection == "program":
67
            continue
68
        if subsection == "options":
69
            subsection = 'class.options'
70
        
71
        myDefinition.keywords[subsection] = line    
72
        print subsection, myDefinition.keywords[subsection]
73
    
74
    return myDefinition
75

    
76
#---------------------------------------------------------------------------------------------------
77
#--- setting default values ------------------------------------------------------------------------
78
#---------------------------------------------------------------------------------------------------
79

    
80
#define separators
81
separator=":"
82
subseparator="."
83
lineseparator="\n"
84

    
85
#--- parse arguments -------------------------------------------------------------------------------
86
#parse arguments (python 2.6)
87
parser = OptionParser()
88
parser.add_option("-i", "--infile",  dest="inputFile",  help="specifies the input file", metavar="FILE", default="qmx.in")
89
parser.add_option("-o", "--outfile", dest="outputFile", help="specifies the output file", metavar="FILE")
90
parser.add_option("-f", action="store_true", dest="overwrite")
91
(options, args) = parser.parse_args()
92

    
93
#--- check wether output file exists ---------------------------------------------------------------
94
if options.outputFile is not None and os.path.exists(options.outputFile) and not options.overwrite:
95
    sys.stderr.write(lineseparator+"the output file <"+options.outputFile+"> already exists"+lineseparator)
96
    sys.exit(1)
97

    
98
#--- read intput file ------------------------------------------------------------------------------
99
file=open(options.inputFile, "r")
100
lines = file.readlines()
101
file.close()
102

    
103
#--- remove comments -------------------------------------------------------------------------------
104
for iline in xrange(len(lines)):
105
    lines[iline] = lines[iline].split("#")[0]    
106

    
107
#--- collect data in class -------------------------------------------------------------------------
108
definitions=[]
109
definitions.append(QmxCalcDefinition())
110

    
111
#--- analyze the input file ------------------------------------------------------------------------
112
for section in "high-level", "low-level", "cluster", "system", "job":
113
    #search lines for section
114
    lines_section=[]
115
    for line in lines:
116
        line = line.split(separator)
117
        if line[0].find(section) >= 0:
118
            line[0] = line[0].replace(section+subseparator, "")
119
            lines_section.append(line)
120

    
121
    #calculators
122
    if section == "high-level" or section == "low-level":
123
        definitions.append(analyzeSection(calcDefinitions, section, lines_section))
124
        
125
    #structures (atoms)
126
    if section == "cluster" or section == "system":
127
        definitions.append(analyzeSection(strDefinitions, section, lines_section))
128
        
129
    #job
130
    if section == "job":
131
        definitions.append(analyzeSection(jobDefinitions, section, lines_section))
132
        
133
    #embed
134
    if section == "embed":
135
        definitions.append(analyzeSection(embedDefinitions, section, lines_section))
136

    
137
output = None
138
if options.outputFile is None:
139
    output=sys.stdout
140
else:
141
    output=open(options.outputFile, "w")
142
    
143
writeData(output, definitions)
144
output.close()
145

    
146

    
147

    
148

    
149

    
150

    
151

    
152
#
153
##--- write header ----------------------------------------------------------------------------------
154
#output.write("#!/usr/bin/env python\n")
155
#
156
##--- write import lines ----------------------------------------------------------------------------
157
#xlines=[]
158
#for data in data_collection:
159
#    value = data.str_import
160
#    if value is None or value in xlines:
161
#        continue
162
#    xlines.append(value)
163
#    output.write(value+lineseparator)
164
#output.write(lineseparator)
165
#
166
##--- define the methods ----------------------------------------------------------------------------
167
#for system in 'high', 'low':
168
#    for data in data_collection:
169
#        if data.__name__ == system+"-level":
170
#            output.write(system+"Level = "+data.str_class+"("+data.str_option+")"+lineseparator)
171
#output.write(lineseparator)
172
#
173
##--- qmx class (substraction scheme ----------------------------------------------------------------
174
#for data in data_collection:
175
#    if data.__name__ == "qmx":
176
#        output.write("qmx = "+data.str_class+"("+data.str_option+")"+lineseparator)
177
#output.write(lineseparator)
178
#
179
##--- read all the systems --------------------------------------------------------------------------
180
#for system in "cluster", "system":
181
#    for data in data_collection:
182
#        if data.__name__ == system:
183
#            if data.str_structure is None:
184
#                continue
185
#            output.write(system+" = "+data.str_class+"(\""+data.str_structure+"\")"+lineseparator)
186
#output.write(lineseparator)
187
#
188
##--- embeding class --------------------------------------------------------------------------------
189
#for data in data_collection:
190
#    if data.__name__ == "embed":
191
#        output.write("embed = "+data.str_class+"("+data.str_option+")"+lineseparator)
192
#        for method in data.str_methods:
193
#            output.write("embed."+method+lineseparator)
194
#output.write(lineseparator)
195
#
196
##--- dynamics class --------------------------------------------------------------------------------
197
#for data in data_collection:
198
#    if data.__name__ == "dynamics":
199
#        output.write("dyn="+data.str_class+"(embed)"+lineseparator)
200
#        output.write("dyn.run("+data.str_option+")"+lineseparator)
201
#
202
#
203
#
204
#
205
#
206
#def getline(section, subsection, lines):
207
#    nline = -1
208
#    for iline in xrange(len(lines)):
209
#        if lines[iline][0].strip() == subsection:
210
#            if nline != -1:
211
#                sys.stderr.write("section: <"+section+separator+subsection+"> has been definied more than once\n")
212
#                sys.exit(1)
213
#            nline = iline
214
#    if nline == -1:
215
#        return None
216
#    return lines[nline][1].strip()
217
#
218
##def analyzeAtoms(section, lines):
219
##    data = Data(section)
220
##    line = getline(section, "program", lines)
221
##    if line is None:
222
##        line=""
223
##    if line.lower() == "turbomole":
224
##        data.str_import = "from ase.io.turbomole import read_turbomole"
225
##        data.str_class = "read_turbomole"
226
##    elif line.lower() == "vasp":
227
##        data.str_import = "from ase.io.vasp import read_vasp"
228
##        data.str_class = "read_vasp"
229
##        
230
##    data.str_structure = getline(section, "structure", lines)
231
##    return data
232
##
233
##def analyzeCalculator(section, lines):
234
##    data = Data(section)
235
##    #read programs
236
##    line = getline(section, "program", lines)
237
##    if line.lower() == "turbomole":
238
##        data.str_import = "from ase.calculators.turbomole import Turbomole"
239
##        data.str_class = "Turbomole"
240
##    elif line.lower() == "vasp":
241
##        data.str_import = "from ase.calculators.vasp import Vasp"
242
##        data.str_class = "Vasp"
243
##    
244
##    str = getline(section, "class", lines)
245
##    if str is not None:
246
##        data.str_class = str
247
##
248
##    str = getline(section, "import", lines)
249
##    if str is not None:
250
##        data.str_import = str
251
##
252
##    str = getline(section, "options", lines)
253
##    if str is not None:
254
##        data.str_option = str
255
##    return data
256
##
257
##def analyzeDynamics(section, lines):
258
##    data = Data(section)
259
##    line = getline(section, "method", lines)
260
##    if line.lower() == "optimizer":
261
##        data.str_import = "from ase.optimize import QuasiNewton"
262
##        data.str_class = "QuasiNewton"
263
##    return data
264