Source code for schroedinger

#!/usr/bin/env python
"""
Solver for basic electronic structure problems.

Examples
--------

Compute the 2D predefined problems::

  $ ./schroedinger.py --well
  $ ./schroedinger.py --oscillator
  $ ./schroedinger.py --hydrogen
  $ ./schroedinger.py --boron

See ``examples/quantum/`` directory for the problem description files
corresponding to the above examples.
"""
from __future__ import absolute_import
import os
from argparse import ArgumentParser, RawDescriptionHelpFormatter

import sfepy
from sfepy.base.conf import ProblemConf, get_standard_keywords
from sfepy.physics.schroedinger_app import SchroedingerApp

[docs]def fix_path(filename): return os.path.join(sfepy.data_dir, filename)
helps = { 'debug': 'automatically start debugger when an exception is raised', 'conf' : 'override problem description file items, written as python' ' dictionary without surrounding braces', 'options' : 'override options item of problem description,' ' written as python dictionary without surrounding braces', 'filename' : 'basename of output file(s) [default: <basename of input file mesh>]', 'well' : 'solve infinite potential well (particle in a box) problem', 'oscillator' : 'solve spherically symmetric linear harmonic oscillator ' '(1 electron) problem', 'hydrogen' : 'solve the hydrogen atom', 'boron' : 'solve the boron atom with 1 electron', 'n_eigs' : 'number of eigenpairs to compute [default: as set in the examples]', 'tau' : 'target value of the Pysparse eigenvalue solver. Eigenvalues in the' ' vicinity of tau will be computed [default: as set in the examples]', }
[docs]def main(): parser = ArgumentParser(description=__doc__, formatter_class=RawDescriptionHelpFormatter) parser.add_argument('--version', action='version', version='%(prog)s ' + sfepy.__version__) parser.add_argument('--debug', action='store_true', dest='debug', default=False, help=helps['debug']) parser.add_argument('-c', '--conf', metavar='"key : value, ..."', action='store', dest='conf', type=str, default=None, help= helps['conf']) parser.add_argument('-O', '--options', metavar='"key : value, ..."', action='store', dest='app_options', type=str, default=None, help=helps['options']) parser.add_argument('-o', metavar='filename', action='store', dest='output_filename_trunk', default=None, help=helps['filename']) group = parser.add_mutually_exclusive_group() group.add_argument('--oscillator', action='store_true', dest='oscillator', default=False, help=helps['oscillator']) group.add_argument('--well', action='store_true', dest='well', default=False, help=helps['well']) group.add_argument('--hydrogen', action='store_true', dest='hydrogen', default=False, help=helps['hydrogen']) group.add_argument('--boron', action='store_true', dest='boron', default=False, help=helps['boron']) parser.add_argument('-n', '--n-eigs', type=int, metavar='int', action='store', dest='n_eigs', default=None, help=helps['n_eigs']) parser.add_argument('-t', '--tau', type=float, metavar='float', action='store', dest='tau', default=None, help=helps['tau']) parser.add_argument('filename_in', nargs='?') options = parser.parse_args() if options.debug: from sfepy.base.base import debug_on_error; debug_on_error() filename_in = options.filename_in if not filename_in: if options.oscillator: filename_in = fix_path("examples/quantum/oscillator.py") elif options.well: filename_in = fix_path("examples/quantum/well.py") elif options.hydrogen: filename_in = fix_path("examples/quantum/hydrogen.py") elif options.boron: filename_in = fix_path("examples/quantum/boron.py") else: parser.print_help() return define_args = {} if options.n_eigs is not None: define_args['n_eigs'] = options.n_eigs if options.tau is not None: define_args['tau'] = options.tau required, other = get_standard_keywords() conf = ProblemConf.from_file_and_options(filename_in, options, required, other, define_args=define_args) app = SchroedingerApp(conf, options, 'schroedinger:') opts = conf.options if hasattr(opts, 'parametric_hook'): # Parametric study. parametric_hook = conf.get_function(opts.parametric_hook) app.parametrize(parametric_hook) app()
if __name__ == '__main__': main()