Source code for schrodinger.utils.openmpi

"""
Provide functions for integration with OpenMPI.
"""
import enum
import os
import pathlib
from typing import Dict
from typing import Optional

from schrodinger.job import util

from .env import prepend_path


[docs]@enum.unique class OpenMPIVersion(enum.Enum): VERSION_1_6_5 = enum.auto() LATEST = enum.auto()
[docs]@enum.unique class EnvVar(str, enum.Enum): LD_LIBRARY_PATH = "LD_LIBRARY_PATH" OPAL_PREFIX = "OPAL_PREFIX" PATH = "PATH" SCHRODINGER_OPENMPI = "SCHRODINGER_OPENMPI"
[docs]def get_openmpi_prefix(version: OpenMPIVersion, *, env: Optional[Dict[str, str]] = None) -> pathlib.Path: """ Return openmpi prefix (OPAL_PREFIX). :param version: version of openmpi to use :param env: Optional environment to start calculations from, defaults to os.environ :return: path to openmpi base directory """ env_override = os.environ.get(EnvVar.SCHRODINGER_OPENMPI) if env_override: return pathlib.Path(env_override) if version == OpenMPIVersion.VERSION_1_6_5: return pathlib.Path( os.environ["SCHRODINGER"]) / "internal" / "lib" / "openmpi-1.6.5" elif version == OpenMPIVersion.LATEST: return pathlib.Path(util.hunt("mmshare", util.DirectoryType.LIB)) / "openmpi" raise RuntimeError(f"{version} not in {OpenMPIVersion}")
[docs]def get_openmpi_env(version=OpenMPIVersion.LATEST, *, env: Optional[Dict[str, str]] = None) -> Dict[str, str]: """ :param version: version of openmpi to use :param env: Optional environment to start calculations from, defaults to os.environ :return: updated environment directionary """ if not env: env = os.environ opal_prefix = get_openmpi_prefix(version, env=env) openmpi_env = dict( OPAL_PREFIX=str(opal_prefix), PATH=os.environ[EnvVar.PATH], LD_LIBRARY_PATH=os.environ.get(EnvVar.LD_LIBRARY_PATH), # OMPI_MCA_mca_base_component_show_load_errors hides component load # errors like: # mca_base_component_repository_open: unable to open mca_ras_lsf: # libbat.so: cannot open shared object file: No such file or directory # (ignored) OMPI_MCA_mca_base_component_show_load_errors="0") prepend_path(openmpi_env, EnvVar.PATH, str(opal_prefix / "bin")) prepend_path(openmpi_env, EnvVar.LD_LIBRARY_PATH, str(opal_prefix / "lib")) return openmpi_env