Révision 13 prepareQMX/prepareQMX.py

prepareQMX.py (revision 13)
1 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
#---------------------------------------------------------------------------------------------------
2 11
import os, sys
12
from copy import deepcopy
3 13
from optparse import OptionParser
4 14

  
5
class Data:
6
    def __init__(self, name):
7
        self.__name__ = name
8
        self.str_option = ""
9
        self.str_import = None
10
        self.str_class  = None
11
        self.str_methods = []
12
        self.str_structure = None
13
                
14
    def __str__(self):
15
       return self.__name__
15
#---------------------------------------------------------------------------------------------------
16
from qmxEMBED import embedDefinitions
17
from qmxJOB  import jobDefinitions
18
from qmxSTR  import strDefinitions
19
from qmxCALC import calcDefinitions, QmxCalcDefinition
16 20

  
21
from qmxWRITE import writeData
22

  
23
#---------------------------------------------------------------------------------------------------
24
#---------------------------------------------------------------------------------------------------
25
#---------------------------------------------------------------------------------------------------
17 26
def getline(section, subsection, lines):
18 27
    nline = -1
19 28
    for iline in xrange(len(lines)):
......
26 35
        return None
27 36
    return lines[nline][1].strip()
28 37

  
29
def analyzeAtoms(section, lines):
30
    data = Data(section)
38
#---------------------------------------------------------------------------------------------------
39
def analyzeSection(definitions, section, lines):
31 40
    line = getline(section, "program", lines)
32 41
    if line is None:
33
        line=""
34
    if line.lower() == "turbomole":
35
        data.str_import = "from ase.io.turbomole import read_turbomole"
36
        data.str_class = "read_turbomole"
37
    elif line.lower() == "vasp":
38
        data.str_import = "from ase.io.vasp import read_vasp"
39
        data.str_class = "read_vasp"
42
        print "section <" + section + "> does not contain program"
43
        sys.exit(1)
40 44
        
41
    data.str_structure = getline(section, "structure", lines)
42
    return data
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
43 56

  
44
def analyzeCalculator(section, lines):
45
    data = Data(section)
46
    #read programs
47
    line = getline(section, "program", lines)
48
    if line.lower() == "turbomole":
49
        data.str_import = "from ase.calculators.turbomole import Turbomole"
50
        data.str_class = "Turbomole"
51
    elif line.lower() == "vasp":
52
        data.str_import = "from ase.calculators.vasp import Vasp"
53
        data.str_class = "Vasp"
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]
54 73
    
55
    str = getline(section, "class", lines)
56
    if str is not None:
57
        data.str_class = str
74
    return myDefinition
58 75

  
59
    str = getline(section, "import", lines)
60
    if str is not None:
61
        data.str_import = str
62

  
63
    str = getline(section, "options", lines)
64
    if str is not None:
65
        data.str_option = str
66
    return data
67

  
68
def analyzeDynamics(section, lines):
69
    data = Data(section)
70
    line = getline(section, "method", lines)
71
    if line.lower() == "optimizer":
72
        data.str_import = "from ase.optimize import QuasiNewton"
73
        data.str_class = "QuasiNewton"
74
    return data
75

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

  
77 80
#define separators
78 81
separator=":"
79 82
subseparator="."
......
87 90
parser.add_option("-f", action="store_true", dest="overwrite")
88 91
(options, args) = parser.parse_args()
89 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 ------------------------------------------------------------------------------
90 99
file=open(options.inputFile, "r")
91 100
lines = file.readlines()
92 101
file.close()
93 102

  
94

  
95
#--- split intput file -----------------------------------------------------------------------------
96

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

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

  
104
#--- settings for QMX class ------------------------------------------------------------------------
105
data = Data("qmx")
106
data.str_class = "Qmx"
107
data.str_import = "from ase.calculators.qmx import Qmx"
108
data.str_option = "highLevel, lowLevel"
109

  
110
data_collection.append(data)
111

  
112
#--- settings for Embed class ----------------------------------------------------------------------
113
data = Data("embed")
114
data.str_class = "Embed"
115
data.str_import = "from ase.embed import Embed"
116
data.str_option = "system, cluster"
117
data.str_methods = ["embed()", "set_calculator(qmx)"]
118

  
119
data_collection.append(data)
120

  
121

  
122 111
#--- analyze the input file ------------------------------------------------------------------------
123
for section in "high-level", "low-level", "cluster", "system", "dynamics":
112
for section in "high-level", "low-level", "cluster", "system", "job":
124 113
    #search lines for section
125 114
    lines_section=[]
126 115
    for line in lines:
......
128 117
        if line[0].find(section) >= 0:
129 118
            line[0] = line[0].replace(section+subseparator, "")
130 119
            lines_section.append(line)
131
    
120

  
132 121
    #calculators
133 122
    if section == "high-level" or section == "low-level":
134
        data_collection.append(analyzeCalculator(section, lines_section))
123
        definitions.append(analyzeSection(calcDefinitions, section, lines_section))
135 124
        
136
    #systems
125
    #structures (atoms)
137 126
    if section == "cluster" or section == "system":
138
        data_collection.append(analyzeAtoms(section, lines_section))
127
        definitions.append(analyzeSection(strDefinitions, section, lines_section))
139 128
        
140
    #dynamics
141
    if section == "dynamics":
142
        data_collection.append(analyzeDynamics(section, lines_section))
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))
143 136

  
144
#--- write output file -----------------------------------------------------------------------------
145
if options.outputFile is not None and os.path.exists(options.outputFile) and not options.overwrite:
146
    sys.stderr.write(lineseparator+"the output file <"+options.outputFile+"> already exists"+lineseparator)
147
    sys.exit(1)
148

  
149 137
output = None
150 138
if options.outputFile is None:
151 139
    output=sys.stdout
152 140
else:
153 141
    output=open(options.outputFile, "w")
154

  
155
#--- write header ----------------------------------------------------------------------------------
156
output.write("#!/usr/bin/env python\n")
157

  
158
#--- write import lines ----------------------------------------------------------------------------
159
xlines=[]
160
for data in data_collection:
161
    value = data.str_import
162
    if value is None or value in xlines:
163
        continue
164
    xlines.append(value)
165
    output.write(value+lineseparator)
166
output.write(lineseparator)
167

  
168
#--- define the methods ----------------------------------------------------------------------------
169
for system in 'high', 'low':
170
    for data in data_collection:
171
        if data.__name__ == system+"-level":
172
            output.write(system+"Level = "+data.str_class+"("+data.str_option+")"+lineseparator)
173
output.write(lineseparator)
174

  
175
#--- qmx class (substraction scheme ----------------------------------------------------------------
176
for data in data_collection:
177
    if data.__name__ == "qmx":
178
        output.write("qmx = "+data.str_class+"("+data.str_option+")"+lineseparator)
179
output.write(lineseparator)
180

  
181
#--- read all the systems --------------------------------------------------------------------------
182
for system in "cluster", "system":
183
    for data in data_collection:
184
        if data.__name__ == system:
185
            if data.str_structure is None:
186
                continue
187
            output.write(system+" = "+data.str_class+"(\""+data.str_structure+"\")"+lineseparator)
188
output.write(lineseparator)
189

  
190
#--- embeding class --------------------------------------------------------------------------------
191
for data in data_collection:
192
    if data.__name__ == "embed":
193
        output.write("embed = "+data.str_class+"("+data.str_option+")"+lineseparator)
194
        for method in data.str_methods:
195
            output.write("embed."+method+lineseparator)
196
output.write(lineseparator)
197

  
198
#--- dynamics class --------------------------------------------------------------------------------
199
for data in data_collection:
200
    if data.__name__ == "dynamics":
201
        output.write("dyn="+data.str_class+"(embed)"+lineseparator)
202
        output.write("dyn.run("+data.str_option+")"+lineseparator)
203

  
142
    
143
writeData(output, definitions)
204 144
output.close()
205
sys.exit(0)
145

  

Formats disponibles : Unified diff