### Navigation

- index
- modules
- toc
- PSI4 [beta5] »
- Module code »

# Source code for grendel

    from __future__ import print_function
    import os
    import atexit
    import sys
    import traceback

    if sys.version_info < (2, 7):
        raise SystemError("grendel needs at least Python version 2.7")
    from copy import copy

    #--------------------------------------------------------------------------------#
    # Helper function
    def get_env_bool(env_var_name, default=False):
        var = os.getenv(env_var_name, default)
        if var in [0, '0', False, 'False', 'FALSE', 'false', 'off', 'OFF', 'Off', 'NO', 'no', 'No']:
            return False
        elif var in [1, '1', True, 'True', 'TRUE', 'true', 'on', 'ON', 'On', 'YES', 'yes', 'Yes']:
            return True
        else:
            raise OSError("invalid value for environment variable {}: '{}'.\n"
                          "Please give something like 'yes' or 'no', 'true' or 'false',"
                          " '1' or '0'".format(env_var_name, var))
    #========================================#
    # Package scope variables from the environment...
    type_checking_enabled = get_env_bool('GRENDEL_TYPE_CHECK', True)
    sanity_checking_enabled = get_env_bool('GRENDEL_SANITY_CHECK', True)
    caching_enabled = not get_env_bool('GRENDEL_NO_CACHE', False)
    show_warnings = get_env_bool('GRENDEL_SHOW_WARNINGS', False)
    #--------------------------------------------------------------------------------#

    # Uhh...technically in this case this could(/should?) be called __subpackages__
    #TODO get this as a list of files/folders in the directory?
    __submodules__ = [
        "util",
        "gmath",
        "differentiation",
        "coordinates",
        "representations",
        "chemistry",
        "symmetry",
        "interface",
        ]

    __all__ = [
    ]

    # TODO Propagate this pattern throughout grendel packages
    for name in __submodules__:
        __import__(__name__ + "." + name)
        m = sys.modules[__name__ + "." + name]
        globals()[name] = m
        if hasattr(m, '__all__'):
            attrlist = copy(m.__all__)
        else:
            attrlist = list(filter(lambda x: x[0]!='_', dir(m)))
        for attr in attrlist:
            globals()[attr] = getattr(m, attr)
        if hasattr(m, '__not_parent_all__'):
            for item in m.__not_parent_all__:
                attrlist.remove(item)
        __all__.extend(attrlist)

    __all__.extend(__submodules__)

    #--------------------------------------------------------------------------------#

    # TODO save/pickle expensive runtime information here in case of exit on error and provide some convenient/reasonable interface for loading said data
    #@atexit.register
    #def grendel_exit():
    #    pass

### Navigation

- index
- modules
- toc
- PSI4 [beta5] »
- Module code »