From 59bb99e7eed502377ae66cff63ed055e80f793b2 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Fri, 27 May 2022 16:26:59 +0300 Subject: [PATCH 01/52] Fix check of kdtree loading from disk --- src/mykdtree.tcc | 68 ++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/mykdtree.tcc b/src/mykdtree.tcc index 6d555bd..6b6831d 100644 --- a/src/mykdtree.tcc +++ b/src/mykdtree.tcc @@ -33,7 +33,7 @@ namespace CosmoTool { template KDTree::KDTree(Cell *cells, NodeIntType Ncells) { - periodic = false; + periodic = false; base_cell = cells; numNodes = Ncells; @@ -41,7 +41,7 @@ namespace CosmoTool { sortingHelper = new Cell *[Ncells]; for (NodeIntType i = 0; i < Ncells; i++) - sortingHelper[i] = &cells[i]; + sortingHelper[i] = &cells[i]; optimize(); } @@ -73,14 +73,14 @@ namespace CosmoTool { absoluteMax[k] = cell->coord[k]; } } - + std::cout << " rebuilding the tree..." << std::endl; - root = buildTree(sortingHelper, activeCells, 0, absoluteMin, absoluteMax); + root = buildTree(sortingHelper, activeCells, 0, absoluteMin, absoluteMax); std::cout << " done." << std::endl; } template - uint64_t KDTree::getIntersection(const coords& x, CoordType r, + uint64_t KDTree::getIntersection(const coords& x, CoordType r, KDTree::Cell **cells, uint64_t numCells) { @@ -112,7 +112,7 @@ namespace CosmoTool { } template - uint64_t KDTree::getIntersection(const coords& x, CoordType r, + uint64_t KDTree::getIntersection(const coords& x, CoordType r, Cell **cells, CoordType *distances, uint64_t numCells) @@ -175,7 +175,7 @@ namespace CosmoTool { template template - void KDTree::recursiveIntersectionCells(RecursionInfoCells& info, + void KDTree::recursiveIntersectionCells(RecursionInfoCells& info, Node *node, int level) { @@ -183,7 +183,7 @@ namespace CosmoTool { CoordType d2 = 0; #if __KD_TREE_ACTIVE_CELLS == 1 - if (node->value->active) + if (node->value->active) #endif { for (int j = 0; j < 3; j++) @@ -250,9 +250,9 @@ namespace CosmoTool { } template - void KD_default_cell_splitter::operator()(KDCell **cells, NodeIntType Ncells, + void KD_default_cell_splitter::operator()(KDCell **cells, NodeIntType Ncells, NodeIntType& split_index, int axis, - typename KDDef::KDCoordinates minBound, + typename KDDef::KDCoordinates minBound, typename KDDef::KDCoordinates maxBound) { CellCompare compare(axis); @@ -279,9 +279,9 @@ namespace CosmoTool { //#pragma omp atomic capture nodeId = (this->lastNode)++; - + node = &nodes[nodeId]; - + // Isolate the environment splitter(cell0, Ncells, mid, axis, minBound, maxBound); @@ -297,12 +297,12 @@ namespace CosmoTool { { node->children[0] = buildTree(cell0, mid, depth, minBound, tmpBound); } - + memcpy(tmpBound, minBound, sizeof(coords)); tmpBound[axis] = node->value->coord[axis]; #pragma omp task private(tmpBound) { - node->children[1] = buildTree(cell0+mid+1, Ncells-mid-1, depth, + node->children[1] = buildTree(cell0+mid+1, Ncells-mid-1, depth, tmpBound, maxBound); } @@ -391,17 +391,17 @@ namespace CosmoTool { } return; } - + // Check if current node is not the nearest - CoordType thisR2 = + CoordType thisR2 = computeDistance(node->value, x); - + if (thisR2 < R2) { R2 = thisR2; best = node->value; - } - + } + // Now we found the best. We check whether the hypersphere // intersect the hyperplane of the other branch @@ -435,11 +435,11 @@ namespace CosmoTool { { coords x_new; r.getPosition(x_new); - recursiveNearest(root, 0, x_new, R2, best); + recursiveNearest(root, 0, x_new, R2, best); } while (r.next()); } - + return best; } @@ -474,15 +474,15 @@ namespace CosmoTool { { recursiveMultipleNearest(info, go, level+1); } - + // Check if current node is not the nearest - CoordType thisR2 = + CoordType thisR2 = computeDistance(node->value, info.x); info.queue.push(node->value, thisR2); info.traversed++; // if (go == 0) // return; - + // Now we found the best. We check whether the hypersphere // intersect the hyperplane of the other branch @@ -497,7 +497,7 @@ namespace CosmoTool { { recursiveMultipleNearest(info, other, level+1); } - } + } } template @@ -505,7 +505,7 @@ namespace CosmoTool { Cell **cells) { RecursionMultipleInfo info(x, cells, N2); - + for (int i = 0; i < N2; i++) cells[i] = 0; @@ -532,7 +532,7 @@ namespace CosmoTool { CoordType *distances) { RecursionMultipleInfo info(x, cells, N2); - + for (int i = 0; i < N2; i++) cells[i] = 0; @@ -555,14 +555,14 @@ namespace CosmoTool { #ifdef __KD_TREE_SAVE_ON_DISK #define KDTREE_DISK_SIGNATURE "KDTREE" #define KDTREE_DISK_SIGNATURE_LEN 7 - + template struct KDTreeOnDisk { long cell_id; long children_node[2]; typename KDDef::KDCoordinates minBound, maxBound; - }; + }; struct KDTreeHeader { @@ -619,7 +619,7 @@ namespace CosmoTool { { std::cerr << "KDTree Signature invalid" << std::endl; throw InvalidOnDiskKDTree(); - } + } if (h.numCells != Ncells || h.nodesUsed < 0) { std::cerr << "The number of cells has changed (" << h.numCells << " != " << Ncells << ") or nodesUsed=" << h.nodesUsed << std::endl; @@ -643,8 +643,8 @@ namespace CosmoTool { 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) + (node_on_disk.children_node[0] >= 0 && node_on_disk.children_node[0] > lastNode) || node_on_disk.children_node[0] < -1 || + (node_on_disk.children_node[1] >= 0 && 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; @@ -683,10 +683,10 @@ namespace CosmoTool { } root = &nodes[h.rootId]; - + sortingHelper = new Cell *[Ncells]; for (NodeIntType i = 0; i < Ncells; i++) - sortingHelper[i] = &cells[i]; + sortingHelper[i] = &cells[i]; } #endif From a309aa732bbd83439acb622840dcafcd42c2fc4e Mon Sep 17 00:00:00 2001 From: Ewoud Date: Thu, 9 Jun 2022 17:48:56 +0200 Subject: [PATCH 02/52] Fix for C++17: switch out random_shuffle for shuffle. For details see https://clang.llvm.org/extra/clang-tidy/checks/modernize-replace-random-shuffle.html --- external/patch-omptl | 57 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/external/patch-omptl b/external/patch-omptl index 9ea9d28..6ff7c7b 100644 --- a/external/patch-omptl +++ b/external/patch-omptl @@ -113,3 +113,60 @@ diff -ur omptl.old/omptl_tools.h omptl/omptl_tools.h namespace omptl { +diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h +--- omptl.old/omptl_algorithm_par.h 2012-04-22 16:29:41.000000000 +0200 ++++ omptl/omptl_algorithm_par.h 2022-06-09 13:50:05.000000000 +0200 +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -1309,14 +1310,14 @@ + void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, + const unsigned P) + { +- std::random_shuffle(first, last); ++ std::shuffle(first, last, std::mt19937(std::random_device()())); + } + + template + void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, + RandomNumberGenerator& rgen, const unsigned P) + { +- std::random_shuffle(first, last, rgen); ++ std::shuffle(first, last, std::mt19937(std::random_device()())); + } + + // Not (yet) parallelized, not straightforward due to possible dependencies +diff -ur omptl.old/omptl_algorithm_ser.h omptl/omptl_algorithm_ser.h +--- omptl.old/omptl_algorithm_ser.h 2012-04-22 16:29:41.000000000 +0200 ++++ omptl/omptl_algorithm_ser.h 2022-06-09 13:50:41.000000000 +0200 +@@ -14,7 +14,7 @@ + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, write to the Free Software + // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +- ++#include + + namespace omptl + { +@@ -463,14 +463,14 @@ + void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, + const unsigned P) + { +- return ::std::random_shuffle(first, last); ++ return ::std::shuffle(first, last, std::mt19937(std::random_device()())); + } + + template + void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, + RandomNumberGenerator &rgen, const unsigned P) + { +- return ::std::random_shuffle(first, last, rgen); ++ return ::std::shuffle(first, last, std::mt19937(std::random_device()())); + } + + template From cc94866bc3d5e91ea32cfa0b05a6557dbe3fc78e Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sun, 19 Jun 2022 08:24:26 +0200 Subject: [PATCH 03/52] Remove bind2nd from omptl --- external/patch-omptl | 258 +++++++++++++++++++++++++++++++------------ 1 file changed, 186 insertions(+), 72 deletions(-) diff --git a/external/patch-omptl b/external/patch-omptl index 6ff7c7b..63df1d1 100644 --- a/external/patch-omptl +++ b/external/patch-omptl @@ -1,6 +1,6 @@ -diff -ur omptl.old/omptl_algorithm omptl/omptl_algorithm ---- omptl.old/omptl_algorithm 2012-04-22 16:29:41.000000000 +0200 -+++ omptl/omptl_algorithm 2021-06-20 15:40:29.000000000 +0200 +diff -ur omptl.old/algorithm omptl/algorithm +--- omptl.old/algorithm 2022-06-19 08:21:39.815498672 +0200 ++++ omptl/algorithm 2022-06-19 08:21:52.953544672 +0200 @@ -20,7 +20,7 @@ #define OMPTL_ALGORITHM 1 @@ -22,32 +22,9 @@ diff -ur omptl.old/omptl_algorithm omptl/omptl_algorithm #endif #endif /* OMPTL_ALGORITHM */ -diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h ---- omptl.old/omptl_algorithm_par.h 2012-04-22 16:29:41.000000000 +0200 -+++ omptl/omptl_algorithm_par.h 2021-06-20 15:40:50.000000000 +0200 -@@ -21,8 +21,8 @@ - #include - #include - --#include --#include -+#include "omptl_tools.h" -+#include "omptl_numeric" - - #include - -@@ -1700,7 +1700,7 @@ - - std::vector pivot_used(pivots.size(), false); // can't be bool due to parallel write - -- const unsigned max_depth = std::floor(std::tr1::log2(P)); -+ const unsigned max_depth = unsigned(std::floor(std::log2(P))); - assert(1u << max_depth <= P); - for (unsigned i = 0; i < max_depth; ++i) - { -diff -ur omptl.old/omptl_numeric omptl/omptl_numeric ---- omptl.old/omptl_numeric 2012-04-22 16:29:41.000000000 +0200 -+++ omptl/omptl_numeric 2021-06-20 15:40:29.000000000 +0200 +diff -ur omptl.old/numeric omptl/numeric +--- omptl.old/numeric 2022-06-19 08:21:39.816498675 +0200 ++++ omptl/numeric 2022-06-19 08:21:52.955544679 +0200 @@ -19,7 +19,7 @@ #define OMPTL_NUMERIC 1 @@ -72,58 +49,91 @@ diff -ur omptl.old/omptl_numeric omptl/omptl_numeric +#include "omptl_numeric_extensions.h" #endif /* OMPTL_NUMERIC */ -diff -ur omptl.old/omptl_numeric_extensions.h omptl/omptl_numeric_extensions.h ---- omptl.old/omptl_numeric_extensions.h 2012-04-22 16:29:41.000000000 +0200 -+++ omptl/omptl_numeric_extensions.h 2021-06-20 15:40:29.000000000 +0200 -@@ -51,9 +51,9 @@ - } // namespace +diff -ur omptl.old/omptl_algorithm omptl/omptl_algorithm +--- omptl.old/omptl_algorithm 2022-06-19 08:21:39.815498672 +0200 ++++ omptl/omptl_algorithm 2022-06-19 08:21:52.953544672 +0200 +@@ -20,7 +20,7 @@ + #define OMPTL_ALGORITHM 1 + + #include +-#include ++#include "omptl" + + namespace omptl + { +@@ -553,9 +553,9 @@ + } // namespace omptl #ifdef _OPENMP -- #include -+ #include "omptl_numeric_extensions_par.h" +- #include ++ #include "omptl_algorithm_par.h" #else -- #include -+ #include "omptl_numeric_extensions_ser.h" +- #include ++ #include "omptl_algorithm_ser.h" #endif - namespace omptl -diff -ur omptl.old/omptl_numeric_par.h omptl/omptl_numeric_par.h ---- omptl.old/omptl_numeric_par.h 2012-04-22 16:29:41.000000000 +0200 -+++ omptl/omptl_numeric_par.h 2021-06-20 15:40:29.000000000 +0200 -@@ -23,8 +23,8 @@ - #include - #include - --#include --#include -+#include "omptl_algorithm" -+#include "omptl_tools.h" - - namespace omptl - { -diff -ur omptl.old/omptl_tools.h omptl/omptl_tools.h ---- omptl.old/omptl_tools.h 2012-04-22 16:29:41.000000000 +0200 -+++ omptl/omptl_tools.h 2021-06-20 15:40:42.000000000 +0200 -@@ -25,7 +25,7 @@ - #include - #include - --#include -+#include - - namespace omptl - { + #endif /* OMPTL_ALGORITHM */ diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h ---- omptl.old/omptl_algorithm_par.h 2012-04-22 16:29:41.000000000 +0200 -+++ omptl/omptl_algorithm_par.h 2022-06-09 13:50:05.000000000 +0200 -@@ -20,6 +20,7 @@ +--- omptl.old/omptl_algorithm_par.h 2022-06-19 08:21:39.816498675 +0200 ++++ omptl/omptl_algorithm_par.h 2022-06-19 08:23:50.705956964 +0200 +@@ -20,9 +20,10 @@ #include #include #include +#include - #include - #include +-#include +-#include ++#include "omptl_tools.h" ++#include "omptl_numeric" + + #include + +@@ -510,7 +511,7 @@ + + typename std::vector::iterator result = + std::find_if(results.begin(),results.end(), +- std::bind2nd(std::not_equal_to(), last) ); ++ std::bind(std::not_equal_to(), std::placeholders::_1, last) ); + + if ( result != results.end() ) + return *result; +@@ -569,7 +570,7 @@ + + const typename std::vector::iterator result + = std::find_if(results.begin(), results.end(), +- std::bind2nd(std::not_equal_to(), last) ); ++ std::bind(std::not_equal_to(), std::placeholders::_1, last) ); + + if ( result != results.end() ) + return *result; +@@ -654,7 +655,7 @@ + + const typename std::vector::iterator + result = std::find_if(results.begin(), results.end(), +- std::bind2nd(std::not_equal_to(), last1)); ++ std::bind(std::not_equal_to(), std::placeholders::_1, last1)); + + if ( result != results.end() ) + return *result; +@@ -953,7 +954,7 @@ + results[t] = std::lower_bound(partitions[t].first, partitions[t].second, value, comp); + + const typename std::vector::iterator result = +- std::find_if(results.begin(), results.end(), std::bind2nd(std::not_equal_to(), last) ); ++ std::find_if(results.begin(), results.end(), std::bind(std::not_equal_to(), std::placeholders::_1, last) ); + + if (result != results.end()) + return *result; +@@ -1179,7 +1180,7 @@ + + namespace detail + { +- ++ + template + Iterator _pivot_range(Iterator first, Iterator last, + const typename std::iterator_traits::value_type pivot, @@ -1309,14 +1310,14 @@ void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, const unsigned P) @@ -141,9 +151,45 @@ diff -ur omptl.old/omptl_algorithm_par.h omptl/omptl_algorithm_par.h } // Not (yet) parallelized, not straightforward due to possible dependencies +@@ -1472,7 +1473,7 @@ + const T& new_value, const unsigned P) + { + return ::omptl::replace_copy_if(first, last, result, +- std::bind2nd(std::equal_to(), old_value), new_value, P); ++ std::bind(std::equal_to(), std::placeholders::_1, old_value), new_value, P); + } + + template +@@ -1700,7 +1701,7 @@ + + std::vector pivot_used(pivots.size(), false); // can't be bool due to parallel write + +- const unsigned max_depth = std::floor(std::tr1::log2(P)); ++ const unsigned max_depth = unsigned(std::floor(std::log2(P))); + assert(1u << max_depth <= P); + for (unsigned i = 0; i < max_depth; ++i) + { +@@ -1781,7 +1782,7 @@ + std::cout << std::endl; + + std::cout << borders.size() << " " << partitions.size() << " " << P << std::endl; +-*/ ++*/ + // Round one: sort final partitions, split remaining + #pragma omp parallel for + for (int i = 0; i < int(partitions.size()); ++i) +@@ -1814,7 +1815,7 @@ + + const RandomAccessIterator begin = partitions[i].first; + const RandomAccessIterator end = partitions[i].second; +- ++ + const RandomAccessIterator middle = + detail::_pivot_range(begin, end, pivots[pivot_index], comp); + partitions[i ] = std::make_pair(begin, middle); diff -ur omptl.old/omptl_algorithm_ser.h omptl/omptl_algorithm_ser.h ---- omptl.old/omptl_algorithm_ser.h 2012-04-22 16:29:41.000000000 +0200 -+++ omptl/omptl_algorithm_ser.h 2022-06-09 13:50:41.000000000 +0200 +--- omptl.old/omptl_algorithm_ser.h 2022-06-19 08:21:39.815498672 +0200 ++++ omptl/omptl_algorithm_ser.h 2022-06-19 08:21:52.960544697 +0200 @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software @@ -170,3 +216,71 @@ diff -ur omptl.old/omptl_algorithm_ser.h omptl/omptl_algorithm_ser.h } template +diff -ur omptl.old/omptl_numeric omptl/omptl_numeric +--- omptl.old/omptl_numeric 2022-06-19 08:21:39.816498675 +0200 ++++ omptl/omptl_numeric 2022-06-19 08:21:52.955544679 +0200 +@@ -19,7 +19,7 @@ + #define OMPTL_NUMERIC 1 + + #include +-#include ++#include "omptl" + + namespace omptl + { +@@ -73,11 +73,11 @@ + } // namespace omptl + + #ifdef _OPENMP +- #include ++ #include "omptl_numeric_par.h" + #else +- #include ++ #include "omptl_numeric_ser.h" + #endif + +-#include ++#include "omptl_numeric_extensions.h" + + #endif /* OMPTL_NUMERIC */ +diff -ur omptl.old/omptl_numeric_extensions.h omptl/omptl_numeric_extensions.h +--- omptl.old/omptl_numeric_extensions.h 2022-06-19 08:21:39.815498672 +0200 ++++ omptl/omptl_numeric_extensions.h 2022-06-19 08:21:52.956544683 +0200 +@@ -51,9 +51,9 @@ + } // namespace + + #ifdef _OPENMP +- #include ++ #include "omptl_numeric_extensions_par.h" + #else +- #include ++ #include "omptl_numeric_extensions_ser.h" + #endif + + namespace omptl +diff -ur omptl.old/omptl_numeric_par.h omptl/omptl_numeric_par.h +--- omptl.old/omptl_numeric_par.h 2022-06-19 08:21:39.816498675 +0200 ++++ omptl/omptl_numeric_par.h 2022-06-19 08:21:52.957544686 +0200 +@@ -23,8 +23,8 @@ + #include + #include + +-#include +-#include ++#include "omptl_algorithm" ++#include "omptl_tools.h" + + namespace omptl + { +diff -ur omptl.old/omptl_tools.h omptl/omptl_tools.h +--- omptl.old/omptl_tools.h 2022-06-19 08:21:39.816498675 +0200 ++++ omptl/omptl_tools.h 2022-06-19 08:21:52.957544686 +0200 +@@ -25,7 +25,7 @@ + #include + #include + +-#include ++#include + + namespace omptl + { From 31d0f194081efe4ae3c4f8109dd05c33056c8b4e Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sun, 19 Jun 2022 10:53:45 +0200 Subject: [PATCH 04/52] Fix patch --- external/patch-omptl | 51 -------------------------------------------- 1 file changed, 51 deletions(-) diff --git a/external/patch-omptl b/external/patch-omptl index 63df1d1..1386247 100644 --- a/external/patch-omptl +++ b/external/patch-omptl @@ -1,54 +1,3 @@ -diff -ur omptl.old/algorithm omptl/algorithm ---- omptl.old/algorithm 2022-06-19 08:21:39.815498672 +0200 -+++ omptl/algorithm 2022-06-19 08:21:52.953544672 +0200 -@@ -20,7 +20,7 @@ - #define OMPTL_ALGORITHM 1 - - #include --#include -+#include "omptl" - - namespace omptl - { -@@ -553,9 +553,9 @@ - } // namespace omptl - - #ifdef _OPENMP -- #include -+ #include "omptl_algorithm_par.h" - #else -- #include -+ #include "omptl_algorithm_ser.h" - #endif - - #endif /* OMPTL_ALGORITHM */ -diff -ur omptl.old/numeric omptl/numeric ---- omptl.old/numeric 2022-06-19 08:21:39.816498675 +0200 -+++ omptl/numeric 2022-06-19 08:21:52.955544679 +0200 -@@ -19,7 +19,7 @@ - #define OMPTL_NUMERIC 1 - - #include --#include -+#include "omptl" - - namespace omptl - { -@@ -73,11 +73,11 @@ - } // namespace omptl - - #ifdef _OPENMP -- #include -+ #include "omptl_numeric_par.h" - #else -- #include -+ #include "omptl_numeric_ser.h" - #endif - --#include -+#include "omptl_numeric_extensions.h" - - #endif /* OMPTL_NUMERIC */ diff -ur omptl.old/omptl_algorithm omptl/omptl_algorithm --- omptl.old/omptl_algorithm 2022-06-19 08:21:39.815498672 +0200 +++ omptl/omptl_algorithm 2022-06-19 08:21:52.953544672 +0200 From f03751907b0671b7e79247bb14188c40f97ad988 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 17 Aug 2022 08:57:52 +0300 Subject: [PATCH 05/52] Push compatibility to HDF5 1.12 --- src/h5_readFlash.cpp | 96 ++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 53 deletions(-) diff --git a/src/h5_readFlash.cpp b/src/h5_readFlash.cpp index 8e46b89..6e2ec3a 100644 --- a/src/h5_readFlash.cpp +++ b/src/h5_readFlash.cpp @@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...) This software is governed by the CeCILL license under French law and -abiding by the rules of distribution of free software. You can use, +abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL -"http://www.cecill.info". +"http://www.cecill.info". As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors have only limited -liability. +liability. In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or developing or reproducing the @@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also therefore means that it is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the software's suitability as regards their -requirements in conditions enabling the security of their systems and/or -data to be ensured and, more generally, to use and operate it in the -same conditions as regards security. +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. @@ -59,8 +59,8 @@ int ipvz_out = 5; /* xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */ -/* n*_runtime_parameters should be set by the caller to - the maximum number of runtime parameters to read. +/* n*_runtime_parameters should be set by the caller to + the maximum number of runtime parameters to read. */ void h5_read_runtime_parameters @@ -100,12 +100,12 @@ void h5_read_runtime_parameters nreal_runtime_parameters = MAX_PARM; /* integer runtime parameters */ - int_rt_parms = (int_runtime_params_t *) malloc(nint_runtime_parameters * sizeof(int_runtime_params_t)); + int_rt_parms = (int_runtime_params_t *) malloc(nint_runtime_parameters * sizeof(int_runtime_params_t)); rank = 1; DataSet dataset = file->openDataSet("integer runtime parameters"); - - IntType int_rt_type = dataset.getIntType(); + + IntType int_rt_type = dataset.getIntType(); //int_rt_type = H5Dget_type(dataset); DataSpace dataspace = dataset.getSpace(); @@ -123,10 +123,7 @@ void h5_read_runtime_parameters DataSpace memspace(rank, &dimens_1d); //memspace = H5Screate_simple(rank, &dimens_1d, NULL); - dataset.read(int_rt_parms, int_rt_type, memspace, dataspace, - H5P_DEFAULT); - //status = H5Dread(dataset, int_rt_type, memspace, dataspace, - // H5P_DEFAULT, int_rt_parms); + dataset.read(int_rt_parms, int_rt_type, memspace, dataspace); for (i = 0; i < nint_runtime_parameters; i++) { @@ -145,14 +142,14 @@ void h5_read_runtime_parameters /* reals */ - real_rt_parms = (real_runtime_params_t *) malloc(nreal_runtime_parameters * sizeof(real_runtime_params_t)); - + real_rt_parms = (real_runtime_params_t *) malloc(nreal_runtime_parameters * sizeof(real_runtime_params_t)); + rank = 1; dataset = file->openDataSet("real runtime parameters"); - //dataset = H5Dopen(*file_identifier, "real runtime parameters"); - + //dataset = H5Dopen(*file_identifier, "real runtime parameters"); + dataspace = dataset.getSpace(); - FloatType real_rt_type = dataset.getFloatType(); + FloatType real_rt_type = dataset.getFloatType(); ndims = dataspace.getSimpleExtentDims(&dimens_1d, NULL); //dataspace = H5Dget_space(dataset); //real_rt_type = H5Dget_type(dataset); @@ -167,10 +164,7 @@ void h5_read_runtime_parameters memspace = DataSpace(rank, &dimens_1d); //memspace = H5Screate_simple(rank, &dimens_1d, NULL); - dataset.read(real_rt_parms, real_rt_type, memspace, dataspace, - H5P_DEFAULT); - //status = H5Dread(dataset, real_rt_type, memspace, dataspace, -// H5P_DEFAULT, real_rt_parms); + dataset.read(real_rt_parms, real_rt_type, memspace, dataspace); for (i = 0; i < nreal_runtime_parameters; i++) { @@ -193,7 +187,7 @@ void h5_read_runtime_parameters *LBox = real_runtime_parameter_values[i]; } if (strncmp(real_runtime_parameter_names[i],"hubbleconstant", 14) == 0 ) { - *hubble = real_runtime_parameter_values[i]; + *hubble = real_runtime_parameter_values[i]; } if (strncmp(real_runtime_parameter_names[i],"omegamatter", 11) == 0 ) { *omegam = real_runtime_parameter_values[i]; @@ -205,7 +199,7 @@ void h5_read_runtime_parameters *omegalambda = real_runtime_parameter_values[i]; } } - + for (i = 0; i < nint_runtime_parameters; i++) { if (strncmp(int_runtime_parameter_names[i],"pt_numx",7) == 0 ) { *numPart = int_runtime_parameter_values[i]; @@ -214,7 +208,7 @@ void h5_read_runtime_parameters } } - + /* xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ void h5_read_flash3_particles (H5File* file, int* totalparticles, @@ -241,8 +235,8 @@ void h5_read_flash3_particles (H5File* file, char *propName; double *partBuffer; char part_names[50][OUTPUT_PROP_LENGTH]; - int string_size; - + int string_size; + // char part_names[NPART_PROPS][OUTPUT_PROP_LENGTH]; hsize_t dimens_2d[2], maxdimens_2d[2]; hsize_t start_2d[2], count_2d[2], stride_2d[2]; @@ -265,12 +259,12 @@ void h5_read_flash3_particles (H5File* file, //total number of particle properties numProps = dimens_2d[0]; - + string_size = OUTPUT_PROP_LENGTH; StrType string_type = H5Tcopy(H5T_C_S1); string_type.setSize(string_size); //status = H5Tset_size(string_type, string_size); - + rank = 2; start_2d[0] = 0; @@ -282,22 +276,20 @@ void h5_read_flash3_particles (H5File* file, count_2d[0] = dimens_2d[0]; count_2d[1] = dimens_2d[1]; - dataspace.selectHyperslab(H5S_SELECT_SET, count_2d, start_2d); + dataspace.selectHyperslab(H5S_SELECT_SET, count_2d, start_2d); //status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start_2d, // stride_2d, count_2d, NULL); DataSpace memspace(rank, dimens_2d); //memspace = H5Screate_simple(rank, dimens_2d, NULL); - dataset.read(part_names, string_type, H5S_ALL, H5S_ALL, H5P_DEFAULT); - //status = H5Dread(dataset, string_type, H5S_ALL, H5S_ALL, - // H5P_DEFAULT, part_names); + dataset.read(part_names, string_type); + - string_type.close(); memspace.close(); dataspace.close(); - dataset.close(); + dataset.close(); //H5Tclose(string_type); //H5Sclose(memspace); //H5Sclose(dataspace); @@ -313,7 +305,7 @@ void h5_read_flash3_particles (H5File* file, if (strncmp(part_names[i], "velz", 4) == 0) { ipvz = i+1; } } - if ((iptag < 0) || (ipx < 0) || (ipy < 0) || (ipz < 0) || (ipvx < 0) || + if ((iptag < 0) || (ipx < 0) || (ipy < 0) || (ipz < 0) || (ipvx < 0) || (ipvy < 0) || (ipvz < 0) ) { printf("One or more required particle attributes not found in file!\n"); return; @@ -325,7 +317,7 @@ void h5_read_flash3_particles (H5File* file, //read particles dataset = file->openDataSet("tracer particles"); //dataset = H5Dopen(*file_identifier, "tracer particles"); - + FloatType datatype = dataset.getFloatType(); //datatype = H5Dget_type(dataset); @@ -338,7 +330,7 @@ void h5_read_flash3_particles (H5File* file, ndims = dataspace.getSimpleExtentDims(dimens_2d, NULL); //dataspace = H5Dget_space(dataset); //H5Sget_simple_extent_dims(dataspace, dimens_2d, maxdimens_2d); - + /*insert particle properties (numPartBuffer) particles at a time*/ pstack = (*localnp); poffset = 0; @@ -366,7 +358,7 @@ void h5_read_flash3_particles (H5File* file, dimens_2d[0] = (pcount); dimens_2d[1] = (numProps); - dataspace.selectHyperslab(H5S_SELECT_SET, count_2d, start_2d); + dataspace.selectHyperslab(H5S_SELECT_SET, count_2d, start_2d); //status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start_2d, // stride_2d, count_2d, NULL); @@ -374,8 +366,7 @@ void h5_read_flash3_particles (H5File* file, //memspace = H5Screate_simple(rank, dimens_2d, maxdimens_2d); /* read data from the dataset */ - dataset.read(partBuffer, datatype, memspace, dataspace, H5P_DEFAULT); - //status = H5Dread(dataset, datatype, memspace, dataspace, H5P_DEFAULT, partBuffer); + dataset.read(partBuffer, datatype, memspace, dataspace); /* convert buffer into particle struct */ @@ -391,8 +382,8 @@ void h5_read_flash3_particles (H5File* file, pos3[p+poffset] = (float) *(partBuffer+ipz-1+p*numProps); } } - - + + if (vel1 && vel2 && vel3) { for(p=0; p < (pcount); p++) { vel1[p+poffset] = (float) *(partBuffer+ipvx-1+p*numProps); @@ -423,7 +414,7 @@ void h5_read_flash3_particles (H5File* file, //status = H5Sclose(dataspace); //status = H5Dclose(dataset); } - + /*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ @@ -451,7 +442,7 @@ void h5_read_flash3_header_info(H5File* file, H5std_string DATASET_NAME; - string_type = H5Tcopy(H5T_C_S1); + string_type = H5Tcopy(H5T_C_S1); H5Tset_size(string_type, MAX_STRING_LENGTH); DataSet dataset = file->openDataSet("real scalars"); @@ -467,13 +458,13 @@ void h5_read_flash3_header_info(H5File* file, /* malloc a pointer to a list of real_list_t's */ real_list = (real_list_t *) malloc(dimens_1d * sizeof(real_list_t)); - // create a new simple dataspace of 1 dimension and size of 'dimens_1d' + // create a new simple dataspace of 1 dimension and size of 'dimens_1d' DataSpace memspace(1, &dimens_1d); - // create an empty vessel sized to hold one real_list_t's worth of data + // create an empty vessel sized to hold one real_list_t's worth of data CompType real_list_type( sizeof(real_list_t) ); - // subdivide the empty vessel into its component sections (name and value) + // subdivide the empty vessel into its component sections (name and value) real_list_type.insertMember( "name", HOFFSET(real_list_t, name), @@ -484,9 +475,8 @@ void h5_read_flash3_header_info(H5File* file, HOFFSET(real_list_t, value), PredType::NATIVE_DOUBLE); - // read the data into 'real_list' - dataset.read( real_list, real_list_type, memspace, dataspace, - H5P_DEFAULT); + // read the data into 'real_list' + dataset.read( real_list, real_list_type, memspace, dataspace); if (status < 0) { From b538d4974dc1a213cf8bcffb500dc415d8cf91f1 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Tue, 15 Nov 2022 09:02:11 +0100 Subject: [PATCH 06/52] Add and fix support for parallel SPH state --- src/sphSmooth.hpp | 37 ++++++++++++++++++------------------ src/sphSmooth.tcc | 48 +++++++++++++++++++++++++---------------------- 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/src/sphSmooth.hpp b/src/sphSmooth.hpp index c364621..de3914c 100644 --- a/src/sphSmooth.hpp +++ b/src/sphSmooth.hpp @@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...) This software is governed by the CeCILL license under French law and -abiding by the rules of distribution of free software. You can use, +abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL -"http://www.cecill.info". +"http://www.cecill.info". As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors have only limited -liability. +liability. In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or developing or reproducing the @@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also therefore means that it is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the software's suitability as regards their -requirements in conditions enabling the security of their systems and/or -data to be ensured and, more generally, to use and operate it in the -same conditions as regards security. +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. @@ -69,13 +69,13 @@ namespace CosmoTool int currentNgb; ComputePrecision smoothRadius; }; - - + + SPHSmooth(SPHTree *tree, uint32_t Nsph); - virtual ~SPHSmooth(); + virtual ~SPHSmooth(); void fetchNeighbours(const typename SPHTree::coords& c, SPHState *state = 0); - + void fetchNeighbours(const typename SPHTree::coords& c, uint32_t newNsph); void fetchNeighboursOnVolume(const typename SPHTree::coords& c, ComputePrecision radius); const typename SPHTree::coords& getCurrentCenter() const @@ -85,13 +85,13 @@ namespace CosmoTool template ComputePrecision computeSmoothedValue(const typename SPHTree::coords& c, - FuncT fun, SPHState *state = 0); - + FuncT fun, SPHState *state = 0); + template ComputePrecision computeInterpolatedValue(const typename SPHTree::coords& c, FuncT fun, SPHState *state = 0); - - ComputePrecision getMaxDistance(const typename SPHTree::coords& c, + + ComputePrecision getMaxDistance(const typename SPHTree::coords& c, SPHNode *node) const; ComputePrecision getSmoothingLen() const @@ -108,11 +108,12 @@ namespace CosmoTool template void runForEachNeighbour(FuncT fun, SPHState *state = 0); + void addGridSite(const typename SPHTree::coords& c, SPHState *state); void addGridSite(const typename SPHTree::coords& c); bool hasNeighbours() const; - virtual ComputePrecision getKernel(ComputePrecision d) const; + virtual ComputePrecision getKernel(ComputePrecision d) const; SPHTree *getTree() { return tree; } @@ -125,20 +126,20 @@ namespace CosmoTool uint32_t getCurrent() const { return internal.currentNgb; } uint32_t getNgb() const { return maxNgb; } - + protected: SPHState internal; uint32_t Nsph; uint32_t deltaNsph; uint32_t maxNgb; SPHTree *tree; - + template ComputePrecision computeWValue(const typename SPHTree::coords & c, SPHCell& cell, CoordType d, FuncT fun, SPHState *state); - + template void runUnrollNode(SPHNode *node, FuncT fun); diff --git a/src/sphSmooth.tcc b/src/sphSmooth.tcc index 86ddca7..0f917a1 100644 --- a/src/sphSmooth.tcc +++ b/src/sphSmooth.tcc @@ -11,7 +11,7 @@ SPHSmooth::SPHSmooth(SPHTree *tree, uint32_t Nsph) internal.currentNgb = 0; this->maxNgb = Nsph; - internal.ngb = boost::shared_ptr(new SPHCell *[maxNgb]); + internal.ngb = boost::shared_ptr(new SPHCell *[maxNgb]); internal.distances = boost::shared_ptr(new CoordType[maxNgb]); } @@ -64,7 +64,7 @@ SPHSmooth::fetchNeighbours(const typename SPHTree::coords& c, uin max_dist = d2; } - internal.smoothRadius = max_dist / 2; + internal.smoothRadius = max_dist / 2; } template @@ -78,20 +78,20 @@ void SPHSmooth::fetchNeighbours(const typename SPHTree::coords& c state->ngb = boost::shared_ptr(new SPHCell *[Nsph]); } else state = &internal; - + memcpy(state->currentCenter, c, sizeof(c)); - + tree->getNearestNeighbours(c, requested, state->ngb.get(), state->distances.get()); state->currentNgb = 0; for (uint32_t i = 0; i < requested && state->ngb[i] != 0; i++,state->currentNgb++) { - d2 = internal.distances[i] = sqrt(internal.distances[i]); + d2 = state->distances[i] = sqrt(state->distances[i]); if (d2 > max_dist) max_dist = d2; } - state->smoothRadius = max_dist / 2; + state->smoothRadius = max_dist / 2; } @@ -114,18 +114,18 @@ SPHSmooth::fetchNeighboursOnVolume(const typename SPHTree::coords if (d2 > max_dist) max_dist = d2; } - internal.smoothRadius = max_dist / 2; -} + internal.smoothRadius = max_dist / 2; +} template template -ComputePrecision +ComputePrecision SPHSmooth::computeSmoothedValue(const typename SPHTree::coords& c, FuncT fun, SPHState *state) { if (state == 0) state = &internal; - + ComputePrecision outputValue = 0; ComputePrecision max_dist = 0; ComputePrecision r3 = cube(state->smoothRadius); @@ -152,7 +152,7 @@ ComputePrecision SPHSmooth::computeInterpolatedValue(const typena { if (state == 0) state = &internal; - + ComputePrecision outputValue = 0; ComputePrecision max_dist = 0; ComputePrecision weight = 0; @@ -163,7 +163,7 @@ ComputePrecision SPHSmooth::computeInterpolatedValue(const typena weight += computeWValue(c, *state->ngb[i], state->distances[i], interpolateOne); } - return (outputValue == 0) ? 0 : (outputValue / weight); + return (outputValue == 0) ? 0 : (outputValue / weight); } template @@ -172,34 +172,38 @@ void SPHSmooth::runForEachNeighbour(FuncT fun, SPHState *state) { if (state == 0) state = &internal; - + for (uint32_t i = 0; i < state->currentNgb; i++) { fun(state->ngb[i]); } } - template -void SPHSmooth::addGridSite(const typename SPHTree::coords& c) +void SPHSmooth::addGridSite(const typename SPHTree::coords& c, SPHState *state) { ComputePrecision outputValue = 0; ComputePrecision max_dist = 0; - - ComputePrecision r3 = cube(internal.smoothRadius); + ComputePrecision r3 = cube(state->smoothRadius); - for (uint32_t i = 0; i < internal.currentNgb; i++) + for (uint32_t i = 0; i < state->currentNgb; i++) { - ComputePrecision d = internal.distances[i]; - SPHCell& cell = *(internal.ngb[i]); - double kernel_value = getKernel(d/internal.smoothRadius) / r3; + ComputePrecision d = state->distances[i]; + SPHCell& cell = *(state->ngb[i]); + double kernel_value = getKernel(d/state->smoothRadius) / r3; #pragma omp atomic cell.val.weight += kernel_value; } } template -ComputePrecision +void SPHSmooth::addGridSite(const typename SPHTree::coords& c) +{ + addGridSite(c, &internal); +} + +template +ComputePrecision SPHSmooth::getKernel(ComputePrecision x) const { // WARNING !!! This is an unnormalized version of the kernel. From 4633f6edc9b56a145b2423a859b636456eead40b Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 16 Nov 2022 16:48:31 +0100 Subject: [PATCH 07/52] Reformat --- src/sphSmooth.hpp | 92 +++++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 51 deletions(-) diff --git a/src/sphSmooth.hpp b/src/sphSmooth.hpp index de3914c..431d423 100644 --- a/src/sphSmooth.hpp +++ b/src/sphSmooth.hpp @@ -1,5 +1,5 @@ /*+ -This is CosmoTool (./src/sphSmooth.hpp) -- Copyright (C) Guilhem Lavaux (2007-2014) +This is CosmoTool (./src/sphSmooth.hpp) -- Copyright (C) Guilhem Lavaux (2007-2022) guilhem.lavaux@gmail.com @@ -39,30 +39,26 @@ knowledge of the CeCILL license and that you accept its terms. #include "config.hpp" #include "mykdtree.hpp" -namespace CosmoTool -{ +namespace CosmoTool { template - class SPHSmooth - { + class SPHSmooth { public: - typedef struct - { + typedef struct { ComputePrecision weight; ValType pValue; } FullType; - typedef KDTree SPHTree; - typedef KDTreeNode SPHNode; - typedef KDCell SPHCell; - typedef typename KDTree::CoordType CoordType; + typedef KDTree SPHTree; + typedef KDTreeNode SPHNode; + typedef KDCell SPHCell; + typedef typename KDTree::CoordType CoordType; - typedef ComputePrecision (*computeParticleValue)(const ValType& t); - typedef void (*runParticleValue)(ValType& t); + typedef ComputePrecision (*computeParticleValue)(const ValType &t); + typedef void (*runParticleValue)(ValType &t); public: typedef SPHCell *P_SPHCell; - struct SPHState - { + struct SPHState { boost::shared_ptr ngb; boost::shared_ptr distances; typename SPHTree::coords currentCenter; @@ -70,46 +66,40 @@ namespace CosmoTool ComputePrecision smoothRadius; }; - SPHSmooth(SPHTree *tree, uint32_t Nsph); virtual ~SPHSmooth(); - void fetchNeighbours(const typename SPHTree::coords& c, SPHState *state = 0); + void + fetchNeighbours(const typename SPHTree::coords &c, SPHState *state = 0); - void fetchNeighbours(const typename SPHTree::coords& c, uint32_t newNsph); - void fetchNeighboursOnVolume(const typename SPHTree::coords& c, ComputePrecision radius); - const typename SPHTree::coords& getCurrentCenter() const - { + void fetchNeighbours(const typename SPHTree::coords &c, uint32_t newNsph); + void fetchNeighboursOnVolume( + const typename SPHTree::coords &c, ComputePrecision radius); + const typename SPHTree::coords &getCurrentCenter() const { return internal.currentCenter; } - template - ComputePrecision computeSmoothedValue(const typename SPHTree::coords& c, - FuncT fun, SPHState *state = 0); + template + ComputePrecision computeSmoothedValue( + const typename SPHTree::coords &c, FuncT fun, SPHState *state = 0); - template - ComputePrecision computeInterpolatedValue(const typename SPHTree::coords& c, - FuncT fun, SPHState *state = 0); + template + ComputePrecision computeInterpolatedValue( + const typename SPHTree::coords &c, FuncT fun, SPHState *state = 0); - ComputePrecision getMaxDistance(const typename SPHTree::coords& c, - SPHNode *node) const; + ComputePrecision + getMaxDistance(const typename SPHTree::coords &c, SPHNode *node) const; - ComputePrecision getSmoothingLen() const - { - return internal.smoothRadius; - } + ComputePrecision getSmoothingLen() const { return internal.smoothRadius; } // TO USE WITH EXTREME CARE ! - void setSmoothingLen(ComputePrecision len) - { - internal.smoothRadius = len; - } + void setSmoothingLen(ComputePrecision len) { internal.smoothRadius = len; } // END - template + template void runForEachNeighbour(FuncT fun, SPHState *state = 0); - void addGridSite(const typename SPHTree::coords& c, SPHState *state); - void addGridSite(const typename SPHTree::coords& c); + void addGridSite(const typename SPHTree::coords &c, SPHState *state); + void addGridSite(const typename SPHTree::coords &c); bool hasNeighbours() const; @@ -134,21 +124,21 @@ namespace CosmoTool uint32_t maxNgb; SPHTree *tree; - template - ComputePrecision computeWValue(const typename SPHTree::coords & c, - SPHCell& cell, - CoordType d, - FuncT fun, SPHState *state); + template + ComputePrecision computeWValue( + const typename SPHTree::coords &c, SPHCell &cell, CoordType d, + FuncT fun, SPHState *state); - template - void runUnrollNode(SPHNode *node, - FuncT fun); + template + void runUnrollNode(SPHNode *node, FuncT fun); }; - template - bool operator<(const SPHSmooth& s1, const SPHSmooth& s2); + template + bool operator<( + const SPHSmooth &s1, + const SPHSmooth &s2); -}; +}; // namespace CosmoTool #include "sphSmooth.tcc" From fe06434619ded5e83e513a45205b13129fed28c7 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 16 Nov 2022 16:48:40 +0100 Subject: [PATCH 08/52] Reformat --- src/sphSmooth.tcc | 310 ++++++++++++++++++++++------------------------ 1 file changed, 147 insertions(+), 163 deletions(-) diff --git a/src/sphSmooth.tcc b/src/sphSmooth.tcc index 0f917a1..fe61347 100644 --- a/src/sphSmooth.tcc +++ b/src/sphSmooth.tcc @@ -3,231 +3,215 @@ namespace CosmoTool { -template -SPHSmooth::SPHSmooth(SPHTree *tree, uint32_t Nsph) -{ - this->Nsph = Nsph; - this->tree = tree; - internal.currentNgb = 0; + template + SPHSmooth::SPHSmooth(SPHTree *tree, uint32_t Nsph) { + this->Nsph = Nsph; + this->tree = tree; + internal.currentNgb = 0; - this->maxNgb = Nsph; - internal.ngb = boost::shared_ptr(new SPHCell *[maxNgb]); - internal.distances = boost::shared_ptr(new CoordType[maxNgb]); -} + this->maxNgb = Nsph; + internal.ngb = boost::shared_ptr(new SPHCell *[maxNgb]); + internal.distances = boost::shared_ptr(new CoordType[maxNgb]); + } -template -SPHSmooth::~SPHSmooth() -{ -} + template + SPHSmooth::~SPHSmooth() {} -template -template -ComputePrecision SPHSmooth::computeWValue(const typename SPHTree::coords& c, - SPHCell& cell, - CoordType d, - FuncT fun, SPHState *state) -{ - CoordType weight; + template + template + ComputePrecision SPHSmooth::computeWValue( + const typename SPHTree::coords &c, SPHCell &cell, CoordType d, FuncT fun, + SPHState *state) { + CoordType weight; - d /= state->smoothRadius; - weight = getKernel(d); + d /= state->smoothRadius; + weight = getKernel(d); - if (cell.val.weight != 0) - return weight * fun(cell.val.pValue) / cell.val.weight; - else - return 0; -} + if (cell.val.weight != 0) + return weight * fun(cell.val.pValue) / cell.val.weight; + else + return 0; + } -template -void -SPHSmooth::fetchNeighbours(const typename SPHTree::coords& c, uint32_t newNngb) -{ - ComputePrecision d2, max_dist = 0; - uint32_t requested = newNngb; + template + void SPHSmooth::fetchNeighbours( + const typename SPHTree::coords &c, uint32_t newNngb) { + ComputePrecision d2, max_dist = 0; + uint32_t requested = newNngb; - if (requested > maxNgb) - { + if (requested > maxNgb) { maxNgb = requested; internal.ngb = boost::shared_ptr(new P_SPHCell[maxNgb]); - internal.distances = boost::shared_ptr(new CoordType[maxNgb]); + internal.distances = + boost::shared_ptr(new CoordType[maxNgb]); } - memcpy(internal.currentCenter, c, sizeof(c)); - tree->getNearestNeighbours(c, requested, (SPHCell **)internal.ngb.get(), (CoordType*)internal.distances.get()); + memcpy(internal.currentCenter, c, sizeof(c)); + tree->getNearestNeighbours( + c, requested, (SPHCell **)internal.ngb.get(), + (CoordType *)internal.distances.get()); - internal.currentNgb = 0; - for (uint32_t i = 0; i < requested && (internal.ngb)[i] != 0; i++,internal.currentNgb++) - { + internal.currentNgb = 0; + for (uint32_t i = 0; i < requested && (internal.ngb)[i] != 0; + i++, internal.currentNgb++) { internal.distances[i] = sqrt(internal.distances[i]); d2 = internal.distances[i]; if (d2 > max_dist) max_dist = d2; } - internal.smoothRadius = max_dist / 2; -} + internal.smoothRadius = max_dist / 2; + } -template -void SPHSmooth::fetchNeighbours(const typename SPHTree::coords& c, SPHState *state) -{ - ComputePrecision d2, max_dist = 0; - uint32_t requested = Nsph; + template + void SPHSmooth::fetchNeighbours( + const typename SPHTree::coords &c, SPHState *state) { + ComputePrecision d2, max_dist = 0; + uint32_t requested = Nsph; - if (state != 0) { - state->distances = boost::shared_ptr(new CoordType[Nsph]); - state->ngb = boost::shared_ptr(new SPHCell *[Nsph]); - } else - state = &internal; + if (state != 0) { + state->distances = boost::shared_ptr(new CoordType[Nsph]); + state->ngb = boost::shared_ptr(new SPHCell *[Nsph]); + } else + state = &internal; - memcpy(state->currentCenter, c, sizeof(c)); + memcpy(state->currentCenter, c, sizeof(c)); - tree->getNearestNeighbours(c, requested, state->ngb.get(), state->distances.get()); + tree->getNearestNeighbours( + c, requested, state->ngb.get(), state->distances.get()); - state->currentNgb = 0; - for (uint32_t i = 0; i < requested && state->ngb[i] != 0; i++,state->currentNgb++) - { + state->currentNgb = 0; + for (uint32_t i = 0; i < requested && state->ngb[i] != 0; + i++, state->currentNgb++) { d2 = state->distances[i] = sqrt(state->distances[i]); if (d2 > max_dist) max_dist = d2; } - state->smoothRadius = max_dist / 2; -} + state->smoothRadius = max_dist / 2; + } + template + void SPHSmooth::fetchNeighboursOnVolume( + const typename SPHTree::coords &c, ComputePrecision radius) { + uint32_t numPart; + ComputePrecision d2, max_dist = 0; -template -void -SPHSmooth::fetchNeighboursOnVolume(const typename SPHTree::coords& c, - ComputePrecision radius) -{ - uint32_t numPart; - ComputePrecision d2, max_dist = 0; + memcpy(internal.currentCenter, c, sizeof(c)); - memcpy(internal.currentCenter, c, sizeof(c)); + internal.currentNgb = tree->getIntersection( + c, radius, internal.ngb, internal.distances, maxNgb); - internal.currentNgb = tree->getIntersection(c, radius, internal.ngb, internal.distances, - maxNgb); - - for (uint32_t i = 0; i < internal.currentNgb; i++) - { + for (uint32_t i = 0; i < internal.currentNgb; i++) { d2 = internal.distances[i] = sqrt(internal.distances[i]); if (d2 > max_dist) max_dist = d2; } - internal.smoothRadius = max_dist / 2; -} + internal.smoothRadius = max_dist / 2; + } -template -template -ComputePrecision -SPHSmooth::computeSmoothedValue(const typename SPHTree::coords& c, - FuncT fun, SPHState *state) -{ - if (state == 0) - state = &internal; + template + template + ComputePrecision SPHSmooth::computeSmoothedValue( + const typename SPHTree::coords &c, FuncT fun, SPHState *state) { + if (state == 0) + state = &internal; - ComputePrecision outputValue = 0; - ComputePrecision max_dist = 0; - ComputePrecision r3 = cube(state->smoothRadius); + ComputePrecision outputValue = 0; + ComputePrecision max_dist = 0; + ComputePrecision r3 = cube(state->smoothRadius); - for (uint32_t i = 0; i < state->currentNgb; i++) - { - outputValue += computeWValue(c, *state->ngb[i], state->distances[i], fun, state); + for (uint32_t i = 0; i < state->currentNgb; i++) { + outputValue += + computeWValue(c, *state->ngb[i], state->distances[i], fun, state); } - return outputValue / r3; -} + return outputValue / r3; + } -template -ComputePrecision interpolateOne(const ValType& t) -{ - return 1.0; -} + template + ComputePrecision interpolateOne(const ValType &t) { + return 1.0; + } -// WARNING ! Cell's weight must be 1 !!! -template -template -ComputePrecision SPHSmooth::computeInterpolatedValue(const typename SPHTree::coords& c, - FuncT fun, SPHState *state) -{ - if (state == 0) - state = &internal; + // WARNING ! Cell's weight must be 1 !!! + template + template + ComputePrecision SPHSmooth::computeInterpolatedValue( + const typename SPHTree::coords &c, FuncT fun, SPHState *state) { + if (state == 0) + state = &internal; - ComputePrecision outputValue = 0; - ComputePrecision max_dist = 0; - ComputePrecision weight = 0; + ComputePrecision outputValue = 0; + ComputePrecision max_dist = 0; + ComputePrecision weight = 0; - for (uint32_t i = 0; i < state->currentNgb; i++) - { + for (uint32_t i = 0; i < state->currentNgb; i++) { outputValue += computeWValue(c, *state->ngb[i], state->distances[i], fun); - weight += computeWValue(c, *state->ngb[i], state->distances[i], interpolateOne); + weight += + computeWValue(c, *state->ngb[i], state->distances[i], interpolateOne); } - return (outputValue == 0) ? 0 : (outputValue / weight); -} + return (outputValue == 0) ? 0 : (outputValue / weight); + } -template -template -void SPHSmooth::runForEachNeighbour(FuncT fun, SPHState *state) -{ - if (state == 0) - state = &internal; + template + template + void + SPHSmooth::runForEachNeighbour(FuncT fun, SPHState *state) { + if (state == 0) + state = &internal; - for (uint32_t i = 0; i < state->currentNgb; i++) - { + for (uint32_t i = 0; i < state->currentNgb; i++) { fun(state->ngb[i]); } -} + } -template -void SPHSmooth::addGridSite(const typename SPHTree::coords& c, SPHState *state) -{ - ComputePrecision outputValue = 0; - ComputePrecision max_dist = 0; - ComputePrecision r3 = cube(state->smoothRadius); + template + void SPHSmooth::addGridSite( + const typename SPHTree::coords &c, SPHState *state) { + ComputePrecision outputValue = 0; + ComputePrecision max_dist = 0; + ComputePrecision r3 = cube(state->smoothRadius); - for (uint32_t i = 0; i < state->currentNgb; i++) - { + for (uint32_t i = 0; i < state->currentNgb; i++) { ComputePrecision d = state->distances[i]; - SPHCell& cell = *(state->ngb[i]); - double kernel_value = getKernel(d/state->smoothRadius) / r3; + SPHCell &cell = *(state->ngb[i]); + double kernel_value = getKernel(d / state->smoothRadius) / r3; #pragma omp atomic cell.val.weight += kernel_value; } -} + } -template -void SPHSmooth::addGridSite(const typename SPHTree::coords& c) -{ - addGridSite(c, &internal); -} + template + void + SPHSmooth::addGridSite(const typename SPHTree::coords &c) { + addGridSite(c, &internal); + } -template -ComputePrecision -SPHSmooth::getKernel(ComputePrecision x) const -{ - // WARNING !!! This is an unnormalized version of the kernel. - if (x < 1) - return 1 - 1.5 * x * x + 0.75 * x * x * x; - else if (x < 2) - { + template + ComputePrecision + SPHSmooth::getKernel(ComputePrecision x) const { + // WARNING !!! This is an unnormalized version of the kernel. + if (x < 1) + return 1 - 1.5 * x * x + 0.75 * x * x * x; + else if (x < 2) { ComputePrecision d = 2 - x; return 0.25 * d * d * d; - } - else - return 0; -} + } else + return 0; + } -template -bool SPHSmooth::hasNeighbours() const -{ - return (internal.currentNgb != 0); -} + template + bool SPHSmooth::hasNeighbours() const { + return (internal.currentNgb != 0); + } -template -bool operator<(const SPHSmooth& s1, const SPHSmooth& s2) -{ - return (s1.getSmoothingLen() < s2.getSmoothingLen()); -} + template + bool operator<( + const SPHSmooth &s1, + const SPHSmooth &s2) { + return (s1.getSmoothingLen() < s2.getSmoothingLen()); + } -}; +}; // namespace CosmoTool From 046e9a1447ba1fed957d1fe1e8b95c68adcca9a9 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Thu, 17 Nov 2022 21:50:06 +0100 Subject: [PATCH 09/52] Reformat and add some adjoint gradient --- src/mykdtree.hpp | 34 +++++++++++++++++----------------- src/sphSmooth.hpp | 16 ++++++++++++++++ src/sphSmooth.tcc | 28 ++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/src/mykdtree.hpp b/src/mykdtree.hpp index 6599c33..67908cf 100644 --- a/src/mykdtree.hpp +++ b/src/mykdtree.hpp @@ -1,5 +1,5 @@ /*+ -This is CosmoTool (./src/mykdtree.hpp) -- Copyright (C) Guilhem Lavaux (2007-2014) +This is CosmoTool (./src/mykdtree.hpp) -- Copyright (C) Guilhem Lavaux (2007-2022) guilhem.lavaux@gmail.com @@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...) This software is governed by the CeCILL license under French law and -abiding by the rules of distribution of free software. You can use, +abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL -"http://www.cecill.info". +"http://www.cecill.info". As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors have only limited -liability. +liability. In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or developing or reproducing the @@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also therefore means that it is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the software's suitability as regards their -requirements in conditions enabling the security of their systems and/or -data to be ensured and, more generally, to use and operate it in the -same conditions as regards security. +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. @@ -48,13 +48,13 @@ namespace CosmoTool { typedef uint64_t NodeIntType; - template + template struct KDDef { typedef CType CoordType; typedef float KDCoordinates[N]; }; - + template struct KDCell { @@ -102,7 +102,7 @@ namespace CosmoTool { uint64_t currentRank; uint64_t numCells; }; - + template class RecursionMultipleInfo @@ -121,7 +121,7 @@ namespace CosmoTool { } }; - template + template struct KD_default_cell_splitter { void operator()(KDCell **cells, NodeIntType Ncells, NodeIntType& split_index, int axis, typename KDDef::KDCoordinates minBound, typename KDDef::KDCoordinates maxBound); @@ -135,7 +135,7 @@ namespace CosmoTool { typedef typename KDDef::KDCoordinates coords; typedef KDCell Cell; typedef KDTreeNode Node; - + CellSplitter splitter; KDTree(Cell *cells, NodeIntType Ncells); @@ -153,10 +153,10 @@ namespace CosmoTool { std::copy(replicate, replicate+N, this->replicate); } - uint64_t getIntersection(const coords& x, CoordType r, + uint64_t getIntersection(const coords& x, CoordType r, Cell **cells, uint64_t numCells); - uint64_t getIntersection(const coords& x, CoordType r, + uint64_t getIntersection(const coords& x, CoordType r, Cell **cells, CoordType *distances, uint64_t numCells); @@ -183,7 +183,7 @@ namespace CosmoTool { NodeIntType getNumberInNode(const Node *n) const { return n->numNodes; } #else NodeIntType getNumberInNode(const Node *n) const { - if (n == 0) + if (n == 0) return 0; return 1+getNumberInNode(n->children[0])+getNumberInNode(n->children[1]); } @@ -211,7 +211,7 @@ namespace CosmoTool { uint32_t depth, coords minBound, coords maxBound); - + template void recursiveIntersectionCells(RecursionInfoCells& info, Node *node, @@ -224,7 +224,7 @@ namespace CosmoTool { CoordType& R2, Cell*& cell); void recursiveMultipleNearest(RecursionMultipleInfo& info, Node *node, - int level); + int level); }; diff --git a/src/sphSmooth.hpp b/src/sphSmooth.hpp index 431d423..fdada71 100644 --- a/src/sphSmooth.hpp +++ b/src/sphSmooth.hpp @@ -79,14 +79,30 @@ namespace CosmoTool { return internal.currentCenter; } + /** This is the pure SPH smoothing function. It does not reweight by the + * value computed at each grid site. + */ template ComputePrecision computeSmoothedValue( const typename SPHTree::coords &c, FuncT fun, SPHState *state = 0); + /** This is the weighted SPH smoothing function. It does reweight by the + * value computed at each grid site. This ensures the total sum of the interpolated + * quantity is preserved by interpolating to the target mesh. + */ template ComputePrecision computeInterpolatedValue( const typename SPHTree::coords &c, FuncT fun, SPHState *state = 0); + /** This is the adjoint gradient of computeInterpolatedValue w.r.t. to the value + * array. FuncT is expected to have the following prototype: + * void((CellValue defined by the user), ComputePrecision weighted_ag_value) + */ + template + void computeAdjointGradientSmoothedValue( + const typename SPHTree::coords &c, ComputePrecision ag_value, FuncT fun, + SPHState *state = 0); + ComputePrecision getMaxDistance(const typename SPHTree::coords &c, SPHNode *node) const; diff --git a/src/sphSmooth.tcc b/src/sphSmooth.tcc index fe61347..c163feb 100644 --- a/src/sphSmooth.tcc +++ b/src/sphSmooth.tcc @@ -134,6 +134,34 @@ namespace CosmoTool { return 1.0; } + template + template + void SPHSmooth::computeAdjointGradientSmoothedValue( + const typename SPHTree::coords &c, ComputePrecision ag_value, FuncT fun, + SPHState *state) { + if (state == 0) + state = &internal; + + ComputePrecision outputValue = 0; + ComputePrecision max_dist = 0; + ComputePrecision weight = 0; + + for (uint32_t i = 0; i < state->currentNgb; i++) { + weight += + computeWValue(c, *state->ngb[i], state->distances[i], interpolateOne); + } + + for (uint32_t i = 0; i < state->currentNgb; i++) { + auto &cell = *state->ngb[i]; + double partial_ag = + computeWValue( + c, cell, state->distances[i], + [ag_value](ComputePrecision) { return ag_value; }) / + weight; + fun(cell.val.pValue, ag_value); + } + } + // WARNING ! Cell's weight must be 1 !!! template template From cd926a0834116e50e853d78be66076af9365cb39 Mon Sep 17 00:00:00 2001 From: Eleni Date: Thu, 1 Dec 2022 17:03:02 +0100 Subject: [PATCH 10/52] added BAO wiggles --- src/cosmopower.cpp | 23 +++++++++++++++++++++++ src/cosmopower.hpp | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/cosmopower.cpp b/src/cosmopower.cpp index 5e58c2c..6108b8c 100644 --- a/src/cosmopower.cpp +++ b/src/cosmopower.cpp @@ -212,6 +212,26 @@ double CosmoPower::powerHuWiggles(double k) return normPower * pow(k,n) * T_k * T_k; } +double CosmoPower::sample_BAO(double k) +{ + // BAO wiggle parameterization for reconstruction + // Babic et al. 2022, https://arxiv.org/abs/2203.06177 + + // No-wiggle transfer function + + double ps_no_wiggle = powerHuBaryons(k); + + // Wiggle parameterization + + double A = 0; + double r_s = 10; + double k_D = 2 * M_PI / 100; + + double param = 1 + A * sin(k * r_s) * exp(- k / k_D); + + return ps_no_wiggle * param; + } + double CosmoPower::primordialPowerSpectrum(double k) { //Primordial power spectrum, needed for PNG @@ -444,6 +464,9 @@ void CosmoPower::setFunction(CosmoFunction f) case POWER_SUGIYAMA: eval = &CosmoPower::powerSugiyama; break; + case SAMPLE_WIGGLES: + eval = &CosmoPower::sample_BAO; + break; case POWER_BDM: eval = &CosmoPower::powerBDM; break; diff --git a/src/cosmopower.hpp b/src/cosmopower.hpp index ba0bffc..7b02f5f 100644 --- a/src/cosmopower.hpp +++ b/src/cosmopower.hpp @@ -89,7 +89,8 @@ namespace CosmoTool { POWER_SUGIYAMA, POWER_BDM, POWER_TEST, - HU_WIGGLES_ORIGINAL + HU_WIGGLES_ORIGINAL, + SAMPLE_WIGGLES }; CosmoPower(); @@ -122,6 +123,7 @@ namespace CosmoTool { double powerBDM(double k); double powerTest(double k); double powerHuWigglesOriginal(double k); + double sample_BAO(double k); }; }; From 17698dab5bb17a267c348adbb0c272db6915b6f9 Mon Sep 17 00:00:00 2001 From: Eleni Date: Thu, 1 Dec 2022 18:52:18 +0100 Subject: [PATCH 11/52] wiggle parameterization --- src/cosmopower.cpp | 16 ++++++++++++++++ src/cosmopower.hpp | 4 +++- src/powerSpectrum.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/cosmopower.cpp b/src/cosmopower.cpp index 6108b8c..c8acd75 100644 --- a/src/cosmopower.cpp +++ b/src/cosmopower.cpp @@ -269,6 +269,19 @@ double CosmoPower::matterTransferFunctionHu(double k) return T_k; } +double CosmoPower::noWiggleTk(double k) +{ + double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75))); + double alpha_Gamma = 1 - 0.328 * log(431 * OmegaEff) * OMEGA_B / OMEGA_0 + 0.38 * log(22.3 * OmegaEff) * pow(OMEGA_B / OMEGA_0, 2); + double GammaEff = OMEGA_0 * h * (alpha_Gamma + (1 - alpha_Gamma)/(1 + pow(0.43 * k * s, 4))); + double q = k/(h*GammaEff) * pow(Theta_27, 2); + double L_0 = log(2 * M_E + 1.8 * q); + double C_0 = 14.2 + 731 / (1 + 62.5 * q); + double T0 = L_0 / (L_0 + C_0 * q * q); + + return T0; +} + double CosmoPower::powerHuBaryons(double k) { double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75))); @@ -473,6 +486,9 @@ void CosmoPower::setFunction(CosmoFunction f) case POWER_TEST: eval = &CosmoPower::powerTest; break; + case NOWIGGLE_TK: + eval = &CosmoPower::noWiggleTk; + break; default: abort(); } diff --git a/src/cosmopower.hpp b/src/cosmopower.hpp index 7b02f5f..5ed9b61 100644 --- a/src/cosmopower.hpp +++ b/src/cosmopower.hpp @@ -90,7 +90,8 @@ namespace CosmoTool { POWER_BDM, POWER_TEST, HU_WIGGLES_ORIGINAL, - SAMPLE_WIGGLES + SAMPLE_WIGGLES, + NOWIGGLE_TK }; CosmoPower(); @@ -124,6 +125,7 @@ namespace CosmoTool { double powerTest(double k); double powerHuWigglesOriginal(double k); double sample_BAO(double k); + double noWiggleTk(double k); }; }; diff --git a/src/powerSpectrum.cpp b/src/powerSpectrum.cpp index 777654c..7786080 100644 --- a/src/powerSpectrum.cpp +++ b/src/powerSpectrum.cpp @@ -58,6 +58,7 @@ using namespace std; #define POWER_TEST 8 #define POWER_SPECTRUM POWER_EFSTATHIOU +#define SAMPLE_WIGGLES 9 namespace Cosmology { @@ -206,6 +207,31 @@ double powG(double y) */ double powerSpectrum(double k, double normPower) { +#if POWER_SPECTRUM == SAMPLE_WIGGLES + // BAO wiggle parameterization for reconstruction + // Babic et al. 2022, https://arxiv.org/abs/2203.06177 + + // No-wiggle transfer function + + double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75))); + double alpha_Gamma = 1 - 0.328 * log(431 * OmegaEff) * OMEGA_B / OMEGA_0 + 0.38 * log(22.3 * OmegaEff) * pow(OMEGA_B / OMEGA_0, 2); + double GammaEff = OMEGA_0 * h * (alpha_Gamma + (1 - alpha_Gamma)/(1 + pow(0.43 * k * s, 4))); + double q = k/(h*GammaEff) * pow(Theta_27, 2); + double L_0 = log(2 * M_E + 1.8 * q); + double C_0 = 14.2 + 731 / (1 + 62.5 * q); + double T0 = L_0 / (L_0 + C_0 * q * q); + + // Wiggle parameterization + + double A = 0; + double r_s = 10; + double k_D = 2 * M_PI / 100; + + double param = 1 + A * sin(k * r_s) * exp(- k / k_D); + + return normPower * pow(k, n) * T0 * T0 * param; +#endif + #if POWER_SPECTRUM == POWER_EFSTATHIOU double a = 6.4/Gamma0; double b = 3/Gamma0; From a35e997ec887a0172aef10bc9163fe6fcb5007ee Mon Sep 17 00:00:00 2001 From: Eleni Date: Fri, 2 Dec 2022 12:36:41 +0100 Subject: [PATCH 12/52] moved param to transfer func --- src/cosmopower.cpp | 30 +++++++++++++++++------------- src/cosmopower.hpp | 3 ++- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/cosmopower.cpp b/src/cosmopower.cpp index c8acd75..7ecaf2d 100644 --- a/src/cosmopower.cpp +++ b/src/cosmopower.cpp @@ -212,24 +212,28 @@ double CosmoPower::powerHuWiggles(double k) return normPower * pow(k,n) * T_k * T_k; } -double CosmoPower::sample_BAO(double k) -{ - // BAO wiggle parameterization for reconstruction - // Babic et al. 2022, https://arxiv.org/abs/2203.06177 +double CosmoPower::BAO_Tk(double k){ - // No-wiggle transfer function - - double ps_no_wiggle = powerHuBaryons(k); - - // Wiggle parameterization + double no_wiggle_tk = noWiggleTk(k); double A = 0; double r_s = 10; double k_D = 2 * M_PI / 100; - double param = 1 + A * sin(k * r_s) * exp(- k / k_D); + //sqrt as we want to make the parameterization part of the transfer function + double param = sqrt(1 + A * sin(k * r_s) * exp(- k / k_D)); + return no_wiggle_tk * param; - return ps_no_wiggle * param; +} + +double CosmoPower::sample_BAO(double k) +{ + // BAO wiggle parameterization for reconstruction + // Babic et al. 2022, https://arxiv.org/abs/2203.06177 + + double T_k = BAO_Tk(k); + + return normPower * pow(k,n) * T_k * T_k; } double CosmoPower::primordialPowerSpectrum(double k) @@ -486,8 +490,8 @@ void CosmoPower::setFunction(CosmoFunction f) case POWER_TEST: eval = &CosmoPower::powerTest; break; - case NOWIGGLE_TK: - eval = &CosmoPower::noWiggleTk; + case BAO_TK: + eval = &CosmoPower::BAO_Tk; break; default: abort(); diff --git a/src/cosmopower.hpp b/src/cosmopower.hpp index 5ed9b61..86ad8b1 100644 --- a/src/cosmopower.hpp +++ b/src/cosmopower.hpp @@ -91,7 +91,7 @@ namespace CosmoTool { POWER_TEST, HU_WIGGLES_ORIGINAL, SAMPLE_WIGGLES, - NOWIGGLE_TK + BAO_TK }; CosmoPower(); @@ -126,6 +126,7 @@ namespace CosmoTool { double powerHuWigglesOriginal(double k); double sample_BAO(double k); double noWiggleTk(double k); + double BAO_Tk(double k); }; }; From f79d7f6830f627c145ad37cc368478e1ce437477 Mon Sep 17 00:00:00 2001 From: Eleni Date: Thu, 1 Dec 2022 17:03:02 +0100 Subject: [PATCH 13/52] added BAO wiggles --- src/cosmopower.cpp | 23 +++++++++++++++++++++++ src/cosmopower.hpp | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/cosmopower.cpp b/src/cosmopower.cpp index 5e58c2c..6108b8c 100644 --- a/src/cosmopower.cpp +++ b/src/cosmopower.cpp @@ -212,6 +212,26 @@ double CosmoPower::powerHuWiggles(double k) return normPower * pow(k,n) * T_k * T_k; } +double CosmoPower::sample_BAO(double k) +{ + // BAO wiggle parameterization for reconstruction + // Babic et al. 2022, https://arxiv.org/abs/2203.06177 + + // No-wiggle transfer function + + double ps_no_wiggle = powerHuBaryons(k); + + // Wiggle parameterization + + double A = 0; + double r_s = 10; + double k_D = 2 * M_PI / 100; + + double param = 1 + A * sin(k * r_s) * exp(- k / k_D); + + return ps_no_wiggle * param; + } + double CosmoPower::primordialPowerSpectrum(double k) { //Primordial power spectrum, needed for PNG @@ -444,6 +464,9 @@ void CosmoPower::setFunction(CosmoFunction f) case POWER_SUGIYAMA: eval = &CosmoPower::powerSugiyama; break; + case SAMPLE_WIGGLES: + eval = &CosmoPower::sample_BAO; + break; case POWER_BDM: eval = &CosmoPower::powerBDM; break; diff --git a/src/cosmopower.hpp b/src/cosmopower.hpp index ba0bffc..7b02f5f 100644 --- a/src/cosmopower.hpp +++ b/src/cosmopower.hpp @@ -89,7 +89,8 @@ namespace CosmoTool { POWER_SUGIYAMA, POWER_BDM, POWER_TEST, - HU_WIGGLES_ORIGINAL + HU_WIGGLES_ORIGINAL, + SAMPLE_WIGGLES }; CosmoPower(); @@ -122,6 +123,7 @@ namespace CosmoTool { double powerBDM(double k); double powerTest(double k); double powerHuWigglesOriginal(double k); + double sample_BAO(double k); }; }; From 2cc11b36332b0a513e3f9aeb8db02161fe67dba8 Mon Sep 17 00:00:00 2001 From: Eleni Date: Thu, 1 Dec 2022 18:52:18 +0100 Subject: [PATCH 14/52] wiggle parameterization --- src/cosmopower.cpp | 16 ++++++++++++++++ src/cosmopower.hpp | 4 +++- src/powerSpectrum.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/cosmopower.cpp b/src/cosmopower.cpp index 6108b8c..c8acd75 100644 --- a/src/cosmopower.cpp +++ b/src/cosmopower.cpp @@ -269,6 +269,19 @@ double CosmoPower::matterTransferFunctionHu(double k) return T_k; } +double CosmoPower::noWiggleTk(double k) +{ + double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75))); + double alpha_Gamma = 1 - 0.328 * log(431 * OmegaEff) * OMEGA_B / OMEGA_0 + 0.38 * log(22.3 * OmegaEff) * pow(OMEGA_B / OMEGA_0, 2); + double GammaEff = OMEGA_0 * h * (alpha_Gamma + (1 - alpha_Gamma)/(1 + pow(0.43 * k * s, 4))); + double q = k/(h*GammaEff) * pow(Theta_27, 2); + double L_0 = log(2 * M_E + 1.8 * q); + double C_0 = 14.2 + 731 / (1 + 62.5 * q); + double T0 = L_0 / (L_0 + C_0 * q * q); + + return T0; +} + double CosmoPower::powerHuBaryons(double k) { double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75))); @@ -473,6 +486,9 @@ void CosmoPower::setFunction(CosmoFunction f) case POWER_TEST: eval = &CosmoPower::powerTest; break; + case NOWIGGLE_TK: + eval = &CosmoPower::noWiggleTk; + break; default: abort(); } diff --git a/src/cosmopower.hpp b/src/cosmopower.hpp index 7b02f5f..5ed9b61 100644 --- a/src/cosmopower.hpp +++ b/src/cosmopower.hpp @@ -90,7 +90,8 @@ namespace CosmoTool { POWER_BDM, POWER_TEST, HU_WIGGLES_ORIGINAL, - SAMPLE_WIGGLES + SAMPLE_WIGGLES, + NOWIGGLE_TK }; CosmoPower(); @@ -124,6 +125,7 @@ namespace CosmoTool { double powerTest(double k); double powerHuWigglesOriginal(double k); double sample_BAO(double k); + double noWiggleTk(double k); }; }; diff --git a/src/powerSpectrum.cpp b/src/powerSpectrum.cpp index 777654c..7786080 100644 --- a/src/powerSpectrum.cpp +++ b/src/powerSpectrum.cpp @@ -58,6 +58,7 @@ using namespace std; #define POWER_TEST 8 #define POWER_SPECTRUM POWER_EFSTATHIOU +#define SAMPLE_WIGGLES 9 namespace Cosmology { @@ -206,6 +207,31 @@ double powG(double y) */ double powerSpectrum(double k, double normPower) { +#if POWER_SPECTRUM == SAMPLE_WIGGLES + // BAO wiggle parameterization for reconstruction + // Babic et al. 2022, https://arxiv.org/abs/2203.06177 + + // No-wiggle transfer function + + double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75))); + double alpha_Gamma = 1 - 0.328 * log(431 * OmegaEff) * OMEGA_B / OMEGA_0 + 0.38 * log(22.3 * OmegaEff) * pow(OMEGA_B / OMEGA_0, 2); + double GammaEff = OMEGA_0 * h * (alpha_Gamma + (1 - alpha_Gamma)/(1 + pow(0.43 * k * s, 4))); + double q = k/(h*GammaEff) * pow(Theta_27, 2); + double L_0 = log(2 * M_E + 1.8 * q); + double C_0 = 14.2 + 731 / (1 + 62.5 * q); + double T0 = L_0 / (L_0 + C_0 * q * q); + + // Wiggle parameterization + + double A = 0; + double r_s = 10; + double k_D = 2 * M_PI / 100; + + double param = 1 + A * sin(k * r_s) * exp(- k / k_D); + + return normPower * pow(k, n) * T0 * T0 * param; +#endif + #if POWER_SPECTRUM == POWER_EFSTATHIOU double a = 6.4/Gamma0; double b = 3/Gamma0; From 4509174d8144f027cde6f67bcd34fb990ec48aa6 Mon Sep 17 00:00:00 2001 From: Eleni Date: Fri, 2 Dec 2022 12:36:41 +0100 Subject: [PATCH 15/52] moved param to transfer func --- src/cosmopower.cpp | 30 +++++++++++++++++------------- src/cosmopower.hpp | 3 ++- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/cosmopower.cpp b/src/cosmopower.cpp index c8acd75..7ecaf2d 100644 --- a/src/cosmopower.cpp +++ b/src/cosmopower.cpp @@ -212,24 +212,28 @@ double CosmoPower::powerHuWiggles(double k) return normPower * pow(k,n) * T_k * T_k; } -double CosmoPower::sample_BAO(double k) -{ - // BAO wiggle parameterization for reconstruction - // Babic et al. 2022, https://arxiv.org/abs/2203.06177 +double CosmoPower::BAO_Tk(double k){ - // No-wiggle transfer function - - double ps_no_wiggle = powerHuBaryons(k); - - // Wiggle parameterization + double no_wiggle_tk = noWiggleTk(k); double A = 0; double r_s = 10; double k_D = 2 * M_PI / 100; - double param = 1 + A * sin(k * r_s) * exp(- k / k_D); + //sqrt as we want to make the parameterization part of the transfer function + double param = sqrt(1 + A * sin(k * r_s) * exp(- k / k_D)); + return no_wiggle_tk * param; - return ps_no_wiggle * param; +} + +double CosmoPower::sample_BAO(double k) +{ + // BAO wiggle parameterization for reconstruction + // Babic et al. 2022, https://arxiv.org/abs/2203.06177 + + double T_k = BAO_Tk(k); + + return normPower * pow(k,n) * T_k * T_k; } double CosmoPower::primordialPowerSpectrum(double k) @@ -486,8 +490,8 @@ void CosmoPower::setFunction(CosmoFunction f) case POWER_TEST: eval = &CosmoPower::powerTest; break; - case NOWIGGLE_TK: - eval = &CosmoPower::noWiggleTk; + case BAO_TK: + eval = &CosmoPower::BAO_Tk; break; default: abort(); diff --git a/src/cosmopower.hpp b/src/cosmopower.hpp index 5ed9b61..86ad8b1 100644 --- a/src/cosmopower.hpp +++ b/src/cosmopower.hpp @@ -91,7 +91,7 @@ namespace CosmoTool { POWER_TEST, HU_WIGGLES_ORIGINAL, SAMPLE_WIGGLES, - NOWIGGLE_TK + BAO_TK }; CosmoPower(); @@ -126,6 +126,7 @@ namespace CosmoTool { double powerHuWigglesOriginal(double k); double sample_BAO(double k); double noWiggleTk(double k); + double BAO_Tk(double k); }; }; From e3ce2fbc41231d9015ba6d2b81183a21e22fe3f9 Mon Sep 17 00:00:00 2001 From: Eleni Date: Fri, 9 Dec 2022 16:17:48 +0100 Subject: [PATCH 16/52] minimally invasive approach --- python/_cosmo_power.pyx | 4 ++-- src/cosmopower.cpp | 32 ++------------------------------ src/cosmopower.hpp | 6 +----- 3 files changed, 5 insertions(+), 37 deletions(-) diff --git a/python/_cosmo_power.pyx b/python/_cosmo_power.pyx index bf4bd4b..7889d17 100644 --- a/python/_cosmo_power.pyx +++ b/python/_cosmo_power.pyx @@ -43,6 +43,7 @@ cdef extern from "cosmopower.hpp" namespace "CosmoTool": CosmoPower() void setFunction(CosmoFunction) + void setFunction_BAO(CosmoFunction,double,double,double) void updateCosmology() void updatePhysicalCosmology() void normalize(double,double) @@ -101,8 +102,7 @@ cdef class CosmologyPower: """ self.power.SIGMA8 = s8 self.power.normalize(k_min, k_max) - - + def setFunction(self,funcname): """setFunction(self, funcname) diff --git a/src/cosmopower.cpp b/src/cosmopower.cpp index 7ecaf2d..9c50588 100644 --- a/src/cosmopower.cpp +++ b/src/cosmopower.cpp @@ -212,30 +212,6 @@ double CosmoPower::powerHuWiggles(double k) return normPower * pow(k,n) * T_k * T_k; } -double CosmoPower::BAO_Tk(double k){ - - double no_wiggle_tk = noWiggleTk(k); - - double A = 0; - double r_s = 10; - double k_D = 2 * M_PI / 100; - - //sqrt as we want to make the parameterization part of the transfer function - double param = sqrt(1 + A * sin(k * r_s) * exp(- k / k_D)); - return no_wiggle_tk * param; - -} - -double CosmoPower::sample_BAO(double k) -{ - // BAO wiggle parameterization for reconstruction - // Babic et al. 2022, https://arxiv.org/abs/2203.06177 - - double T_k = BAO_Tk(k); - - return normPower * pow(k,n) * T_k * T_k; - } - double CosmoPower::primordialPowerSpectrum(double k) { //Primordial power spectrum, needed for PNG @@ -481,18 +457,14 @@ void CosmoPower::setFunction(CosmoFunction f) case POWER_SUGIYAMA: eval = &CosmoPower::powerSugiyama; break; - case SAMPLE_WIGGLES: - eval = &CosmoPower::sample_BAO; - break; case POWER_BDM: eval = &CosmoPower::powerBDM; break; + case NOWIGGLE_TK: + eval = &CosmoPower::noWiggleTk; case POWER_TEST: eval = &CosmoPower::powerTest; break; - case BAO_TK: - eval = &CosmoPower::BAO_Tk; - break; default: abort(); } diff --git a/src/cosmopower.hpp b/src/cosmopower.hpp index 86ad8b1..ea36102 100644 --- a/src/cosmopower.hpp +++ b/src/cosmopower.hpp @@ -90,15 +90,13 @@ namespace CosmoTool { POWER_BDM, POWER_TEST, HU_WIGGLES_ORIGINAL, - SAMPLE_WIGGLES, - BAO_TK + NOWIGGLE_TK }; CosmoPower(); ~CosmoPower(); void setFunction(CosmoFunction f); - void updateCosmology(); void updatePhysicalCosmology(); void normalize(double k_min = -1, double k_max = -1); @@ -124,9 +122,7 @@ namespace CosmoTool { double powerBDM(double k); double powerTest(double k); double powerHuWigglesOriginal(double k); - double sample_BAO(double k); double noWiggleTk(double k); - double BAO_Tk(double k); }; }; From 1e4ced7c4d349e7570dc1f22840cee3db47d3b01 Mon Sep 17 00:00:00 2001 From: Eleni Date: Fri, 9 Dec 2022 21:53:03 +0100 Subject: [PATCH 17/52] added BAO wiggle params in cosmo --- python/_cosmo_power.pyx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/_cosmo_power.pyx b/python/_cosmo_power.pyx index 7889d17..78305f8 100644 --- a/python/_cosmo_power.pyx +++ b/python/_cosmo_power.pyx @@ -39,6 +39,9 @@ cdef extern from "cosmopower.hpp" namespace "CosmoTool": double OmegaEff double Gamma0 double normPower + double A_BAO + double r_BAO + double k_D_BAO CosmoPower() From f326962bc82f63962258750604df5f233e4aa75a Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Tue, 31 Jan 2023 14:38:04 +0100 Subject: [PATCH 18/52] Add dependencies --- builder/build-wheels.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builder/build-wheels.sh b/builder/build-wheels.sh index ac343fe..585ab56 100755 --- a/builder/build-wheels.sh +++ b/builder/build-wheels.sh @@ -8,12 +8,12 @@ export CC CXX # Install a system package required by our library #yum install -y atlas-devel -yum install -y cmake3 gsl-devel zlib-devel fftw3-devel +yum install -y cmake3 gsl-devel zlib-devel fftw3-devel libffi-devel hdf5 hdf5-devel ln -fs /usr/bin/cmake3 /usr/bin/cmake -ALL_PYTHON="cp36-cp36m cp37-cp37m cp38-cp38 cp39-cp39" +ALL_PYTHON="cp37-cp37m cp38-cp38 cp39-cp39 cp310-cp310" # Compile wheels for pkg in $ALL_PYTHON; do From 957d5187e9fccd67c31628d1bc3bc9c5bf612d0a Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Fri, 3 Feb 2023 21:44:28 +0100 Subject: [PATCH 19/52] Bump requirement of numpy --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3a4577b..8342e0f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy<1.19 +numpy<1.22 cffi numexpr pyfftw From 5eb0fe210b87b3e639d94f8b04243d8e094c0400 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sat, 4 Feb 2023 08:26:42 +0100 Subject: [PATCH 20/52] Fix version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 576e0d6..f9b7042 100644 --- a/setup.py +++ b/setup.py @@ -229,7 +229,7 @@ class BuildCMakeExt(build_ext): CosmoTool_extension = CMakeExtension(name="cosmotool") setup(name='cosmotool', - version='1.3.1', + version='1.3.2', packages=["cosmotool"], package_dir={'cosmotool': 'python/cosmotool'}, install_requires=['numpy','cffi','numexpr','pyfftw','h5py'], From fd16d7dc6979c95344c9e445d596cc899bf60b0e Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sat, 4 Feb 2023 09:54:32 +0100 Subject: [PATCH 21/52] Add config.* updated tool for mac support --- external/config.guess | 1754 ++++++++++++++++++++++++++++++ external/config.sub | 1890 +++++++++++++++++++++++++++++++++ external/external_build.cmake | 6 +- 3 files changed, 3649 insertions(+), 1 deletion(-) create mode 100755 external/config.guess create mode 100755 external/config.sub diff --git a/external/config.guess b/external/config.guess new file mode 100755 index 0000000..7f76b62 --- /dev/null +++ b/external/config.guess @@ -0,0 +1,1754 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2022 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-01-09' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2022 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# Just in case it came from the environment. +GUESS= + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case $UNAME_SYSTEM in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case $UNAME_VERSION in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; + *:ekkoBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; + *:SolidBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; + macppc:MirBSD:*:*) + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; + *:MirBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; + alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case $ALPHA_CPU_TYPE in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; + Amiga*:UNIX_System_V:4.0:*) + GUESS=m68k-unknown-sysv4 + ;; + *:[Aa]miga[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; + *:[Mm]orph[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-morphos + ;; + *:OS/390:*:*) + GUESS=i370-ibm-openedition + ;; + *:z/VM:*:*) + GUESS=s390-ibm-zvmoe + ;; + *:OS400:*:*) + GUESS=powerpc-ibm-os400 + ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + GUESS=hppa1.1-hitachi-hiuxmpp + ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; + NILE*:*:*:dcosx) + GUESS=pyramid-pyramid-svr4 + ;; + DRS?6000:unix:4.0:6*) + GUESS=sparc-icl-nx6 + ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; + s390x:SunOS:*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; + sun4H:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; + sun4*:SunOS:*:*) + case `/usr/bin/arch -k` in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; + sun3*:SunOS:*:*) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case `/bin/arch` in + sun3) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun4) + GUESS=sparc-sun-sunos$UNAME_RELEASE + ;; + esac + ;; + aushp:SunOS:*:*) + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; + m68k:machten:*:*) + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; + powerpc:machten:*:*) + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; + RISC*:Mach:*:*) + GUESS=mips-dec-mach_bsd4.3 + ;; + RISC*:ULTRIX:*:*) + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; + VAX*:ULTRIX*:*:*) + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; + Motorola:PowerMAX_OS:*:*) + GUESS=powerpc-motorola-powermax + ;; + Motorola:*:4.3:PL8-*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:Power_UNIX:*:*) + GUESS=powerpc-harris-powerunix + ;; + m88k:CX/UX:7*:*) + GUESS=m88k-harris-cxux7 + ;; + m88k:*:4*:R4*) + GUESS=m88k-motorola-sysv4 + ;; + m88k:*:3*:R3*) + GUESS=m88k-motorola-sysv3 + ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + GUESS=m88k-dg-dgux$UNAME_RELEASE + else + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE + fi + else + GUESS=i586-dg-dgux$UNAME_RELEASE + fi + ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + GUESS=m88k-dolphin-sysv3 + ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + GUESS=m88k-motorola-sysv3 + ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + GUESS=m88k-tektronix-sysv3 + ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + GUESS=m68k-tektronix-bsd + ;; + *:IRIX*:*:*) + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + GUESS=i386-ibm-aix + ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + GUESS=$SYSTEM_NAME + else + GUESS=rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + GUESS=rs6000-ibm-aix3.2.4 + else + GUESS=rs6000-ibm-aix3.2 + fi + ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; + *:AIX:*:*) + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + GUESS=rs6000-bull-bosx + ;; + DPX/2?00:B.O.S.:*:*) + GUESS=m68k-bull-sysv3 + ;; + 9000/[34]??:4.3bsd:1.*:*) + GUESS=m68k-hp-bsd + ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + GUESS=m68k-hp-bsd4.4 + ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if test -x /usr/bin/getconf; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case $sc_cpu_version in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case $sc_kernel_bits in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if test "$HP_ARCH" = hppa2.0w + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; + 9000/8??:4.3bsd:*:*) + GUESS=hppa1.0-hp-bsd + ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; + hp8??:OSF1:*:*) + GUESS=hppa1.0-hp-osf + ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk + else + GUESS=$UNAME_MACHINE-unknown-osf1 + fi + ;; + parisc*:Lites*:*:*) + GUESS=hppa1.1-hp-lites + ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + GUESS=c1-convex-bsd + ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + GUESS=c34-convex-bsd + ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + GUESS=c38-convex-bsd + ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + GUESS=c4-convex-bsd + ;; + CRAY*Y-MP:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; + CRAY*T3E:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; + CRAY*SV1:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; + *:UNICOS/mp:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; + sparc*:BSD/OS:*:*) + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; + *:BSD/OS:*:*) + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case $UNAME_PROCESSOR in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; + i*:CYGWIN*:*) + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; + *:MINGW*:*) + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; + i*:PW*:*) + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; + *:Interix*:*) + case $UNAME_MACHINE in + x86) + GUESS=i586-pc-interix$UNAME_RELEASE + ;; + authenticamd | genuineintel | EM64T) + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; + IA64) + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; + esac ;; + i*:UWIN*:*) + GUESS=$UNAME_MACHINE-pc-uwin + ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + GUESS=x86_64-pc-cygwin + ;; + prep*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; + *:GNU:*:*) + # the GNU system + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; + aarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi + else + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf + fi + fi + ;; + avr32*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + cris:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + crisv32:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + frv:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + hexagon:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:Linux:*:*) + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; + ia64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m32r*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m68*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + padre:Linux:*:*) + GUESS=sparc-unknown-linux-$LIBC + ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + GUESS=hppa64-unknown-linux-$LIBC + ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; + esac + ;; + ppc64:Linux:*:*) + GUESS=powerpc64-unknown-linux-$LIBC + ;; + ppc:Linux:*:*) + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + s390:Linux:*:* | s390x:Linux:*:*) + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; + sh64*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sh*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + tile*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + vax:Linux:*:*) + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; + x86_64:Linux:*:*) + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI=${LIBC}x32 + fi + fi + GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI + ;; + xtensa*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + GUESS=i386-sequent-sysv4 + ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; + i*86:XTS-300:*:STOP) + GUESS=$UNAME_MACHINE-unknown-stop + ;; + i*86:atheos:*:*) + GUESS=$UNAME_MACHINE-unknown-atheos + ;; + i*86:syllable:*:*) + GUESS=$UNAME_MACHINE-pc-syllable + ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; + i*86:*DOS:*:*) + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL + fi + ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv32 + fi + ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + GUESS=i586-pc-msdosdjgpp + ;; + Intel:Mach:3*:*) + GUESS=i386-pc-mach3 + ;; + paragon:*:*:*) + GUESS=i860-intel-osf1 + ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 + fi + ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + GUESS=m68010-convergent-sysv + ;; + mc68k:UNIX:SYSTEM5:3.51m) + GUESS=m68k-convergent-sysv + ;; + M680?0:D-NIX:5.3:*) + GUESS=m68k-diab-dnix + ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; + mc68030:UNIX_System_V:4.*:*) + GUESS=m68k-atari-sysv4 + ;; + TSUNAMI:LynxOS:2.*:*) + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; + rs6000:LynxOS:2.*:*) + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; + SM[BE]S:UNIX_SV:*:*) + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; + RM*:ReliantUNIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + RM*:SINIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + GUESS=$UNAME_MACHINE-sni-sysv4 + else + GUESS=ns32k-sni-sysv + fi + ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + GUESS=i586-unisys-sysv4 + ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + GUESS=hppa1.1-stratus-sysv4 + ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + GUESS=i860-stratus-sysv4 + ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=$UNAME_MACHINE-stratus-vos + ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=hppa1.1-stratus-vos + ;; + mc68*:A/UX:*:*) + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; + news*:NEWS-OS:6*:*) + GUESS=mips-sony-newsos6 + ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE + else + GUESS=mips-unknown-sysv$UNAME_RELEASE + fi + ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + GUESS=powerpc-be-beos + ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + GUESS=powerpc-apple-beos + ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + GUESS=i586-pc-beos + ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + GUESS=i586-pc-haiku + ;; + x86_64:Haiku:*:*) + GUESS=x86_64-unknown-haiku + ;; + SX-4:SUPER-UX:*:*) + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; + SX-5:SUPER-UX:*:*) + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; + SX-6:SUPER-UX:*:*) + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; + SX-7:SUPER-UX:*:*) + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; + SX-8:SUPER-UX:*:*) + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; + SX-8R:SUPER-UX:*:*) + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; + Power*:Rhapsody:*:*) + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; + *:Rhapsody:*:*) + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; + *:QNX:*:4*) + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; + NSE-*:NONSTOP_KERNEL:*:*) + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; + *:NonStop-UX:*:*) + GUESS=mips-compaq-nonstopux + ;; + BS2000:POSIX*:*:*) + GUESS=bs2000-siemens-sysv + ;; + DS/*:UNIX_System_V:*:*) + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "${cputype-}" = 386; then + UNAME_MACHINE=i386 + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype + fi + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; + *:TOPS-10:*:*) + GUESS=pdp10-unknown-tops10 + ;; + *:TENEX:*:*) + GUESS=pdp10-unknown-tenex + ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + GUESS=pdp10-dec-tops20 + ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + GUESS=pdp10-xkl-tops20 + ;; + *:TOPS-20:*:*) + GUESS=pdp10-unknown-tops20 + ;; + *:ITS:*:*) + GUESS=pdp10-unknown-its + ;; + SEI:*:*:SEIUX) + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; + *:DragonFly:*:*) + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; + esac ;; + *:XENIX:*:SysV) + GUESS=i386-pc-xenix + ;; + i*86:skyos:*:*) + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; + i*86:rdos:*:*) + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; + x86_64:VMkernel:*:*) + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; +esac + +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/external/config.sub b/external/config.sub new file mode 100755 index 0000000..dba16e8 --- /dev/null +++ b/external/config.sub @@ -0,0 +1,1890 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2022 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-01-03' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2022 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/external/external_build.cmake b/external/external_build.cmake index bbe3e77..b82d692 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -65,7 +65,11 @@ if (ENABLE_SHARP) URL ${CMAKE_SOURCE_DIR}/external/libsharp-6077806.tar.gz PREFIX ${BUILD_PREFIX}/sharp-prefix BUILD_IN_SOURCE 1 - CONFIGURE_COMMAND autoconf && ./configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" --prefix=${DEP_BUILD} ${SHARP_OPENMP} + CONFIGURE_COMMAND + cp -f ${CMAKE_SOURCE_DIR}/external/config.guess . && + cp -f ${CMAKE_SOURCE_DIR}/external/config.sub . && + autoconf && + ./configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" --prefix=${DEP_BUILD} ${SHARP_OPENMP} INSTALL_COMMAND echo "No install" BUILD_BYPRODUCTS ${SHARP_LIBRARIES} ) From 522588fc1f770c3ee1233a9bf22de8345e7bd7e4 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Mon, 27 Feb 2023 14:16:36 +0100 Subject: [PATCH 22/52] Fixup script for more modern pypa image --- builder/build-wheels.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/builder/build-wheels.sh b/builder/build-wheels.sh index 585ab56..60a8bfc 100755 --- a/builder/build-wheels.sh +++ b/builder/build-wheels.sh @@ -13,6 +13,9 @@ yum install -y cmake3 gsl-devel zlib-devel fftw3-devel libffi-devel hdf5 hdf5-de ln -fs /usr/bin/cmake3 /usr/bin/cmake +test -d /io/wheelhouse || mkdir /io/wheelhouse +test -d /io/wheelhouse/fix || mkdir /io/wheelhouse/fix + ALL_PYTHON="cp37-cp37m cp38-cp38 cp39-cp39 cp310-cp310" # Compile wheels @@ -25,8 +28,8 @@ for pkg in $ALL_PYTHON; do done # Bundle external shared libraries into the wheels -for whl in wheelhouse/cosmotool*.whl; do - auditwheel repair "$whl" --plat $PLAT -w /io/wheelhouse/ +for whl in /io/wheelhouse/cosmotool*.whl; do + auditwheel repair "$whl" --plat $PLAT -w /io/wheelhouse/fix done # Install packages and test From 05ac03fb7ac6aad8c739635c4288afeea8481116 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sat, 22 Apr 2023 17:21:14 +0200 Subject: [PATCH 23/52] Update bundled external libs --- external/external_build.cmake | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/external/external_build.cmake b/external/external_build.cmake index b82d692..c0e73eb 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -5,11 +5,11 @@ OPTION(ENABLE_OPENMP "Set to Yes if Healpix and/or you need openMP" OFF) SET(FFTW_URL "http://www.fftw.org/fftw-3.3.3.tar.gz" CACHE STRING "URL to download FFTW from") SET(EIGEN_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2" CACHE STRING "URL to download Eigen from") SET(GENGETOPT_URL "ftp://ftp.gnu.org/gnu/gengetopt/gengetopt-2.22.5.tar.gz" CACHE STRING "URL to download gengetopt from") -SET(HDF5_URL "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.18/src/hdf5-1.8.18.tar.bz2" CACHE STRING "URL to download HDF5 from") -SET(NETCDF_URL "ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4.5.0.tar.gz" CACHE STRING "URL to download NetCDF from") -SET(NETCDFCXX_URL "https://github.com/Unidata/netcdf-cxx4/archive/v4.3.0.tar.gz" CACHE STRING "URL to download NetCDF-C++ from") -SET(BOOST_URL "https://boostorg.jfrog.io/artifactory/main/release/1.74.0/source/boost_1_74_0.tar.bz2" CACHE STRING "URL to download Boost from") -SET(GSL_URL "ftp://ftp.gnu.org/gnu/gsl/gsl-1.15.tar.gz" CACHE STRING "URL to download GSL from ") +SET(HDF5_URL "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.12/hdf5-1.12.2/src/hdf5-1.12.2.tar.gz" CACHE STRING "URL to download HDF5 from") +SET(NETCDF_URL "https://downloads.unidata.ucar.edu/netcdf-c/4.9.2/netcdf-c-4.9.2.tar.gz" CACHE STRING "URL to download NetCDF from") +SET(NETCDFCXX_URL "https://github.com/Unidata/netcdf-cxx4/archive/v4.3.1.tar.gz" CACHE STRING "URL to download NetCDF-C++ from") +SET(BOOST_URL "https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.gz" CACHE STRING "URL to download Boost from") +SET(GSL_URL "https://ftpmirror.gnu.org/gsl/gsl-2.7.tar.gz" CACHE STRING "URL to download GSL from ") mark_as_advanced(FFTW_URL EIGEN_URL HDF5_URL NETCDF_URL BOOST_URL GSL_URL) SET(all_deps) @@ -86,7 +86,7 @@ if (INTERNAL_HDF5) ExternalProject_Add(hdf5 PREFIX ${BUILD_PREFIX}/hdf5-prefix URL ${HDF5_URL} - URL_HASH MD5=29117bf488887f89888f9304c8ebea0b + URL_HASH MD5=30172c75e436d7f2180e274071a4ca97 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXT_INSTALL} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} @@ -95,6 +95,7 @@ if (INTERNAL_HDF5) -DHDF5_BUILD_TOOLS=ON -DHDF5_BUILD_HL_LIB=ON -DBUILD_SHARED_LIBS=OFF + -DHDF5_ENABLE_Z_LIB_SUPPORT=ON ) SET(cosmotool_DEPS ${cosmotool_DEPS} hdf5) SET(hdf5_built hdf5) @@ -102,11 +103,11 @@ if (INTERNAL_HDF5) SET(HDF5_ROOTDIR ${HDF5_BIN_DIR}) SET(CONFIGURE_LDFLAGS "${CONFIGURE_LDFLAGS} -L${HDF5_BIN_DIR}/lib") SET(CONFIGURE_LIBS "${CONFIGURE_LIBS} -ldl") - set(HDF5_C_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5-static.a) - set(HDF5_HL_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5_hl-static.a) - set(HDF5_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5-static.a CACHE STRING "HDF5 lib" FORCE) - set(HDF5_HL_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5_hl-static.a CACHE STRING "HDF5 HL lib" FORCE) - set(HDF5_CXX_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5_cpp-static.a CACHE STRING "HDF5 C++ lib" FORCE) + set(HDF5_C_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5.a) + set(HDF5_HL_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5_hl.a) + set(HDF5_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5.a CACHE STRING "HDF5 lib" FORCE) + set(HDF5_HL_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5_hl.a CACHE STRING "HDF5 HL lib" FORCE) + set(HDF5_CXX_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5_cpp.a CACHE STRING "HDF5 C++ lib" FORCE) SET(HDF5_INCLUDE_DIRS ${HDF5_BIN_DIR}/include CACHE STRING "HDF5 include path" FORCE) mark_as_advanced(HDF5_LIBRARIES HDF5_CXX_LIBRARIES HDF5_INCLUDE_DIRS) @@ -164,7 +165,7 @@ if (INTERNAL_NETCDF) SET(NETCDF_CONFIG_COMMAND ${NETCDF_SOURCE_DIR}/configure --prefix=${NETCDF_BIN_DIR} --libdir=${NETCDF_BIN_DIR}/lib --enable-netcdf-4 --with-pic --disable-shared --disable-dap - --disable-cdmremote --disable-rpc --enable-cxx-4 + --disable-byterange --disable-cdmremote --disable-rpc --enable-cxx-4 --disable-examples ${EXTRA_NC_FLAGS} CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER}) list(INSERT CMAKE_PREFIX_PATH 0 ${EXT_INSTALL}) @@ -182,6 +183,7 @@ if (INTERNAL_NETCDF) -DBUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DENABLE_NETCDF4=ON + -DENABLE_BYTERANGE=FALSE -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DENABLE_DAP=OFF -DCMAKE_INSTALL_PREFIX=${NETCDF_BIN_DIR} @@ -238,7 +240,7 @@ if (INTERNAL_BOOST) ExternalProject_Add(boost URL ${BOOST_URL} PREFIX ${BUILD_PREFIX}/boost-prefix - URL_HASH MD5=da07ca30dd1c0d1fdedbd487efee01bd + URL_HASH MD5=f7050f554a65f6a42ece221eaeec1660 CONFIGURE_COMMAND ${BOOST_SOURCE_DIR}/bootstrap.sh --prefix=${CMAKE_BINARY_DIR}/ext_build/boost BUILD_IN_SOURCE 1 From d8b58bd8f154ab3f9759b0d12f6bcbd43789a744 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sun, 23 Apr 2023 12:44:12 +0200 Subject: [PATCH 24/52] Update version --- setup.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/setup.py b/setup.py index f9b7042..857eab4 100644 --- a/setup.py +++ b/setup.py @@ -76,9 +76,9 @@ class InstallCMakeLibs(install_lib): # # your files are moved to the appropriate location when the installation # # is run # -# libs = [os.path.join(bin_dir, _lib) for _lib in -# os.listdir(bin_dir) if -# os.path.isfile(os.path.join(bin_dir, _lib)) and +# libs = [os.path.join(bin_dir, _lib) for _lib in +# os.listdir(bin_dir) if +# os.path.isfile(os.path.join(bin_dir, _lib)) and # os.path.splitext(_lib)[1] in [".dll", ".so"] # and not (_lib.startswith("python") or _lib.startswith(PACKAGE_NAME))] # @@ -87,16 +87,16 @@ class InstallCMakeLibs(install_lib): # shutil.move(lib, os.path.join(self.build_dir, # os.path.basename(lib))) # -# # Mark the libs for installation, adding them to -# # distribution.data_files seems to ensure that setuptools' record +# # Mark the libs for installation, adding them to +# # distribution.data_files seems to ensure that setuptools' record # # writer appends them to installed-files.txt in the package's egg-info # # -# # Also tried adding the libraries to the distribution.libraries list, -# # but that never seemed to add them to the installed-files.txt in the -# # egg-info, and the online recommendation seems to be adding libraries -# # into eager_resources in the call to setup(), which I think puts them -# # in data_files anyways. -# # +# # Also tried adding the libraries to the distribution.libraries list, +# # but that never seemed to add them to the installed-files.txt in the +# # egg-info, and the online recommendation seems to be adding libraries +# # into eager_resources in the call to setup(), which I think puts them +# # in data_files anyways. +# # # # What is the best way? # # # These are the additional installation files that should be @@ -104,7 +104,7 @@ class InstallCMakeLibs(install_lib): # # step; depending on the files that are generated from your cmake # # build chain, you may need to modify the below code # -# self.distribution.data_files = [os.path.join(self.install_dir, +# self.distribution.data_files = [os.path.join(self.install_dir, # os.path.basename(lib)) # for lib in libs] # print(self.distribution.data_files) @@ -213,7 +213,7 @@ class BuildCMakeExt(build_ext): if _pyd_top[0].startswith(PACKAGE_NAME): if os.path.splitext(_pyd)[1] in [".pyd", ".so"] or _pyd_top[-1] == 'config.py': pyd_path.append((_pyd_top,_pyd)) - + for top,p in pyd_path: _,n = os.path.split(p) @@ -229,7 +229,7 @@ class BuildCMakeExt(build_ext): CosmoTool_extension = CMakeExtension(name="cosmotool") setup(name='cosmotool', - version='1.3.2', + version='1.3.3', packages=["cosmotool"], package_dir={'cosmotool': 'python/cosmotool'}, install_requires=['numpy','cffi','numexpr','pyfftw','h5py'], From 394472948a85e0a128b3aa1dcf9a5d58cf0d708a Mon Sep 17 00:00:00 2001 From: Eleni Tsaprazi Date: Fri, 3 Nov 2023 11:05:52 +0000 Subject: [PATCH 25/52] added variable declarations --- src/cosmopower.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cosmopower.hpp b/src/cosmopower.hpp index ea36102..768992c 100644 --- a/src/cosmopower.hpp +++ b/src/cosmopower.hpp @@ -66,6 +66,10 @@ namespace CosmoTool { double Gamma0; double normPower; + double A_BAO; + double r_BAO; + double k_D_BAO; + struct EHuParams { double k_silk; double s; @@ -108,6 +112,7 @@ namespace CosmoTool { double power(double k); double integrandNormalize(double k); + private: double (CosmoPower::*eval)(double); @@ -123,6 +128,7 @@ namespace CosmoTool { double powerTest(double k); double powerHuWigglesOriginal(double k); double noWiggleTk(double k); + }; }; From 2aa7c96e4850bf04adc90b763da4e60095f8a994 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Sun, 3 Dec 2023 20:29:56 +0100 Subject: [PATCH 26/52] Update for macmini --- external/external_build.cmake | 14 +++++++++----- external/libsharp-8d51946.tar.gz | Bin 0 -> 92135 bytes 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 external/libsharp-8d51946.tar.gz diff --git a/external/external_build.cmake b/external/external_build.cmake index b82d692..990cdca 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -37,11 +37,12 @@ CHECK_CHANGE_STATE(INTERNAL_DLIB DLIB_INCLUDE_DIR DLIB_LIBRARIES) IF(ENABLE_OPENMP) IF (NOT OPENMP_FOUND) MESSAGE(ERROR "No known compiler option for enabling OpenMP") + ELSE() + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_C_FLAGS}") ENDIF(NOT OPENMP_FOUND) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_C_FLAGS}") ENDIF(ENABLE_OPENMP) @@ -55,21 +56,24 @@ if (ENABLE_SHARP) SET(DEP_BUILD ${BUILD_PREFIX}/sharp-prefix/src/sharp/auto) IF(NOT ENABLE_OPENMP) SET(SHARP_OPENMP --disable-openmp) + ELSE() + SET(SHARP_OPENMP) ENDIF() SET(CUTILS_LIBRARY ${DEP_BUILD}/lib/libc_utils.a) SET(FFTPACK_LIBRARY ${DEP_BUILD}/lib/libfftpack.a) SET(SHARP_LIBRARY ${DEP_BUILD}/lib/libsharp.a) SET(SHARP_LIBRARIES ${SHARP_LIBRARY} ${FFTPACK_LIBRARY} ${CUTILS_LIBRARY}) SET(SHARP_INCLUDE_PATH ${DEP_BUILD}/include) + message(STATUS "Flags: ${CMAKE_C_FLAGS}") ExternalProject_Add(sharp - URL ${CMAKE_SOURCE_DIR}/external/libsharp-6077806.tar.gz + URL ${CMAKE_SOURCE_DIR}/external/libsharp-8d51946.tar.gz PREFIX ${BUILD_PREFIX}/sharp-prefix BUILD_IN_SOURCE 1 CONFIGURE_COMMAND cp -f ${CMAKE_SOURCE_DIR}/external/config.guess . && cp -f ${CMAKE_SOURCE_DIR}/external/config.sub . && autoconf && - ./configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" --prefix=${DEP_BUILD} ${SHARP_OPENMP} + ./configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" "CFLAGS=${CMAKE_C_FLAGS}" "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}" --prefix=${DEP_BUILD} ${SHARP_OPENMP} INSTALL_COMMAND echo "No install" BUILD_BYPRODUCTS ${SHARP_LIBRARIES} ) diff --git a/external/libsharp-8d51946.tar.gz b/external/libsharp-8d51946.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7ca7602b566408a29e58d09b6eca546994c001be GIT binary patch literal 92135 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 L!ZXARJjDM178xt) literal 0 HcmV?d00001 From d4b1742cbf1083b198cc1ada1e848300eec4f20a Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Tue, 5 Dec 2023 16:35:43 +0100 Subject: [PATCH 27/52] Add periodic argument --- sample/simple3DFilter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sample/simple3DFilter.cpp b/sample/simple3DFilter.cpp index e075b06..52d48aa 100644 --- a/sample/simple3DFilter.cpp +++ b/sample/simple3DFilter.cpp @@ -84,6 +84,7 @@ int main(int argc, char **argv) { char *fname1, *outFile; double rLimit, boxsize, rLimit2, cx, cy, cz; int Nres; + int periodic; MiniArgDesc args[] = {{"INPUT DATA1", &fname1, MINIARG_STRING}, {"RADIUS LIMIT", &rLimit, MINIARG_DOUBLE}, @@ -93,6 +94,7 @@ int main(int argc, char **argv) { {"CY", &cy, MINIARG_DOUBLE}, {"CZ", &cz, MINIARG_DOUBLE}, {"OUTPUT FILE", &outFile, MINIARG_STRING}, + {"PERIODIC", &periodic, MINIARG_INT}, {0, 0, MINIARG_NULL}}; if (!parseMiniArgs(argc, argv, args)) @@ -148,6 +150,7 @@ int main(int argc, char **argv) { cout << "Building trees..." << endl; MyTree tree1(allCells_1, N1_points); + tree1.setPeriodic(periodic != 0); cout << "Creating smoothing filter..." << endl; From 4afc982dfc7d4b1ef33d7aad85ae81355f3e19cd Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 6 Dec 2023 09:28:19 +0100 Subject: [PATCH 28/52] Cache downloads --- external/external_build.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/external/external_build.cmake b/external/external_build.cmake index cfcbdc4..7503e45 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -2,6 +2,7 @@ include(FindOpenMP) OPTION(ENABLE_OPENMP "Set to Yes if Healpix and/or you need openMP" OFF) +SET(SOURCE_PREFIX ${CMAKE_SOURCE_DIR}) SET(FFTW_URL "http://www.fftw.org/fftw-3.3.3.tar.gz" CACHE STRING "URL to download FFTW from") SET(EIGEN_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2" CACHE STRING "URL to download Eigen from") SET(GENGETOPT_URL "ftp://ftp.gnu.org/gnu/gengetopt/gengetopt-2.22.5.tar.gz" CACHE STRING "URL to download gengetopt from") @@ -12,6 +13,8 @@ SET(BOOST_URL "https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/ SET(GSL_URL "https://ftpmirror.gnu.org/gsl/gsl-2.7.tar.gz" CACHE STRING "URL to download GSL from ") mark_as_advanced(FFTW_URL EIGEN_URL HDF5_URL NETCDF_URL BOOST_URL GSL_URL) +file(MAKE_DIRECTORY ${SOURCE_PREFIX}/downloads) + SET(all_deps) MACRO(CHECK_CHANGE_STATE VAR) @@ -68,6 +71,7 @@ if (ENABLE_SHARP) ExternalProject_Add(sharp URL ${CMAKE_SOURCE_DIR}/external/libsharp-8d51946.tar.gz PREFIX ${BUILD_PREFIX}/sharp-prefix + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads BUILD_IN_SOURCE 1 CONFIGURE_COMMAND cp -f ${CMAKE_SOURCE_DIR}/external/config.guess . && @@ -91,6 +95,7 @@ if (INTERNAL_HDF5) PREFIX ${BUILD_PREFIX}/hdf5-prefix URL ${HDF5_URL} URL_HASH MD5=30172c75e436d7f2180e274071a4ca97 + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXT_INSTALL} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} @@ -177,6 +182,7 @@ if (INTERNAL_NETCDF) ExternalProject_Add(netcdf DEPENDS ${hdf5_built} PREFIX ${BUILD_PREFIX}/netcdf-prefix + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads URL ${NETCDF_URL} LIST_SEPARATOR | CMAKE_ARGS @@ -244,6 +250,7 @@ if (INTERNAL_BOOST) ExternalProject_Add(boost URL ${BOOST_URL} PREFIX ${BUILD_PREFIX}/boost-prefix + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads URL_HASH MD5=f7050f554a65f6a42ece221eaeec1660 CONFIGURE_COMMAND ${BOOST_SOURCE_DIR}/bootstrap.sh --prefix=${CMAKE_BINARY_DIR}/ext_build/boost @@ -287,6 +294,7 @@ IF(INTERNAL_GSL) ExternalProject_Add(gsl URL ${GSL_URL} PREFIX ${BUILD_PREFIX}/gsl-prefix + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads CONFIGURE_COMMAND ${GSL_SOURCE_DIR}/configure --prefix=${EXT_INSTALL} --disable-shared --with-pic @@ -339,6 +347,7 @@ IF(INTERNAL_FFTW) ExternalProject_Add(fftw URL ${FFTW_URL} PREFIX ${BUILD_PREFIX}/fftw-prefix + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads CONFIGURE_COMMAND ${FFTW_SOURCE}/configure --prefix=${EXT_INSTALL} @@ -368,6 +377,7 @@ IF (INTERNAL_EIGEN) ExternalProject_Add(eigen URL ${EIGEN_URL} URL_HASH MD5=b9e98a200d2455f06db9c661c5610496 + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads PREFIX ${BUILD_PREFIX}/eigen-prefix CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXT_INSTALL} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} @@ -400,6 +410,7 @@ SET(cosmotool_DEPS ${cosmotool_DEPS} omptl) SET(OMPTL_BUILD_DIR ${BUILD_PREFIX}/omptl-prefix/src/omptl) ExternalProject_Add(omptl PREFIX ${BUILD_PREFIX}/omptl-prefix + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads URL ${CMAKE_SOURCE_DIR}/external/omptl-20120422.tar.bz2 CONFIGURE_COMMAND echo "No configure" BUILD_COMMAND echo "No build" From 0093a6aa0febf777fe679c0dc8b55cf295b175a5 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 6 Dec 2023 09:28:36 +0100 Subject: [PATCH 29/52] Fix cython syntax and port to more recent numpy.pxd --- python/_cosmomath.pyx | 2 +- python/_cosmotool.pyx | 12 ++++++++++-- python/_project.pyx | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/python/_cosmomath.pyx b/python/_cosmomath.pyx index e5ab880..fc4b3b6 100644 --- a/python/_cosmomath.pyx +++ b/python/_cosmomath.pyx @@ -12,7 +12,7 @@ cdef extern from "numpy/npy_common.h": ctypedef npy_intp cdef extern from "special_math.hpp" namespace "CosmoTool": - T log_modified_bessel_first_kind[T](T v, T z) nogil except + + T log_modified_bessel_first_kind[T](T v, T z) except + nogil cdef extern from "numpy_adaptors.hpp" namespace "CosmoTool": void parallel_ufunc_dd_d[T,IT](char **args, IT* dimensions, IT* steps, void *func) diff --git a/python/_cosmotool.pyx b/python/_cosmotool.pyx index b2494bd..7f2bc76 100644 --- a/python/_cosmotool.pyx +++ b/python/_cosmotool.pyx @@ -39,7 +39,7 @@ cdef extern from "loadSimu.hpp" namespace "CosmoTool": cdef extern from "loadGadget.hpp" namespace "CosmoTool": - SimuData *loadGadgetMulti(const char *fname, int id, int flags, int gformat) nogil except + + SimuData *loadGadgetMulti(const char *fname, int id, int flags, int gformat) except + nogil void cxx_writeGadget "CosmoTool::writeGadget" (const char * s, SimuData *data) except + cdef extern from "safe_gadget.hpp": @@ -313,6 +313,13 @@ tries to get an array from the object.""" references to the object are gone. """ pass + +cdef extern from "numpy/arrayobject.h": + # a little bit awkward: the reference to obj will be stolen + # using PyObject* to signal that Cython cannot handle it automatically + int PyArray_SetBaseObject(np.ndarray arr, PyObject *obj) except -1 # -1 means there was an error + + cdef object wrap_array(void *p, np.uint64_t s, int typ): cdef np.ndarray ndarray cdef ArrayWrapper wrapper @@ -320,7 +327,8 @@ cdef object wrap_array(void *p, np.uint64_t s, int typ): wrapper = ArrayWrapper() wrapper.set_data(s, typ, p) ndarray = np.array(wrapper, copy=False) - ndarray.base = wrapper + #ndarray.base = wrapper + PyArray_SetBaseObject(ndarray, wrapper) Py_INCREF(wrapper) return ndarray diff --git a/python/_project.pyx b/python/_project.pyx index bd64667..726ed0c 100644 --- a/python/_project.pyx +++ b/python/_project.pyx @@ -727,7 +727,7 @@ cdef DTYPE_t C_line_of_sight_projection(DTYPE_t[:,:,:] density, cdef int iu0[3] cdef int i cdef int N = density.shape[0] - cdef int half_N = density.shape[0]/2 + cdef int half_N = density.shape[0]//2 cdef int completed cdef DTYPE_t I0, d, dist2, delta, s, max_distance2 cdef int jumper[1] From c88f91ba809e6182210165f03729b10a8dab6413 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 6 Dec 2023 09:29:58 +0100 Subject: [PATCH 30/52] Bump to 1.3.4 --- CMakeLists.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b61f220..30d626f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,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 "3") -SET(CPACK_PACKAGE_VERSION_PATCH "1${EXTRA_VERSION}") +SET(CPACK_PACKAGE_VERSION_PATCH "4${EXTRA_VERSION}") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CosmoToolbox-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}") SET(CPACK_STRIP_FILES "lib/libCosmoTool.so") SET(CPACK_SOURCE_IGNORE_FILES diff --git a/setup.py b/setup.py index 857eab4..93daaba 100644 --- a/setup.py +++ b/setup.py @@ -229,7 +229,7 @@ class BuildCMakeExt(build_ext): CosmoTool_extension = CMakeExtension(name="cosmotool") setup(name='cosmotool', - version='1.3.3', + version='1.3.4', packages=["cosmotool"], package_dir={'cosmotool': 'python/cosmotool'}, install_requires=['numpy','cffi','numexpr','pyfftw','h5py'], From 7a81120977aea431b55028b07ea43fe335503e33 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 6 Dec 2023 18:40:06 +0100 Subject: [PATCH 31/52] Fix setPeriodic --- sample/simple3DFilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample/simple3DFilter.cpp b/sample/simple3DFilter.cpp index 52d48aa..2dbde42 100644 --- a/sample/simple3DFilter.cpp +++ b/sample/simple3DFilter.cpp @@ -150,7 +150,7 @@ int main(int argc, char **argv) { cout << "Building trees..." << endl; MyTree tree1(allCells_1, N1_points); - tree1.setPeriodic(periodic != 0); + tree1.setPeriodic(periodic != 0, boxsize); cout << "Creating smoothing filter..." << endl; From 7c7ccd6f878a4b341496dcce30069d7de5e7ff5e Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 6 Dec 2023 21:21:11 +0000 Subject: [PATCH 32/52] Changed to use configure and not CMake for hdf5. --- external/external_build.cmake | 18 ++++++++---------- src/interpolate.cpp | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/external/external_build.cmake b/external/external_build.cmake index 7503e45..035622a 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -96,15 +96,9 @@ if (INTERNAL_HDF5) URL ${HDF5_URL} URL_HASH MD5=30172c75e436d7f2180e274071a4ca97 DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${EXT_INSTALL} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DHDF5_BUILD_CPP_LIB=ON - -DHDF5_BUILD_TOOLS=ON - -DHDF5_BUILD_HL_LIB=ON - -DBUILD_SHARED_LIBS=OFF - -DHDF5_ENABLE_Z_LIB_SUPPORT=ON + CONFIGURE_COMMAND + ${HDF5_SOURCE_DIR}/configure "CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" "CFLAGS=${CMAKE_C_FLAGS}" "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}" --prefix=${HDF5_BIN_DIR} --disable-shared --enable-cxx --enable-hl --enable-tools --with-pic + INSTALL_COMMAND make install ) SET(cosmotool_DEPS ${cosmotool_DEPS} hdf5) SET(hdf5_built hdf5) @@ -207,12 +201,16 @@ if (INTERNAL_NETCDF) ExternalProject_Add(netcdf-c++ DEPENDS ${hdf5_built} netcdf PREFIX ${BUILD_PREFIX}/netcdf-c++-prefix + DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads URL ${NETCDFCXX_URL} CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DBUILD_SHARED_LIBS=OFF - -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DHDF5_C_LIBRARY=${HDF5_C_STATIC_LIBRARY} + -DHDF5_HL_LIBRARY=${HDF5_HL_STATIC_LIBRARY} + -DHDF5_INCLUDE_DIR=${HDF5_INCLUDE_DIRS} -DBUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${NETCDF_BIN_DIR} diff --git a/src/interpolate.cpp b/src/interpolate.cpp index 3de19f5..b996f7a 100644 --- a/src/interpolate.cpp +++ b/src/interpolate.cpp @@ -157,6 +157,7 @@ const Interpolate& Interpolate::operator=(const Interpolate& a) gsl_spline_init(spline, a.spline->x, a.spline->y, a.spline->size); logx = a.logx; logy = a.logy; + return *this; } double Interpolate::getMaxX() const From b878efb8b1dd0b27119f7e41ef3f493acaefec3a Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 6 Dec 2023 22:35:55 +0100 Subject: [PATCH 33/52] Fix requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8342e0f..e47ca7a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ numpy<1.22 cffi numexpr pyfftw -cython +cython<3 From 6adf02b287876388ba42821cd9c34a2b7f203818 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Thu, 7 Dec 2023 08:56:24 +0100 Subject: [PATCH 34/52] Attempt to fix linkage errors --- CMakeLists.txt | 14 +++++++++++--- external/external_build.cmake | 14 ++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 30d626f..80b1743 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,17 @@ ENDIF(BUILD_PYTHON) MESSAGE(STATUS "Using the target ${CosmoTool_local} to build python module") +find_library(ZLIB_LIBRARY z) +find_library(DL_LIBRARY dl) +find_library(RT_LIBRARY rt) +if (RT_LIBRARY) + SET(RT_DEP rt) + message(STATUS "RT found, linking against it") +else() + SET(RT_DEP) +endif() +find_library(MATH_LIBRARY m) + include(${CMAKE_SOURCE_DIR}/external/external_build.cmake) IF(YORICK_SUPPORT) @@ -55,9 +66,6 @@ IF(YORICK_SUPPORT) ENDIF(YORICK_SUPPORT) find_program(CYTHON NAMES cython3 cython) -find_library(ZLIB_LIBRARY z) -find_library(DL_LIBRARY dl) -find_library(MATH_LIBRARY m) set(NETCDF_FIND_REQUIRED ${YORICK_SUPPORT}) set(GSL_FIND_REQUIRED TRUE) diff --git a/external/external_build.cmake b/external/external_build.cmake index 035622a..0dad2cf 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -105,7 +105,7 @@ if (INTERNAL_HDF5) SET(ENV{HDF5_ROOT} ${HDF5_BIN_DIR}) SET(HDF5_ROOTDIR ${HDF5_BIN_DIR}) SET(CONFIGURE_LDFLAGS "${CONFIGURE_LDFLAGS} -L${HDF5_BIN_DIR}/lib") - SET(CONFIGURE_LIBS "${CONFIGURE_LIBS} -ldl") + SET(CONFIGURE_LIBS "${CONFIGURE_LIBS} -ldl ${RT_LIBRARY}") set(HDF5_C_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5.a) set(HDF5_HL_STATIC_LIBRARY ${HDF5_BIN_DIR}/lib/libhdf5_hl.a) set(HDF5_LIBRARIES ${HDF5_BIN_DIR}/lib/libhdf5.a CACHE STRING "HDF5 lib" FORCE) @@ -175,26 +175,28 @@ if (INTERNAL_NETCDF) string(REPLACE ";" "|" CMAKE_PREFIX_PATH_ALT_SEP "${CMAKE_PREFIX_PATH}") ExternalProject_Add(netcdf DEPENDS ${hdf5_built} + URL_HASH MD5=f48ee01534365006934f0c63d4055ea0 PREFIX ${BUILD_PREFIX}/netcdf-prefix DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads URL ${NETCDF_URL} - LIST_SEPARATOR | - CMAKE_ARGS + LIST_SEPARATOR | + CMAKE_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DNC_EXTRA_DEPS=${RT_DEP} -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DENABLE_NETCDF4=ON -DENABLE_BYTERANGE=FALSE - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DENABLE_DAP=OFF + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DENABLE_DAP=OFF -DCMAKE_INSTALL_PREFIX=${NETCDF_BIN_DIR} -DHDF5_C_LIBRARY=${HDF5_C_STATIC_LIBRARY} -DHDF5_HL_LIBRARY=${HDF5_HL_STATIC_LIBRARY} -DHDF5_INCLUDE_DIR=${HDF5_INCLUDE_DIRS} - -DCMAKE_INSTALL_LIBDIR=lib + -DCMAKE_INSTALL_LIBDIR=lib ) SET(NETCDFCXX_SOURCE_DIR ${BUILD_PREFIX}/netcdf-c++-prefix/src/netcdf-c++) From 26e095fc7134bb9f74848ba19d95e41d830603b2 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 16 Jan 2024 07:21:56 +0100 Subject: [PATCH 35/52] Fix for default MacOS build with python --- external/external_build.cmake | 2 +- python/CMakeLists.txt | 5 +---- setup.py | 26 +++++++++++++++++--------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/external/external_build.cmake b/external/external_build.cmake index 0dad2cf..65ee8b8 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -39,7 +39,7 @@ CHECK_CHANGE_STATE(INTERNAL_DLIB DLIB_INCLUDE_DIR DLIB_LIBRARIES) IF(ENABLE_OPENMP) IF (NOT OPENMP_FOUND) - MESSAGE(ERROR "No known compiler option for enabling OpenMP") + MESSAGE(NOTICE "No known compiler option for enabling OpenMP") ELSE() SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 7eda7ac..368eed6 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -69,13 +69,10 @@ target_link_libraries(_fast_interp PRIVATE ${CosmoTool_local} ) SET(ct_TARGETS _cosmotool _project _cosmo_power _cosmo_cic _fast_interp _cosmomath) if (Boost_FOUND) - message(STATUS "Building bispectrum support (path = ${Boost_INCLUDE_DIRS})") + message(STATUS "Building bispectrum support") include_directories(${Boost_INCLUDE_DIRS}) add_library(_cosmo_bispectrum MODULE _cosmo_bispectrum.cpp) target_link_libraries(_cosmo_bispectrum ${MATH_LIBRARY}) - if(ENABLE_OPENMP) - set_target_properties(_cosmo_bispectrum PROPERTIES COMPILE_FLAGS "${OpenMP_CXX_FLAGS}" LINK_FLAGS "${OpenMP_CXX_FLAGS}") - endif() if (Boost_DEP) add_dependencies(_cosmo_bispectrum ${Boost_DEP}) endif() diff --git a/setup.py b/setup.py index 93daaba..0d2f694 100644 --- a/setup.py +++ b/setup.py @@ -2,6 +2,7 @@ import stat import os import sys import shutil +from sysconfig import get_config_var from distutils.command.install_data import install_data import pathlib from setuptools import find_packages, setup, Extension @@ -167,17 +168,24 @@ class BuildCMakeExt(build_ext): # Change your cmake arguments below as necessary # Below is just an example set of arguments for building Blender as a Python module + c_compiler=os.environ.get('CC', get_config_var("CC")) + cxx_compiler=os.environ.get('CXX', get_config_var("CXX")) + compilers=[] fill_up_settings=[ - ("CMAKE_C_COMPILER", "CC"), - ("CMAKE_CXX_COMPILER", "CXX"), - ("CMAKE_C_FLAGS", "CFLAGS"), - ("CMAKE_EXE_LINKER_FLAGS_INIT", "LDFLAGS"), - ("CMAKE_SHARED_LINKER_FLAGS_INIT", "LDFLAGS"), - ("CMAKE_MODULE_LINKER_FLAGS_INIT", "LDFLAGS")] - for cmake_flag, os_flag in fill_up_settings: - if os_flag in os.environ: - compilers.append(f"-D{cmake_flag}={os.environ[os_flag]}") + ("CMAKE_C_COMPILER", "CC", get_config_var("CC")), + ("CMAKE_CXX_COMPILER", "CXX", get_config_var("CXX")), + ("CMAKE_C_FLAGS", "CFLAGS", None), + ("CMAKE_CXX_FLAGS", "CXXFLAGS", None), + ("CMAKE_EXE_LINKER_FLAGS_INIT", "LDFLAGS", None), + ("CMAKE_SHARED_LINKER_FLAGS_INIT", "LDFLAGS", None), + ("CMAKE_MODULE_LINKER_FLAGS_INIT", "LDFLAGS", None)] + for cmake_flag, os_flag, default_flag in fill_up_settings: + if os_flag in os.environ or default_flag is not None: + c = os.environ.get(os_flag, default_flag) + if not c is None: + compilers.append(f"-D{cmake_flag}={c}") + print(compilers) self.spawn(['cmake', '-H'+SOURCE_DIR, '-B'+self.build_temp, '-DENABLE_OPENMP=ON','-DINTERNAL_BOOST=ON','-DINTERNAL_EIGEN=ON', From 97a1e34132c73f2ef4f3ceebbf0840e7a8354a0c Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 16 Jan 2024 07:33:45 +0100 Subject: [PATCH 36/52] Strip mandatory pyfftw support --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0d2f694..17ea91d 100644 --- a/setup.py +++ b/setup.py @@ -240,7 +240,7 @@ setup(name='cosmotool', version='1.3.4', packages=["cosmotool"], package_dir={'cosmotool': 'python/cosmotool'}, - install_requires=['numpy','cffi','numexpr','pyfftw','h5py'], + install_requires=['numpy','cffi','numexpr','h5py'], setup_requires=['cython','cffi','numpy','numexpr'], ext_modules=[CosmoTool_extension], description='A small cosmotool box of useful functions', From 751d8a19a068ea39c2d5c23c780a70e09b69a3ef Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 16 Jan 2024 07:49:08 +0100 Subject: [PATCH 37/52] Remove pyfftw from requirements --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e47ca7a..922eaeb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ numpy<1.22 cffi numexpr -pyfftw cython<3 From b8e60a7d335c6f6a2698375b21020dc43ed08db6 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 16 Jan 2024 07:50:50 +0100 Subject: [PATCH 38/52] Updating to 1.3.5 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 17ea91d..7c07d3a 100644 --- a/setup.py +++ b/setup.py @@ -237,7 +237,7 @@ class BuildCMakeExt(build_ext): CosmoTool_extension = CMakeExtension(name="cosmotool") setup(name='cosmotool', - version='1.3.4', + version='1.3.5', packages=["cosmotool"], package_dir={'cosmotool': 'python/cosmotool'}, install_requires=['numpy','cffi','numexpr','h5py'], From 883c338c08c8761b09f263ee4d39709101d4aa23 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Wed, 17 Jan 2024 14:00:09 +0100 Subject: [PATCH 39/52] Fixed building --- external/external_build.cmake | 1 + sample/CMakeLists.txt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/external/external_build.cmake b/external/external_build.cmake index 65ee8b8..997cc4d 100644 --- a/external/external_build.cmake +++ b/external/external_build.cmake @@ -206,6 +206,7 @@ if (INTERNAL_NETCDF) DOWNLOAD_DIR ${SOURCE_PREFIX}/downloads URL ${NETCDFCXX_URL} CMAKE_ARGS + -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DBUILD_SHARED_LIBS=OFF diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt index 03709a7..6d019a7 100644 --- a/sample/CMakeLists.txt +++ b/sample/CMakeLists.txt @@ -1,4 +1,8 @@ SET(tolink ${CosmoTool_local} ${CosmoTool_LIBS} ${GSL_LIBRARIES} ${DL_LIBRARY}) +if (RT_LIBRARY) + SET(tolink ${tolink} ${RT_LIBRARY}) +endif() + include_directories(${CMAKE_SOURCE_DIR}/src) include_directories(${FFTW3_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} ${GSL_INCLUDE_PATH}) if(YORICK_SUPPORT) From 54a59b5246407b0b8d226eddb90e8151f829278b Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 16 Jan 2024 07:54:48 +0100 Subject: [PATCH 40/52] Fix manifest --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 5c4f363..2344e64 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -17,7 +17,7 @@ include doc/source/index.rst include doc/source/intro.rst include doc/source/pythonmodule.rst include external/external_build.cmake -include external/libsharp-6077806.tar.gz +include external/libsharp-8d51946.tar.gz include external/omptl-20120422.tar.bz2 include external/patch-omptl include python/CMakeLists.txt From f2a5092cf119760a9a0f03da81980b791dbf9389 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 13 Feb 2024 07:53:06 +0100 Subject: [PATCH 41/52] Fix MANIFEST --- MANIFEST.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 2344e64..6400359 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -16,6 +16,8 @@ include doc/source/cpplibrary.rst include doc/source/index.rst include doc/source/intro.rst include doc/source/pythonmodule.rst +include external/config.guess +include external/config.sub include external/external_build.cmake include external/libsharp-8d51946.tar.gz include external/omptl-20120422.tar.bz2 From 1db266b4ea982284c200739bf4e24f3166346b88 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 13 Feb 2024 08:19:54 +0100 Subject: [PATCH 42/52] Add pyproject.toml --- MANIFEST.in | 1 + pyproject.toml | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 pyproject.toml diff --git a/MANIFEST.in b/MANIFEST.in index 6400359..4bc4264 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,5 @@ include .gitignore +include pyproject.toml include CMakeLists.txt include FindNumPy.cmake include FindPyLibs.cmake diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..890c3fc --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,4 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + From 1151d0c8b6008e095a692c166afbeef807557f24 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 13 Feb 2024 08:25:14 +0100 Subject: [PATCH 43/52] Add cython back to dependency --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7c07d3a..63377a0 100644 --- a/setup.py +++ b/setup.py @@ -240,7 +240,7 @@ setup(name='cosmotool', version='1.3.5', packages=["cosmotool"], package_dir={'cosmotool': 'python/cosmotool'}, - install_requires=['numpy','cffi','numexpr','h5py'], + install_requires=['cython','numpy','cffi','numexpr','h5py'], setup_requires=['cython','cffi','numpy','numexpr'], ext_modules=[CosmoTool_extension], description='A small cosmotool box of useful functions', From 1548fd84508ed84c6c5a00bd7da570967e2edf7c Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 13 Feb 2024 09:15:36 +0100 Subject: [PATCH 44/52] Add missing pyx in MANIFEST --- MANIFEST.in | 1 + pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 4bc4264..309d4fc 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -27,6 +27,7 @@ include python/CMakeLists.txt include python/_cosmo_bispectrum.cpp include python/_cosmo_cic.pyx include python/_cosmo_power.pyx +include python/_cosmomath.pyx include python/_cosmotool.pyx include python/_fast_interp.pyx include python/_project.pyx diff --git a/pyproject.toml b/pyproject.toml index 890c3fc..32826dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,4 @@ [build-system] -requires = ["setuptools"] +requires = ["setuptools","wheel","cython"] build-backend = "setuptools.build_meta" From 1d59533b175b5bbe0c8a3ce02fe2808a1fdc5e51 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 13 Feb 2024 10:28:58 +0100 Subject: [PATCH 45/52] Add python in search path --- python/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 368eed6..1b3fe10 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -2,7 +2,7 @@ set(CMAKE_SHARED_MODULE_PREFIX) set(PYTHON_INCLUDES ${NUMPY_INCLUDE_DIRS} ${PYTHON_INCLUDE_PATH} ${CMAKE_SOURCE_DIR}/python) -include_directories(${CMAKE_SOURCE_DIR}/src ${CMAKE_BINARY_DIR}/src) +include_directories(${CMAKE_SOURCE_DIR}/python ${CMAKE_SOURCE_DIR}/src ${CMAKE_BINARY_DIR}/src) IF(CYTHON) add_custom_command( From 4bcc5f32704867a6ff9068ac1cc8e328476d6fe9 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 13 Feb 2024 10:37:52 +0100 Subject: [PATCH 46/52] Add missing numpy_adaptors --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 309d4fc..105a2d6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -97,6 +97,7 @@ include sample/testkd3.cpp include setup.py include src/CMakeLists.txt include src/algo.hpp +include src/numpy_adaptors.hpp include src/bqueue.hpp include src/bqueue.tcc include src/bsp_simple.hpp From 47d63a25cec1f8a823aa14edaa10f6aa1fc93412 Mon Sep 17 00:00:00 2001 From: "guilhem.lavaux@iap.fr" Date: Tue, 13 Feb 2024 10:47:28 +0100 Subject: [PATCH 47/52] Bump version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 63377a0..0b98cce 100644 --- a/setup.py +++ b/setup.py @@ -237,7 +237,7 @@ class BuildCMakeExt(build_ext): CosmoTool_extension = CMakeExtension(name="cosmotool") setup(name='cosmotool', - version='1.3.5', + version='1.3.6', packages=["cosmotool"], package_dir={'cosmotool': 'python/cosmotool'}, install_requires=['cython','numpy','cffi','numexpr','h5py'], From be64c7fd7afe1c1c173401c64842b2ca99f27a6f Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Thu, 25 Apr 2024 17:05:54 +0200 Subject: [PATCH 48/52] Remove support for old python --- builder/build-wheels.sh | 6 +++--- builder/start.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/builder/build-wheels.sh b/builder/build-wheels.sh index 60a8bfc..8f529dd 100755 --- a/builder/build-wheels.sh +++ b/builder/build-wheels.sh @@ -16,7 +16,7 @@ ln -fs /usr/bin/cmake3 /usr/bin/cmake test -d /io/wheelhouse || mkdir /io/wheelhouse test -d /io/wheelhouse/fix || mkdir /io/wheelhouse/fix -ALL_PYTHON="cp37-cp37m cp38-cp38 cp39-cp39 cp310-cp310" +ALL_PYTHON="cp39-cp39 cp310-cp310" # Compile wheels for pkg in $ALL_PYTHON; do @@ -24,11 +24,11 @@ for pkg in $ALL_PYTHON; do # "${PYBIN}/pip" install -r /io/dev-requirements.txt "${PYBIN}/pip" install setuptools wheel Cython "${PYBIN}/pip" install -r /io/requirements.txt - "${PYBIN}/pip" wheel -vvv /io/ -w wheelhouse/ + "${PYBIN}/pip" wheel -vvv /io/ -w /io/wheelhouse/ done # Bundle external shared libraries into the wheels -for whl in /io/wheelhouse/cosmotool*.whl; do +for whl in /io/wheelhouse/cosmotool*linux*.whl; do auditwheel repair "$whl" --plat $PLAT -w /io/wheelhouse/fix done diff --git a/builder/start.sh b/builder/start.sh index 9fbc185..31f95f0 100755 --- a/builder/start.sh +++ b/builder/start.sh @@ -9,4 +9,4 @@ if ! [ -e ${d}/setup.py ] ; then exit 1 fi -podman run -ti --rm -e PLAT=manylinux2010_x86_64 -v ${d}:/io:Z quay.io/pypa/manylinux2010_x86_64 /io/builder/build-wheels.sh +podman run -ti --rm -e PLAT=manylinux2014_x86_64 -v ${d}:/io:Z quay.io/pypa/manylinux2014_x86_64 /io/builder/build-wheels.sh From 924047de22b6c1e1e367d807e0508d6641c5ea24 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Thu, 25 Apr 2024 18:11:02 +0200 Subject: [PATCH 49/52] Add possibility to have an external state --- src/hdf5_array.hpp | 2 +- src/sphSmooth.hpp | 4 +++- src/sphSmooth.tcc | 37 +++++++++++++++++++++---------------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/hdf5_array.hpp b/src/hdf5_array.hpp index db75a33..55dc87b 100644 --- a/src/hdf5_array.hpp +++ b/src/hdf5_array.hpp @@ -426,7 +426,7 @@ namespace CosmoTool { #define CTOOL_HDF5_INSERT_ELEMENT(r, STRUCT, element) \ { \ ::CosmoTool::get_hdf5_data_type t; \ - long position = HOFFSET(STRUCT, BOOST_PP_TUPLE_ELEM(2, 1, element)); \ + long position = offsetof(STRUCT, BOOST_PP_TUPLE_ELEM(2, 1, element)); \ const char *field_name = BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 1, element)); \ type.insertMember(field_name, position, t.type()); \ } diff --git a/src/sphSmooth.hpp b/src/sphSmooth.hpp index fdada71..f9c468b 100644 --- a/src/sphSmooth.hpp +++ b/src/sphSmooth.hpp @@ -72,7 +72,9 @@ namespace CosmoTool { void fetchNeighbours(const typename SPHTree::coords &c, SPHState *state = 0); - void fetchNeighbours(const typename SPHTree::coords &c, uint32_t newNsph); + void fetchNeighbours( + const typename SPHTree::coords &c, uint32_t newNsph, + SPHState *state = 0); void fetchNeighboursOnVolume( const typename SPHTree::coords &c, ComputePrecision radius); const typename SPHTree::coords &getCurrentCenter() const { diff --git a/src/sphSmooth.tcc b/src/sphSmooth.tcc index c163feb..c50fb7e 100644 --- a/src/sphSmooth.tcc +++ b/src/sphSmooth.tcc @@ -35,32 +35,38 @@ namespace CosmoTool { template void SPHSmooth::fetchNeighbours( - const typename SPHTree::coords &c, uint32_t newNngb) { + const typename SPHTree::coords &c, uint32_t newNngb, SPHState *state) { ComputePrecision d2, max_dist = 0; uint32_t requested = newNngb; - if (requested > maxNgb) { - maxNgb = requested; - internal.ngb = boost::shared_ptr(new P_SPHCell[maxNgb]); - internal.distances = - boost::shared_ptr(new CoordType[maxNgb]); + if (state != 0) { + state->distances = boost::shared_ptr(new CoordType[Nsph]); + state->ngb = boost::shared_ptr(new SPHCell *[Nsph]); + } else { + state = &internal; + if (requested > maxNgb) { + maxNgb = requested; + internal.ngb = boost::shared_ptr(new P_SPHCell[maxNgb]); + internal.distances = + boost::shared_ptr(new CoordType[maxNgb]); + } } - memcpy(internal.currentCenter, c, sizeof(c)); + memcpy(state->currentCenter, c, sizeof(c)); tree->getNearestNeighbours( - c, requested, (SPHCell **)internal.ngb.get(), - (CoordType *)internal.distances.get()); + c, requested, (SPHCell **)state->ngb.get(), + (CoordType *)state->distances.get()); - internal.currentNgb = 0; - for (uint32_t i = 0; i < requested && (internal.ngb)[i] != 0; - i++, internal.currentNgb++) { - internal.distances[i] = sqrt(internal.distances[i]); - d2 = internal.distances[i]; + state->currentNgb = 0; + for (uint32_t i = 0; i < requested && (state->ngb)[i] != 0; + i++, state->currentNgb++) { + state->distances[i] = sqrt(state->distances[i]); + d2 = state->distances[i]; if (d2 > max_dist) max_dist = d2; } - internal.smoothRadius = max_dist / 2; + state->smoothRadius = max_dist / 2; } template @@ -241,5 +247,4 @@ namespace CosmoTool { const SPHSmooth &s2) { return (s1.getSmoothingLen() < s2.getSmoothingLen()); } - }; // namespace CosmoTool From fb51ffd35e5f111bbf7a679a0dffc562530c1cb1 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Fri, 26 Apr 2024 08:53:38 +0200 Subject: [PATCH 50/52] Fixup for sph --- src/sphSmooth.tcc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sphSmooth.tcc b/src/sphSmooth.tcc index c50fb7e..6643dd3 100644 --- a/src/sphSmooth.tcc +++ b/src/sphSmooth.tcc @@ -40,8 +40,8 @@ namespace CosmoTool { uint32_t requested = newNngb; if (state != 0) { - state->distances = boost::shared_ptr(new CoordType[Nsph]); - state->ngb = boost::shared_ptr(new SPHCell *[Nsph]); + state->distances = boost::shared_ptr(new CoordType[newNngb]); + state->ngb = boost::shared_ptr(new SPHCell *[newNngb]); } else { state = &internal; if (requested > maxNgb) { @@ -212,7 +212,7 @@ namespace CosmoTool { ComputePrecision d = state->distances[i]; SPHCell &cell = *(state->ngb[i]); double kernel_value = getKernel(d / state->smoothRadius) / r3; -#pragma omp atomic +#pragma omp atomic update cell.val.weight += kernel_value; } } From 736531e9fd4c9a53d3ab63a9674aab42e4a5a7e3 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Thu, 9 May 2024 09:55:02 +0300 Subject: [PATCH 51/52] Add towncrier experimental --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 32826dd..7a031e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,3 +2,7 @@ requires = ["setuptools","wheel","cython"] build-backend = "setuptools.build_meta" + +[tool.towncrier] +directory = "changes" + From 70f6f88802a145caab0ebeb1edcde6d66923d5ea Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Tue, 11 Mar 2025 14:26:57 -0400 Subject: [PATCH 52/52] Add ZLIB package --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 80b1743..02a93d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ ENDIF(BUILD_PYTHON) MESSAGE(STATUS "Using the target ${CosmoTool_local} to build python module") +find_package(ZLIB) find_library(ZLIB_LIBRARY z) find_library(DL_LIBRARY dl) find_library(RT_LIBRARY rt) @@ -82,7 +83,7 @@ SET(CPACK_PACKAGE_VERSION_MINOR "3") SET(CPACK_PACKAGE_VERSION_PATCH "4${EXTRA_VERSION}") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CosmoToolbox-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}") SET(CPACK_STRIP_FILES "lib/libCosmoTool.so") -SET(CPACK_SOURCE_IGNORE_FILES +SET(CPACK_SOURCE_IGNORE_FILES "/CVS/;/\\\\.git/;/\\\\.svn/;\\\\.swp$;\\\\.#;/#;.*~;cscope.*;/CMakeFiles/;.*\\\\.cmake;Makefile") add_subdirectory(src)