Skip to content

Commit 9c6c906

Browse files
author
jensj
committed
Simplify a bit
1 parent e43fdf9 commit 9c6c906

File tree

2 files changed

+47
-78
lines changed

2 files changed

+47
-78
lines changed

ase/atom.py

+7-10
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
"""This module defines the Atom object."""
22

3-
import warnings
4-
53
import numpy as np
64

75
from ase.data import atomic_numbers, chemical_symbols, atomic_masses
86

97

10-
# singular, plural, default value
8+
# Singular, plural, default value:
119
names = {'position': ('positions', np.zeros(3)),
12-
'number': ('numbers', 0),
13-
'tag': ('tags', 0),
14-
'momentum': ('momenta', np.zeros(3)),
15-
'mass': ('masses', None),
16-
'magmom': ('magmoms', 0.0),
17-
'charge': ('charges', 0.0)
18-
}
10+
'number': ('numbers', 0),
11+
'tag': ('tags', 0),
12+
'momentum': ('momenta', np.zeros(3)),
13+
'mass': ('masses', None),
14+
'magmom': ('magmoms', 0.0),
15+
'charge': ('charges', 0.0)}
1916

2017

2118
def atomproperty(name, doc):

ase/cli/run.py

+40-68
Original file line numberDiff line numberDiff line change
@@ -17,53 +17,73 @@
1717
from ase.optimize import LBFGS
1818
from ase.io.trajectory import PickleTrajectory
1919
from ase.utils.eos import EquationOfState
20-
from ase.calculators.calculator import get_calculator
20+
from ase.calculators.calculator import get_calculator, names as calcnames
2121
import ase.db as db
2222

2323

24-
def main(runner=None):
25-
if runner is None:
26-
runner = Runner()
24+
def main():
25+
runner = Runner()
2726
runner.parse()
2827
if runner.errors:
2928
sys.exit(runner.errors)
3029

3130

3231
class Runner:
33-
names = []
34-
35-
parameter_namespace = {}
36-
37-
calculator_name = None
38-
3932
def __init__(self):
4033
self.db = None
4134
self.opts = None
4235
self.errors = 0
36+
self.names = []
37+
self.calculator_name = None
4338

4439
if world.rank == 0:
4540
self.logfile = sys.stdout
4641
else:
4742
self.logfile = devnull
4843

4944
def parse(self, args=None):
50-
# create the top-level parser
45+
parser = self.make_parser()
46+
self.add_options(parser)
47+
self.opts, names = parser.parse_args(args)
48+
49+
if args is None and self.opts.interactive_python_session:
50+
file = tempfile.NamedTemporaryFile()
51+
file.write('import os\n')
52+
file.write('if "PYTHONSTARTUP" in os.environ:\n')
53+
file.write(' execfile(os.environ["PYTHONSTARTUP"])\n')
54+
file.write('from ase.cli.run import Runner\n')
55+
file.write('atoms = Runner().parse(%r)\n' %
56+
([self.calculator_name] + sys.argv[1:]))
57+
file.flush()
58+
os.system('python -i %s' % file.name)
59+
return
60+
61+
if self.calculator_name is None:
62+
if names:
63+
self.calculator_name = names.pop(0)
64+
else:
65+
parser.error('Missing calculator name')
66+
67+
atoms = self.run(names)
68+
return atoms
69+
70+
def make_parser(self):
5171
parser = optparse.OptionParser(
52-
usage='%prog calculator [options] [name, name, ...]')
72+
usage='ase-run calculator [options] [system, ...]',
73+
description="Run calculation with one of ASE's calculators: " +
74+
', '.join(calcnames) + '.')
75+
return parser
76+
77+
def add_options(self, parser):
5378
add = parser.add_option
54-
add('-q', '--quiet', action='store_const', const=0, default=1,
55-
dest='verbosity')
56-
add('-V', '--verbose', action='store_const', const=2, default=1,
57-
dest='verbosity')
5879
add('-t', '--tag',
5980
help='String tag added to filenames.')
60-
add('--plugin')
6181
add('-p', '--parameters', default='',
6282
metavar='key=value,...',
6383
help='Comma-separated key=value pairs of ' +
6484
'calculator specific parameters.')
6585
add('-d', '--database',
66-
help='Use a filename with a ".sqlite" extension for a sqlite3 ' +
86+
help='Use a filename with a ".db" extension for a sqlite3 ' +
6787
'database or a ".json" extension for a simple json database. ' +
6888
'Default is no database')
6989
add('-S', '--skip', action='store_true',
@@ -81,42 +101,13 @@ def parse(self, args=None):
81101
help='Relax unit-cell and internal coordinates.')
82102
add('-E', '--equation-of-state', help='Equation of state ...')
83103
add('--eos-type', default='sjeos', help='Selects the type of eos.')
84-
add('-i', '--interactive-python-session', action='store_true',
85-
) # help=optparse.SUPPRESS)
104+
add('-i', '--interactive-python-session', action='store_true')
86105
add('-c', '--collection')
87106
add('--modify', metavar='...',
88107
help='Modify atoms with Python statement. ' +
89108
'Example: --modify="atoms.positions[-1,2]+=0.1".')
90109
add('--after', help='Perform operation after calculation. ' +
91110
'Example: --after="atoms.calc.write(...)"')
92-
93-
self.opts, names = parser.parse_args(args)
94-
95-
if args is None and self.opts.interactive_python_session:
96-
file = tempfile.NamedTemporaryFile()
97-
file.write('import os\n')
98-
file.write('if "PYTHONSTARTUP" in os.environ:\n')
99-
file.write(' execfile(os.environ["PYTHONSTARTUP"])\n')
100-
file.write('from ase.cli.run import Runner\n')
101-
file.write('atoms = Runner().parse(%r)\n' %
102-
([self.calculator_name] + sys.argv[1:]))
103-
file.flush()
104-
os.system('python -i %s' % file.name)
105-
return
106-
107-
if self.calculator_name is None:
108-
if names:
109-
self.calculator_name = names.pop(0)
110-
else:
111-
parser.error('Missing calculator name')
112-
113-
if self.opts.plugin:
114-
runner = self.get_runner()
115-
else:
116-
runner = self
117-
118-
atoms = runner.run(names)
119-
return atoms
120111

121112
def log(self, *args, **kwargs):
122113
print(file=self.logfile, *args, **kwargs)
@@ -193,20 +184,6 @@ def calculate(self, atoms, name):
193184

194185
return data
195186

196-
def get_plugin(self, name):
197-
f = open(self.opts.plugin)
198-
script = f.read()
199-
f.close()
200-
namespace = {}
201-
exec script in namespace
202-
for cls in namespace:
203-
if issubclass(namespace[cls], Runner):
204-
runner = namespace[cls]()
205-
runner.opts = self.opts
206-
runner.calculator_name = self.calculator_name
207-
runner.parameter_namespace = self.parameter_namespace
208-
return runner
209-
210187
def expand(self, names):
211188
if not self.names and self.opts.collection:
212189
con = db.connect(self.opts.collection)
@@ -240,17 +217,12 @@ def build(self, name):
240217

241218
def set_calculator(self, atoms, name):
242219
cls = get_calculator(self.calculator_name)
243-
parameters = self.get_parameters()
220+
parameters = str2dict(self.opts.parameters)
244221
if getattr(cls, 'nolabel', False):
245222
atoms.calc = cls(**parameters)
246223
else:
247224
atoms.calc = cls(label=self.get_filename(name), **parameters)
248225

249-
def get_parameters(self):
250-
namespace = self.parameter_namespace
251-
parameters = str2dict(self.opts.parameters, namespace)
252-
return parameters
253-
254226
def calculate_once(self, atoms, name):
255227
opts = self.opts
256228

0 commit comments

Comments
 (0)