diff --git a/CMakeLists.txt b/CMakeLists.txt index afc69a2..ebc64e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,12 @@ cmake_minimum_required(VERSION 2.6) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}") project(CosmoToolbox) +include(GetGitRevisionDescription) + +get_git_head_revision(HEAD GIT_VER) + option(BUILD_SHARED_LIBS "Build shared libraries." OFF) find_path(NETCDF_INCLUDE_PATH NAMES netcdf.h) @@ -27,7 +32,7 @@ SET(CPACK_PACKAGE_VENDOR "Guilhem Lavaux") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENCE_CeCILL_V2") SET(CPACK_PACKAGE_VERSION_MAJOR "1") SET(CPACK_PACKAGE_VERSION_MINOR "0") -SET(CPACK_PACKAGE_VERSION_PATCH "0") +SET(CPACK_PACKAGE_VERSION_PATCH "0-${GIT_VER}") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CosmoToolbox-${GalaxExplorer_VERSION_MAJOR}.${GalaxExplorer_VERSION_MINOR}") SET(CPACK_STRIP_FILES "lib/libCosmoTool.so") SET(CPACK_SOURCE_IGNORE_FILES diff --git a/GetGitRevisionDescription.cmake b/GetGitRevisionDescription.cmake new file mode 100644 index 0000000..f6f07ca --- /dev/null +++ b/GetGitRevisionDescription.cmake @@ -0,0 +1,104 @@ +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ ...]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) + set(GIT_DIR "${CMAKE_SOURCE_DIR}/.git") + if(NOT EXISTS "${GIT_DIR}") + # not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" "${GIT_DATA}/grabRef.cmake" @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process(COMMAND "${GIT_EXECUTABLE}" describe ${hash} ${ARGN} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE res + OUTPUT_VARIABLE out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} "${out}" PARENT_SCOPE) +endfunction() diff --git a/GetGitRevisionDescription.cmake.in b/GetGitRevisionDescription.cmake.in new file mode 100644 index 0000000..c04662c --- /dev/null +++ b/GetGitRevisionDescription.cmake.in @@ -0,0 +1,30 @@ +# +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) +string(STRIP "${HEAD_HASH}" HEAD_HASH) diff --git a/src/loadGadget.cpp b/src/loadGadget.cpp index 8336936..47f6bb9 100644 --- a/src/loadGadget.cpp +++ b/src/loadGadget.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -63,12 +64,13 @@ PurePositionData *CosmoTool::loadGadgetPosition(const char *fname) -SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id, int loadflags) +SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id, int loadflags, int GadgetFormat) { SimuData *data; int p, n; UnformattedRead *f; GadgetHeader h; + float velmul; if (id >= 0) { int k = snprintf(0, 0, "%s.%d", fname, id)+1; @@ -113,9 +115,9 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id, int loadflags) h.flag_cooling = f->readInt32(); h.num_files = f->readInt32(); data->BoxSize = h.BoxSize = f->readReal64(); - h.Omega0 = f->readReal64(); - h.OmegaLambda = f->readReal64(); - h.HubbleParam = f->readReal64(); + data->Omega_M = h.Omega0 = f->readReal64(); + data->Omega_Lambda = h.OmegaLambda = f->readReal64(); + data->Hubble = h.HubbleParam = f->readReal64(); f->endCheckpoint(true); for(int k=0; k<6; k++) @@ -125,6 +127,14 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id, int loadflags) } data->NumPart = NumPart; data->TotalNumPart = NumPartTotal; + if (GadgetFormat == 1) + velmul = sqrt(h.time); + else if (GadgetFormat == 2) + velmul = 1/(h.time); + else { + cerr << "unknown gadget format" << endl; + abort(); + } } catch (const InvalidUnformattedAccess& e) { @@ -197,9 +207,10 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id, int loadflags) f->beginCheckpoint(); for(int k = 0, p = 0; k < 6; k++) { for(int n = 0; n < h.npart[k]; n++) { - data->Vel[0][p] = f->readReal32(); - data->Vel[1][p] = f->readReal32(); - data->Vel[2][p] = f->readReal32(); + // THIS IS GADGET 1 + data->Vel[0][p] = f->readReal32()*velmul; + data->Vel[1][p] = f->readReal32()*velmul; + data->Vel[2][p] = f->readReal32()*velmul; p++; } } @@ -213,7 +224,8 @@ SimuData *CosmoTool::loadGadgetMulti(const char *fname, int id, int loadflags) return 0; } - // TODO: FIX THE UNITS OF THESE FUNKY VELOCITIES !!! + // THE VELOCITIES ARE IN PHYSICAL COORDINATES +/// // TODO: FIX THE UNITS OF THESE FUNKY VELOCITIES !!! } else { // Skip velocities f->skip(NumPart*3*sizeof(float)+2*4); diff --git a/src/loadGadget.hpp b/src/loadGadget.hpp index 59a46d4..e92e21f 100644 --- a/src/loadGadget.hpp +++ b/src/loadGadget.hpp @@ -8,7 +8,7 @@ namespace CosmoTool { PurePositionData *loadGadgetPosition(const char *fname); - SimuData *loadGadgetMulti(const char *fname, int id, int flags); + SimuData *loadGadgetMulti(const char *fname, int id, int flags, int GadgetFormat = 1); }; diff --git a/src/loadRamses.cpp b/src/loadRamses.cpp index 74ee575..d243c1a 100644 --- a/src/loadRamses.cpp +++ b/src/loadRamses.cpp @@ -243,7 +243,6 @@ int readInfoFile(const char *basename, int outputId, InfoData& info) iss >> unitLength; infoMap[keyword] = unitLength; - } } diff --git a/src/mykdtree.tcc b/src/mykdtree.tcc index e87b7c2..2a233a4 100644 --- a/src/mykdtree.tcc +++ b/src/mykdtree.tcc @@ -446,6 +446,7 @@ namespace CosmoTool { { char id[KDTREE_DISK_SIGNATURE_LEN]; long nodesUsed, numCells; + long rootId; }; template @@ -456,6 +457,7 @@ namespace CosmoTool { strncpy(h.id, KDTREE_DISK_SIGNATURE, KDTREE_DISK_SIGNATURE_LEN); h.nodesUsed = lastNode; h.numCells = numNodes; + h.rootId = root - nodes; o.write((char*)&h, sizeof(h)); for (long i = 0; i < lastNode; i++) @@ -464,13 +466,17 @@ namespace CosmoTool { node_on_disk.cell_id = nodes[i].value - base_cell; if (nodes[i].children[0] == 0) - node_on_disk.children_node[0] = -1; + node_on_disk.children_node[0] = -1L; else node_on_disk.children_node[0] = nodes[i].children[0] - nodes; + assert((node_on_disk.children_node[0] == -1) || ((node_on_disk.children_node[0] >= 0) && (node_on_disk.children_node[0] < lastNode))); + if (nodes[i].children[1] == 0) - node_on_disk.children_node[1] = -1; + node_on_disk.children_node[1] = -1L; else node_on_disk.children_node[1] = nodes[i].children[1] - nodes; + assert((node_on_disk.children_node[1] == -1) || ((node_on_disk.children_node[1] >= 0) && (node_on_disk.children_node[1] < lastNode))); + memcpy(node_on_disk.minBound, nodes[i].minBound, sizeof(coords)); memcpy(node_on_disk.maxBound, nodes[i].maxBound, sizeof(coords)); @@ -489,10 +495,15 @@ namespace CosmoTool { in.read((char *)&h, sizeof(h)); if (!in || strncmp(h.id, KDTREE_DISK_SIGNATURE, KDTREE_DISK_SIGNATURE_LEN) != 0) - throw InvalidOnDiskKDTree(); + { + std::cerr << "KDTree Signature invalid" << std::endl; + throw InvalidOnDiskKDTree(); + } - if (h.numCells != Ncells || h.nodesUsed < 0) + if (h.numCells != Ncells || h.nodesUsed < 0) { + std::cerr << "The number of cells has changed (" << h.numCells << " != " << Ncells << ") or nodesUsed=" << h.nodesUsed << std::endl; throw InvalidOnDiskKDTree(); + } base_cell = cells; nodes = new Node[h.nodesUsed]; @@ -505,11 +516,18 @@ namespace CosmoTool { in.read((char *)&node_on_disk, sizeof(node_on_disk)); - if (!in || node_on_disk.cell_id > numNodes || node_on_disk.cell_id < 0 || + if (!in) { + std::cerr << "End-of-file reached" << std::endl; + delete[] nodes; + throw InvalidOnDiskKDTree(); + } + if (node_on_disk.cell_id > numNodes || node_on_disk.cell_id < 0 || node_on_disk.children_node[0] > lastNode || node_on_disk.children_node[0] < -1 || node_on_disk.children_node[1] > lastNode || node_on_disk.children_node[1] < -1) { delete[] nodes; + std::cerr << "Invalid cell id or children node id invalid" << std::endl; + std::cerr << node_on_disk.cell_id << std::endl << node_on_disk.children_node[0] << std::endl << node_on_disk.children_node[1] << std::endl; throw InvalidOnDiskKDTree(); } @@ -535,9 +553,15 @@ namespace CosmoTool { if (c != N) { delete[] nodes; + std::cerr << "Coordinates of the cell inconsistent with the boundaries" << std::endl + << " X=" << nodes[i].value->coord[0] << " B=[" << nodes[i].minBound[0] << "," << nodes[i].maxBound[0] << "]" << std::endl + << " Y=" << nodes[i].value->coord[1] << " B=[" << nodes[i].minBound[1] << "," << nodes[i].maxBound[1] << "]" << std::endl + << " Z=" << nodes[i].value->coord[2] << " B=[" << nodes[i].minBound[2] << "," << nodes[i].maxBound[2] << "]" << std::endl; throw InvalidOnDiskKDTree(); } } + + root = &nodes[h.rootId]; sortingHelper = new Cell *[Ncells]; for (uint32_t i = 0; i < Ncells; i++) diff --git a/src/powerSpectrum.cpp b/src/powerSpectrum.cpp index 9f3d7c8..6ad7c89 100644 --- a/src/powerSpectrum.cpp +++ b/src/powerSpectrum.cpp @@ -21,7 +21,7 @@ using namespace std; #define POWER_BDM 7 #define POWER_TEST 8 -#define POWER_SPECTRUM HU_WIGGLES +#define POWER_SPECTRUM POWER_EFSTATHIOU namespace Cosmology { diff --git a/src/yorick.cpp b/src/yorick.cpp index b6ebeed..78c5faf 100644 --- a/src/yorick.cpp +++ b/src/yorick.cpp @@ -118,6 +118,13 @@ public: static const NcType t = ncInt; }; +template<> +class NetCDF_type +{ +public: + static const NcType t = ncInt; +}; + template<> class NetCDF_type {