Statistiques
| Révision :

root / prepareQMX / prepareQMX.py

Historique | Voir | Annoter | Télécharger (5,56 ko)

1 10 tkerber
#!/usr/bin/env python
2 13 tkerber
3 13 tkerber
# command line interface for setup of QMX calculations
4 13 tkerber
#
5 13 tkerber
# Torsten Kerber, ENS LYON: 2011, 07, 11
6 13 tkerber
#
7 13 tkerber
# This work is supported by Award No. UK-C0017, made by King Abdullah
8 13 tkerber
# University of Science and Technology (KAUST)
9 13 tkerber
10 13 tkerber
#---------------------------------------------------------------------------------------------------
11 10 tkerber
import os, sys
12 13 tkerber
from copy import deepcopy
13 10 tkerber
from optparse import OptionParser
14 10 tkerber
15 13 tkerber
#---------------------------------------------------------------------------------------------------
16 13 tkerber
from qmxEMBED import embedDefinitions
17 13 tkerber
from qmxJOB  import jobDefinitions
18 16 tkerber
from qmxSTR  import strSystemDefinitions, strClusterDefinitions
19 13 tkerber
from qmxCALC import calcDefinitions, QmxCalcDefinition
20 10 tkerber
21 13 tkerber
from qmxWRITE import writeData
22 13 tkerber
23 13 tkerber
#---------------------------------------------------------------------------------------------------
24 13 tkerber
#---------------------------------------------------------------------------------------------------
25 13 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 13 tkerber
#---------------------------------------------------------------------------------------------------
39 13 tkerber
def analyzeSection(definitions, section, lines):
40 10 tkerber
    line = getline(section, "program", lines)
41 10 tkerber
    if line is None:
42 13 tkerber
        print "section <" + section + "> does not contain program"
43 13 tkerber
        sys.exit(1)
44 10 tkerber
45 13 tkerber
    myDefinition = None
46 13 tkerber
    for definition in definitions:
47 14 tkerber
        if definition.name.lower() == line.lower():
48 13 tkerber
            myDefinition = deepcopy(definition)
49 13 tkerber
            break
50 13 tkerber
51 13 tkerber
    if myDefinition is None:
52 13 tkerber
        print "the program <" + line + "> is not defined for the section <" + section + ">"
53 13 tkerber
        sys.exit(1)
54 13 tkerber
55 13 tkerber
    myDefinition.system = section
56 10 tkerber
57 13 tkerber
    subsections = []
58 13 tkerber
    for line in lines:
59 13 tkerber
        subsections.append(line[0].strip().lower())
60 13 tkerber
61 13 tkerber
    for subsection in subsections:
62 13 tkerber
        line = getline(section, subsection, lines)
63 13 tkerber
        if line is None:
64 13 tkerber
            print "input error in <"+section+"."+subsection+">"
65 13 tkerber
            sys.exit(1)
66 13 tkerber
        if subsection == "program":
67 13 tkerber
            continue
68 13 tkerber
        if subsection == "options":
69 14 tkerber
            subsection = 'class.options'
70 13 tkerber
        myDefinition.keywords[subsection] = line
71 10 tkerber
72 13 tkerber
    return myDefinition
73 10 tkerber
74 13 tkerber
#---------------------------------------------------------------------------------------------------
75 10 tkerber
#--- setting default values ------------------------------------------------------------------------
76 13 tkerber
#---------------------------------------------------------------------------------------------------
77 13 tkerber
78 10 tkerber
#define separators
79 10 tkerber
separator=":"
80 10 tkerber
subseparator="."
81 10 tkerber
lineseparator="\n"
82 10 tkerber
83 10 tkerber
#--- parse arguments -------------------------------------------------------------------------------
84 10 tkerber
#parse arguments (python 2.6)
85 10 tkerber
parser = OptionParser()
86 10 tkerber
parser.add_option("-i", "--infile",  dest="inputFile",  help="specifies the input file", metavar="FILE", default="qmx.in")
87 10 tkerber
parser.add_option("-o", "--outfile", dest="outputFile", help="specifies the output file", metavar="FILE")
88 10 tkerber
parser.add_option("-f", action="store_true", dest="overwrite")
89 10 tkerber
(options, args) = parser.parse_args()
90 10 tkerber
91 13 tkerber
#--- check wether output file exists ---------------------------------------------------------------
92 13 tkerber
if options.outputFile is not None and os.path.exists(options.outputFile) and not options.overwrite:
93 13 tkerber
    sys.stderr.write(lineseparator+"the output file <"+options.outputFile+"> already exists"+lineseparator)
94 13 tkerber
    sys.exit(1)
95 13 tkerber
96 13 tkerber
#--- read intput file ------------------------------------------------------------------------------
97 10 tkerber
file=open(options.inputFile, "r")
98 10 tkerber
lines = file.readlines()
99 10 tkerber
file.close()
100 10 tkerber
101 10 tkerber
#--- remove comments -------------------------------------------------------------------------------
102 10 tkerber
for iline in xrange(len(lines)):
103 10 tkerber
    lines[iline] = lines[iline].split("#")[0]
104 10 tkerber
105 10 tkerber
#--- collect data in class -------------------------------------------------------------------------
106 13 tkerber
definitions=[]
107 13 tkerber
definitions.append(QmxCalcDefinition())
108 10 tkerber
109 10 tkerber
#--- analyze the input file ------------------------------------------------------------------------
110 14 tkerber
for section in "high-level", "low-level", "cluster", "system", "job", "embed":
111 10 tkerber
    #search lines for section
112 10 tkerber
    lines_section=[]
113 10 tkerber
    for line in lines:
114 10 tkerber
        line = line.split(separator)
115 10 tkerber
        if line[0].find(section) >= 0:
116 10 tkerber
            line[0] = line[0].replace(section+subseparator, "")
117 10 tkerber
            lines_section.append(line)
118 13 tkerber
119 10 tkerber
    #calculators
120 10 tkerber
    if section == "high-level" or section == "low-level":
121 13 tkerber
        definitions.append(analyzeSection(calcDefinitions, section, lines_section))
122 10 tkerber
123 13 tkerber
    #structures (atoms)
124 16 tkerber
    if section == "cluster":
125 16 tkerber
        definitions.append(analyzeSection(strClusterDefinitions, section, lines_section))
126 10 tkerber
127 16 tkerber
    #structures (atoms)
128 16 tkerber
    if section == "system":
129 16 tkerber
        definitions.append(analyzeSection(strSystemDefinitions, section, lines_section))
130 16 tkerber
131 13 tkerber
    #job
132 13 tkerber
    if section == "job":
133 13 tkerber
        definitions.append(analyzeSection(jobDefinitions, section, lines_section))
134 13 tkerber
135 13 tkerber
    #embed
136 13 tkerber
    if section == "embed":
137 13 tkerber
        definitions.append(analyzeSection(embedDefinitions, section, lines_section))
138 10 tkerber
139 10 tkerber
output = None
140 10 tkerber
if options.outputFile is None:
141 10 tkerber
    output=sys.stdout
142 10 tkerber
else:
143 10 tkerber
    output=open(options.outputFile, "w")
144 13 tkerber
145 13 tkerber
writeData(output, definitions)
146 10 tkerber
output.close()