diff --git a/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/build/Makefile b/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/build/Makefile deleted file mode 100644 index f5c9d0d5..00000000 --- a/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/build/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -CC = gcc -C++ = g++ -CFLAGS = -c -std=c++14 -Wall -O3 -SIMFLAGS = -l. -std=c++14 -Wall -O3 -LFLAGS = -pthread -lm -#INCDIR = "$(ROOTINC)/include/" "$(ROOTINC)/external/" "$(ROOTINC)/external/ANN/include/" -#INCDIRPARAMS = $(INCDIR:%=-I%) -INCDIRPARAMS = -I$(ROOTINC)/include/ -I$(ROOTINC)/external/ -I$(ROOTINC)/external/ANN/include/ -OBJ = NRMConstant_v5.o particle.o simulate.o count_cores.o output.o simulate_rdme.o simulate_threads.o model.o pthread_barrier.o -ANNOBJECTS = ANN.o brute.o kd_tree.o kd_util.o kd_split.o \ - kd_dump.o kd_search.o kd_pr_search.o kd_fix_rad_search.o \ - bd_tree.o bd_search.o bd_pr_search.o bd_fix_rad_search.o \ - perf.o - - -.PHONY: all - -all: ssa_sdpd - - -CORE: $(OBJ) -#this is now called directly, before this make command, in solver.py -# make -d -f $(ROOTINC_ESC)/external/ANN/src/Makefile.spatialpy ROOTINC=$(ROOTINC_ESC) - -main.o: - $(C++) -c $(GPROFFLAG) $(GDB_FLAG) -o main.o $(MODEL) $(INCDIRPARAMS) $(CFLAGS) - -%.o: $(ROOT)/src/%.cpp - $(C++) -c $(GPROFFLAG) $(GDB_FLAG) -o $@ "$<" $(INCDIRPARAMS) $(CFLAGS) - -%.o: $(ROOT)/src/%.c - $(CC) -c $(GPROFFLAG) $(GDB_FLAG) -o $@ "$<" $(INCDIRPARAMS) $(CFLAGS) - -ssa_sdpd: main.o - $(C++) $(GPROFFLAG) $(GDB_FLAG) -o ssa_sdpd $(addprefix $(COREDIR)/,$(OBJ)) main.o $(addprefix $(COREDIR)/,$(ANNOBJECTS)) $(LFLAGS) - diff --git a/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/build/SConstruct b/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/build/SConstruct new file mode 100644 index 00000000..92b25a22 --- /dev/null +++ b/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/build/SConstruct @@ -0,0 +1,34 @@ +import os + +model = ARGUMENTS.get('MODEL') +root_dir = ARGUMENTS.get('ROOT') +root_include_dir = ARGUMENTS.get('ROOTINC') +core_dir = ARGUMENTS.get('COREDIR') +build_dir = ARGUMENTS.get('BUILD') + +if core_dir is None: + core_dir = build_dir + +env = Environment( + tools=['default', 'mingw'], + CPPPATH=[ + Dir(f'{root_include_dir}/include'), + Dir(f'{root_include_dir}/external/ANN/include'), + ], + LIBPATH=[ + Dir(f'{core_dir}/lib'), + ], + ENV=os.environ, + # When MSVC (or any other compilers) are supported, update this to be a compiler-specific flag + CXXFLAGS=['-std=c++14'], +) +env.VariantDir(core_dir, f'{root_dir}/src', duplicate=False) +env.VariantDir(f'{core_dir}/external/ANN', f'{root_dir}/external/ANN/src', duplicate=False) + +Export('env') +ann = SConscript(f'{root_dir}/external/ANN/src/SConscript', variant_dir=f'{core_dir}/external/ANN', duplicate=False) +core = SConscript(f'{root_dir}/src/SConscript', variant_dir=core_dir, duplicate=False) + +env.StaticLibrary(f'{core_dir}/lib/spatialpy-core', core) +env.StaticLibrary(f'{core_dir}/lib/ANN', ann) +env.Program('ssa_sdpd.exe', model, LIBS=['spatialpy-core', 'ANN', 'pthread']) diff --git a/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/external/ANN/src/Makefile.spatialpy b/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/external/ANN/src/Makefile.spatialpy deleted file mode 100755 index 027ed9ac..00000000 --- a/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/external/ANN/src/Makefile.spatialpy +++ /dev/null @@ -1,118 +0,0 @@ -#----------------------------------------------------------------------------- -# Makefile for ANN library -#---------------------------------------------------------------------- -# Copyright (c) 1997-2005 University of Maryland and Sunil Arya and -# David Mount. All Rights Reserved. -# -# This software and related documentation is part of the Approximate -# Nearest Neighbor Library (ANN). This software is provided under -# the provisions of the Lesser GNU Public License (LGPL). See the -# file ../ReadMe.txt for further information. -# -# The University of Maryland (U.M.) and the authors make no -# representations about the suitability or fitness of this software for -# any purpose. It is provided "as is" without express or implied -# warranty. -#---------------------------------------------------------------------- -# History: -# Revision 0.1 03/04/98 -# Initial release -# Revision 1.0 04/01/05 -# Renamed files from .cc to .cpp for Microsoft Visual C++ -# Added kd_dump.cpp -# Revision 1.1 05/03/05 -# Added kd_fix_rad_search.cpp and bd_fix_rad_search.cpp -#---------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Some basic definitions: -# BASEDIR where include, src, lib, ... are -# INCLIB include directory -# LIBLIB library directory -#----------------------------------------------------------------------------- -BASEDIR = .. -C++ = g++ -CFLAGS = -c -std=c++14 -Wall -O3 -g -INCDIR = $(ROOTINC)/external/ANN/include/ -LIBDIR = $(BASEDIR)/lib - -SOURCES = ANN.cpp brute.cpp kd_tree.cpp kd_util.cpp kd_split.cpp \ - kd_dump.cpp kd_search.cpp kd_pr_search.cpp kd_fix_rad_search.cpp \ - bd_tree.cpp bd_search.cpp bd_pr_search.cpp bd_fix_rad_search.cpp \ - perf.cpp - -HEADERS = kd_tree.h kd_split.h kd_util.h kd_search.h \ - kd_pr_search.h kd_fix_rad_search.h perf.h pr_queue.h pr_queue_k.h - -OBJECTS = $(SOURCES:.cpp=.o) - -#----------------------------------------------------------------------------- -# Make the library -#----------------------------------------------------------------------------- - -default: spatialpy - -targets: $(LIBDIR)/$(ANNLIB) - -spatialpy: $(OBJECTS) - -$(LIBDIR)/$(ANNLIB): $(OBJECTS) - $(MAKELIB) $(ANNLIB) $(OBJECTS) - $(RANLIB) $(ANNLIB) - mv $(ANNLIB) $(LIBDIR) - -#----------------------------------------------------------------------------- -# Make object files -#----------------------------------------------------------------------------- - -ANN.o: $(ROOTINC)/external/ANN/src/ANN.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/ANN.cpp - -brute.o: $(ROOTINC)/external/ANN/src/brute.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/brute.cpp - -kd_tree.o: $(ROOTINC)/external/ANN/src/kd_tree.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/kd_tree.cpp - -kd_util.o: $(ROOTINC)/external/ANN/src/kd_util.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/kd_util.cpp - -kd_split.o: $(ROOTINC)/external/ANN/src/kd_split.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/kd_split.cpp - -kd_search.o: $(ROOTINC)/external/ANN/src/kd_search.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/kd_search.cpp - -kd_pr_search.o: $(ROOTINC)/external/ANN/src/kd_pr_search.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/kd_pr_search.cpp - -kd_fix_rad_search.o: $(ROOTINC)/external/ANN/src/kd_fix_rad_search.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/kd_fix_rad_search.cpp - -kd_dump.o: $(ROOTINC)/external/ANN/src/kd_dump.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/kd_dump.cpp - -bd_tree.o: $(ROOTINC)/external/ANN/src/bd_tree.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/bd_tree.cpp - -bd_search.o: $(ROOTINC)/external/ANN/src/bd_search.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/bd_search.cpp - -bd_pr_search.o: $(ROOTINC)/external/ANN/src/bd_pr_search.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/bd_pr_search.cpp - -bd_fix_rad_search.o: $(ROOTINC)/external/ANN/src/bd_fix_rad_search.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/bd_fix_rad_search.cpp - -perf.o: $(ROOTINC)/external/ANN/src/perf.cpp - $(C++) -c -I$(INCDIR) $(CFLAGS) $(ROOTINC)/external/ANN/src/perf.cpp - -#----------------------------------------------------------------------------- -# Cleaning -#----------------------------------------------------------------------------- - -clean: - -rm -f *.o core - -realclean: clean - diff --git a/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/external/ANN/src/SConscript b/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/external/ANN/src/SConscript new file mode 100644 index 00000000..8354d4c0 --- /dev/null +++ b/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/external/ANN/src/SConscript @@ -0,0 +1,18 @@ +Import('env') +libANN = env.Object([ + 'ANN.cpp', + 'brute.cpp', + 'kd_tree.cpp', + 'kd_util.cpp', + 'kd_split.cpp', + 'kd_dump.cpp', + 'kd_search.cpp', + 'kd_pr_search.cpp', + 'kd_fix_rad_search.cpp', + 'bd_tree.cpp', + 'bd_search.cpp', + 'bd_pr_search.cpp', + 'bd_fix_rad_search.cpp', + 'perf.cpp' +]) +Return('libANN') diff --git a/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/src/SConscript b/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/src/SConscript new file mode 100644 index 00000000..c4a9a3c0 --- /dev/null +++ b/spatialpy/solvers/c_base/ssa_sdpd-c-simulation-engine/src/SConscript @@ -0,0 +1,13 @@ +Import('env') +libspatialpy_core = env.Object([ + 'count_cores.cpp', + 'model.cpp', + 'NRMConstant_v5.cpp', + 'output.cpp', + 'particle.cpp', + 'pthread_barrier.cpp', + 'simulate.cpp', + 'simulate_rdme.cpp', + 'simulate_threads.cpp' +]) +Return('libspatialpy_core') diff --git a/spatialpy/solvers/solver.py b/spatialpy/solvers/solver.py index 6936f86e..c884a6f8 100644 --- a/spatialpy/solvers/solver.py +++ b/spatialpy/solvers/solver.py @@ -23,6 +23,7 @@ import time import getpass import re +import sys import numpy @@ -66,7 +67,7 @@ def __init__(self, model, debug_level=0): self.build_dir = None self.propfilename = None self.prop_file_name = None - self.executable_name = 'ssa_sdpd' + self.executable_name = 'ssa_sdpd.exe' self.h = None # basis function width self.spatialpy_root = os.path.dirname( @@ -470,51 +471,35 @@ def compile(self, debug=False, profile=False): self.__create_propensity_file(stoich_matrix, dep_graph, file_name=self.prop_file_name) # Build the solver - for make_exe_location in ["make", "mingw32-make"]: - make_exe = shutil.which("make") - if make_exe is not None: - break - if make_exe is None: - raise SimulationError("Make executable could not be found") - makefile = self.spatialpy_rootdir+'/build/Makefile' - makefile_ann = self.spatialpy_rootdir+'/external/ANN/src/Makefile.spatialpy' - - cmd_ann = [ - make_exe, '-d', '-C', self.core_dir, '-f', makefile_ann, - f'ROOTINC={self.spatialpy_rootinc}', - ] - cmd_core = [ - make_exe, '-d', '-C', self.core_dir, 'CORE', '-f', makefile, + makefile = self.spatialpy_rootdir+'/build/SConstruct' + make_cmd = [ + sys.executable, "-m", "SCons", f"-C{self.build_dir}", f"-f{makefile}", f'ROOT={self.spatialpy_rootparam}', f'ROOTINC={self.spatialpy_rootinc}', - f'BUILD={self.core_dir}', - ] - cmd_build = [ - make_exe, '-d', '-C', self.build_dir, '-I', self.core_dir, '-f', makefile, - 'ROOT=' + self.spatialpy_rootparam, - 'ROOTINC=' + self.spatialpy_rootinc, - 'COREDIR=' + self.core_dir, - 'MODEL=' + self.prop_file_name, 'BUILD='+self.build_dir + f'COREDIR={self.core_dir}', + f'MODEL={self.prop_file_name}', + f'BUILD={self.build_dir}', ] if profile: - cmd_build.append('GPROFFLAG=-pg') + # TODO: add profile/debug targets to SConstruct file + make_cmd.append('GPROFFLAG=-pg') if profile or debug: - cmd_build.append('GDB_FLAG=-g') + make_cmd.append('GDB_FLAG=-g') if self.debug_level > 1: - cmd = " && ".join([*cmd_ann, *cmd_core, *cmd_build]) + cmd = " ".join(make_cmd) print(f"cmd: {cmd}\n") try: - for cmd_target in [cmd_ann, cmd_core, cmd_build]: - result = subprocess.check_output(cmd_target, stderr=subprocess.STDOUT) - if self.debug_level > 1: - print(result.stdout.decode("utf-8")) + result = subprocess.check_output(make_cmd, stderr=subprocess.STDOUT) + if self.debug_level > 1: + print(result) except subprocess.CalledProcessError as err: try: print(err.stdout.decode("utf-8")) except Exception: pass - raise SimulationError(f"Compilation of solver failed, return_code={result.return_code}") + raise SimulationError(f"Compilation of solver failed, return_code={err.returncode}") except OSError as err: + cmd = " ".join(make_cmd) print(f"Error, execution of compilation raised an exception: {err}") print(f"cmd = {cmd}") raise SimulationError("Compilation of solver failed") from err