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__("grendel." + name)
m = sys.modules["grendel." + 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