Skip to content
Snippets Groups Projects
Commit 20ddc48c authored by Eleni Mathioulaki's avatar Eleni Mathioulaki
Browse files

Merge branch 'pramodk/nrn-update' into 'master'

Adding update NEURON package

See merge request technical-coordination/project-internal/devops/platform/ebrains-spack-builds!273
parents 7a037a43 bdfd8ab9
No related branches found
No related tags found
No related merge requests found
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.package import *
class Neuron(CMakePackage):
"""NEURON is a simulation environment for single and networks of neurons.
NEURON is a simulation environment for modeling individual and networks of
neurons. NEURON models individual neurons via the use of sections that are
automatically subdivided into individual compartments, instead of
requiring the user to manually create compartments.
"""
homepage = "https://www.neuron.yale.edu/"
url = "https://github.com/neuronsimulator/nrn/releases/download/8.2.2/full-src-package-8.2.2.tar.gz"
git = "https://github.com/neuronsimulator/nrn"
version("develop", branch="master", submodules="True")
version("8.2.2", tag="8.2.2", submodules="True")
version("8.1.0", tag="8.1.0", submodules="True")
version("8.0.0", tag="8.0.0", submodules="True")
version("7.8.2", tag="7.8.2", submodules="True")
version("7.8.1", tag="7.8.1", submodules="True")
variant("coreneuron", default=True, description="Enable CoreNEURON as submodule")
variant("cross-compile", default=False, description="Build for cross-compile environment")
variant("interviews", default=False, description="Enable GUI with INTERVIEWS")
variant("legacy-unit", default=False, description="Enable legacy units")
variant("mpi", default=True, description="Enable MPI parallelism")
variant("python", default=True, description="Enable python")
variant("rx3d", default=False, description="Enable cython translated 3-d rxd")
variant("tests", default=False, description="Enable unit tests")
variant("caliper", default=False, description="Add LLNL/Caliper support")
depends_on("bison", type="build")
depends_on("flex", type="build")
depends_on("py-cython", when="+rx3d", type="build")
depends_on("gettext")
depends_on("mpi", when="+mpi")
depends_on("ncurses")
depends_on("python@2.7:", when="+python")
depends_on("py-pytest", when="+python+tests")
depends_on("py-mpi4py", when="+mpi+python+tests")
depends_on("readline")
depends_on("caliper", when="+caliper")
depends_on("py-numpy", type="run")
conflicts("+rx3d", when="~python")
patch("patch-v782-git-cmake-avx512.patch", when="@7.8.2")
def cmake_args(self):
spec = self.spec
def cmake_options(spec_options):
value = "TRUE" if spec_options in spec else "FALSE"
cmake_name = spec_options[1:].upper().replace("-", "_")
return "-DNRN_ENABLE_" + cmake_name + ":BOOL=" + value
args = [
cmake_options(variant)
for variant in [
"+coreneuron",
"+interviews",
"+mpi",
"+python",
"+rx3d",
"+coreneuron",
"+tests",
]
]
args.append("-DNRN_ENABLE_BINARY_SPECIAL=ON")
if "~mpi" in spec and "+coreneuron" in spec:
args.append("-DCORENRN_ENABLE_MPI=OFF")
if "+python" in spec:
args.append("-DPYTHON_EXECUTABLE:FILEPATH=" + spec["python"].command.path)
if spec.variants["build_type"].value == "Debug":
args.append("-DCMAKE_C_FLAGS=-g -O0")
args.append("-DCMAKE_CXX_FLAGS=-g -O0")
args.append("-DCMAKE_BUILD_TYPE=Custom")
if "+legacy-unit" in spec:
args.append("-DNRN_DYNAMIC_UNITS_USE_LEGACY=ON")
if "+caliper" in spec:
args.append("-DCORENRN_CALIPER_PROFILING=ON")
return args
@run_after("install")
def filter_compilers(self):
"""run after install to avoid spack compiler wrappers
getting embded into nrnivmodl script"""
spec = self.spec
if "cray" in spec.architecture:
cc_compiler = "cc"
cxx_compiler = "CC"
elif spec.satisfies("+mpi"):
cc_compiler = spec["mpi"].mpicc
cxx_compiler = spec["mpi"].mpicxx
else:
cc_compiler = self.compiler.cc
cxx_compiler = self.compiler.cxx
kwargs = {"backup": False, "string": True}
nrnmech_makefile = join_path(self.prefix, "./bin/nrnmech_makefile")
# assign_operator is changed to fix wheel support
if self.spec.satisfies("@:7"):
assign_operator = "?="
else:
assign_operator = "="
filter_file(
"CC {0} {1}".format(assign_operator, env["CC"]),
"CC = {0}".format(cc_compiler),
nrnmech_makefile,
**kwargs,
)
filter_file(
"CXX {0} {1}".format(assign_operator, env["CXX"]),
"CXX = {0}".format(cxx_compiler),
nrnmech_makefile,
**kwargs,
)
if spec.satisfies("+coreneuron"):
corenrn_makefile = join_path(self.prefix, "share/coreneuron/nrnivmodl_core_makefile")
filter_file(env["CXX"], cxx_compiler, corenrn_makefile, **kwargs)
def setup_run_environment(self, env):
env.prepend_path("PATH", join_path(self.prefix, "bin"))
env.prepend_path("LD_LIBRARY_PATH", join_path(self.prefix, "lib"))
if self.spec.satisfies("+python"):
env.prepend_path("PYTHONPATH", self.spec.prefix.lib.python)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 391d4daa..20b8b571 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -98,7 +98,7 @@ Currently we have enabled CMake code formatting using [cmake-format](https://git
* Make sure to install cmake-format utility with Python version you are using:
```
-pip3.7 install cmake-format==0.6.0 --user
+pip3.7 install cmake-format==0.6.0 pyyaml --user
```
Now you should have `cmake-format` command available.
diff --git a/cmake/ExternalProjectHelper.cmake b/cmake/ExternalProjectHelper.cmake
index 57094e7e..eeb6dfc2 100644
--- a/cmake/ExternalProjectHelper.cmake
+++ b/cmake/ExternalProjectHelper.cmake
@@ -1,5 +1,15 @@
find_package(Git QUIET)
+if(${GIT_FOUND} AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
+ execute_process(
+ COMMAND ${GIT_EXECUTABLE} --git-dir=.git describe --all
+ RESULT_VARIABLE NOT_A_GIT_REPO
+ ERROR_QUIET
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
+else()
+ set(NOT_A_GIT_REPO "NotAGitRepo")
+endif()
+
# initialize submodule with given path
function(initialize_submodule path)
if(NOT ${GIT_FOUND})
@@ -9,7 +19,7 @@ function(initialize_submodule path)
message(STATUS "Sub-module : missing ${path} : running git submodule update --init --recursive")
execute_process(
COMMAND
- git submodule update --init --recursive -- ${path}
+ ${GIT_EXECUTABLE} submodule update --init --recursive -- ${path}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
endfunction()
@@ -20,6 +30,9 @@ function(add_external_project name)
NAMES CMakeLists.txt
PATHS "${PROJECT_SOURCE_DIR}/external/${name}")
if(NOT EXISTS ${${name}_PATH})
+ if(NOT_A_GIT_REPO)
+ message(FATAL_ERROR "Looks like you are building from source. Git needed for ${name} feature.")
+ endif()
initialize_submodule(external/${name})
else()
message(STATUS "Sub-project : using ${name} from from external/${name}")
diff --git a/git2nrnversion_h.sh b/git2nrnversion_h.sh
index d62b7410..4d8e4015 100755
--- a/git2nrnversion_h.sh
+++ b/git2nrnversion_h.sh
@@ -20,10 +20,9 @@ if git log > /dev/null && test -d .git ; then
elif test -f src/nrnoc/nrnversion.h ; then
sed -n '1,$p' src/nrnoc/nrnversion.h
else
- echo "#define GIT_DATE \"1999-12-31\""
- echo "#define GIT_BRANCH \"?\""
- echo "#define GIT_CHANGESET \"?\""
- echo "#define GIT_DESCRIBE \"?\""
- exit 1
+ echo "#define GIT_DATE \"Build Time: $(date "+%Y-%m-%d-%H:%M:%S")\""
+ echo "#define GIT_BRANCH \"unknown branch\""
+ echo "#define GIT_CHANGESET \"unknown commit id\""
+ echo "#define GIT_DESCRIBE \"${PROJECT_VERSION}.dev0\""
fi
diff --git a/src/ivoc/ivocvect.cpp b/src/ivoc/ivocvect.cpp
index 4884614a..4da9e17e 100644
--- a/src/ivoc/ivocvect.cpp
+++ b/src/ivoc/ivocvect.cpp
@@ -67,7 +67,26 @@ extern "C" {
#define FRead(arg1,arg2,arg3,arg4) if (fread(arg1,arg2,arg3,arg4) != arg3) {}
#endif
-static double dmaxint_;
+/**
+ * As all parameters are passed from hoc as double, we need
+ * to calculate max integer that can fit into double variable.
+ *
+ * With IEEE 64-bit double has 52 bits of mantissa, so it's 2^53.
+ * calculating it with approach `while (dbl + 1 != dbl) dbl++;`
+ * has issues with SSE and other 32 bits platform. So we are using
+ * direct value here.
+ *
+ * The maximum mantissa 0xFFFFFFFFFFFFF which is 52 bits all 1.
+ * In Python it's:
+ *
+ * >>> (2.**53).hex()
+ * '0x1.0000000000000p+53'
+ * >>> (2.**53)
+ * 9007199254740992.0
+ *
+ * See https://stackoverflow.com/questions/1848700/biggest-integer-that-can-be-stored-in-a-double
+ */
+static double dmaxint_ = 9007199254740992;
// Definitions allow machine independent write and read
// note that must include BYTEHEADER at head of routine
@@ -3776,20 +3795,7 @@ static void steer_x(void* v) {
}
void Vector_reg() {
- dmaxint_ = 1073741824.;
- for(;;) {
- if (dmaxint_*2. == double(int(dmaxint_*2.))) {
- dmaxint_ *= 2.;
- }else{
- if (dmaxint_*2. - 1. == double(int(dmaxint_*2. - 1.))) {
- dmaxint_ = 2.*dmaxint_ - 1.;
- }
- break;
- }
- }
- //printf("dmaxint=%30.20g %d\n", dmaxint_, (long)dmaxint_);
- class2oc("Vector", v_cons, v_destruct, v_members, NULL, v_retobj_members,
- v_retstr_members);
+ class2oc("Vector", v_cons, v_destruct, v_members, NULL, v_retobj_members, v_retstr_members);
svec_ = hoc_lookup("Vector");
// now make the x variable an actual double
Symbol* sv = hoc_lookup("Vector");
diff --git a/src/nrniv/CMakeLists.txt b/src/nrniv/CMakeLists.txt
index 30024d6e..26f76a98 100644
--- a/src/nrniv/CMakeLists.txt
+++ b/src/nrniv/CMakeLists.txt
@@ -139,7 +139,8 @@ set(NRN_INCLUDE_DIRS
# is different from the contents of nrnversion.h
# ~~~
add_custom_target(
- nrnversion_h ${PROJECT_SOURCE_DIR}/git2nrnversion_h.sh ${PROJECT_SOURCE_DIR} > nrnversion.h.tmp
+ nrnversion_h
+ COMMAND ${CMAKE_COMMAND} -E env PROJECT_VERSION=${PROJECT_VERSION} $ENV{SHELL} ${PROJECT_SOURCE_DIR}/git2nrnversion_h.sh ${PROJECT_SOURCE_DIR} > nrnversion.h.tmp
COMMAND ${CMAKE_COMMAND} -E copy_if_different nrnversion.h.tmp ${NRN_NRNOC_SRC_DIR}/nrnversion.h
DEPENDS ${PROJECT_SOURCE_DIR}/git2nrnversion_h.sh)
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment