Source code for brian2.codegen.runtime.GSLcython_rt.GSLcython_rt

"""
Module containing the Cython CodeObject for code generation for integration using the ODE solver provided in the
GNU Scientific Library (GSL)
"""

import os
import sys
from distutils.errors import CompileError

from brian2.core.preferences import prefs

from ...generators.cython_generator import CythonCodeGenerator
from ...generators.GSL_generator import GSLCythonCodeGenerator
from ..cython_rt import CythonCodeObject

__all__ = ["GSLCythonCodeObject", "IntegrationError"]


[docs] class GSLCompileError(Exception): pass
[docs] class IntegrationError(Exception): """ Error used to signify that GSL was unable to complete integration (only works for cython) """ pass
[docs] class GSLCythonCodeObject(CythonCodeObject): templater = CythonCodeObject.templater.derive("brian2.codegen.runtime.GSLcython_rt") # CodeGenerator that is used to do bulk of abstract_code --> language specific translation original_generator_class = CythonCodeGenerator generator_class = GSLCythonCodeGenerator
[docs] def compile(self): self.libraries += ["gsl", "gslcblas"] self.headers += [ "<stdio.h>", "<stdlib.h>", "<gsl/gsl_odeiv2.h>", "<gsl/gsl_errno.h>", "<gsl/gsl_matrix.h>", ] if sys.platform == "win32": self.define_macros += [("WIN32", "1"), ("GSL_DLL", "1")] if prefs.GSL.directory is not None: self.include_dirs += [prefs.GSL.directory] self.library_dirs += [ os.path.abspath(os.path.join(prefs.GSL.directory, "..", "lib")) ] if sys.platform == "win32": GSL_bin = os.path.abspath( os.path.join(os.path.join(prefs.GSL.directory, "..", "bin")) ) os.add_dll_directory(GSL_bin) try: super().compile() except CompileError as err: raise GSLCompileError( "\nCompilation of files generated for integration with GSL has failed." "\nOne cause for this could be incorrect installation of GSL itself." "\nIf GSL is installed but Python cannot find the correct files, it is " "also possible to give the gsl directory manually by specifying " "prefs.GSL.directory = ..." ) from err