From 858065029d27622049e64388a642a7d2b986b258 Mon Sep 17 00:00:00 2001 From: David Nicholson Date: Sun, 12 Nov 2017 15:46:51 -0500 Subject: [PATCH 01/46] Reverse communication compute fragment/aggregate --- src/compute_aggregate_atom.cpp | 45 +++++++++++++++++++++++++++++++++- src/compute_aggregate_atom.h | 2 ++ src/compute_fragment_atom.cpp | 45 +++++++++++++++++++++++++++++++++- src/compute_fragment_atom.h | 2 ++ 4 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index 1155ac437a..f92bf02cba 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -51,6 +51,7 @@ ComputeAggregateAtom::ComputeAggregateAtom(LAMMPS *lmp, int narg, char **arg) : peratom_flag = 1; size_peratom_cols = 0; comm_forward = 1; + comm_reverse = 1; nmax = 0; } @@ -163,6 +164,11 @@ void ComputeAggregateAtom::compute_peratom() while (1) { comm->forward_comm_compute(this); + // reverse communication when bonds are not stored on every processor + + if (force->newton_bond) + comm->reverse_comm_compute(this); + change = 0; while (1) { done = 1; @@ -252,13 +258,50 @@ void ComputeAggregateAtom::unpack_forward_comm(int n, int first, double *buf) m = 0; last = first + n; if (commflag) - for (i = first; i < last; i++) aggregateID[i] = buf[m++]; + for (i = first; i < last; i++) { + double x = buf[m++]; + + // only overwrite ghost IDs with values lower than current ones + + aggregateID[i] = MIN(x,aggregateID[i]); + } else { int *mask = atom->mask; for (i = first; i < last; i++) mask[i] = (int) ubuf(buf[m++]).i; } } +/* ---------------------------------------------------------------------- */ + +int ComputeAggregateAtom::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = aggregateID[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeAggregateAtom::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + double x = buf[m++]; + + // only overwrite local IDs with values lower than current ones + + aggregateID[j] = MIN(x,aggregateID[j]); + } +} + /* ---------------------------------------------------------------------- memory usage of local atom-based array ------------------------------------------------------------------------- */ diff --git a/src/compute_aggregate_atom.h b/src/compute_aggregate_atom.h index 8170aabc7f..dc2e1d7b40 100644 --- a/src/compute_aggregate_atom.h +++ b/src/compute_aggregate_atom.h @@ -33,6 +33,8 @@ class ComputeAggregateAtom : public Compute { void compute_peratom(); int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); double memory_usage(); private: diff --git a/src/compute_fragment_atom.cpp b/src/compute_fragment_atom.cpp index 2dfb20a570..8606f54933 100644 --- a/src/compute_fragment_atom.cpp +++ b/src/compute_fragment_atom.cpp @@ -44,6 +44,7 @@ ComputeFragmentAtom::ComputeFragmentAtom(LAMMPS *lmp, int narg, char **arg) : peratom_flag = 1; size_peratom_cols = 0; comm_forward = 1; + comm_reverse = 1; nmax = 0; } @@ -122,6 +123,11 @@ void ComputeFragmentAtom::compute_peratom() while (1) { comm->forward_comm_compute(this); + // reverse communication when bonds are not stored on every processor + + if (force->newton_bond) + comm->reverse_comm_compute(this); + change = 0; while (1) { done = 1; @@ -183,13 +189,50 @@ void ComputeFragmentAtom::unpack_forward_comm(int n, int first, double *buf) m = 0; last = first + n; if (commflag) - for (i = first; i < last; i++) fragmentID[i] = buf[m++]; + for (i = first; i < last; i++) { + double x = buf[m++]; + + // only overwrite ghost IDs with values lower than current ones + + fragmentID[i] = MIN(x,fragmentID[i]); + } else { int *mask = atom->mask; for (i = first; i < last; i++) mask[i] = (int) ubuf(buf[m++]).i; } } +/* ---------------------------------------------------------------------- */ + +int ComputeFragmentAtom::pack_reverse_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) { + buf[m++] = fragmentID[i]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeFragmentAtom::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + double x = buf[m++]; + + // only overwrite local IDs with values lower than current ones + + fragmentID[j] = MIN(x,fragmentID[j]); + } +} + /* ---------------------------------------------------------------------- memory usage of local atom-based array ------------------------------------------------------------------------- */ diff --git a/src/compute_fragment_atom.h b/src/compute_fragment_atom.h index a56239dbda..2365b6028b 100644 --- a/src/compute_fragment_atom.h +++ b/src/compute_fragment_atom.h @@ -32,6 +32,8 @@ class ComputeFragmentAtom : public Compute { void compute_peratom(); int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); + int pack_reverse_comm(int, int, double *); + void unpack_reverse_comm(int, int *, double *); double memory_usage(); private: -- GitLab From c16b7a3273f469c75a982a944b01865ecd0d303a Mon Sep 17 00:00:00 2001 From: David Nicholson Date: Sun, 12 Nov 2017 15:57:53 -0500 Subject: [PATCH 02/46] Multiple run fix for cluster/aggregate computes --- src/compute_aggregate_atom.cpp | 2 +- src/compute_cluster_atom.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index f92bf02cba..b3daf5f98c 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -121,7 +121,7 @@ void ComputeAggregateAtom::compute_peratom() // invoke full neighbor list (will copy or build if necessary) - neighbor->build_one(list); + neighbor->build_one(list,1); // if group is dynamic, insure ghost atom masks are current diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index 5ee6368504..d01402d480 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -113,7 +113,7 @@ void ComputeClusterAtom::compute_peratom() // invoke full neighbor list (will copy or build if necessary) - neighbor->build_one(list); + neighbor->build_one(list,1); inum = list->inum; ilist = list->ilist; -- GitLab From a085ee0c554024209762d9e4633c775aaf289e88 Mon Sep 17 00:00:00 2001 From: David Nicholson Date: Mon, 13 Nov 2017 04:53:16 -0500 Subject: [PATCH 03/46] Always build occasional lists on first step --- src/compute_aggregate_atom.cpp | 2 +- src/compute_cluster_atom.cpp | 2 +- src/neighbor.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index b3daf5f98c..f92bf02cba 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -121,7 +121,7 @@ void ComputeAggregateAtom::compute_peratom() // invoke full neighbor list (will copy or build if necessary) - neighbor->build_one(list,1); + neighbor->build_one(list); // if group is dynamic, insure ghost atom masks are current diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index d01402d480..5ee6368504 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -113,7 +113,7 @@ void ComputeClusterAtom::compute_peratom() // invoke full neighbor list (will copy or build if necessary) - neighbor->build_one(list,1); + neighbor->build_one(list); inum = list->inum; ilist = list->ilist; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index cc2e5d6d11..46b921191b 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -2144,7 +2144,7 @@ void Neighbor::build_one(class NeighList *mylist, int preflag) NPair *np = neigh_pair[mylist->index]; - if (preflag) { + if (preflag || update->firststep == update->ntimestep) { if (np->last_build > lastcall) return; } else { if (np->last_build >= lastcall) return; -- GitLab From e55c90cc443b4f3b40fd4c7ff5fa6222b835027c Mon Sep 17 00:00:00 2001 From: David Nicholson Date: Tue, 14 Nov 2017 14:01:07 -0500 Subject: [PATCH 04/46] Moved rerun bug fix to individual affected styles --- src/compute_aggregate_atom.cpp | 4 +++- src/compute_cluster_atom.cpp | 4 +++- src/compute_hexorder_atom.cpp | 4 +++- src/neighbor.cpp | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp index f92bf02cba..674fecb8c0 100644 --- a/src/compute_aggregate_atom.cpp +++ b/src/compute_aggregate_atom.cpp @@ -120,8 +120,10 @@ void ComputeAggregateAtom::compute_peratom() } // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) - neighbor->build_one(list); + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); // if group is dynamic, insure ghost atom masks are current diff --git a/src/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp index 5ee6368504..9a7df03e49 100644 --- a/src/compute_cluster_atom.cpp +++ b/src/compute_cluster_atom.cpp @@ -112,8 +112,10 @@ void ComputeClusterAtom::compute_peratom() } // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) - neighbor->build_one(list); + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); inum = list->inum; ilist = list->ilist; diff --git a/src/compute_hexorder_atom.cpp b/src/compute_hexorder_atom.cpp index 013036f364..85324651c1 100644 --- a/src/compute_hexorder_atom.cpp +++ b/src/compute_hexorder_atom.cpp @@ -154,8 +154,10 @@ void ComputeHexOrderAtom::compute_peratom() } // invoke full neighbor list (will copy or build if necessary) + // on the first step of a run, set preflag to one in neighbor->build_one(...) - neighbor->build_one(list); + if (update->firststep == update->ntimestep) neighbor->build_one(list,1); + else neighbor->build_one(list); inum = list->inum; ilist = list->ilist; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 46b921191b..cc2e5d6d11 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -2144,7 +2144,7 @@ void Neighbor::build_one(class NeighList *mylist, int preflag) NPair *np = neigh_pair[mylist->index]; - if (preflag || update->firststep == update->ntimestep) { + if (preflag) { if (np->last_build > lastcall) return; } else { if (np->last_build >= lastcall) return; -- GitLab From 939b1b2d05257ef627d64396878b52cb9a17b160 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 22 Feb 2018 14:27:23 -0700 Subject: [PATCH 05/46] Workaround issue in pair_snap_kokkos_impl --- src/KOKKOS/pair_snap_kokkos_impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index b2c8bbcd99..6165c3e9f7 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -188,7 +188,7 @@ void PairSNAPKokkos::compute(int eflag_in, int vflag_in) int team_size_max = Kokkos::TeamPolicy::team_size_max(*this); int vector_length = 8; #ifdef KOKKOS_ENABLE_CUDA - int team_size = 20;//max_neighs; + int team_size = 32;//max_neighs; if (team_size*vector_length > team_size_max) team_size = team_size_max/vector_length; #else -- GitLab From 523978b4c7d536cff704e599b51b2a94868f7e9c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Feb 2018 12:04:15 +0100 Subject: [PATCH 06/46] dead code and uninitialized variables detected by clang --- src/USER-MISC/pair_edip_multi.cpp | 2 +- src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/USER-MISC/pair_edip_multi.cpp b/src/USER-MISC/pair_edip_multi.cpp index d52b2e4a47..3345549ae3 100644 --- a/src/USER-MISC/pair_edip_multi.cpp +++ b/src/USER-MISC/pair_edip_multi.cpp @@ -364,7 +364,7 @@ void PairEDIPMulti::edip_fc(double r, Param *param, double &f, double &fdr) double c = param->cutoffC; double alpha = param->alpha; double x; - double v1, v2, v3; + double v1, v2; if(r < c + 1E-6) { diff --git a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp index c6490b0824..60445d2d86 100644 --- a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp @@ -1700,6 +1700,7 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th jnum = numneigh[i]; offseti = offset[itype]; lj1i = lj1[itype]; lj2i = lj2[itype]; lj3i = lj3[itype]; lj4i = lj4[itype]; + fxtmp = fytmp = fztmp = 0.0; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; -- GitLab From 0003bb6766d79e87fb18bb9e7bbf0c7a0c1f7e49 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Feb 2018 14:20:39 +0100 Subject: [PATCH 07/46] merge capture regions, so the library interface code can compiled with exceptions --- src/library.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 0544aa5a4a..f0bd7f7ca6 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -276,13 +276,6 @@ void lammps_commands_string(void *ptr, char *str) { LAMMPS *lmp = (LAMMPS *) ptr; - BEGIN_CAPTURE - { - if (lmp->update->whichflag != 0) - lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); - } - END_CAPTURE - // make copy of str so can strtok() it int n = strlen(str) + 1; @@ -291,6 +284,11 @@ void lammps_commands_string(void *ptr, char *str) BEGIN_CAPTURE { + if (lmp->update->whichflag != 0) { + delete [] copy; + lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); + } + char *ptr = copy; for (int i=0; i < n-1; ++i) { -- GitLab From f3cf407a21511fa902bdc732955ec26b78a6555f Mon Sep 17 00:00:00 2001 From: Giacomo Fiorin Date: Fri, 23 Feb 2018 08:34:53 -0500 Subject: [PATCH 08/46] Collected fixes and updates to Colvars library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit includes several fixes to moving restraints; also added is support for runtime integration of 2D and 3D PMFs from ABF. Mostly changes to existing member functions, with few additions in classes not directly accessible by LAMMPS. Also removed are calls to std::pow(), replaced by a copy of MathSpecial::powint(). Relevant commits in Colvars repository: 7307b5c 2017-12-14 Doc improvements [Giacomo Fiorin] 7f86f37 2017-12-14 Allow K-changing restraints computing accumulated work; fix staged-k TI estimator [Giacomo Fiorin] 7c1c175 2017-12-14 Fix 1D ABF trying to do pABF [Jérôme Hénin] b94aa7e 2017-11-16 Unify PMF output for 1D, 2D and 3D in ABF [Jérôme Hénin] 771a88f 2017-11-15 Poisson integration for all BC in 2d and 3d [Jérôme Hénin] 6af4d60 2017-12-01 Print message when issuing cv delete in VMD [Giacomo Fiorin] 4413972 2017-11-30 Check for homogeneous colvar to set it periodic [Jérôme Hénin] 95fe4b2 2017-11-06 Allow abf_integrate to start in bin with 1 sample [Jérôme Hénin] 06eea27 2017-10-23 Shorten a few constructs by using the power function [Giacomo Fiorin] 3165dfb 2017-10-20 Move includes of colvarproxy.h from headers to files [Giacomo Fiorin] 32a867b 2017-10-20 Add optimized powint function from LAMMPS headers [Giacomo Fiorin] 3ad070a 2017-10-20 Remove some unused includes, isolate calls to std::pow() [Giacomo Fiorin] 0aaf540 2017-10-20 Replace all calls to std::pow() where the exponent is not an integer [Giacomo Fiorin] --- doc/src/PDF/colvars-refman-lammps.pdf | Bin 600504 -> 608198 bytes lib/colvars/colvar.cpp | 2 +- lib/colvars/colvar.h | 16 +- lib/colvars/colvar_UIestimator.h | 4 +- lib/colvars/colvaratoms.cpp | 2 + lib/colvars/colvaratoms.h | 1 + lib/colvars/colvarbias.cpp | 1 + lib/colvars/colvarbias_abf.cpp | 247 +++++-- lib/colvars/colvarbias_abf.h | 62 +- lib/colvars/colvarbias_alb.cpp | 66 +- lib/colvars/colvarbias_histogram.cpp | 14 +- lib/colvars/colvarbias_meta.cpp | 3 +- lib/colvars/colvarbias_restraint.cpp | 189 +++-- lib/colvars/colvarbias_restraint.h | 22 +- lib/colvars/colvarcomp.h | 64 +- lib/colvars/colvarcomp_distances.cpp | 33 +- lib/colvars/colvardeps.cpp | 11 +- lib/colvars/colvardeps.h | 2 + lib/colvars/colvargrid.cpp | 698 +++++++++++++++++- lib/colvars/colvargrid.h | 276 +++++-- lib/colvars/colvarmodule.cpp | 141 +++- lib/colvars/colvarmodule.h | 115 +-- lib/colvars/colvarparse.cpp | 3 +- lib/colvars/colvarproxy.cpp | 162 +++- lib/colvars/colvarproxy.h | 57 +- lib/colvars/colvars_version.h | 2 +- lib/colvars/colvarscript.cpp | 12 +- src/USER-COLVARS/colvarproxy_lammps_version.h | 2 +- 28 files changed, 1776 insertions(+), 431 deletions(-) diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index daa1393269b953d569aff9846a135480dcdd42c7..2d28758819a9a7a0dac700cd4a8239f51257b8e1 100644 GIT binary patch delta 229816 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�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

LAMMPS Documentation :c,h3 -22 Feb 2018 version :c,h4 +8 Mar 2018 version :c,h4 Version info: :h4 diff --git a/src/version.h b/src/version.h index 8342aa8ef1..2ca19eaed7 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "22 Feb 2018" +#define LAMMPS_VERSION "8 Mar 2018" -- GitLab From 39786b17407dd03a501f8582df53bd56a25d16f7 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 8 Mar 2018 10:57:08 -0700 Subject: [PATCH 30/46] Update Kokkos library to r2.6.00 --- lib/kokkos/CHANGELOG.md | 44 + lib/kokkos/CMakeLists.txt | 14 +- lib/kokkos/Copyright.txt | 2 +- lib/kokkos/HOW_TO_SNAPSHOT | 2 +- lib/kokkos/LICENSE | 2 +- lib/kokkos/Makefile.kokkos | 116 +- lib/kokkos/README | 213 +- lib/kokkos/algorithms/src/Kokkos_Random.hpp | 150 +- lib/kokkos/algorithms/src/Kokkos_Sort.hpp | 48 +- lib/kokkos/algorithms/unit_tests/TestCuda.cpp | 7 +- .../algorithms/unit_tests/TestOpenMP.cpp | 17 +- lib/kokkos/algorithms/unit_tests/TestROCm.cpp | 6 +- .../algorithms/unit_tests/TestRandom.hpp | 2 +- .../algorithms/unit_tests/TestSerial.cpp | 5 +- lib/kokkos/algorithms/unit_tests/TestSort.hpp | 104 +- .../algorithms/unit_tests/TestThreads.cpp | 17 +- .../algorithms/unit_tests/UnitTestMain.cpp | 8 +- lib/kokkos/benchmarks/atomic/Makefile | 2 +- .../benchmark_suite/scripts/run_tests.bash | 4 +- .../benchmarks/bytes_and_flops/bench.hpp | 2 +- .../bytes_and_flops/bench_stride.hpp | 2 +- .../bytes_and_flops/bench_unroll_stride.hpp | 2 +- .../benchmarks/bytes_and_flops/main.cpp | 2 +- lib/kokkos/benchmarks/gather/gather.hpp | 2 +- .../benchmarks/gather/gather_unroll.hpp | 2 +- lib/kokkos/benchmarks/gather/main.cpp | 2 +- .../benchmarks/policy_performance/main.cpp | 2 +- .../policy_performance/policy_perf_test.hpp | 2 +- lib/kokkos/cmake/Modules/FindHWLOC.cmake | 6 +- lib/kokkos/cmake/kokkos_build.cmake | 36 +- lib/kokkos/cmake/kokkos_options.cmake | 6 +- lib/kokkos/cmake/kokkos_settings.cmake | 87 +- lib/kokkos/cmake/tribits.cmake | 7 +- lib/kokkos/config/configure_compton_cpu.sh | 190 -- lib/kokkos/config/configure_compton_mic.sh | 186 -- lib/kokkos/config/configure_kokkos.sh | 293 -- lib/kokkos/config/configure_kokkos_bgq.sh | 88 - lib/kokkos/config/configure_kokkos_dev.sh | 216 -- lib/kokkos/config/configure_kokkos_nvidia.sh | 204 -- lib/kokkos/config/configure_shannon.sh | 190 -- ...nfigure_tpetra_kokkos_cuda_nvcc_wrapper.sh | 140 - .../kokkos-trilinos-integration-procedure.txt | 148 - .../config/kokkos_dev/config-core-all.sh | 110 - .../kokkos_dev/config-core-cuda-omp-hwloc.sh | 104 - .../config/kokkos_dev/config-core-cuda.sh | 88 - .../kokkos_dev/config-core-cxx11-omp.sh | 84 - .../config/kokkos_dev/config-core-dbg-none.sh | 78 - .../kokkos_dev/config-core-intel-cuda-omp.sh | 89 - .../kokkos_dev/config-core-intel-omp.sh | 84 - .../config/kokkos_dev/config-core-omp.sh | 77 - .../kokkos_dev/config-core-threads-hwloc.sh | 87 - lib/kokkos/config/nvcc_wrapper | 340 -- lib/kokkos/config/test_all_sandia | 106 +- .../containers/performance_tests/TestCuda.cpp | 2 +- .../performance_tests/TestDynRankView.hpp | 26 +- .../performance_tests/TestGlobal2LocalIds.hpp | 8 +- .../containers/performance_tests/TestMain.cpp | 2 +- .../performance_tests/TestOpenMP.cpp | 2 +- .../containers/performance_tests/TestROCm.cpp | 2 +- .../performance_tests/TestScatterView.hpp | 2 +- .../performance_tests/TestThreads.cpp | 2 +- .../TestUnorderedMapPerformance.hpp | 2 +- lib/kokkos/containers/src/Kokkos_Bitset.hpp | 22 +- lib/kokkos/containers/src/Kokkos_DualView.hpp | 60 +- .../containers/src/Kokkos_DynRankView.hpp | 333 +- .../containers/src/Kokkos_DynamicView.hpp | 387 ++- .../containers/src/Kokkos_ErrorReporter.hpp | 10 +- .../containers/src/Kokkos_Functional.hpp | 2 +- .../containers/src/Kokkos_ScatterView.hpp | 11 +- .../containers/src/Kokkos_StaticCrsGraph.hpp | 12 +- .../containers/src/Kokkos_UnorderedMap.hpp | 36 +- lib/kokkos/containers/src/Kokkos_Vector.hpp | 2 +- .../src/impl/Kokkos_Bitset_impl.hpp | 4 +- .../src/impl/Kokkos_Functional_impl.hpp | 2 +- .../impl/Kokkos_StaticCrsGraph_factory.hpp | 2 +- .../src/impl/Kokkos_UnorderedMap_impl.cpp | 2 +- .../src/impl/Kokkos_UnorderedMap_impl.hpp | 14 +- .../containers/unit_tests/TestBitset.hpp | 2 +- lib/kokkos/containers/unit_tests/TestCuda.cpp | 6 +- .../containers/unit_tests/TestDualView.hpp | 8 +- .../containers/unit_tests/TestDynViewAPI.hpp | 565 ++-- .../containers/unit_tests/TestDynamicView.hpp | 273 +- .../unit_tests/TestErrorReporter.hpp | 2 +- .../containers/unit_tests/TestOpenMP.cpp | 5 +- lib/kokkos/containers/unit_tests/TestROCm.cpp | 2 +- .../containers/unit_tests/TestScatterView.hpp | 4 +- .../containers/unit_tests/TestSerial.cpp | 4 +- .../unit_tests/TestStaticCrsGraph.hpp | 24 +- .../containers/unit_tests/TestThreads.cpp | 17 +- .../unit_tests/TestUnorderedMap.hpp | 2 +- .../containers/unit_tests/TestVector.hpp | 2 +- .../TestViewCtorPropEmbeddedDim.hpp | 2 +- .../containers/unit_tests/UnitTestMain.cpp | 9 +- lib/kokkos/core/perf_test/Makefile | 1 + .../core/perf_test/PerfTestBlasKernels.hpp | 10 +- lib/kokkos/core/perf_test/PerfTestDriver.hpp | 2 +- .../core/perf_test/PerfTestGramSchmidt.cpp | 8 +- lib/kokkos/core/perf_test/PerfTestHexGrad.cpp | 2 +- lib/kokkos/core/perf_test/PerfTestMDRange.hpp | 2 +- lib/kokkos/core/perf_test/PerfTestMain.cpp | 2 +- .../core/perf_test/PerfTest_Category.hpp | 2 +- .../perf_test/PerfTest_CustomReduction.cpp | 2 +- .../core/perf_test/PerfTest_ViewCopy.cpp | 445 +++ lib/kokkos/core/perf_test/test_atomic.cpp | 2 +- lib/kokkos/core/perf_test/test_mempool.cpp | 2 +- lib/kokkos/core/perf_test/test_taskdag.cpp | 2 +- .../src/Cuda/KokkosExp_Cuda_IterateTile.hpp | 2 +- .../KokkosExp_Cuda_IterateTile_Refactor.hpp | 2 +- lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp | 2 +- lib/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp | 8 +- .../core/src/Cuda/Kokkos_Cuda_Alloc.hpp | 2 +- .../core/src/Cuda/Kokkos_Cuda_Error.hpp | 2 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Impl.cpp | 29 +- .../core/src/Cuda/Kokkos_Cuda_Internal.hpp | 2 +- .../core/src/Cuda/Kokkos_Cuda_Locks.cpp | 2 +- .../core/src/Cuda/Kokkos_Cuda_Locks.hpp | 19 +- .../core/src/Cuda/Kokkos_Cuda_Parallel.hpp | 158 +- .../core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp | 35 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.cpp | 88 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp | 292 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp | 18 +- .../core/src/Cuda/Kokkos_Cuda_UniqueToken.hpp | 2 +- .../src/Cuda/Kokkos_Cuda_Vectorization.hpp | 2 +- .../Kokkos_Cuda_Version_9_8_Compatibility.hpp | 58 + lib/kokkos/core/src/Cuda/Kokkos_Cuda_View.hpp | 10 +- .../src/Cuda/Kokkos_Cuda_WorkGraphPolicy.hpp | 2 +- .../core/src/Cuda/Kokkos_Cuda_abort.hpp | 2 +- .../core/src/KokkosExp_MDRangePolicy.hpp | 98 +- lib/kokkos/core/src/Kokkos_AnonymousSpace.hpp | 127 + lib/kokkos/core/src/Kokkos_Array.hpp | 2 +- lib/kokkos/core/src/Kokkos_Atomic.hpp | 15 +- lib/kokkos/core/src/Kokkos_Complex.hpp | 4 +- lib/kokkos/core/src/Kokkos_Concepts.hpp | 2 +- lib/kokkos/core/src/Kokkos_CopyViews.hpp | 1720 +++++++++++ lib/kokkos/core/src/Kokkos_Core.hpp | 27 +- lib/kokkos/core/src/Kokkos_Core_fwd.hpp | 9 +- lib/kokkos/core/src/Kokkos_Crs.hpp | 10 +- lib/kokkos/core/src/Kokkos_Cuda.hpp | 2 +- lib/kokkos/core/src/Kokkos_CudaSpace.hpp | 2 +- lib/kokkos/core/src/Kokkos_ExecPolicy.hpp | 234 +- lib/kokkos/core/src/Kokkos_HBWSpace.hpp | 2 +- lib/kokkos/core/src/Kokkos_HostSpace.hpp | 2 +- lib/kokkos/core/src/Kokkos_Layout.hpp | 2 +- lib/kokkos/core/src/Kokkos_Macros.hpp | 15 +- lib/kokkos/core/src/Kokkos_MasterLock.hpp | 2 +- lib/kokkos/core/src/Kokkos_MemoryPool.hpp | 12 +- lib/kokkos/core/src/Kokkos_MemoryTraits.hpp | 2 +- lib/kokkos/core/src/Kokkos_NumericTraits.hpp | 2 +- lib/kokkos/core/src/Kokkos_OpenMP.hpp | 4 +- lib/kokkos/core/src/Kokkos_OpenMPTarget.hpp | 2 +- .../core/src/Kokkos_OpenMPTargetSpace.hpp | 2 +- lib/kokkos/core/src/Kokkos_Pair.hpp | 2 +- lib/kokkos/core/src/Kokkos_Parallel.hpp | 2 +- .../core/src/Kokkos_Parallel_Reduce.hpp | 237 +- .../src/Kokkos_Profiling_ProfileSection.hpp | 2 +- lib/kokkos/core/src/Kokkos_Qthreads.hpp | 2 +- lib/kokkos/core/src/Kokkos_ROCm.hpp | 12 +- lib/kokkos/core/src/Kokkos_ROCmSpace.hpp | 2 +- lib/kokkos/core/src/Kokkos_ScratchSpace.hpp | 2 +- lib/kokkos/core/src/Kokkos_Serial.hpp | 41 +- lib/kokkos/core/src/Kokkos_TaskPolicy.hpp | 2 +- lib/kokkos/core/src/Kokkos_TaskScheduler.hpp | 14 +- lib/kokkos/core/src/Kokkos_Threads.hpp | 2 +- lib/kokkos/core/src/Kokkos_Timer.hpp | 2 +- lib/kokkos/core/src/Kokkos_UniqueToken.hpp | 2 +- lib/kokkos/core/src/Kokkos_Vectorization.hpp | 2 +- lib/kokkos/core/src/Kokkos_View.hpp | 1772 +++++------ .../core/src/Kokkos_WorkGraphPolicy.hpp | 4 +- lib/kokkos/core/src/Kokkos_hwloc.hpp | 2 +- .../core/src/Makefile.generate_build_files | 23 +- .../core/src/OpenMP/Kokkos_OpenMP_Exec.cpp | 7 +- .../core/src/OpenMP/Kokkos_OpenMP_Exec.hpp | 8 +- .../src/OpenMP/Kokkos_OpenMP_Parallel.hpp | 15 +- .../core/src/OpenMP/Kokkos_OpenMP_Task.cpp | 2 +- .../core/src/OpenMP/Kokkos_OpenMP_Task.hpp | 2 +- .../core/src/OpenMP/Kokkos_OpenMP_Team.hpp | 28 +- .../OpenMP/Kokkos_OpenMP_WorkGraphPolicy.hpp | 2 +- .../OpenMPTarget/Kokkos_OpenMPTargetSpace.cpp | 2 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp | 2 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp | 28 +- .../Kokkos_OpenMPTarget_Parallel.hpp | 2 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Task.cpp | 2 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Task.hpp | 2 +- .../core/src/Qthreads/Kokkos_QthreadsExec.cpp | 2 +- .../core/src/Qthreads/Kokkos_QthreadsExec.hpp | 2 +- .../src/Qthreads/Kokkos_Qthreads_Parallel.hpp | 2 +- .../src/Qthreads/Kokkos_Qthreads_Task.cpp | 2 +- .../src/Qthreads/Kokkos_Qthreads_Task.hpp | 2 +- .../Qthreads/Kokkos_Qthreads_TaskQueue.hpp | 2 +- .../Kokkos_Qthreads_TaskQueue_impl.hpp | 2 +- .../KokkosExp_ROCm_IterateTile_Refactor.hpp | 2750 +++++++++++++++++ .../core/src/ROCm/Kokkos_ROCm_Atomic.hpp | 42 +- .../core/src/ROCm/Kokkos_ROCm_Config.hpp | 2 +- lib/kokkos/core/src/ROCm/Kokkos_ROCm_Exec.cpp | 2 +- lib/kokkos/core/src/ROCm/Kokkos_ROCm_Exec.hpp | 125 +- lib/kokkos/core/src/ROCm/Kokkos_ROCm_Impl.cpp | 10 +- .../core/src/ROCm/Kokkos_ROCm_Invoke.hpp | 2 +- lib/kokkos/core/src/ROCm/Kokkos_ROCm_Join.hpp | 2 +- .../core/src/ROCm/Kokkos_ROCm_Parallel.hpp | 129 +- .../core/src/ROCm/Kokkos_ROCm_Reduce.hpp | 2 +- .../core/src/ROCm/Kokkos_ROCm_ReduceScan.hpp | 2 +- lib/kokkos/core/src/ROCm/Kokkos_ROCm_Scan.hpp | 2 +- .../core/src/ROCm/Kokkos_ROCm_Space.cpp | 2 +- lib/kokkos/core/src/ROCm/Kokkos_ROCm_Task.cpp | 2 +- lib/kokkos/core/src/ROCm/Kokkos_ROCm_Task.hpp | 2 +- lib/kokkos/core/src/ROCm/Kokkos_ROCm_Tile.hpp | 2 +- .../src/ROCm/Kokkos_ROCm_Vectorization.hpp | 2 +- .../core/src/Threads/Kokkos_ThreadsExec.cpp | 6 +- .../core/src/Threads/Kokkos_ThreadsExec.hpp | 2 +- .../src/Threads/Kokkos_ThreadsExec_base.cpp | 2 +- .../core/src/Threads/Kokkos_ThreadsTeam.hpp | 28 +- .../src/Threads/Kokkos_Threads_Parallel.hpp | 7 +- .../Kokkos_Threads_WorkGraphPolicy.hpp | 2 +- .../src/impl/KokkosExp_Host_IterateTile.hpp | 2 +- .../core/src/impl/KokkosExp_ViewMapping.hpp | 2 +- .../core/src/impl/Kokkos_AnalyzePolicy.hpp | 2 +- .../core/src/impl/Kokkos_Atomic_Assembly.hpp | 2 +- .../Kokkos_Atomic_Compare_Exchange_Strong.hpp | 14 +- .../core/src/impl/Kokkos_Atomic_Decrement.hpp | 33 +- .../core/src/impl/Kokkos_Atomic_Exchange.hpp | 22 +- .../core/src/impl/Kokkos_Atomic_Fetch_Add.hpp | 13 +- .../core/src/impl/Kokkos_Atomic_Fetch_And.hpp | 13 +- .../core/src/impl/Kokkos_Atomic_Fetch_Or.hpp | 13 +- .../core/src/impl/Kokkos_Atomic_Fetch_Sub.hpp | 13 +- .../core/src/impl/Kokkos_Atomic_Generic.hpp | 6 +- .../core/src/impl/Kokkos_Atomic_Increment.hpp | 30 +- .../core/src/impl/Kokkos_Atomic_View.hpp | 14 +- .../core/src/impl/Kokkos_Atomic_Windows.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_BitOps.hpp | 6 +- .../core/src/impl/Kokkos_CPUDiscovery.cpp | 2 +- .../core/src/impl/Kokkos_CPUDiscovery.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_ClockTic.hpp | 2 +- .../core/src/impl/Kokkos_ConcurrentBitset.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_Core.cpp | 36 +- lib/kokkos/core/src/impl/Kokkos_Error.cpp | 2 +- lib/kokkos/core/src/impl/Kokkos_Error.hpp | 2 +- .../core/src/impl/Kokkos_ExecPolicy.cpp | 2 +- .../core/src/impl/Kokkos_FunctorAdapter.hpp | 584 +++- .../core/src/impl/Kokkos_FunctorAnalysis.hpp | 87 +- lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp | 2 +- .../core/src/impl/Kokkos_HostBarrier.cpp | 16 +- .../core/src/impl/Kokkos_HostBarrier.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_HostSpace.cpp | 2 +- .../core/src/impl/Kokkos_HostThreadTeam.cpp | 2 +- .../core/src/impl/Kokkos_HostThreadTeam.hpp | 15 +- .../core/src/impl/Kokkos_MemoryPool.cpp | 2 +- .../core/src/impl/Kokkos_Memory_Fence.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_OldMacros.hpp | 2 +- .../core/src/impl/Kokkos_PhysicalLayout.hpp | 6 +- .../src/impl/Kokkos_Profiling_DeviceInfo.hpp | 2 +- .../src/impl/Kokkos_Profiling_Interface.cpp | 46 +- .../src/impl/Kokkos_Profiling_Interface.hpp | 58 +- lib/kokkos/core/src/impl/Kokkos_Serial.cpp | 2 +- .../core/src/impl/Kokkos_Serial_Task.cpp | 2 +- .../core/src/impl/Kokkos_Serial_Task.hpp | 2 +- .../impl/Kokkos_Serial_WorkGraphPolicy.hpp | 2 +- .../core/src/impl/Kokkos_SharedAlloc.cpp | 23 +- .../core/src/impl/Kokkos_SharedAlloc.hpp | 43 +- lib/kokkos/core/src/impl/Kokkos_Spinwait.cpp | 75 +- lib/kokkos/core/src/impl/Kokkos_Spinwait.hpp | 52 +- .../core/src/impl/Kokkos_StaticAssert.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_Tags.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_TaskQueue.hpp | 19 +- .../core/src/impl/Kokkos_TaskQueue_impl.hpp | 4 +- lib/kokkos/core/src/impl/Kokkos_Timer.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_Traits.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_Utilities.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_ViewArray.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_ViewCtor.hpp | 2 +- .../core/src/impl/Kokkos_ViewMapping.hpp | 42 +- lib/kokkos/core/src/impl/Kokkos_ViewTile.hpp | 2 +- .../core/src/impl/Kokkos_Volatile_Load.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_hwloc.cpp | 2 +- lib/kokkos/core/unit_test/CMakeLists.txt | 49 + lib/kokkos/core/unit_test/Makefile | 56 +- lib/kokkos/core/unit_test/TestAggregate.hpp | 2 +- lib/kokkos/core/unit_test/TestAtomic.hpp | 2 +- .../core/unit_test/TestAtomicOperations.hpp | 2 +- lib/kokkos/core/unit_test/TestAtomicViews.hpp | 33 +- lib/kokkos/core/unit_test/TestCXX11.hpp | 2 +- .../core/unit_test/TestCXX11Deduction.hpp | 2 +- .../core/unit_test/TestCompilerMacros.hpp | 4 +- lib/kokkos/core/unit_test/TestComplex.hpp | 2 +- .../core/unit_test/TestConcurrentBitset.hpp | 2 +- lib/kokkos/core/unit_test/TestCrs.hpp | 2 +- .../unit_test/TestDefaultDeviceTypeInit.hpp | 2 +- .../core/unit_test/TestFunctorAnalysis.hpp | 2 +- lib/kokkos/core/unit_test/TestHWLOC.cpp | 2 +- lib/kokkos/core/unit_test/TestInit.hpp | 2 +- lib/kokkos/core/unit_test/TestMDRange.hpp | 502 ++- lib/kokkos/core/unit_test/TestMemoryPool.hpp | 2 +- .../core/unit_test/TestPolicyConstruction.hpp | 159 +- lib/kokkos/core/unit_test/TestRange.hpp | 2 +- lib/kokkos/core/unit_test/TestReduce.hpp | 6 +- .../unit_test/TestReduceCombinatorical.hpp | 2 +- lib/kokkos/core/unit_test/TestResize.hpp | 2 +- lib/kokkos/core/unit_test/TestScan.hpp | 2 +- lib/kokkos/core/unit_test/TestSharedAlloc.hpp | 2 +- .../core/unit_test/TestTaskScheduler.hpp | 2 +- lib/kokkos/core/unit_test/TestTeam.hpp | 47 +- lib/kokkos/core/unit_test/TestTeamVector.hpp | 9 +- .../unit_test/TestTemplateMetaFunctions.hpp | 2 +- lib/kokkos/core/unit_test/TestTile.hpp | 14 +- lib/kokkos/core/unit_test/TestUniqueToken.hpp | 2 +- lib/kokkos/core/unit_test/TestUtilities.hpp | 2 +- lib/kokkos/core/unit_test/TestViewAPI.hpp | 430 ++- .../unit_test/TestViewCtorPropEmbeddedDim.hpp | 2 +- .../core/unit_test/TestViewMapping_a.hpp | 134 +- .../core/unit_test/TestViewMapping_b.hpp | 2 +- .../unit_test/TestViewMapping_subview.hpp | 68 +- lib/kokkos/core/unit_test/TestViewOfClass.hpp | 6 +- .../core/unit_test/TestViewSpaceAssign.hpp | 2 +- lib/kokkos/core/unit_test/TestViewSubview.hpp | 218 +- lib/kokkos/core/unit_test/TestWorkGraph.hpp | 2 +- lib/kokkos/core/unit_test/UnitTestMain.cpp | 2 +- .../core/unit_test/UnitTestMainInit.cpp | 2 +- .../unit_test/UnitTest_PushFinalizeHook.cpp | 139 + .../UnitTest_PushFinalizeHook_terminate.cpp | 86 + .../cuda/TestCudaHostPinned_Category.hpp | 2 +- .../cuda/TestCudaHostPinned_SharedAlloc.cpp | 2 +- .../cuda/TestCudaHostPinned_ViewAPI.cpp | 2 +- .../cuda/TestCudaHostPinned_ViewMapping_a.cpp | 2 +- .../cuda/TestCudaHostPinned_ViewMapping_b.cpp | 2 +- ...TestCudaHostPinned_ViewMapping_subview.cpp | 2 +- .../unit_test/cuda/TestCudaUVM_Category.hpp | 2 +- .../cuda/TestCudaUVM_SharedAlloc.cpp | 2 +- .../unit_test/cuda/TestCudaUVM_ViewAPI.cpp | 2 +- .../cuda/TestCudaUVM_ViewMapping_a.cpp | 2 +- .../cuda/TestCudaUVM_ViewMapping_b.cpp | 2 +- .../cuda/TestCudaUVM_ViewMapping_subview.cpp | 2 +- .../cuda/TestCuda_AtomicOperations.cpp | 2 +- .../unit_test/cuda/TestCuda_AtomicViews.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Atomics.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Category.hpp | 2 +- .../core/unit_test/cuda/TestCuda_Complex.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Crs.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Init.cpp | 2 +- .../core/unit_test/cuda/TestCuda_InterOp.cpp | 85 + .../core/unit_test/cuda/TestCuda_MDRange.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Other.cpp | 2 +- .../unit_test/cuda/TestCuda_RangePolicy.cpp | 2 +- .../unit_test/cuda/TestCuda_Reductions.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Scan.cpp | 2 +- .../unit_test/cuda/TestCuda_SharedAlloc.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Spaces.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_a.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_b.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c01.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c02.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c03.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c04.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c05.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c06.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c07.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c08.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c09.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c10.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c11.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c12.cpp | 2 +- .../unit_test/cuda/TestCuda_SubView_c13.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Task.cpp | 2 +- .../core/unit_test/cuda/TestCuda_Team.cpp | 2 +- .../cuda/TestCuda_TeamReductionScan.cpp | 2 +- .../unit_test/cuda/TestCuda_TeamScratch.cpp | 2 +- .../unit_test/cuda/TestCuda_UniqueToken.cpp | 2 +- .../unit_test/cuda/TestCuda_ViewAPI_b.cpp | 2 +- .../unit_test/cuda/TestCuda_ViewMapping_a.cpp | 2 +- .../unit_test/cuda/TestCuda_ViewMapping_b.cpp | 2 +- .../cuda/TestCuda_ViewMapping_subview.cpp | 2 +- .../unit_test/cuda/TestCuda_ViewOfClass.cpp | 2 +- .../unit_test/cuda/TestCuda_WorkGraph.cpp | 2 +- .../default/TestDefaultDeviceType.cpp | 2 +- .../default/TestDefaultDeviceTypeResize.cpp | 2 +- .../TestDefaultDeviceType_Category.hpp | 2 +- .../default/TestDefaultDeviceType_a.cpp | 2 +- .../default/TestDefaultDeviceType_b.cpp | 2 +- .../default/TestDefaultDeviceType_c.cpp | 2 +- .../default/TestDefaultDeviceType_d.cpp | 2 +- .../core/unit_test/openmp/TestOpenMP.hpp | 2 +- .../openmp/TestOpenMP_AtomicOperations.cpp | 2 +- .../openmp/TestOpenMP_AtomicViews.cpp | 2 +- .../unit_test/openmp/TestOpenMP_Atomics.cpp | 2 +- .../unit_test/openmp/TestOpenMP_Category.hpp | 2 +- .../unit_test/openmp/TestOpenMP_Complex.cpp | 2 +- .../core/unit_test/openmp/TestOpenMP_Crs.cpp | 2 +- .../core/unit_test/openmp/TestOpenMP_Init.cpp | 2 +- .../unit_test/openmp/TestOpenMP_InterOp.cpp | 90 + .../unit_test/openmp/TestOpenMP_MDRange.cpp | 2 +- .../unit_test/openmp/TestOpenMP_Other.cpp | 2 +- .../openmp/TestOpenMP_RangePolicy.cpp | 2 +- .../openmp/TestOpenMP_Reductions.cpp | 2 +- .../core/unit_test/openmp/TestOpenMP_Scan.cpp | 2 +- .../openmp/TestOpenMP_SharedAlloc.cpp | 2 +- .../unit_test/openmp/TestOpenMP_SubView_a.cpp | 2 +- .../unit_test/openmp/TestOpenMP_SubView_b.cpp | 2 +- .../openmp/TestOpenMP_SubView_c01.cpp | 2 +- .../openmp/TestOpenMP_SubView_c02.cpp | 2 +- .../openmp/TestOpenMP_SubView_c03.cpp | 2 +- .../openmp/TestOpenMP_SubView_c04.cpp | 2 +- .../openmp/TestOpenMP_SubView_c05.cpp | 2 +- .../openmp/TestOpenMP_SubView_c06.cpp | 2 +- .../openmp/TestOpenMP_SubView_c07.cpp | 2 +- .../openmp/TestOpenMP_SubView_c08.cpp | 2 +- .../openmp/TestOpenMP_SubView_c09.cpp | 2 +- .../openmp/TestOpenMP_SubView_c10.cpp | 2 +- .../openmp/TestOpenMP_SubView_c11.cpp | 2 +- .../openmp/TestOpenMP_SubView_c12.cpp | 2 +- .../openmp/TestOpenMP_SubView_c13.cpp | 2 +- .../core/unit_test/openmp/TestOpenMP_Task.cpp | 2 +- .../core/unit_test/openmp/TestOpenMP_Team.cpp | 2 +- .../openmp/TestOpenMP_TeamReductionScan.cpp | 2 +- .../openmp/TestOpenMP_TeamScratch.cpp | 2 +- .../openmp/TestOpenMP_UniqueToken.cpp | 2 +- .../unit_test/openmp/TestOpenMP_ViewAPI_b.cpp | 2 +- .../openmp/TestOpenMP_ViewMapping_a.cpp | 2 +- .../openmp/TestOpenMP_ViewMapping_b.cpp | 2 +- .../openmp/TestOpenMP_ViewMapping_subview.cpp | 2 +- .../openmp/TestOpenMP_ViewOfClass.cpp | 2 +- .../unit_test/openmp/TestOpenMP_WorkGraph.cpp | 2 +- .../openmptarget/TestOpenMPTarget.hpp | 2 +- .../TestOpenMPTarget_AtomicOperations.cpp | 2 +- .../TestOpenMPTarget_AtomicViews.cpp | 2 +- .../openmptarget/TestOpenMPTarget_Atomics.cpp | 2 +- .../TestOpenMPTarget_Category.hpp | 2 +- .../openmptarget/TestOpenMPTarget_Complex.cpp | 2 +- .../openmptarget/TestOpenMPTarget_Init.cpp | 2 +- .../openmptarget/TestOpenMPTarget_MDRange.cpp | 2 +- .../openmptarget/TestOpenMPTarget_Other.cpp | 2 +- .../TestOpenMPTarget_RangePolicy.cpp | 2 +- .../TestOpenMPTarget_Reductions.cpp | 2 +- .../openmptarget/TestOpenMPTarget_Scan.cpp | 2 +- .../TestOpenMPTarget_SharedAlloc.cpp | 2 +- .../TestOpenMPTarget_SubView_a.cpp | 2 +- .../TestOpenMPTarget_SubView_b.cpp | 2 +- .../TestOpenMPTarget_SubView_c01.cpp | 2 +- .../TestOpenMPTarget_SubView_c02.cpp | 2 +- .../TestOpenMPTarget_SubView_c03.cpp | 2 +- .../TestOpenMPTarget_SubView_c04.cpp | 2 +- .../TestOpenMPTarget_SubView_c05.cpp | 2 +- .../TestOpenMPTarget_SubView_c06.cpp | 2 +- .../TestOpenMPTarget_SubView_c07.cpp | 2 +- .../TestOpenMPTarget_SubView_c08.cpp | 2 +- .../TestOpenMPTarget_SubView_c09.cpp | 2 +- .../TestOpenMPTarget_SubView_c10.cpp | 2 +- .../TestOpenMPTarget_SubView_c11.cpp | 2 +- .../TestOpenMPTarget_SubView_c12.cpp | 2 +- .../openmptarget/TestOpenMPTarget_Team.cpp | 2 +- .../TestOpenMPTarget_TeamReductionScan.cpp | 2 +- .../TestOpenMPTarget_TeamScratch.cpp | 2 +- .../TestOpenMPTarget_ViewAPI_b.cpp | 2 +- .../TestOpenMPTarget_ViewMapping_a.cpp | 2 +- .../TestOpenMPTarget_ViewMapping_b.cpp | 2 +- .../TestOpenMPTarget_ViewMapping_subview.cpp | 2 +- .../TestOpenMPTarget_ViewOfClass.cpp | 2 +- .../core/unit_test/qthreads/TestQthreads.hpp | 2 +- .../qthreads/TestQthreads_Atomics.cpp | 2 +- .../qthreads/TestQthreads_Category.hpp | 2 +- .../unit_test/qthreads/TestQthreads_Other.cpp | 2 +- .../qthreads/TestQthreads_Reductions.cpp | 2 +- .../qthreads/TestQthreads_SubView_a.cpp | 2 +- .../qthreads/TestQthreads_SubView_b.cpp | 2 +- .../qthreads/TestQthreads_SubView_c01.cpp | 2 +- .../qthreads/TestQthreads_SubView_c02.cpp | 2 +- .../qthreads/TestQthreads_SubView_c03.cpp | 2 +- .../qthreads/TestQthreads_SubView_c04.cpp | 2 +- .../qthreads/TestQthreads_SubView_c05.cpp | 2 +- .../qthreads/TestQthreads_SubView_c06.cpp | 2 +- .../qthreads/TestQthreads_SubView_c07.cpp | 2 +- .../qthreads/TestQthreads_SubView_c08.cpp | 2 +- .../qthreads/TestQthreads_SubView_c09.cpp | 2 +- .../qthreads/TestQthreads_SubView_c10.cpp | 2 +- .../qthreads/TestQthreads_SubView_c11.cpp | 2 +- .../qthreads/TestQthreads_SubView_c12.cpp | 2 +- .../qthreads/TestQthreads_SubView_c13.cpp | 2 +- .../unit_test/qthreads/TestQthreads_Team.cpp | 2 +- .../qthreads/TestQthreads_ViewAPI_a.cpp | 2 +- .../qthreads/TestQthreads_ViewAPI_b.cpp | 2 +- .../rocm/TestROCmHostPinned_Category.hpp | 2 +- .../rocm/TestROCmHostPinned_SharedAlloc.cpp | 2 +- .../rocm/TestROCmHostPinned_ViewAPI.cpp | 2 +- .../rocm/TestROCmHostPinned_ViewMapping_a.cpp | 2 +- .../rocm/TestROCmHostPinned_ViewMapping_b.cpp | 2 +- ...TestROCmHostPinned_ViewMapping_subview.cpp | 2 +- .../rocm/TestROCm_AtomicOperations.cpp | 2 +- .../unit_test/rocm/TestROCm_AtomicViews.cpp | 2 +- .../core/unit_test/rocm/TestROCm_Atomics.cpp | 2 +- .../core/unit_test/rocm/TestROCm_Category.hpp | 2 +- .../core/unit_test/rocm/TestROCm_Complex.cpp | 2 +- .../core/unit_test/rocm/TestROCm_Init.cpp | 2 +- .../core/unit_test/rocm/TestROCm_MDRange.cpp | 47 + .../core/unit_test/rocm/TestROCm_Other.cpp | 2 +- .../unit_test/rocm/TestROCm_RangePolicy.cpp | 2 +- .../unit_test/rocm/TestROCm_Reductions.cpp | 2 +- .../core/unit_test/rocm/TestROCm_Scan.cpp | 2 +- .../unit_test/rocm/TestROCm_SharedAlloc.cpp | 2 +- .../core/unit_test/rocm/TestROCm_Spaces.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_a.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_b.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c01.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c02.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c03.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c04.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c05.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c06.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c07.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c08.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c09.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c10.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c11.cpp | 2 +- .../unit_test/rocm/TestROCm_SubView_c12.cpp | 2 +- .../core/unit_test/rocm/TestROCm_Team.cpp | 2 +- .../rocm/TestROCm_TeamReductionScan.cpp | 2 +- .../unit_test/rocm/TestROCm_TeamScratch.cpp | 2 +- .../unit_test/rocm/TestROCm_ViewAPI_b.cpp | 2 +- .../unit_test/rocm/TestROCm_ViewMapping_a.cpp | 2 +- .../unit_test/rocm/TestROCm_ViewMapping_b.cpp | 2 +- .../rocm/TestROCm_ViewMapping_subview.cpp | 2 +- .../unit_test/rocm/TestROCm_ViewOfClass.cpp | 2 +- .../serial/TestSerial_AtomicOperations.cpp | 2 +- .../serial/TestSerial_AtomicViews.cpp | 2 +- .../unit_test/serial/TestSerial_Atomics.cpp | 2 +- .../unit_test/serial/TestSerial_Category.hpp | 2 +- .../unit_test/serial/TestSerial_Complex.cpp | 2 +- .../core/unit_test/serial/TestSerial_Crs.cpp | 2 +- .../core/unit_test/serial/TestSerial_Init.cpp | 2 +- .../unit_test/serial/TestSerial_MDRange.cpp | 2 +- .../unit_test/serial/TestSerial_Other.cpp | 2 +- .../serial/TestSerial_RangePolicy.cpp | 2 +- .../serial/TestSerial_Reductions.cpp | 2 +- .../core/unit_test/serial/TestSerial_Scan.cpp | 2 +- .../serial/TestSerial_SharedAlloc.cpp | 2 +- .../unit_test/serial/TestSerial_SubView_a.cpp | 2 +- .../unit_test/serial/TestSerial_SubView_b.cpp | 2 +- .../serial/TestSerial_SubView_c01.cpp | 2 +- .../serial/TestSerial_SubView_c02.cpp | 2 +- .../serial/TestSerial_SubView_c03.cpp | 2 +- .../serial/TestSerial_SubView_c04.cpp | 2 +- .../serial/TestSerial_SubView_c05.cpp | 2 +- .../serial/TestSerial_SubView_c06.cpp | 2 +- .../serial/TestSerial_SubView_c07.cpp | 2 +- .../serial/TestSerial_SubView_c08.cpp | 2 +- .../serial/TestSerial_SubView_c09.cpp | 2 +- .../serial/TestSerial_SubView_c10.cpp | 2 +- .../serial/TestSerial_SubView_c11.cpp | 2 +- .../serial/TestSerial_SubView_c12.cpp | 2 +- .../serial/TestSerial_SubView_c13.cpp | 2 +- .../core/unit_test/serial/TestSerial_Task.cpp | 2 +- .../core/unit_test/serial/TestSerial_Team.cpp | 2 +- .../serial/TestSerial_TeamReductionScan.cpp | 2 +- .../serial/TestSerial_TeamScratch.cpp | 2 +- .../unit_test/serial/TestSerial_ViewAPI_b.cpp | 2 +- .../serial/TestSerial_ViewMapping_a.cpp | 2 +- .../serial/TestSerial_ViewMapping_b.cpp | 2 +- .../serial/TestSerial_ViewMapping_subview.cpp | 2 +- .../serial/TestSerial_ViewOfClass.cpp | 2 +- .../unit_test/serial/TestSerial_WorkGraph.cpp | 2 +- .../core/unit_test/threads/TestThreads.hpp | 2 +- .../threads/TestThreads_AtomicOperations.cpp | 2 +- .../threads/TestThreads_AtomicViews.cpp | 2 +- .../unit_test/threads/TestThreads_Atomics.cpp | 2 +- .../threads/TestThreads_Category.hpp | 2 +- .../unit_test/threads/TestThreads_Complex.cpp | 2 +- .../unit_test/threads/TestThreads_Crs.cpp | 2 +- .../unit_test/threads/TestThreads_Init.cpp | 2 +- .../unit_test/threads/TestThreads_MDRange.cpp | 2 +- .../unit_test/threads/TestThreads_Other.cpp | 2 +- .../threads/TestThreads_RangePolicy.cpp | 2 +- .../threads/TestThreads_Reductions.cpp | 2 +- .../unit_test/threads/TestThreads_Scan.cpp | 2 +- .../threads/TestThreads_SharedAlloc.cpp | 2 +- .../threads/TestThreads_SubView_a.cpp | 2 +- .../threads/TestThreads_SubView_b.cpp | 2 +- .../threads/TestThreads_SubView_c01.cpp | 2 +- .../threads/TestThreads_SubView_c02.cpp | 2 +- .../threads/TestThreads_SubView_c03.cpp | 2 +- .../threads/TestThreads_SubView_c04.cpp | 2 +- .../threads/TestThreads_SubView_c05.cpp | 2 +- .../threads/TestThreads_SubView_c06.cpp | 2 +- .../threads/TestThreads_SubView_c07.cpp | 2 +- .../threads/TestThreads_SubView_c08.cpp | 2 +- .../threads/TestThreads_SubView_c09.cpp | 2 +- .../threads/TestThreads_SubView_c10.cpp | 2 +- .../threads/TestThreads_SubView_c11.cpp | 2 +- .../threads/TestThreads_SubView_c12.cpp | 2 +- .../threads/TestThreads_SubView_c13.cpp | 2 +- .../unit_test/threads/TestThreads_Team.cpp | 2 +- .../threads/TestThreads_TeamReductionScan.cpp | 2 +- .../threads/TestThreads_TeamScratch.cpp | 2 +- .../threads/TestThreads_ViewAPI_b.cpp | 2 +- .../threads/TestThreads_ViewMapping_a.cpp | 2 +- .../threads/TestThreads_ViewMapping_b.cpp | 2 +- .../TestThreads_ViewMapping_subview.cpp | 2 +- .../threads/TestThreads_ViewOfClass.cpp | 2 +- .../threads/TestThreads_WorkGraph.cpp | 2 +- .../query_cuda_arch.cpp | 0 .../{config => doc}/kokkos-promotion.txt | 16 +- .../example/cmake_build/cmake_example.cpp | 2 +- lib/kokkos/example/common/VectorImport.hpp | 2 +- lib/kokkos/example/common/WrapMPI.hpp | 2 +- lib/kokkos/example/feint/ElemFunctor.hpp | 14 +- lib/kokkos/example/feint/feint.hpp | 2 +- lib/kokkos/example/feint/feint_cuda.cpp | 2 +- lib/kokkos/example/feint/feint_fwd.hpp | 2 +- lib/kokkos/example/feint/feint_openmp.cpp | 2 +- lib/kokkos/example/feint/feint_rocm.cpp | 2 +- lib/kokkos/example/feint/feint_threads.cpp | 2 +- lib/kokkos/example/feint/main.cpp | 2 +- lib/kokkos/example/fenl/CGSolve.hpp | 4 +- lib/kokkos/example/fenl/fenl.cpp | 2 +- lib/kokkos/example/fenl/fenl.hpp | 2 +- lib/kokkos/example/fenl/fenl_functors.hpp | 60 +- lib/kokkos/example/fenl/fenl_impl.hpp | 8 +- lib/kokkos/example/fenl/main.cpp | 2 +- lib/kokkos/example/fixture/BoxElemFixture.hpp | 26 +- lib/kokkos/example/fixture/BoxElemPart.cpp | 2 +- lib/kokkos/example/fixture/BoxElemPart.hpp | 2 +- lib/kokkos/example/fixture/HexElement.hpp | 2 +- lib/kokkos/example/fixture/Main.cpp | 2 +- lib/kokkos/example/fixture/TestFixture.cpp | 2 +- lib/kokkos/example/fixture/TestFixture.hpp | 4 +- lib/kokkos/example/global_2_local_ids/G2L.hpp | 2 +- .../example/global_2_local_ids/G2L_Main.cpp | 2 +- lib/kokkos/example/grow_array/grow_array.hpp | 2 +- lib/kokkos/example/grow_array/main.cpp | 2 +- lib/kokkos/example/md_skeleton/force.cpp | 2 +- lib/kokkos/example/md_skeleton/main.cpp | 2 +- lib/kokkos/example/md_skeleton/neighbor.cpp | 2 +- lib/kokkos/example/md_skeleton/setup.cpp | 2 +- lib/kokkos/example/md_skeleton/system.h | 2 +- lib/kokkos/example/md_skeleton/types.h | 2 +- .../example/multi_fem/BoxMeshFixture.hpp | 2 +- .../example/multi_fem/BoxMeshPartition.cpp | 2 +- .../example/multi_fem/BoxMeshPartition.hpp | 2 +- lib/kokkos/example/multi_fem/Explicit.hpp | 2 +- .../example/multi_fem/ExplicitFunctors.hpp | 2 +- lib/kokkos/example/multi_fem/FEMesh.hpp | 2 +- lib/kokkos/example/multi_fem/HexElement.hpp | 2 +- .../multi_fem/HexExplicitFunctions.hpp | 2 +- lib/kokkos/example/multi_fem/Implicit.hpp | 2 +- .../example/multi_fem/ImplicitFunctors.hpp | 2 +- lib/kokkos/example/multi_fem/LinAlgBLAS.hpp | 2 +- lib/kokkos/example/multi_fem/Nonlinear.hpp | 2 +- .../multi_fem/NonlinearElement_Cuda.hpp | 2 +- .../example/multi_fem/NonlinearFunctors.hpp | 2 +- lib/kokkos/example/multi_fem/ParallelComm.hpp | 2 +- .../example/multi_fem/ParallelDataMap.hpp | 2 +- .../example/multi_fem/ParallelMachine.cpp | 2 +- .../example/multi_fem/ParallelMachine.hpp | 2 +- .../example/multi_fem/SparseLinearSystem.hpp | 2 +- .../multi_fem/SparseLinearSystemFill.hpp | 2 +- .../multi_fem/SparseLinearSystem_Cuda.hpp | 2 +- .../example/multi_fem/TestBoxMeshFixture.hpp | 2 +- .../multi_fem/TestBoxMeshPartition.cpp | 2 +- lib/kokkos/example/multi_fem/TestCuda.cpp | 2 +- lib/kokkos/example/multi_fem/TestHost.cpp | 2 +- .../example/multi_fem/TestHybridFEM.cpp | 2 +- .../example/query_device/query_device.cpp | 2 +- lib/kokkos/example/sort_array/main.cpp | 2 +- lib/kokkos/example/sort_array/sort_array.hpp | 2 +- .../tutorial/01_hello_world/hello_world.cpp | 2 +- .../hello_world_lambda.cpp | 2 +- .../02_simple_reduce/simple_reduce.cpp | 2 +- .../simple_reduce_lambda.cpp | 2 +- .../tutorial/03_simple_view/simple_view.cpp | 2 +- .../simple_view_lambda.cpp | 2 +- .../simple_memoryspaces.cpp | 2 +- .../05_simple_atomics/simple_atomics.cpp | 6 +- .../simple_mdrangepolicy.cpp | 2 +- .../01_data_layouts/data_layouts.cpp | 8 +- .../02_memory_traits/memory_traits.cpp | 8 +- .../Advanced_Views/03_subviews/subviews.cpp | 28 +- .../Advanced_Views/04_dualviews/dual_view.cpp | 8 +- .../05_NVIDIA_UVM/uvm_example.cpp | 8 +- .../overlapping_deepcopy.cpp | 2 +- .../01_random_numbers/random_numbers.cpp | 2 +- .../01_thread_teams/thread_teams.cpp | 2 +- .../thread_teams_lambda.cpp | 2 +- .../nested_parallel_for.cpp | 2 +- .../03_vectorization/vectorization.cpp | 12 +- .../04_team_scan/team_scan.cpp | 2 +- .../launch_bounds/launch_bounds_reduce.cpp | 2 +- lib/kokkos/generate_makefile.bash | 51 +- lib/kokkos/{config => }/master_history.txt | 3 +- lib/kokkos/{config => scripts}/snapshot.py | 0 .../testing_scripts/README | 0 .../testing_scripts/jenkins_test_driver | 0 .../testing_scripts/obj_size_opt_check | 0 .../test_kokkos_master_develop_promotion.sh | 0 .../trilinos-integration/checkin-test | 0 .../prepare_trilinos_repos.sh | 2 +- .../shepard_jenkins_run_script_pthread_intel | 2 +- .../shepard_jenkins_run_script_serial_intel | 2 +- .../white_run_jenkins_script_cuda | 2 +- .../white_run_jenkins_script_omp | 2 +- 694 files changed, 12328 insertions(+), 6812 deletions(-) delete mode 100644 lib/kokkos/config/configure_compton_cpu.sh delete mode 100644 lib/kokkos/config/configure_compton_mic.sh delete mode 100644 lib/kokkos/config/configure_kokkos.sh delete mode 100755 lib/kokkos/config/configure_kokkos_bgq.sh delete mode 100755 lib/kokkos/config/configure_kokkos_dev.sh delete mode 100644 lib/kokkos/config/configure_kokkos_nvidia.sh delete mode 100644 lib/kokkos/config/configure_shannon.sh delete mode 100755 lib/kokkos/config/configure_tpetra_kokkos_cuda_nvcc_wrapper.sh delete mode 100644 lib/kokkos/config/kokkos-trilinos-integration-procedure.txt delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-all.sh delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-cuda-omp-hwloc.sh delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-cuda.sh delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-cxx11-omp.sh delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-dbg-none.sh delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-intel-cuda-omp.sh delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-intel-omp.sh delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-omp.sh delete mode 100755 lib/kokkos/config/kokkos_dev/config-core-threads-hwloc.sh delete mode 100755 lib/kokkos/config/nvcc_wrapper create mode 100644 lib/kokkos/core/perf_test/PerfTest_ViewCopy.cpp create mode 100644 lib/kokkos/core/src/Kokkos_AnonymousSpace.hpp create mode 100644 lib/kokkos/core/src/Kokkos_CopyViews.hpp create mode 100644 lib/kokkos/core/src/ROCm/KokkosExp_ROCm_IterateTile_Refactor.hpp create mode 100644 lib/kokkos/core/unit_test/UnitTest_PushFinalizeHook.cpp create mode 100644 lib/kokkos/core/unit_test/UnitTest_PushFinalizeHook_terminate.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_InterOp.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_InterOp.cpp create mode 100644 lib/kokkos/core/unit_test/rocm/TestROCm_MDRange.cpp rename lib/kokkos/{config => doc/hardware_identification}/query_cuda_arch.cpp (100%) rename lib/kokkos/{config => doc}/kokkos-promotion.txt (86%) rename lib/kokkos/{config => }/master_history.txt (87%) rename lib/kokkos/{config => scripts}/snapshot.py (100%) rename lib/kokkos/{config => scripts}/testing_scripts/README (100%) rename lib/kokkos/{config => scripts}/testing_scripts/jenkins_test_driver (100%) rename lib/kokkos/{config => scripts}/testing_scripts/obj_size_opt_check (100%) rename lib/kokkos/{config => scripts/testing_scripts}/test_kokkos_master_develop_promotion.sh (100%) rename lib/kokkos/{config => scripts}/trilinos-integration/checkin-test (100%) rename lib/kokkos/{config => scripts}/trilinos-integration/prepare_trilinos_repos.sh (93%) rename lib/kokkos/{config => scripts}/trilinos-integration/shepard_jenkins_run_script_pthread_intel (91%) rename lib/kokkos/{config => scripts}/trilinos-integration/shepard_jenkins_run_script_serial_intel (91%) rename lib/kokkos/{config => scripts}/trilinos-integration/white_run_jenkins_script_cuda (91%) rename lib/kokkos/{config => scripts}/trilinos-integration/white_run_jenkins_script_omp (91%) diff --git a/lib/kokkos/CHANGELOG.md b/lib/kokkos/CHANGELOG.md index e3de6b048d..feb2bd547f 100644 --- a/lib/kokkos/CHANGELOG.md +++ b/lib/kokkos/CHANGELOG.md @@ -1,5 +1,49 @@ # Change Log +## [2.6.00](https://github.com/kokkos/kokkos/tree/2.6.00) (2018-03-07) +[Full Changelog](https://github.com/kokkos/kokkos/compare/2.5.00...2.6.00) + +**Part of the Kokkos C++ Performance Portability Programming EcoSystem 2.6** + +**Implemented enhancements:** + +- Support NVIDIA Volta microarchitecture [\#1466](https://github.com/kokkos/kokkos/issues/1466) +- Kokkos - Define empty functions when profiling disabled [\#1424](https://github.com/kokkos/kokkos/issues/1424) +- Don't use \_\_constant\_\_ cache for lock arrays, enable once per run update instead of once per call [\#1385](https://github.com/kokkos/kokkos/issues/1385) +- task dag enhancement. [\#1354](https://github.com/kokkos/kokkos/issues/1354) +- Cuda task team collectives and stack size [\#1353](https://github.com/kokkos/kokkos/issues/1353) +- Replace View operator acceptance of more than rank integers with 'access' function [\#1333](https://github.com/kokkos/kokkos/issues/1333) +- Interoperability: Do not shut down backend execution space runtimes upon calling finalize. [\#1305](https://github.com/kokkos/kokkos/issues/1305) +- shmem\_size for LayoutStride [\#1291](https://github.com/kokkos/kokkos/issues/1291) +- Kokkos::resize performs poorly on 1D Views [\#1270](https://github.com/kokkos/kokkos/issues/1270) +- stride\(\) is inconsistent with dimension\(\), extent\(\), etc. [\#1214](https://github.com/kokkos/kokkos/issues/1214) +- Kokkos::sort defaults to std::sort on host [\#1208](https://github.com/kokkos/kokkos/issues/1208) +- DynamicView with host size grow [\#1206](https://github.com/kokkos/kokkos/issues/1206) +- Unmanaged View with Anonymous Memory Space [\#1175](https://github.com/kokkos/kokkos/issues/1175) +- Sort subset of Kokkos::DynamicView [\#1160](https://github.com/kokkos/kokkos/issues/1160) +- MDRange policy doesn't support lambda reductions [\#1054](https://github.com/kokkos/kokkos/issues/1054) +- Add ability to set hook on Kokkos::finalize [\#714](https://github.com/kokkos/kokkos/issues/714) +- Atomics with Serial Backend - Default should be Disable? [\#549](https://github.com/kokkos/kokkos/issues/549) +- KOKKOS\_ENABLE\_DEPRECATED\_CODE [\#1359](https://github.com/kokkos/kokkos/issues/1359) + +**Fixed bugs:** + +- cuda\_internal\_maximum\_warp\_count returns 8, but I believe it should return 16 for P100 [\#1269](https://github.com/kokkos/kokkos/issues/1269) +- Cuda: level 1 scratch memory bug \(reported by Stan Moore\) [\#1434](https://github.com/kokkos/kokkos/issues/1434) +- MDRangePolicy Reduction requires value\_type typedef in Functor [\#1379](https://github.com/kokkos/kokkos/issues/1379) +- Kokkos DeepCopy between empty views fails [\#1369](https://github.com/kokkos/kokkos/issues/1369) +- Several issues with new CMake build infrastructure \(reported by Eric Phipps\) [\#1365](https://github.com/kokkos/kokkos/issues/1365) +- deep\_copy between rank-1 host/device views of differing layouts without UVM no longer works \(reported by Eric Phipps\) [\#1363](https://github.com/kokkos/kokkos/issues/1363) +- Profiling can't be disabled in CMake, and a parallel\_for is missing for tasks \(reported by Kyungjoo Kim\) [\#1349](https://github.com/kokkos/kokkos/issues/1349) +- get\_work\_partition int overflow \(reported by berryj5\) [\#1327](https://github.com/kokkos/kokkos/issues/1327) +- Kokkos::deep\_copy must fence even if the two views are the same [\#1303](https://github.com/kokkos/kokkos/issues/1303) +- CudaUVMSpace::allocate/deallocate must fence [\#1302](https://github.com/kokkos/kokkos/issues/1302) +- ViewResize on CUDA fails in Debug because of too many resources requested [\#1299](https://github.com/kokkos/kokkos/issues/1299) +- Cuda 9 and intrepid2 calls from Panzer. [\#1183](https://github.com/kokkos/kokkos/issues/1183) +- Slowdown due to tracking\_enabled\(\) in 2.04.00 \(found by Albany app\) [\#1016](https://github.com/kokkos/kokkos/issues/1016) +- Bounds checking fails with zero-span Views \(reported by Stan Moore\) [\#1411](https://github.com/kokkos/kokkos/issues/1411) + + ## [2.5.00](https://github.com/kokkos/kokkos/tree/2.5.00) (2017-12-15) [Full Changelog](https://github.com/kokkos/kokkos/compare/2.04.11...2.5.00) diff --git a/lib/kokkos/CMakeLists.txt b/lib/kokkos/CMakeLists.txt index 9c708ded4a..cd1f4ea981 100644 --- a/lib/kokkos/CMakeLists.txt +++ b/lib/kokkos/CMakeLists.txt @@ -7,7 +7,7 @@ ELSE() ENDIF() IF(NOT KOKKOS_HAS_TRILINOS) - cmake_minimum_required(VERSION 3.1 FATAL_ERROR) + cmake_minimum_required(VERSION 3.3 FATAL_ERROR) # Define Project Name if this is a standalone build IF(NOT DEFINED ${PROJECT_NAME}) @@ -37,9 +37,19 @@ IF(NOT KOKKOS_HAS_TRILINOS) COMMAND ${KOKKOS_SETTINGS} make -f ${KOKKOS_SRC_PATH}/cmake/Makefile.generate_cmake_settings CXX=${CMAKE_CXX_COMPILER} generate_build_settings WORKING_DIRECTORY "${Kokkos_BINARY_DIR}" OUTPUT_FILE ${Kokkos_BINARY_DIR}/core_src_make.out - RESULT_VARIABLE res + RESULT_VARIABLE GEN_SETTINGS_RESULT ) + if (GEN_SETTINGS_RESULT) + message(FATAL_ERROR "Kokkos settings generation failed:\n" + "${KOKKOS_SETTINGS} make -f ${KOKKOS_SRC_PATH}/cmake/Makefile.generate_cmake_settings CXX=${CMAKE_CXX_COMPILER} generate_build_settings") + endif() include(${Kokkos_BINARY_DIR}/kokkos_generated_settings.cmake) + string(REPLACE " " ";" KOKKOS_TPL_INCLUDE_DIRS "${KOKKOS_GMAKE_TPL_INCLUDE_DIRS}") + string(REPLACE " " ";" KOKKOS_TPL_LIBRARY_DIRS "${KOKKOS_GMAKE_TPL_LIBRARY_DIRS}") + string(REPLACE " " ";" KOKKOS_TPL_LIBRARY_NAMES "${KOKKOS_GMAKE_TPL_LIBRARY_NAMES}") + list(REMOVE_ITEM KOKKOS_TPL_INCLUDE_DIRS "") + list(REMOVE_ITEM KOKKOS_TPL_LIBRARY_DIRS "") + list(REMOVE_ITEM KOKKOS_TPL_LIBRARY_NAMES "") set_kokkos_srcs(KOKKOS_SRC ${KOKKOS_SRC}) #------------ NOW BUILD ------------------------------------------------------ diff --git a/lib/kokkos/Copyright.txt b/lib/kokkos/Copyright.txt index 05980758fa..50b76995af 100644 --- a/lib/kokkos/Copyright.txt +++ b/lib/kokkos/Copyright.txt @@ -34,7 +34,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/HOW_TO_SNAPSHOT b/lib/kokkos/HOW_TO_SNAPSHOT index 46bfb4167f..ad3f78efb4 100644 --- a/lib/kokkos/HOW_TO_SNAPSHOT +++ b/lib/kokkos/HOW_TO_SNAPSHOT @@ -19,7 +19,7 @@ snapshot Kokkos from github.com/kokkos to Trilinos. 3) Snapshot the current commit in the Kokkos clone into the Trilinos clone. This overwrites ${TRILINOS}/packages/kokkos with the content of ${KOKKOS}: - ${KOKKOS}/config/snapshot.py --verbose ${KOKKOS} ${TRILINOS}/packages + ${KOKKOS}/scripts/snapshot.py --verbose ${KOKKOS} ${TRILINOS}/packages 4) Verify the snapshot commit happened as expected cd ${TRILINOS}/packages/kokkos diff --git a/lib/kokkos/LICENSE b/lib/kokkos/LICENSE index 7341a699d6..c68a8a2a9f 100644 --- a/lib/kokkos/LICENSE +++ b/lib/kokkos/LICENSE @@ -36,7 +36,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos index 4315b009d5..a7bb63f190 100644 --- a/lib/kokkos/Makefile.kokkos +++ b/lib/kokkos/Makefile.kokkos @@ -9,8 +9,8 @@ KOKKOS_DEVICES ?= "OpenMP" #KOKKOS_DEVICES ?= "Pthreads" # Options: # Intel: KNC,KNL,SNB,HSW,BDW,SKX -# NVIDIA: Kepler,Kepler30,Kepler32,Kepler35,Kepler37,Maxwell,Maxwell50,Maxwell52,Maxwell53,Pascal60,Pascal61 -# ARM: ARMv80,ARMv81,ARMv8-ThunderX +# NVIDIA: Kepler,Kepler30,Kepler32,Kepler35,Kepler37,Maxwell,Maxwell50,Maxwell52,Maxwell53,Pascal60,Pascal61,Volta70,Volta72 +# ARM: ARMv80,ARMv81,ARMv8-ThunderX,ARMv8-TX2 # IBM: BGQ,Power7,Power8,Power9 # AMD-GPUS: Kaveri,Carrizo,Fiji,Vega # AMD-CPUS: AMDAVX,Ryzen,Epyc @@ -21,7 +21,7 @@ KOKKOS_DEBUG ?= "no" KOKKOS_USE_TPLS ?= "" # Options: c++11,c++1z KOKKOS_CXX_STANDARD ?= "c++11" -# Options: aggressive_vectorization,disable_profiling +# Options: aggressive_vectorization,disable_profiling,disable_deprecated_code KOKKOS_OPTIONS ?= "" # Default settings specific options. @@ -48,6 +48,7 @@ KOKKOS_INTERNAL_USE_MEMKIND := $(call kokkos_has_string,$(KOKKOS_USE_TPLS),exper KOKKOS_INTERNAL_ENABLE_COMPILER_WARNINGS := $(call kokkos_has_string,$(KOKKOS_OPTIONS),compiler_warnings) KOKKOS_INTERNAL_OPT_RANGE_AGGRESSIVE_VECTORIZATION := $(call kokkos_has_string,$(KOKKOS_OPTIONS),aggressive_vectorization) KOKKOS_INTERNAL_DISABLE_PROFILING := $(call kokkos_has_string,$(KOKKOS_OPTIONS),disable_profiling) +KOKKOS_INTERNAL_DISABLE_DEPRECATED_CODE := $(call kokkos_has_string,$(KOKKOS_OPTIONS),disable_deprecated_code) KOKKOS_INTERNAL_DISABLE_DUALVIEW_MODIFY_CHECK := $(call kokkos_has_string,$(KOKKOS_OPTIONS),disable_dualview_modify_check) KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT := $(call kokkos_has_string,$(KOKKOS_OPTIONS),enable_profile_load_print) KOKKOS_INTERNAL_CUDA_USE_LDG := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),use_ldg) @@ -93,7 +94,7 @@ KOKKOS_INTERNAL_COMPILER_INTEL := $(call kokkos_has_string,$(KOKKOS_CXX_VE KOKKOS_INTERNAL_COMPILER_PGI := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),PGI) KOKKOS_INTERNAL_COMPILER_XL := $(strip $(shell $(CXX) -qversion 2>&1 | grep XL | wc -l)) KOKKOS_INTERNAL_COMPILER_CRAY := $(strip $(shell $(CXX) -craype-verbose 2>&1 | grep "CC-" | wc -l)) -KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell export OMPI_CXX=$(OMPI_CXX); export MPICH_CXX=$(MPICH_CXX); $(CXX) --version 2>&1 | grep nvcc | wc -l)) +KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell export OMPI_CXX=$(OMPI_CXX); export MPICH_CXX=$(MPICH_CXX); $(CXX) --version 2>&1 | grep nvcc | wc -l)) KOKKOS_INTERNAL_COMPILER_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),clang) KOKKOS_INTERNAL_COMPILER_APPLE_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),apple-darwin) KOKKOS_INTERNAL_COMPILER_HCC := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),HCC) @@ -229,12 +230,16 @@ KOKKOS_INTERNAL_USE_ARCH_MAXWELL52 := $(call kokkos_has_string,$(KOKKOS_ARCH),Ma KOKKOS_INTERNAL_USE_ARCH_MAXWELL53 := $(call kokkos_has_string,$(KOKKOS_ARCH),Maxwell53) KOKKOS_INTERNAL_USE_ARCH_PASCAL61 := $(call kokkos_has_string,$(KOKKOS_ARCH),Pascal61) KOKKOS_INTERNAL_USE_ARCH_PASCAL60 := $(call kokkos_has_string,$(KOKKOS_ARCH),Pascal60) +KOKKOS_INTERNAL_USE_ARCH_VOLTA70 := $(call kokkos_has_string,$(KOKKOS_ARCH),Volta70) +KOKKOS_INTERNAL_USE_ARCH_VOLTA72 := $(call kokkos_has_string,$(KOKKOS_ARCH),Volta72) KOKKOS_INTERNAL_USE_ARCH_NVIDIA := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KEPLER30) \ + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER32) \ + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER35) \ + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER37) \ + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL61) \ + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL60) \ + + $(KOKKOS_INTERNAL_USE_ARCH_VOLTA70) \ + + $(KOKKOS_INTERNAL_USE_ARCH_VOLTA72) \ + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50) \ + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52) \ + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53)) @@ -249,6 +254,8 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_NVIDIA), 0) + $(KOKKOS_INTERNAL_USE_ARCH_KEPLER37) \ + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL61) \ + $(KOKKOS_INTERNAL_USE_ARCH_PASCAL60) \ + + $(KOKKOS_INTERNAL_USE_ARCH_VOLTA70) \ + + $(KOKKOS_INTERNAL_USE_ARCH_VOLTA72) \ + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50) \ + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52) \ + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53)) @@ -267,7 +274,8 @@ endif KOKKOS_INTERNAL_USE_ARCH_ARMV80 := $(call kokkos_has_string,$(KOKKOS_ARCH),ARMv80) KOKKOS_INTERNAL_USE_ARCH_ARMV81 := $(call kokkos_has_string,$(KOKKOS_ARCH),ARMv81) KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX := $(call kokkos_has_string,$(KOKKOS_ARCH),ARMv8-ThunderX) -KOKKOS_INTERNAL_USE_ARCH_ARM := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_ARMV80)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV81)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX) | bc)) +KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX2 := $(call kokkos_has_string,$(KOKKOS_ARCH),ARMv8-TX2) +KOKKOS_INTERNAL_USE_ARCH_ARM := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_ARMV80)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV81)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX2) | bc)) # IBM based. KOKKOS_INTERNAL_USE_ARCH_BGQ := $(call kokkos_has_string,$(KOKKOS_ARCH),BGQ) @@ -316,6 +324,9 @@ endif # Generating the list of Flags. KOKKOS_CPPFLAGS = -I./ -I$(KOKKOS_PATH)/core/src -I$(KOKKOS_PATH)/containers/src -I$(KOKKOS_PATH)/algorithms/src +KOKKOS_TPL_INCLUDE_DIRS = +KOKKOS_TPL_LIBRARY_DIRS = +KOKKOS_TPL_LIBRARY_NAMES = KOKKOS_CXXFLAGS = ifeq ($(KOKKOS_INTERNAL_ENABLE_COMPILER_WARNINGS), 1) @@ -323,7 +334,9 @@ ifeq ($(KOKKOS_INTERNAL_ENABLE_COMPILER_WARNINGS), 1) endif KOKKOS_LIBS = -ldl +KOKKOS_TPL_LIBRARY_NAMES += dl KOKKOS_LDFLAGS = -L$(shell pwd) +KOKKOS_LINK_FLAGS = KOKKOS_SRC = KOKKOS_HEADERS = @@ -437,21 +450,32 @@ ifeq ($(KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT), 1) endif ifeq ($(KOKKOS_INTERNAL_USE_HWLOC), 1) - KOKKOS_CPPFLAGS += -I$(HWLOC_PATH)/include - KOKKOS_LDFLAGS += -L$(HWLOC_PATH)/lib + ifneq ($(HWLOC_PATH),) + KOKKOS_CPPFLAGS += -I$(HWLOC_PATH)/include + KOKKOS_LDFLAGS += -L$(HWLOC_PATH)/lib + KOKKOS_TPL_INCLUDE_DIRS += $(HWLOC_PATH)/include + KOKKOS_TPL_LIBRARY_DIRS += $(HWLOC_PATH)/lib + endif KOKKOS_LIBS += -lhwloc + KOKKOS_TPL_LIBRARY_NAMES += hwloc tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_HWLOC") endif ifeq ($(KOKKOS_INTERNAL_USE_LIBRT), 1) tmp := $(call kokkos_append_header,"\#define KOKKOS_USE_LIBRT") KOKKOS_LIBS += -lrt + KOKKOS_TPL_LIBRARY_NAMES += rt endif ifeq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) - KOKKOS_CPPFLAGS += -I$(MEMKIND_PATH)/include - KOKKOS_LDFLAGS += -L$(MEMKIND_PATH)/lib + ifneq ($(MEMKIND_PATH),) + KOKKOS_CPPFLAGS += -I$(MEMKIND_PATH)/include + KOKKOS_LDFLAGS += -L$(MEMKIND_PATH)/lib + KOKKOS_TPL_INCLUDE_DIRS += $(MEMKIND_PATH)/include + KOKKOS_TPL_LIBRARY_DIRS += $(MEMKIND_PATH)/lib + endif KOKKOS_LIBS += -lmemkind -lnuma + KOKKOS_TPL_LIBRARY_NAMES += memkind numa tmp := $(call kokkos_append_header,"\#define KOKKOS_HAVE_HBWSPACE") endif @@ -459,6 +483,10 @@ ifeq ($(KOKKOS_INTERNAL_DISABLE_PROFILING), 0) tmp := $(call kokkos_append_header,"\#define KOKKOS_ENABLE_PROFILING") endif +ifeq ($(KOKKOS_INTERNAL_DISABLE_DEPRECATED_CODE), 0) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ENABLE_DEPRECATED_CODE") +endif + tmp := $(call kokkos_append_header,"/* Optimization Settings */") ifeq ($(KOKKOS_INTERNAL_OPT_RANGE_AGGRESSIVE_VECTORIZATION), 1) @@ -560,6 +588,24 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX), 1) endif endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX2), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ARMV81") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_ARMV8_THUNDERX2") + + ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) + KOKKOS_CXXFLAGS += + KOKKOS_LDFLAGS += + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) + KOKKOS_CXXFLAGS += + KOKKOS_LDFLAGS += + else + KOKKOS_CXXFLAGS += -mtune=thunderx2t99 -mcpu=thunderx2t99 + KOKKOS_LDFLAGS += -mtune=thunderx2t99 -mcpu=thunderx2t99 + endif + endif +endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_SSE42), 1) tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_SSE42") @@ -754,10 +800,11 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) KOKKOS_INTERNAL_CUDA_ARCH_FLAG=-arch - endif - ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - KOKKOS_INTERNAL_CUDA_ARCH_FLAG=--cuda-gpu-arch - KOKKOS_CXXFLAGS += -x cuda + else ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG=--cuda-gpu-arch + KOKKOS_CXXFLAGS += -x cuda + else + $(error Makefile.kokkos: CUDA is enabled but the compiler is neither NVCC nor Clang) endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER30), 1) @@ -805,6 +852,16 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_PASCAL61") KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_61 endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VOLTA70), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_VOLTA") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_VOLTA70") + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_70 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VOLTA72), 1) + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_VOLTA") + tmp := $(call kokkos_append_header,"\#define KOKKOS_ARCH_VOLTA72") + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_72 + endif ifneq ($(KOKKOS_INTERNAL_USE_ARCH_NVIDIA), 0) KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG) @@ -850,6 +907,7 @@ ifeq ($(KOKKOS_INTERNAL_USE_ROCM), 1) KOKKOS_CXXFLAGS += $(shell $(ROCM_HCC_PATH)/bin/hcc-config --cxxflags) KOKKOS_LDFLAGS += $(shell $(ROCM_HCC_PATH)/bin/hcc-config --ldflags) -lhc_am -lm + KOKKOS_TPL_LIBRARY_NAMES += hc_am m KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_ROCM_ARCH_FLAG) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/ROCm/*.cpp) @@ -880,13 +938,17 @@ KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/containers/src/impl/*.cpp) ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.hpp) - KOKKOS_CPPFLAGS += -I$(CUDA_PATH)/include - KOKKOS_LDFLAGS += -L$(CUDA_PATH)/lib64 - KOKKOS_LIBS += -lcudart -lcuda - - ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - KOKKOS_CXXFLAGS += --cuda-path=$(CUDA_PATH) + ifneq ($(CUDA_PATH),) + KOKKOS_CPPFLAGS += -I$(CUDA_PATH)/include + KOKKOS_LDFLAGS += -L$(CUDA_PATH)/lib64 + KOKKOS_TPL_INCLUDE_DIRS += $(CUDA_PATH)/include + KOKKOS_TPL_LIBRARY_DIRS += $(CUDA_PATH)/lib64 + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + KOKKOS_CXXFLAGS += --cuda-path=$(CUDA_PATH) + endif endif + KOKKOS_LIBS += -lcudart -lcuda + KOKKOS_TPL_LIBRARY_NAMES += cudart cuda endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) @@ -911,20 +973,27 @@ ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) endif KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_OPENMP_FLAG) + KOKKOS_LINK_FLAGS += $(KOKKOS_INTERNAL_OPENMP_FLAG) endif ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Threads/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Threads/*.hpp) KOKKOS_LIBS += -lpthread + KOKKOS_TPL_LIBRARY_NAMES += pthread endif ifeq ($(KOKKOS_INTERNAL_USE_QTHREADS), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Qthreads/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Qthreads/*.hpp) - KOKKOS_CPPFLAGS += -I$(QTHREADS_PATH)/include - KOKKOS_LDFLAGS += -L$(QTHREADS_PATH)/lib + ifneq ($(QTHREADS_PATH),) + KOKKOS_CPPFLAGS += -I$(QTHREADS_PATH)/include + KOKKOS_LDFLAGS += -L$(QTHREADS_PATH)/lib + KOKKOS_TPL_INCLUDE_DIRS += $(QTHREADS_PATH)/include + KOKKOS_TPL_LIBRARY_DIRS += $(QTHREADS_PATH)/lib64 + endif KOKKOS_LIBS += -lqthread + KOKKOS_TPL_LIBRARY_NAMES += qthread endif # Explicitly set the GCC Toolchain for Clang. @@ -940,11 +1009,6 @@ ifneq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_HBWSpace.cpp,$(KOKKOS_SRC)) endif -# Don't include Kokkos_Profiling_Interface.cpp if not using profiling to avoid a link warning. -ifeq ($(KOKKOS_INTERNAL_DISABLE_PROFILING), 1) - KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_Profiling_Interface.cpp,$(KOKKOS_SRC)) -endif - # Don't include Kokkos_Serial.cpp or Kokkos_Serial_Task.cpp if not using Serial # device to avoid a link warning. ifneq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) diff --git a/lib/kokkos/README b/lib/kokkos/README index d6c66634dd..31d134bf0a 100644 --- a/lib/kokkos/README +++ b/lib/kokkos/README @@ -1,87 +1,101 @@ -Kokkos implements a programming model in C++ for writing performance portable +Kokkos Core implements a programming model in C++ for writing performance portable applications targeting all major HPC platforms. For that purpose it provides abstractions for both parallel execution of code and data management. Kokkos is designed to target complex node architectures with N-level memory hierarchies and multiple types of execution resources. It currently can use OpenMP, Pthreads and CUDA as backend programming models. -Kokkos is licensed under standard 3-clause BSD terms of use. For specifics -see the LICENSE file contained in the repository or distribution. +Kokkos Core is part of the Kokkos C++ Performance Portability Programming EcoSystem, +which also provides math kernels (https://github.com/kokkos/kokkos-kernels), as well as +profiling and debugging tools (https://github.com/kokkos/kokkos-tools). -The core developers of Kokkos are Carter Edwards and Christian Trott -at the Computer Science Research Institute of the Sandia National -Laboratories. +# Learning about Kokkos -The KokkosP interface and associated tools are developed by the Application -Performance Team and Kokkos core developers at Sandia National Laboratories. +A programming guide can be found on the Wiki, the API reference is under development. -To learn more about Kokkos consider watching one of our presentations: -GTC 2015: - http://on-demand.gputechconf.com/gtc/2015/video/S5166.html - http://on-demand.gputechconf.com/gtc/2015/presentation/S5166-H-Carter-Edwards.pdf +For questions find us on Slack: https://kokkosteam.slack.com or open a github issue. -A programming guide can be found under doc/Kokkos_PG.pdf. This is an initial version -and feedback is greatly appreciated. +For non-public questions send an email to +crtrott(at)sandia.gov A separate repository with extensive tutorial material can be found under https://github.com/kokkos/kokkos-tutorials. -If you have a patch to contribute please feel free to issue a pull request against -the develop branch. For major contributions it is better to contact us first -for guidance. - -For questions please send an email to -kokkos-users@software.sandia.gov +Furthermore, the 'example/tutorial' directory provides step by step tutorial +examples which explain many of the features of Kokkos. They work with +simple Makefiles. To build with g++ and OpenMP simply type 'make' +in the 'example/tutorial' directory. This will build all examples in the +subfolders. To change the build options refer to the Programming Guide +in the compilation section. -For non-public questions send an email to -hcedwar(at)sandia.gov and crtrott(at)sandia.gov - -============================================================================ -====Requirements============================================================ -============================================================================ - -Primary tested compilers on X86 are: - GCC 4.8.4 - GCC 4.9.3 - GCC 5.1.0 - GCC 5.3.0 - GCC 6.1.0 - Intel 15.0.2 - Intel 16.0.1 - Intel 17.1.043 - Intel 17.4.196 - Intel 18.0.128 - Clang 3.5.2 - Clang 3.6.1 - Clang 3.7.1 - Clang 3.8.1 - Clang 3.9.0 - Clang 4.0.0 - Clang 4.0.0 for CUDA (CUDA Toolkit 8.0.44) - PGI 17.10 - NVCC 7.0 for CUDA (with gcc 4.8.4) - NVCC 7.5 for CUDA (with gcc 4.8.4) - NVCC 8.0.44 for CUDA (with gcc 5.3.0) - -Primary tested compilers on Power 8 are: - GCC 5.4.0 (OpenMP,Serial) - IBM XL 13.1.5 (OpenMP, Serial) (There is a workaround in place to avoid a compiler bug) - NVCC 8.0.44 for CUDA (with gcc 5.4.0) - NVCC 9.0.103 for CUDA (with gcc 6.3.0) - -Primary tested compilers on Intel KNL are: - GCC 6.2.0 - Intel 16.4.258 (with gcc 4.7.2) - Intel 17.2.174 (with gcc 4.9.3) - Intel 18.0.128 (with gcc 4.9.3) - -Other compilers working: - X86: - Cygwin 2.1.0 64bit with gcc 4.9.3 - -Known non-working combinations: - Power8: - Pthreads backend +To learn more about Kokkos consider watching one of our presentations: +* GTC 2015: + - http://on-demand.gputechconf.com/gtc/2015/video/S5166.html + - http://on-demand.gputechconf.com/gtc/2015/presentation/S5166-H-Carter-Edwards.pdf + + +# Contributing to Kokkos + +We are open and try to encourage contributions from external developers. +To do so please first open an issue describing the contribution and then issue +a pull request against the develop branch. For larger features it may be good +to get guidance from the core development team first through the github issue. + +Note that Kokkos Core is licensed under standard 3-clause BSD terms of use. +Which means contributing to Kokkos allows anyone else to use your contributions +not just for public purposes but also for closed source commercial projects. +For specifics see the LICENSE file contained in the repository or distribution. + +# Requirements + +### Primary tested compilers on X86 are: + * GCC 4.8.4 + * GCC 4.9.3 + * GCC 5.1.0 + * GCC 5.3.0 + * GCC 6.1.0 + * Intel 15.0.2 + * Intel 16.0.1 + * Intel 17.1.043 + * Intel 17.4.196 + * Intel 18.0.128 + * Clang 3.6.1 + * Clang 3.7.1 + * Clang 3.8.1 + * Clang 3.9.0 + * Clang 4.0.0 + * Clang 4.0.0 for CUDA (CUDA Toolkit 8.0.44) + * Clang 6.0.0 for CUDA (CUDA Toolkit 9.1) + * PGI 17.10 + * NVCC 7.0 for CUDA (with gcc 4.8.4) + * NVCC 7.5 for CUDA (with gcc 4.8.4) + * NVCC 8.0.44 for CUDA (with gcc 5.3.0) + * NVCC 9.1 for CUDA (with gcc 6.1.0) + +### Primary tested compilers on Power 8 are: + * GCC 5.4.0 (OpenMP,Serial) + * IBM XL 13.1.6 (OpenMP, Serial) + * NVCC 8.0.44 for CUDA (with gcc 5.4.0) + * NVCC 9.0.103 for CUDA (with gcc 6.3.0 and XL 13.1.6) + +### Primary tested compilers on Intel KNL are: + * GCC 6.2.0 + * Intel 16.4.258 (with gcc 4.7.2) + * Intel 17.2.174 (with gcc 4.9.3) + * Intel 18.0.128 (with gcc 4.9.3) + +### Primary tested compilers on ARM + * GCC 6.1.0 + +### Other compilers working: + * X86: + - Cygwin 2.1.0 64bit with gcc 4.9.3 + +### Known non-working combinations: + * Power8: + - Pthreads backend + * ARM + - Pthreads backend Primary tested compiler are passing in release mode @@ -97,20 +111,7 @@ NVCC: -Wall -Wshadow -pedantic -Werror -Wsign-compare -Wtype-limits -Wuninitiali Other compilers are tested occasionally, in particular when pushing from develop to master branch, without -Werror and only for a select set of backends. -============================================================================ -====Getting started========================================================= -============================================================================ - -In the 'example/tutorial' directory you will find step by step tutorial -examples which explain many of the features of Kokkos. They work with -simple Makefiles. To build with g++ and OpenMP simply type 'make' -in the 'example/tutorial' directory. This will build all examples in the -subfolders. To change the build options refer to the Programming Guide -in the compilation section. - -============================================================================ -====Running Unit Tests====================================================== -============================================================================ +# Running Unit Tests To run the unit tests create a build directory and run the following commands @@ -121,30 +122,35 @@ make test Run KOKKOS_PATH/generate_makefile.bash --help for more detailed options such as changing the device type for which to build. -============================================================================ -====Install the library===================================================== -============================================================================ +# Installing the library To install Kokkos as a library create a build directory and run the following KOKKOS_PATH/generate_makefile.bash --prefix=INSTALL_PATH -make lib +make kokkoslib make install KOKKOS_PATH/generate_makefile.bash --help for more detailed options such as changing the device type for which to build. -============================================================================ -====CMakeFiles============================================================== -============================================================================ +Note that in many cases it is preferable to build Kokkos inline with an +application. The main reason is that you may otherwise need many different +configurations of Kokkos installed depending on the required compile time +features an application needs. For example there is only one default +execution space, which means you need different installations to have OpenMP +or Pthreads as the default space. Also for the CUDA backend there are certain +choices, such as allowing relocatable device code, which must be made at +installation time. Building Kokkos inline uses largely the same process +as compiling an application against an installed Kokkos library. See for +example benchmarks/bytes_and_flops/Makefile which can be used with an installed +library and for an inline build. -The CMake files contained in this repository require Tribits and are used -for integration with Trilinos. They do not currently support a standalone -CMake build. +### CMake -=========================================================================== -====Kokkos and CUDA UVM==================================================== -=========================================================================== +Kokkos supports being build as part of a CMake applications. An example can +be found in example/cmake_build. + +# Kokkos and CUDA UVM Kokkos does support UVM as a specific memory space called CudaUVMSpace. Allocations made with that space are accessible from host and device. @@ -154,25 +160,16 @@ In either case UVM comes with a number of restrictions: running. This will lead to segfaults. To avoid that you either need to call Kokkos::Cuda::fence() (or just Kokkos::fence()), after kernels, or you can set the environment variable CUDA_LAUNCH_BLOCKING=1. -Furthermore in multi socket multi GPU machines, UVM defaults to using -zero copy allocations for technical reasons related to using multiple +Furthermore in multi socket multi GPU machines without NVLINK, UVM defaults +to using zero copy allocations for technical reasons related to using multiple GPUs from the same process. If an executable doesn't do that (e.g. each MPI rank of an application uses a single GPU [can be the same GPU for multiple MPI ranks]) you can set CUDA_MANAGED_FORCE_DEVICE_ALLOC=1. This will enforce proper UVM allocations, but can lead to errors if more than a single GPU is used by a single process. -=========================================================================== -====Contributing=========================================================== -=========================================================================== - -Contributions to Kokkos are welcome. In order to do so, please open an issue -where a feature request or bug can be discussed. Then issue a pull request -with your contribution. Pull requests must be issued against the develop branch. -=========================================================================== -====Citing Kokkos========================================================== -=========================================================================== +# Citing Kokkos If you publish work which mentions Kokkos, please cite the following paper: diff --git a/lib/kokkos/algorithms/src/Kokkos_Random.hpp b/lib/kokkos/algorithms/src/Kokkos_Random.hpp index 3db9a145d7..1c659e44a4 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Random.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Random.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -1530,7 +1530,7 @@ struct fill_random_functor_range{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) + if(idx(a.extent(0))) a(idx) = Rand::draw(gen,range); } rand_pool.free_state(gen); @@ -1555,8 +1555,8 @@ struct fill_random_functor_range{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) a(idx,k) = Rand::draw(gen,range); } } @@ -1583,9 +1583,9 @@ struct fill_random_functor_range{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) a(idx,k,l) = Rand::draw(gen,range); } } @@ -1611,10 +1611,10 @@ struct fill_random_functor_range{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) a(idx,k,l,m) = Rand::draw(gen,range); } } @@ -1640,11 +1640,11 @@ struct fill_random_functor_range{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) - for(IndexType n=0;n(a.dimension_4());n++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) + for(IndexType n=0;n(a.extent(4));n++) a(idx,k,l,m,n) = Rand::draw(gen,range); } } @@ -1670,12 +1670,12 @@ struct fill_random_functor_range{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) - for(IndexType n=0;n(a.dimension_4());n++) - for(IndexType o=0;o(a.dimension_5());o++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) + for(IndexType n=0;n(a.extent(4));n++) + for(IndexType o=0;o(a.extent(5));o++) a(idx,k,l,m,n,o) = Rand::draw(gen,range); } } @@ -1701,13 +1701,13 @@ struct fill_random_functor_range{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) - for(IndexType n=0;n(a.dimension_4());n++) - for(IndexType o=0;o(a.dimension_5());o++) - for(IndexType p=0;p(a.dimension_6());p++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) + for(IndexType n=0;n(a.extent(4));n++) + for(IndexType o=0;o(a.extent(5));o++) + for(IndexType p=0;p(a.extent(6));p++) a(idx,k,l,m,n,o,p) = Rand::draw(gen,range); } } @@ -1733,14 +1733,14 @@ struct fill_random_functor_range{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) - for(IndexType n=0;n(a.dimension_4());n++) - for(IndexType o=0;o(a.dimension_5());o++) - for(IndexType p=0;p(a.dimension_6());p++) - for(IndexType q=0;q(a.dimension_7());q++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) + for(IndexType n=0;n(a.extent(4));n++) + for(IndexType o=0;o(a.extent(5));o++) + for(IndexType p=0;p(a.extent(6));p++) + for(IndexType q=0;q(a.extent(7));q++) a(idx,k,l,m,n,o,p,q) = Rand::draw(gen,range); } } @@ -1765,7 +1765,7 @@ struct fill_random_functor_begin_end{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) + if(idx(a.extent(0))) a(idx) = Rand::draw(gen,begin,end); } rand_pool.free_state(gen); @@ -1790,8 +1790,8 @@ struct fill_random_functor_begin_end{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) a(idx,k) = Rand::draw(gen,begin,end); } } @@ -1818,9 +1818,9 @@ struct fill_random_functor_begin_end{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) a(idx,k,l) = Rand::draw(gen,begin,end); } } @@ -1846,10 +1846,10 @@ struct fill_random_functor_begin_end{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) a(idx,k,l,m) = Rand::draw(gen,begin,end); } } @@ -1875,11 +1875,11 @@ struct fill_random_functor_begin_end{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())){ - for(IndexType l=0;l(a.dimension_1());l++) - for(IndexType m=0;m(a.dimension_2());m++) - for(IndexType n=0;n(a.dimension_3());n++) - for(IndexType o=0;o(a.dimension_4());o++) + if(idx(a.extent(0))){ + for(IndexType l=0;l(a.extent(1));l++) + for(IndexType m=0;m(a.extent(2));m++) + for(IndexType n=0;n(a.extent(3));n++) + for(IndexType o=0;o(a.extent(4));o++) a(idx,l,m,n,o) = Rand::draw(gen,begin,end); } } @@ -1905,12 +1905,12 @@ struct fill_random_functor_begin_end{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) - for(IndexType n=0;n(a.dimension_4());n++) - for(IndexType o=0;o(a.dimension_5());o++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) + for(IndexType n=0;n(a.extent(4));n++) + for(IndexType o=0;o(a.extent(5));o++) a(idx,k,l,m,n,o) = Rand::draw(gen,begin,end); } } @@ -1937,13 +1937,13 @@ struct fill_random_functor_begin_end{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) - for(IndexType n=0;n(a.dimension_4());n++) - for(IndexType o=0;o(a.dimension_5());o++) - for(IndexType p=0;p(a.dimension_6());p++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) + for(IndexType n=0;n(a.extent(4));n++) + for(IndexType o=0;o(a.extent(5));o++) + for(IndexType p=0;p(a.extent(6));p++) a(idx,k,l,m,n,o,p) = Rand::draw(gen,begin,end); } } @@ -1969,14 +1969,14 @@ struct fill_random_functor_begin_end{ typename RandomPool::generator_type gen = rand_pool.get_state(); for(IndexType j=0;j(a.dimension_0())) { - for(IndexType k=0;k(a.dimension_1());k++) - for(IndexType l=0;l(a.dimension_2());l++) - for(IndexType m=0;m(a.dimension_3());m++) - for(IndexType n=0;n(a.dimension_4());n++) - for(IndexType o=0;o(a.dimension_5());o++) - for(IndexType p=0;p(a.dimension_6());p++) - for(IndexType q=0;q(a.dimension_7());q++) + if(idx(a.extent(0))) { + for(IndexType k=0;k(a.extent(1));k++) + for(IndexType l=0;l(a.extent(2));l++) + for(IndexType m=0;m(a.extent(3));m++) + for(IndexType n=0;n(a.extent(4));n++) + for(IndexType o=0;o(a.extent(5));o++) + for(IndexType p=0;p(a.extent(6));p++) + for(IndexType q=0;q(a.extent(7));q++) a(idx,k,l,m,n,o,p,q) = Rand::draw(gen,begin,end); } } @@ -1988,14 +1988,14 @@ struct fill_random_functor_begin_end{ template void fill_random(ViewType a, RandomPool g, typename ViewType::const_value_type range) { - int64_t LDA = a.dimension_0(); + int64_t LDA = a.extent(0); if(LDA>0) parallel_for((LDA+127)/128,Impl::fill_random_functor_range(a,g,range)); } template void fill_random(ViewType a, RandomPool g, typename ViewType::const_value_type begin,typename ViewType::const_value_type end ) { - int64_t LDA = a.dimension_0(); + int64_t LDA = a.extent(0); if(LDA>0) parallel_for((LDA+127)/128,Impl::fill_random_functor_begin_end(a,g,begin,end)); } diff --git a/lib/kokkos/algorithms/src/Kokkos_Sort.hpp b/lib/kokkos/algorithms/src/Kokkos_Sort.hpp index 237de751fe..888476045b 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Sort.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Sort.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -120,7 +120,6 @@ public: KOKKOS_INLINE_FUNCTION void operator() (const int& i) const { - // printf("copy: dst(%i) src(%i)\n",i+dst_offset,i); copy_op::copy(dst_values,i+dst_offset,src_values,i); } }; @@ -151,20 +150,22 @@ public: DstViewType dst_values ; perm_view_type sort_order ; src_view_type src_values ; + int src_offset ; copy_permute_functor( DstViewType const & dst_values_ , PermuteViewType const & sort_order_ , SrcViewType const & src_values_ + , int const & src_offset_ ) : dst_values( dst_values_ ) , sort_order( sort_order_ ) , src_values( src_values_ ) + , src_offset( src_offset_ ) {} KOKKOS_INLINE_FUNCTION void operator() (const int& i) const { - // printf("copy_permute: dst(%i) src(%i)\n",i,sort_order(i)); - copy_op::copy(dst_values,i,src_values,sort_order(i)); + copy_op::copy(dst_values,i,src_values,src_offset+sort_order(i)); } }; @@ -259,19 +260,21 @@ public: // Create the permutation vector, the bin_offset array and the bin_count array. Can be called again if keys changed void create_permute_vector() { const size_t len = range_end - range_begin ; - Kokkos::parallel_for (Kokkos::RangePolicy (0,len),*this); - Kokkos::parallel_scan(Kokkos::RangePolicy (0,bin_op.max_bins()) ,*this); + Kokkos::parallel_for ("Kokkos::Sort::BinCount",Kokkos::RangePolicy (0,len),*this); + Kokkos::parallel_scan("Kokkos::Sort::BinOffset",Kokkos::RangePolicy (0,bin_op.max_bins()) ,*this); Kokkos::deep_copy(bin_count_atomic,0); - Kokkos::parallel_for (Kokkos::RangePolicy (0,len),*this); + Kokkos::parallel_for ("Kokkos::Sort::BinBinning",Kokkos::RangePolicy (0,len),*this); if(sort_within_bins) - Kokkos::parallel_for (Kokkos::RangePolicy(0,bin_op.max_bins()) ,*this); + Kokkos::parallel_for ("Kokkos::Sort::BinSort",Kokkos::RangePolicy(0,bin_op.max_bins()) ,*this); } - // Sort a view with respect ot the first dimension using the permutation array + // Sort a subset of a view with respect to the first dimension using the permutation array template - void sort( ValuesViewType const & values) + void sort( ValuesViewType const & values + , int values_range_begin + , int values_range_end) const { typedef Kokkos::View< typename ValuesViewType::data_type, @@ -280,6 +283,10 @@ public: scratch_view_type ; const size_t len = range_end - range_begin ; + const size_t values_len = values_range_end - values_range_begin ; + if (len != values_len) { + Kokkos::abort("BinSort::sort: values range length != permutation vector length"); + } scratch_view_type sorted_values("Scratch", @@ -297,19 +304,25 @@ public: , offset_type /* PermuteViewType */ , ValuesViewType /* SrcViewType */ > - functor( sorted_values , sort_order , values ); + functor( sorted_values , sort_order , values, values_range_begin - range_begin ); - parallel_for( Kokkos::RangePolicy(0,len),functor); + parallel_for("Kokkos::Sort::CopyPermute", Kokkos::RangePolicy(0,len),functor); } { copy_functor< ValuesViewType , scratch_view_type > functor( values , range_begin , sorted_values ); - parallel_for( Kokkos::RangePolicy(0,len),functor); + parallel_for("Kokkos::Sort::Copy", Kokkos::RangePolicy(0,len),functor); } } + template + void sort( ValuesViewType const & values ) const + { + this->sort( values, 0, /*values.extent(0)*/ range_end - range_begin ); + } + // Get the permutation vector KOKKOS_INLINE_FUNCTION offset_type get_permute_vector() const { return sort_order;} @@ -327,7 +340,7 @@ public: KOKKOS_INLINE_FUNCTION void operator() (const bin_count_tag& tag, const int& i) const { const int j = range_begin + i ; - bin_count_atomic(bin_op.bin(keys,j))++; + bin_count_atomic(bin_op.bin(keys, j))++; } KOKKOS_INLINE_FUNCTION @@ -512,7 +525,7 @@ void sort( ViewType const & view , bool const always_use_kokkos_sort = false) Kokkos::Experimental::MinMaxScalar result; Kokkos::Experimental::MinMax reducer(result); - parallel_reduce(Kokkos::RangePolicy(0,view.extent(0)), + parallel_reduce("Kokkos::Sort::FindExtent",Kokkos::RangePolicy(0,view.extent(0)), Impl::min_max_functor(view),reducer); if(result.min_val == result.max_val) return; BinSort bin_sort(view,CompType(view.extent(0)/2,result.min_val,result.max_val),true); @@ -532,7 +545,7 @@ void sort( ViewType view Kokkos::Experimental::MinMaxScalar result; Kokkos::Experimental::MinMax reducer(result); - parallel_reduce( range_policy( begin , end ) + parallel_reduce("Kokkos::Sort::FindExtent", range_policy( begin , end ) , Impl::min_max_functor(view),reducer ); if(result.min_val == result.max_val) return; @@ -541,8 +554,9 @@ void sort( ViewType view bin_sort(view,begin,end,CompType((end-begin)/2,result.min_val,result.max_val),true); bin_sort.create_permute_vector(); - bin_sort.sort(view); + bin_sort.sort(view,begin,end); } + } #endif diff --git a/lib/kokkos/algorithms/unit_tests/TestCuda.cpp b/lib/kokkos/algorithms/unit_tests/TestCuda.cpp index 710eeb8ada..86fdccd0e7 100644 --- a/lib/kokkos/algorithms/unit_tests/TestCuda.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestCuda.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -61,14 +61,9 @@ class cuda : public ::testing::Test { protected: static void SetUpTestCase() { - std::cout << std::setprecision(5) << std::scientific; - Kokkos::HostSpace::execution_space::initialize(); - Kokkos::Cuda::initialize( Kokkos::Cuda::SelectDevice(0) ); } static void TearDownTestCase() { - Kokkos::Cuda::finalize(); - Kokkos::HostSpace::execution_space::finalize(); } }; diff --git a/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp b/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp index c2c118ce1a..c4ddde7b7f 100644 --- a/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -60,25 +60,10 @@ protected: static void SetUpTestCase() { std::cout << std::setprecision(5) << std::scientific; - - int threads_count = 0; - #pragma omp parallel - { - #pragma omp atomic - ++threads_count; - } - - if (threads_count > 3) { - threads_count /= 2; - } - - Kokkos::OpenMP::initialize( threads_count ); - Kokkos::OpenMP::print_configuration( std::cout ); } static void TearDownTestCase() { - Kokkos::OpenMP::finalize(); } }; diff --git a/lib/kokkos/algorithms/unit_tests/TestROCm.cpp b/lib/kokkos/algorithms/unit_tests/TestROCm.cpp index 720b377ed2..15179509bb 100644 --- a/lib/kokkos/algorithms/unit_tests/TestROCm.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestROCm.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -62,13 +62,9 @@ protected: static void SetUpTestCase() { std::cout << std::setprecision(5) << std::scientific; - Kokkos::HostSpace::execution_space::initialize(); - Kokkos::Experimental::ROCm::initialize( Kokkos::Experimental::ROCm::SelectDevice(0) ); } static void TearDownTestCase() { - Kokkos::Experimental::ROCm::finalize(); - Kokkos::HostSpace::execution_space::finalize(); } }; diff --git a/lib/kokkos/algorithms/unit_tests/TestRandom.hpp b/lib/kokkos/algorithms/unit_tests/TestRandom.hpp index 2771f1793d..73bd416f2a 100644 --- a/lib/kokkos/algorithms/unit_tests/TestRandom.hpp +++ b/lib/kokkos/algorithms/unit_tests/TestRandom.hpp @@ -34,7 +34,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/algorithms/unit_tests/TestSerial.cpp b/lib/kokkos/algorithms/unit_tests/TestSerial.cpp index a1df93e07b..9cf998f773 100644 --- a/lib/kokkos/algorithms/unit_tests/TestSerial.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestSerial.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -62,13 +62,10 @@ class serial : public ::testing::Test { protected: static void SetUpTestCase() { - std::cout << std::setprecision (5) << std::scientific; - Kokkos::Serial::initialize (); } static void TearDownTestCase () { - Kokkos::Serial::finalize (); } }; diff --git a/lib/kokkos/algorithms/unit_tests/TestSort.hpp b/lib/kokkos/algorithms/unit_tests/TestSort.hpp index 2cb0b89712..e0c646c199 100644 --- a/lib/kokkos/algorithms/unit_tests/TestSort.hpp +++ b/lib/kokkos/algorithms/unit_tests/TestSort.hpp @@ -34,7 +34,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -171,10 +171,10 @@ void test_3D_sort(unsigned int n) { double sum_after = 0.0; unsigned int sort_fails = 0; - Kokkos::parallel_reduce(keys.dimension_0(),sum3D(keys),sum_before); + Kokkos::parallel_reduce(keys.extent(0),sum3D(keys),sum_before); int bin_1d = 1; - while( bin_1d*bin_1d*bin_1d*4< (int) keys.dimension_0() ) bin_1d*=2; + while( bin_1d*bin_1d*bin_1d*4< (int) keys.extent(0) ) bin_1d*=2; int bin_max[3] = {bin_1d,bin_1d,bin_1d}; typename KeyViewType::value_type min[3] = {0,0,0}; typename KeyViewType::value_type max[3] = {100,100,100}; @@ -186,8 +186,8 @@ void test_3D_sort(unsigned int n) { Sorter.create_permute_vector(); Sorter.template sort< KeyViewType >(keys); - Kokkos::parallel_reduce(keys.dimension_0(),sum3D(keys),sum_after); - Kokkos::parallel_reduce(keys.dimension_0()-1,bin3d_is_sorted_struct(keys,bin_1d,min[0],max[0]),sort_fails); + Kokkos::parallel_reduce(keys.extent(0),sum3D(keys),sum_after); + Kokkos::parallel_reduce(keys.extent(0)-1,bin3d_is_sorted_struct(keys,bin_1d,min[0],max[0]),sort_fails); double ratio = sum_before/sum_after; double epsilon = 1e-10; @@ -205,24 +205,13 @@ void test_3D_sort(unsigned int n) { template void test_dynamic_view_sort(unsigned int n ) { - typedef typename ExecutionSpace::memory_space memory_space ; typedef Kokkos::Experimental::DynamicView KeyDynamicViewType; typedef Kokkos::View KeyViewType; const size_t upper_bound = 2 * n ; + const size_t min_chunk_size = 1024; - const size_t total_alloc_size = n * sizeof(KeyType) * 1.2 ; - const size_t superblock_size = std::min(total_alloc_size, size_t(1000000)); - - typename KeyDynamicViewType::memory_pool - pool( memory_space() - , n * sizeof(KeyType) * 1.2 - , 500 /* min block size in bytes */ - , 30000 /* max block size in bytes */ - , superblock_size - ); - - KeyDynamicViewType keys("Keys",pool,upper_bound); + KeyDynamicViewType keys("Keys", min_chunk_size, upper_bound); keys.resize_serial(n); @@ -230,13 +219,15 @@ void test_dynamic_view_sort(unsigned int n ) // Test sorting array with all numbers equal Kokkos::deep_copy(keys_view,KeyType(1)); - Kokkos::Experimental::deep_copy(keys,keys_view); + Kokkos::deep_copy(keys,keys_view); Kokkos::sort(keys, 0 /* begin */ , n /* end */ ); Kokkos::Random_XorShift64_Pool g(1931); Kokkos::fill_random(keys_view,g,Kokkos::Random_XorShift64_Pool::generator_type::MAX_URAND); - Kokkos::Experimental::deep_copy(keys,keys_view); + ExecutionSpace::fence(); + Kokkos::deep_copy(keys,keys_view); + //ExecutionSpace::fence(); double sum_before = 0.0; double sum_after = 0.0; @@ -246,7 +237,9 @@ void test_dynamic_view_sort(unsigned int n ) Kokkos::sort(keys, 0 /* begin */ , n /* end */ ); - Kokkos::Experimental::deep_copy( keys_view , keys ); + ExecutionSpace::fence(); // Need this fence to prevent BusError with Cuda + Kokkos::deep_copy( keys_view , keys ); + //ExecutionSpace::fence(); Kokkos::parallel_reduce(n,sum(keys_view),sum_after); Kokkos::parallel_reduce(n-1,is_sorted_struct(keys_view),sort_fails); @@ -269,6 +262,74 @@ void test_dynamic_view_sort(unsigned int n ) //---------------------------------------------------------------------------- +template +void test_issue_1160() +{ + Kokkos::View element_("element", 10); + Kokkos::View x_("x", 10); + Kokkos::View v_("y", 10); + + auto h_element = Kokkos::create_mirror_view(element_); + auto h_x = Kokkos::create_mirror_view(x_); + auto h_v = Kokkos::create_mirror_view(v_); + + h_element(0) = 9; + h_element(1) = 8; + h_element(2) = 7; + h_element(3) = 6; + h_element(4) = 5; + h_element(5) = 4; + h_element(6) = 3; + h_element(7) = 2; + h_element(8) = 1; + h_element(9) = 0; + + for (int i = 0; i < 10; ++i) { + h_v.access(i, 0) = h_x.access(i, 0) = double(h_element(i)); + } + Kokkos::deep_copy(element_, h_element); + Kokkos::deep_copy(x_, h_x); + Kokkos::deep_copy(v_, h_v); + + typedef decltype(element_) KeyViewType; + typedef Kokkos::BinOp1D< KeyViewType > BinOp; + + int begin = 3; + int end = 8; + auto max = h_element(begin); + auto min = h_element(end - 1); + BinOp binner(end - begin, min, max); + + Kokkos::BinSort Sorter(element_,begin,end,binner,false); + Sorter.create_permute_vector(); + Sorter.sort(element_,begin,end); + + Sorter.sort(x_,begin,end); + Sorter.sort(v_,begin,end); + + Kokkos::deep_copy(h_element, element_); + Kokkos::deep_copy(h_x, x_); + Kokkos::deep_copy(h_v, v_); + + ASSERT_EQ(h_element(0), 9); + ASSERT_EQ(h_element(1), 8); + ASSERT_EQ(h_element(2), 7); + ASSERT_EQ(h_element(3), 2); + ASSERT_EQ(h_element(4), 3); + ASSERT_EQ(h_element(5), 4); + ASSERT_EQ(h_element(6), 5); + ASSERT_EQ(h_element(7), 6); + ASSERT_EQ(h_element(8), 1); + ASSERT_EQ(h_element(9), 0); + + for (int i = 0; i < 10; ++i) { + ASSERT_EQ(h_element(i), int(h_x.access(i, 0))); + ASSERT_EQ(h_element(i), int(h_v.access(i, 0))); + } +} + +//---------------------------------------------------------------------------- + template void test_sort(unsigned int N) { @@ -278,6 +339,7 @@ void test_sort(unsigned int N) test_3D_sort(N); test_dynamic_view_sort(N*N); #endif + test_issue_1160(); } } diff --git a/lib/kokkos/algorithms/unit_tests/TestThreads.cpp b/lib/kokkos/algorithms/unit_tests/TestThreads.cpp index 08749779ff..99cdb7da92 100644 --- a/lib/kokkos/algorithms/unit_tests/TestThreads.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestThreads.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -63,25 +63,10 @@ protected: static void SetUpTestCase() { std::cout << std::setprecision(5) << std::scientific; - - unsigned num_threads = 4; - - if (Kokkos::hwloc::available()) { - num_threads = Kokkos::hwloc::get_available_numa_count() - * Kokkos::hwloc::get_available_cores_per_numa() - // * Kokkos::hwloc::get_available_threads_per_core() - ; - - } - - std::cout << "Threads: " << num_threads << std::endl; - - Kokkos::Threads::initialize( num_threads ); } static void TearDownTestCase() { - Kokkos::Threads::finalize(); } }; diff --git a/lib/kokkos/algorithms/unit_tests/UnitTestMain.cpp b/lib/kokkos/algorithms/unit_tests/UnitTestMain.cpp index 9e75b580bc..8feb08332f 100644 --- a/lib/kokkos/algorithms/unit_tests/UnitTestMain.cpp +++ b/lib/kokkos/algorithms/unit_tests/UnitTestMain.cpp @@ -35,16 +35,20 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER */ #include +#include int main(int argc, char *argv[]) { + Kokkos::initialize(argc,argv); ::testing::InitGoogleTest(&argc,argv); - return RUN_ALL_TESTS(); + int result = RUN_ALL_TESTS(); + Kokkos::finalize(); + return result; } diff --git a/lib/kokkos/benchmarks/atomic/Makefile b/lib/kokkos/benchmarks/atomic/Makefile index 41875ee5e4..64b43917de 100644 --- a/lib/kokkos/benchmarks/atomic/Makefile +++ b/lib/kokkos/benchmarks/atomic/Makefile @@ -10,7 +10,7 @@ default: build ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) -CXX = ${KOKKOS_PATH}/config/nvcc_wrapper +CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper EXE = ${EXE_NAME}.cuda KOKKOS_CUDA_OPTIONS = "enable_lambda" else diff --git a/lib/kokkos/benchmarks/benchmark_suite/scripts/run_tests.bash b/lib/kokkos/benchmarks/benchmark_suite/scripts/run_tests.bash index 63aaca9e40..9dded535e8 100755 --- a/lib/kokkos/benchmarks/benchmark_suite/scripts/run_tests.bash +++ b/lib/kokkos/benchmarks/benchmark_suite/scripts/run_tests.bash @@ -3,7 +3,7 @@ # BytesAndFlops cd build/bytes_and_flops -USE_CUDA=`grep "_CUDA 1" KokkosCore_config.h | wc -l` +USE_CUDA=`grep "_CUDA" KokkosCore_config.h | wc -l` if [[ ${USE_CUDA} > 0 ]]; then BAF_EXE=bytes_and_flops.cuda @@ -41,4 +41,4 @@ cd ../.. echo "MiniFE: ${FE_PERF_1} ${FE_PERF_2}" PERF_RESULT=`echo "${BAF_PERF_1} ${BAF_PERF_2} ${MD_PERF_1} ${MD_PERF_2} ${FE_PERF_1} ${FE_PERF_2}" | awk '{print ($1+$2+$3+$4+$5+$6)/6}'` -echo "Total Result: " ${PERF_RESULT} \ No newline at end of file +echo "Total Result: " ${PERF_RESULT} diff --git a/lib/kokkos/benchmarks/bytes_and_flops/bench.hpp b/lib/kokkos/benchmarks/bytes_and_flops/bench.hpp index e3fe42a652..59b4d50c44 100644 --- a/lib/kokkos/benchmarks/bytes_and_flops/bench.hpp +++ b/lib/kokkos/benchmarks/bytes_and_flops/bench.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/benchmarks/bytes_and_flops/bench_stride.hpp b/lib/kokkos/benchmarks/bytes_and_flops/bench_stride.hpp index b60ec84994..6509c654e7 100644 --- a/lib/kokkos/benchmarks/bytes_and_flops/bench_stride.hpp +++ b/lib/kokkos/benchmarks/bytes_and_flops/bench_stride.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/benchmarks/bytes_and_flops/bench_unroll_stride.hpp b/lib/kokkos/benchmarks/bytes_and_flops/bench_unroll_stride.hpp index 0992c5b54b..c6651da1e7 100644 --- a/lib/kokkos/benchmarks/bytes_and_flops/bench_unroll_stride.hpp +++ b/lib/kokkos/benchmarks/bytes_and_flops/bench_unroll_stride.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/benchmarks/bytes_and_flops/main.cpp b/lib/kokkos/benchmarks/bytes_and_flops/main.cpp index 8db5ce0eb5..4f46b38717 100644 --- a/lib/kokkos/benchmarks/bytes_and_flops/main.cpp +++ b/lib/kokkos/benchmarks/bytes_and_flops/main.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/benchmarks/gather/gather.hpp b/lib/kokkos/benchmarks/gather/gather.hpp index 406bd28983..bbbd65850f 100644 --- a/lib/kokkos/benchmarks/gather/gather.hpp +++ b/lib/kokkos/benchmarks/gather/gather.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/benchmarks/gather/gather_unroll.hpp b/lib/kokkos/benchmarks/gather/gather_unroll.hpp index 1d01b26ca7..1d9c99adf9 100644 --- a/lib/kokkos/benchmarks/gather/gather_unroll.hpp +++ b/lib/kokkos/benchmarks/gather/gather_unroll.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/benchmarks/gather/main.cpp b/lib/kokkos/benchmarks/gather/main.cpp index 88eb0493c1..ca5238e7fd 100644 --- a/lib/kokkos/benchmarks/gather/main.cpp +++ b/lib/kokkos/benchmarks/gather/main.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/benchmarks/policy_performance/main.cpp b/lib/kokkos/benchmarks/policy_performance/main.cpp index b0ed9bb512..2f5395734a 100644 --- a/lib/kokkos/benchmarks/policy_performance/main.cpp +++ b/lib/kokkos/benchmarks/policy_performance/main.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/benchmarks/policy_performance/policy_perf_test.hpp b/lib/kokkos/benchmarks/policy_performance/policy_perf_test.hpp index 11576413e2..1ab437928d 100644 --- a/lib/kokkos/benchmarks/policy_performance/policy_perf_test.hpp +++ b/lib/kokkos/benchmarks/policy_performance/policy_perf_test.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/cmake/Modules/FindHWLOC.cmake b/lib/kokkos/cmake/Modules/FindHWLOC.cmake index 273dcb5c8a..60df8084d8 100644 --- a/lib/kokkos/cmake/Modules/FindHWLOC.cmake +++ b/lib/kokkos/cmake/Modules/FindHWLOC.cmake @@ -2,7 +2,7 @@ # FindHWLOC # ---------- # -# Try to find HWLOC. +# Try to find HWLOC, based on KOKKOS_HWLOC_DIR # # The following variables are defined: # @@ -10,8 +10,8 @@ # HWLOC_INCLUDE_DIR - HWLOC include directory # HWLOC_LIBRARIES - Libraries needed to use HWLOC -find_path(HWLOC_INCLUDE_DIR hwloc.h) -find_library(HWLOC_LIBRARIES hwloc) +find_path(HWLOC_INCLUDE_DIR hwloc.h PATHS "${KOKKOS_HWLOC_DIR}/include") +find_library(HWLOC_LIBRARIES hwloc PATHS "${KOKKOS_HWLOC_DIR}/lib") include(FindPackageHandleStandardArgs) find_package_handle_standard_args(HWLOC DEFAULT_MSG diff --git a/lib/kokkos/cmake/kokkos_build.cmake b/lib/kokkos/cmake/kokkos_build.cmake index f31680d6e2..76d0655adb 100644 --- a/lib/kokkos/cmake/kokkos_build.cmake +++ b/lib/kokkos/cmake/kokkos_build.cmake @@ -1,7 +1,3 @@ -# kokkos_generated_settings.cmake includes the kokkos library itself in KOKKOS_LIBS -# which we do not want to use for the cmake builds so clean this up -string(REGEX REPLACE "-lkokkos" "" KOKKOS_LIBS ${KOKKOS_LIBS}) - ############################ Detect if submodule ############################### # # With thanks to StackOverflow: @@ -73,6 +69,19 @@ IF(KOKKOS_SEPARATE_LIBS) PUBLIC $<$:${KOKKOS_CXX_FLAGS}> ) + target_include_directories( + kokkoscore + PUBLIC + ${KOKKOS_TPL_INCLUDE_DIRS} + ) + + foreach(lib IN LISTS KOKKOS_TPL_LIBRARY_NAMES) + find_library(LIB_${lib} ${lib} PATHS ${KOKKOS_TPL_LIBRARY_DIRS}) + target_link_libraries(kokkoscore PUBLIC ${LIB_${lib}}) + endforeach() + + target_link_libraries(kokkoscore PUBLIC "${KOKKOS_LINK_FLAGS}") + # Install the kokkoscore library INSTALL (TARGETS kokkoscore EXPORT KokkosTargets @@ -81,12 +90,6 @@ IF(KOKKOS_SEPARATE_LIBS) RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin ) - TARGET_LINK_LIBRARIES( - kokkoscore - ${KOKKOS_LD_FLAGS} - ${KOKKOS_EXTRA_LIBS_LIST} - ) - # kokkoscontainers if (DEFINED KOKKOS_CONTAINERS_SRCS) ADD_LIBRARY( @@ -144,12 +147,19 @@ ELSE() PUBLIC $<$:${KOKKOS_CXX_FLAGS}> ) - TARGET_LINK_LIBRARIES( + target_include_directories( kokkos - ${KOKKOS_LD_FLAGS} - ${KOKKOS_EXTRA_LIBS_LIST} + PUBLIC + ${KOKKOS_TPL_INCLUDE_DIRS} ) + foreach(lib IN LISTS KOKKOS_TPL_LIBRARY_NAMES) + find_library(LIB_${lib} ${lib} PATHS ${KOKKOS_TPL_LIBRARY_DIRS}) + target_link_libraries(kokkos PUBLIC ${LIB_${lib}}) + endforeach() + + target_link_libraries(kokkos PUBLIC "${KOKKOS_LINK_FLAGS}") + # Install the kokkos library INSTALL (TARGETS kokkos EXPORT KokkosTargets diff --git a/lib/kokkos/cmake/kokkos_options.cmake b/lib/kokkos/cmake/kokkos_options.cmake index f17710a4ce..25eb8e86ce 100644 --- a/lib/kokkos/cmake/kokkos_options.cmake +++ b/lib/kokkos/cmake/kokkos_options.cmake @@ -25,11 +25,12 @@ list(APPEND KOKKOS_INTERNAL_ENABLE_OPTIONS_LIST Cuda_LDG_Intrinsic Debug Debug_DualView_Modify_Check - Debug_Bounds_Checkt + Debug_Bounds_Check Compiler_Warnings Profiling Profiling_Load_Print Aggressive_Vectorization + Deprecated_Code ) #------------------------------------------------------------------------------- @@ -263,7 +264,8 @@ set(KOKKOS_ENABLE_PROFILING ${KOKKOS_INTERNAL_ENABLE_PROFILING_DEFAULT} CACHE BO set_kokkos_default_default(PROFILING_LOAD_PRINT OFF) set(KOKKOS_ENABLE_PROFILING_LOAD_PRINT ${KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT_DEFAULT} CACHE BOOL "Enable profile load print.") - +set_kokkos_default_default(DEPRECATED_CODE ON) +set(KOKKOS_ENABLE_DEPRECATED_CODE ${KOKKOS_INTERNAL_ENABLE_DEPRECATED_CODE_DEFAULT} CACHE BOOL "Enable deprecated code.") #------------------------------------------------------------------------------- diff --git a/lib/kokkos/cmake/kokkos_settings.cmake b/lib/kokkos/cmake/kokkos_settings.cmake index 850a74a670..579fab0c95 100644 --- a/lib/kokkos/cmake/kokkos_settings.cmake +++ b/lib/kokkos/cmake/kokkos_settings.cmake @@ -14,6 +14,13 @@ #------------------------------------------------------------------------------- # Ensure that KOKKOS_ARCH is in the ARCH_LIST +if (KOKKOS_ARCH MATCHES ",") + message("-- Detected a comma in: KOKKOS_ARCH=${KOKKOS_ARCH}") + message("-- Although we prefer KOKKOS_ARCH to be semicolon-delimited, we do allow") + message("-- comma-delimited values for compatibility with scripts (see github.com/trilinos/Trilinos/issues/2330)") + string(REPLACE "," ";" KOKKOS_ARCH "${KOKKOS_ARCH}") + message("-- Commas were changed to semicolons, now KOKKOS_ARCH=${KOKKOS_ARCH}") +endif() foreach(arch ${KOKKOS_ARCH}) list(FIND KOKKOS_ARCH_LIST ${arch} indx) if (indx EQUAL -1) @@ -23,14 +30,13 @@ foreach(arch ${KOKKOS_ARCH}) endforeach() # KOKKOS_SETTINGS uses KOKKOS_ARCH -string(REPLACE ";" "," KOKKOS_ARCH "${KOKKOS_ARCH}") -set(KOKKOS_ARCH ${KOKKOS_ARCH}) +string(REPLACE ";" "," KOKKOS_GMAKE_ARCH "${KOKKOS_ARCH}") # From Makefile.kokkos: Options: yes,no if(${KOKKOS_ENABLE_DEBUG}) - set(KOKKOS_DEBUG yes) + set(KOKKOS_GMAKE_DEBUG yes) else() - set(KOKKOS_DEBUG no) + set(KOKKOS_GMAKE_DEBUG no) endif() #------------------------------- KOKKOS_DEVICES -------------------------------- @@ -43,10 +49,10 @@ foreach(devopt ${KOKKOS_DEVICES_LIST}) endif () endforeach() # List needs to be comma-delmitted -string(REPLACE ";" "," KOKKOS_DEVICES "${KOKKOS_DEVICESl}") +string(REPLACE ";" "," KOKKOS_GMAKE_DEVICES "${KOKKOS_DEVICESl}") #------------------------------- KOKKOS_OPTIONS -------------------------------- -# From Makefile.kokkos: Options: aggressive_vectorization,disable_profiling +# From Makefile.kokkos: Options: aggressive_vectorization,disable_profiling,disable_deprecated_code #compiler_warnings, aggressive_vectorization, disable_profiling, disable_dualview_modify_check, enable_profile_load_print set(KOKKOS_OPTIONSl) @@ -57,7 +63,10 @@ if(${KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION}) list(APPEND KOKKOS_OPTIONSl aggressive_vectorization) endif() if(NOT ${KOKKOS_ENABLE_PROFILING}) - list(APPEND KOKKOS_OPTIONSl disable_vectorization) + list(APPEND KOKKOS_OPTIONSl disable_profiling) +endif() +if(NOT ${KOKKOS_ENABLE_DEPRECATED_CODE}) + list(APPEND KOKKOS_OPTIONSl disable_deprecated_code) endif() if(NOT ${KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK}) list(APPEND KOKKOS_OPTIONSl disable_dualview_modify_check) @@ -66,7 +75,7 @@ if(${KOKKOS_ENABLE_PROFILING_LOAD_PRINT}) list(APPEND KOKKOS_OPTIONSl enable_profile_load_print) endif() # List needs to be comma-delimitted -string(REPLACE ";" "," KOKKOS_OPTIONS "${KOKKOS_OPTIONSl}") +string(REPLACE ";" "," KOKKOS_GMAKE_OPTIONS "${KOKKOS_OPTIONSl}") #------------------------------- KOKKOS_USE_TPLS ------------------------------- @@ -78,19 +87,19 @@ foreach(tplopt ${KOKKOS_USE_TPLS_LIST}) endif () endforeach() # List needs to be comma-delimitted -string(REPLACE ";" "," KOKKOS_USE_TPLS "${KOKKOS_USE_TPLSl}") +string(REPLACE ";" "," KOKKOS_GMAKE_USE_TPLS "${KOKKOS_USE_TPLSl}") #------------------------------- KOKKOS_CUDA_OPTIONS --------------------------- # Construct the Makefile options -set(KOKKOS_CUDA_OPTIONS) +set(KOKKOS_CUDA_OPTIONSl) foreach(cudaopt ${KOKKOS_CUDA_OPTIONS_LIST}) if (${KOKKOS_ENABLE_CUDA_${cudaopt}}) list(APPEND KOKKOS_CUDA_OPTIONSl ${KOKKOS_INTERNAL_${cudaopt}}) endif () endforeach() # List needs to be comma-delmitted -string(REPLACE ";" "," KOKKOS_CUDA_OPTIONS "${KOKKOS_CUDA_OPTIONSl}") +string(REPLACE ";" "," KOKKOS_GMAKE_CUDA_OPTIONS "${KOKKOS_CUDA_OPTIONSl}") #------------------------------- PATH VARIABLES -------------------------------- # Want makefile to use same executables specified which means modifying @@ -100,10 +109,10 @@ string(REPLACE ";" "," KOKKOS_CUDA_OPTIONS "${KOKKOS_CUDA_OPTIONSl}") set(KOKKOS_INTERNAL_PATHS) set(addpathl) -foreach(kvar "CUDA;QTHREADS;${KOKKOS_USE_TPLS_LIST}") +foreach(kvar IN LISTS KOKKOS_USE_TPLS_LIST ITEMS CUDA QTHREADS) if(${KOKKOS_ENABLE_${kvar}}) if(DEFINED KOKKOS_${kvar}_DIR) - set(KOKKOS_INTERNAL_PATHS "${KOKKOS_INTERNAL_PATHS} ${kvar}_PATH=${KOKKOS_${kvar}_DIR}") + set(KOKKOS_INTERNAL_PATHS ${KOKKOS_INTERNAL_PATHS} "${kvar}_PATH=${KOKKOS_${kvar}_DIR}") if(IS_DIRECTORY ${KOKKOS_${kvar}_DIR}/bin) list(APPEND addpathl ${KOKKOS_${kvar}_DIR}/bin) endif() @@ -124,10 +133,9 @@ set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} KOKKOS_INSTALL_PATH=${CMAKE_INSTALL_PREFI # Form of KOKKOS_foo=$KOKKOS_foo foreach(kvar ARCH;DEVICES;DEBUG;OPTIONS;CUDA_OPTIONS;USE_TPLS) - set(KOKKOS_VAR KOKKOS_${kvar}) - if(DEFINED KOKKOS_${kvar}) - if (NOT "${${KOKKOS_VAR}}" STREQUAL "") - set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} ${KOKKOS_VAR}=${${KOKKOS_VAR}}) + if(DEFINED KOKKOS_GMAKE_${kvar}) + if (NOT "${KOKKOS_GMAKE_${kvar}}" STREQUAL "") + set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} KOKKOS_${kvar}=${KOKKOS_GMAKE_${kvar}}) endif() endif() endforeach() @@ -147,7 +155,7 @@ if (NOT "${KOKKOS_INTERNAL_PATHS}" STREQUAL "") set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} ${KOKKOS_INTERNAL_PATHS}) endif() if (NOT "${KOKKOS_INTERNAL_ADDTOPATH}" STREQUAL "") - set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} PATH=${KOKKOS_INTERNAL_ADDTOPATH}:\${PATH}) + set(KOKKOS_SETTINGS ${KOKKOS_SETTINGS} "PATH=\"${KOKKOS_INTERNAL_ADDTOPATH}:$ENV{PATH}\"") endif() # Final form that gets passed to make @@ -185,7 +193,7 @@ if(KOKKOS_CMAKE_VERBOSE) message(STATUS "") message(STATUS "Architectures:") - message(STATUS " ${KOKKOS_ARCH}") + message(STATUS " ${KOKKOS_GMAKE_ARCH}") message(STATUS "") message(STATUS "Enabled options") @@ -194,43 +202,14 @@ if(KOKKOS_CMAKE_VERBOSE) message(STATUS " KOKKOS_SEPARATE_LIBS") endif() - if(KOKKOS_ENABLE_HWLOC) - message(STATUS " KOKKOS_ENABLE_HWLOC") - endif() - - if(KOKKOS_ENABLE_MEMKIND) - message(STATUS " KOKKOS_ENABLE_MEMKIND") - endif() - - if(KOKKOS_ENABLE_DEBUG) - message(STATUS " KOKKOS_ENABLE_DEBUG") - endif() - - if(KOKKOS_ENABLE_PROFILING) - message(STATUS " KOKKOS_ENABLE_PROFILING") - endif() - - if(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION) - message(STATUS " KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION") - endif() - - if(KOKKOS_ENABLE_CUDA) - if(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC) - message(STATUS " KOKKOS_ENABLE_CUDA_LDG_INTRINSIC") - endif() - - if(KOKKOS_ENABLE_CUDA_UVM) - message(STATUS " KOKKOS_ENABLE_CUDA_UVM") - endif() - - if(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE) - message(STATUS " KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE") - endif() - - if(KOKKOS_ENABLE_CUDA_LAMBDA) - message(STATUS " KOKKOS_ENABLE_CUDA_LAMBDA") + foreach(opt IN LISTS KOKKOS_INTERNAL_ENABLE_OPTIONS_LIST) + string(TOUPPER ${opt} OPT) + if (KOKKOS_ENABLE_${OPT}) + message(STATUS " KOKKOS_ENABLE_${OPT}") endif() + endforeach() + if(KOKKOS_ENABLE_CUDA) if(KOKKOS_CUDA_DIR) message(STATUS " KOKKOS_CUDA_DIR: ${KOKKOS_CUDA_DIR}") endif() diff --git a/lib/kokkos/cmake/tribits.cmake b/lib/kokkos/cmake/tribits.cmake index 321704a1c8..1b5a7b2adb 100644 --- a/lib/kokkos/cmake/tribits.cmake +++ b/lib/kokkos/cmake/tribits.cmake @@ -3,7 +3,7 @@ INCLUDE(CTest) cmake_policy(SET CMP0054 NEW) -MESSAGE(WARNING "The project name is: ${PROJECT_NAME}") +MESSAGE(STATUS "The project name is: ${PROJECT_NAME}") IF(NOT DEFINED ${PROJECT_NAME}_ENABLE_OpenMP) SET(${PROJECT_NAME}_ENABLE_OpenMP OFF) @@ -84,9 +84,6 @@ ENDFUNCTION() MACRO(TRIBITS_ADD_TEST_DIRECTORIES) - message(STATUS "ProjectName: " ${PROJECT_NAME}) - message(STATUS "Tests: " ${${PROJECT_NAME}_ENABLE_TESTS}) - IF(${${PROJECT_NAME}_ENABLE_TESTS}) FOREACH(TEST_DIR ${ARGN}) ADD_SUBDIRECTORY(${TEST_DIR}) @@ -95,13 +92,11 @@ MACRO(TRIBITS_ADD_TEST_DIRECTORIES) ENDMACRO() MACRO(TRIBITS_ADD_EXAMPLE_DIRECTORIES) - IF(${PACKAGE_NAME}_ENABLE_EXAMPLES OR ${PARENT_PACKAGE_NAME}_ENABLE_EXAMPLES) FOREACH(EXAMPLE_DIR ${ARGN}) ADD_SUBDIRECTORY(${EXAMPLE_DIR}) ENDFOREACH() ENDIF() - ENDMACRO() diff --git a/lib/kokkos/config/configure_compton_cpu.sh b/lib/kokkos/config/configure_compton_cpu.sh deleted file mode 100644 index 17287fb848..0000000000 --- a/lib/kokkos/config/configure_compton_cpu.sh +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -# Additional command-line arguments given to this script will be -# passed directly to CMake. -# - -# -# Force CMake to re-evaluate build options. -# -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -#----------------------------------------------------------------------------- -# Incrementally construct cmake configure options: - -CMAKE_CONFIGURE="" - -#----------------------------------------------------------------------------- -# Location of Trilinos source tree: - -CMAKE_PROJECT_DIR="${HOME}/Trilinos" - -# Location for installation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=/home/projects/kokkos/host/`date +%F`" - -#----------------------------------------------------------------------------- -# General build options. -# Use a variable so options can be propagated to CUDA compiler. - -CMAKE_VERBOSE_MAKEFILE=OFF -CMAKE_BUILD_TYPE=RELEASE -# CMAKE_BUILD_TYPE=DEBUG - -#----------------------------------------------------------------------------- -# Build for CUDA architecture: - -CUDA_ARCH="" -# CUDA_ARCH="20" -# CUDA_ARCH="30" -# CUDA_ARCH="35" - -# Build with Intel compiler - -INTEL=ON - -# Build for MIC architecture: - -# INTEL_XEON_PHI=ON - -# Build with HWLOC at location: - -HWLOC_BASE_DIR="/home/projects/libraries/host/hwloc/1.6.2" - -# Location for MPI to use in examples: - -MPI_BASE_DIR="" - -#----------------------------------------------------------------------------- -# MPI configuation only used for examples: -# -# Must have the MPI_BASE_DIR so that the -# include path can be passed to the Cuda compiler - -if [ -n "${MPI_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D MPI_BASE_DIR:PATH=${MPI_BASE_DIR}" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# Pthread configuation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# OpenMP configuation: - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=OFF" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Configure packages for kokkos-only: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Hardware locality cmake configuration: - -if [ -n "${HWLOC_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" -fi - -#----------------------------------------------------------------------------- -# Cuda cmake configuration: - -if [ -n "${CUDA_ARCH}" ] ; -then - - # Options to CUDA_NVCC_FLAGS must be semi-colon delimited, - # this is different than the standard CMAKE_CXX_FLAGS syntax. - - CUDA_NVCC_FLAGS="-gencode;arch=compute_${CUDA_ARCH},code=sm_${CUDA_ARCH}" - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi" - - if [ "${CMAKE_BUILD_TYPE}" = "DEBUG" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-g" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-O3" - fi - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_VERBOSE_BUILD:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_NVCC_FLAGS:STRING=${CUDA_NVCC_FLAGS}" - -fi - -#----------------------------------------------------------------------------- - -if [ "${INTEL}" = "ON" -o "${INTEL_XEON_PHI}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=icc" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=icpc" -fi - -#----------------------------------------------------------------------------- - -# Cross-compile for Intel Xeon Phi: - -if [ "${INTEL_XEON_PHI}" = "ON" ] ; -then - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_SYSTEM_NAME=Linux" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_Fortran_COMPILER:FILEPATH=ifort" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_DIRS:FILEPATH=${MKLROOT}/lib/mic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_NAMES='mkl_intel_lp64;mkl_sequential;mkl_core;pthread;m'" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CHECKED_STL:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_WARNINGS_AS_ERRORS_FLAGS:STRING=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BUILD_SHARED_LIBS:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D DART_TESTING_TIMEOUT:STRING=600" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_LIBRARY_NAMES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_LAPACK_LIBRARIES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_BinUtils=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_Pthread_LIBRARIES=pthread" - - # Cannot cross-compile fortran compatibility checks on the MIC: - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" - - # Tell cmake the answers to compile-and-execute tests - # to prevent cmake from executing a cross-compiled program. - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_GCC_ABI_DEMANGLE_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_TEUCHOS_BLASFLOAT_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_SLAPY2_WORKS_EXITCODE=0" - -fi - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_VERBOSE_MAKEFILE:BOOL=${CMAKE_VERBOSE_MAKEFILE}" - -#----------------------------------------------------------------------------- - -echo "cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR}" - -cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/configure_compton_mic.sh b/lib/kokkos/config/configure_compton_mic.sh deleted file mode 100644 index 7f9aee13f9..0000000000 --- a/lib/kokkos/config/configure_compton_mic.sh +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -# Additional command-line arguments given to this script will be -# passed directly to CMake. -# - -# -# Force CMake to re-evaluate build options. -# -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -#----------------------------------------------------------------------------- -# Incrementally construct cmake configure options: - -CMAKE_CONFIGURE="" - -#----------------------------------------------------------------------------- -# Location of Trilinos source tree: - -CMAKE_PROJECT_DIR="${HOME}/Trilinos" - -# Location for installation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=/home/projects/kokkos/mic/`date +%F`" - -#----------------------------------------------------------------------------- -# General build options. -# Use a variable so options can be propagated to CUDA compiler. - -CMAKE_VERBOSE_MAKEFILE=OFF -CMAKE_BUILD_TYPE=RELEASE -# CMAKE_BUILD_TYPE=DEBUG - -#----------------------------------------------------------------------------- -# Build for CUDA architecture: - -CUDA_ARCH="" -# CUDA_ARCH="20" -# CUDA_ARCH="30" -# CUDA_ARCH="35" - -# Build for MIC architecture: - -INTEL_XEON_PHI=ON - -# Build with HWLOC at location: - -HWLOC_BASE_DIR="/home/projects/libraries/mic/hwloc/1.6.2" - -# Location for MPI to use in examples: - -MPI_BASE_DIR="" - -#----------------------------------------------------------------------------- -# MPI configuation only used for examples: -# -# Must have the MPI_BASE_DIR so that the -# include path can be passed to the Cuda compiler - -if [ -n "${MPI_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D MPI_BASE_DIR:PATH=${MPI_BASE_DIR}" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# Pthread configuation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# OpenMP configuation: - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=OFF" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Configure packages for kokkos-only: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Hardware locality cmake configuration: - -if [ -n "${HWLOC_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" -fi - -#----------------------------------------------------------------------------- -# Cuda cmake configuration: - -if [ -n "${CUDA_ARCH}" ] ; -then - - # Options to CUDA_NVCC_FLAGS must be semi-colon delimited, - # this is different than the standard CMAKE_CXX_FLAGS syntax. - - CUDA_NVCC_FLAGS="-gencode;arch=compute_${CUDA_ARCH},code=sm_${CUDA_ARCH}" - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi" - - if [ "${CMAKE_BUILD_TYPE}" = "DEBUG" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-g" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-O3" - fi - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_VERBOSE_BUILD:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_NVCC_FLAGS:STRING=${CUDA_NVCC_FLAGS}" - -fi - -#----------------------------------------------------------------------------- - -if [ "${INTEL}" = "ON" -o "${INTEL_XEON_PHI}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=icc" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=icpc" -fi - -#----------------------------------------------------------------------------- - -# Cross-compile for Intel Xeon Phi: - -if [ "${INTEL_XEON_PHI}" = "ON" ] ; -then - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_SYSTEM_NAME=Linux" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_Fortran_COMPILER:FILEPATH=ifort" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_DIRS:FILEPATH=${MKLROOT}/lib/mic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_NAMES='mkl_intel_lp64;mkl_sequential;mkl_core;pthread;m'" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CHECKED_STL:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_WARNINGS_AS_ERRORS_FLAGS:STRING=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BUILD_SHARED_LIBS:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D DART_TESTING_TIMEOUT:STRING=600" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_LIBRARY_NAMES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_LAPACK_LIBRARIES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_BinUtils=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_Pthread_LIBRARIES=pthread" - - # Cannot cross-compile fortran compatibility checks on the MIC: - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" - - # Tell cmake the answers to compile-and-execute tests - # to prevent cmake from executing a cross-compiled program. - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_GCC_ABI_DEMANGLE_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_TEUCHOS_BLASFLOAT_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_SLAPY2_WORKS_EXITCODE=0" - -fi - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_VERBOSE_MAKEFILE:BOOL=${CMAKE_VERBOSE_MAKEFILE}" - -#----------------------------------------------------------------------------- - -echo "cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR}" - -cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/configure_kokkos.sh b/lib/kokkos/config/configure_kokkos.sh deleted file mode 100644 index 592e7f5936..0000000000 --- a/lib/kokkos/config/configure_kokkos.sh +++ /dev/null @@ -1,293 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# General build options. -# Use a variable so options can be propagated to CUDA compiler. - -CMAKE_BUILD_TYPE=RELEASE -# CMAKE_BUILD_TYPE=DEBUG - -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -#----------------------------------------------------------------------------- - -USE_CUDA_ARCH= -USE_THREAD= -USE_OPENMP= -USE_INTEL= -USE_XEON_PHI= -HWLOC_BASE_DIR= -MPI_BASE_DIR= -BLAS_LIB_DIR= -LAPACK_LIB_DIR= - -if [ 1 ] ; then - # Platform 'kokkos-dev' with Cuda, OpenMP, hwloc, mpi, gnu - USE_CUDA_ARCH="35" - USE_OPENMP=ON - HWLOC_BASE_DIR="/home/projects/hwloc/1.7.1/host/gnu/4.4.7" - MPI_BASE_DIR="/home/projects/mvapich/2.0.0b/gnu/4.4.7" - BLAS_LIB_DIR="/home/projects/blas/host/gnu/lib" - LAPACK_LIB_DIR="/home/projects/lapack/host/gnu/lib" - -elif [ ] ; then - # Platform 'kokkos-dev' with Cuda, Threads, hwloc, mpi, gnu - USE_CUDA_ARCH="35" - USE_THREAD=ON - HWLOC_BASE_DIR="/home/projects/hwloc/1.7.1/host/gnu/4.4.7" - MPI_BASE_DIR="/home/projects/mvapich/2.0.0b/gnu/4.4.7" - BLAS_LIB_DIR="/home/projects/blas/host/gnu/lib" - LAPACK_LIB_DIR="/home/projects/lapack/host/gnu/lib" - -elif [ ] ; then - # Platform 'kokkos-dev' with Xeon Phi and hwloc - USE_OPENMP=ON - USE_INTEL=ON - USE_XEON_PHI=ON - HWLOC_BASE_DIR="/home/projects/hwloc/1.7.1/mic/intel/13.SP1.1.106" - -elif [ ] ; then - # Platform 'kokkos-nvidia' with Cuda, OpenMP, hwloc, mpi, gnu - USE_CUDA_ARCH="20" - USE_OPENMP=ON - HWLOC_BASE_DIR="/home/sems/common/hwloc/current" - MPI_BASE_DIR="/home/sems/common/openmpi/current" - -elif [ ] ; then - # Platform 'kokkos-nvidia' with Cuda, Threads, hwloc, mpi, gnu - USE_CUDA_ARCH="20" - USE_THREAD=ON - HWLOC_BASE_DIR="/home/sems/common/hwloc/current" - MPI_BASE_DIR="/home/sems/common/openmpi/current" - -fi - -#----------------------------------------------------------------------------- -# Incrementally construct cmake configure command line options: - -CMAKE_CONFIGURE="" -CMAKE_CXX_FLAGS="" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- - -if [ 1 ] ; then - - # Configure for Tpetra/Kokkos: - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_DIRS:FILEPATH=${BLAS_LIB_DIR}" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_LIBRARY_DIRS:FILEPATH=${LAPACK_LIB_DIR}" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Tpetra:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Kokkos:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraClassic:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TeuchosKokkosCompat:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TeuchosKokkosComm:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Tpetra_ENABLE_Kokkos_Refactor:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D KokkosClassic_DefaultNode:STRING=Kokkos::Compat::KokkosOpenMPWrapperNode" - - CMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS}-DKOKKOS_FAST_COMPILE" - - if [ -n "${USE_CUDA_ARCH}" ] ; then - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Cuda:BOOL=ON" - - fi - -fi - -if [ 1 ] ; then - - # Configure for Stokhos: - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Sacado:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Stokhos:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Stokhos_ENABLE_Belos:BOOL=ON" - -fi - -if [ 1 ] ; then - - # Configure for TrilinosCouplings: - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TrilinosCouplings:BOOL=ON" - -fi - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_VERBOSE_MAKEFILE:BOOL=ON" - -if [ "${CMAKE_BUILD_TYPE}" == "DEBUG" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" -fi - -#----------------------------------------------------------------------------- -# Location for installation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# MPI configuation only used for examples: -# -# Must have the MPI_BASE_DIR so that the -# include path can be passed to the Cuda compiler - -if [ -n "${MPI_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D MPI_BASE_DIR:PATH=${MPI_BASE_DIR}" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# Kokkos use pthread configuation: - -if [ "${USE_THREAD}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=ON" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# Kokkos use OpenMP configuation: - -if [ "${USE_OPENMP}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_OpenMP:BOOL=ON" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_OpenMP:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# Hardware locality configuration: - -if [ -n "${HWLOC_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" -fi - -#----------------------------------------------------------------------------- -# Cuda cmake configuration: - -if [ -n "${USE_CUDA_ARCH}" ] ; -then - - # Options to CUDA_NVCC_FLAGS must be semi-colon delimited, - # this is different than the standard CMAKE_CXX_FLAGS syntax. - - CUDA_NVCC_FLAGS="-DKOKKOS_HAVE_CUDA_ARCH=${USE_CUDA_ARCH}0;-gencode;arch=compute_${USE_CUDA_ARCH},code=sm_${USE_CUDA_ARCH}" - - if [ "${USE_OPENMP}" = "ON" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi,-fopenmp" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi" - fi - - if [ "${CMAKE_BUILD_TYPE}" = "DEBUG" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-g" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-O3" - fi - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_VERBOSE_BUILD:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_NVCC_FLAGS:STRING=${CUDA_NVCC_FLAGS}" - -fi - -#----------------------------------------------------------------------------- - -if [ "${USE_INTEL}" = "ON" -o "${USE_XEON_PHI}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=icc" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=icpc" -fi - -# Cross-compile for Intel Xeon Phi: - -if [ "${USE_XEON_PHI}" = "ON" ] ; -then - - CMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -mmic" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_SYSTEM_NAME=Linux" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_Fortran_COMPILER:FILEPATH=ifort" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_DIRS:FILEPATH=${MKLROOT}/lib/mic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_NAMES='mkl_intel_lp64;mkl_sequential;mkl_core;pthread;m'" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CHECKED_STL:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_WARNINGS_AS_ERRORS_FLAGS:STRING=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BUILD_SHARED_LIBS:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D DART_TESTING_TIMEOUT:STRING=600" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_LIBRARY_NAMES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_LAPACK_LIBRARIES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_BinUtils=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_Pthread_LIBRARIES=pthread" - - # Cannot cross-compile fortran compatibility checks on the MIC: - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" - - # Tell cmake the answers to compile-and-execute tests - # to prevent cmake from executing a cross-compiled program. - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_GCC_ABI_DEMANGLE_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_TEUCHOS_BLASFLOAT_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_SLAPY2_WORKS_EXITCODE=0" - -fi - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- - -if [ -n "${CMAKE_CXX_FLAGS}" ] ; then - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING='${CMAKE_CXX_FLAGS}'" - -fi - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo "cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR}" - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/configure_kokkos_bgq.sh b/lib/kokkos/config/configure_kokkos_bgq.sh deleted file mode 100755 index 73236937ea..0000000000 --- a/lib/kokkos/config/configure_kokkos_bgq.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -# Additional command-line arguments given to this script will be -# passed directly to CMake. -# - -# to build: -# build on bgq-b[1-12] -# module load sierra-devel -# run this configure file -# make - -# to run: -# ssh bgq-login -# cd /scratch/username/... -# export OMP_PROC_BIND and XLSMPOPTS environment variables -# run with srun - -# Note: hwloc does not work to get or set cpubindings on bgq. -# Use the openmp backend and the openmp environment variables. -# -# Only the mpi wrappers seem to be setup for cross-compile, -# so it is important that this configure enables MPI and uses mpigcc wrappers. - - - -# -# Force CMake to re-evaluate build options. -# -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -#----------------------------------------------------------------------------- -# Incrementally construct cmake configure options: - -CMAKE_CONFIGURE="" - -#----------------------------------------------------------------------------- -# Location of Trilinos source tree: - -CMAKE_PROJECT_DIR="../Trilinos" - -# Location for installation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=../TrilinosInstall/`date +%F`" - -#----------------------------------------------------------------------------- -# General build options. -# Use a variable so options can be propagated to CUDA compiler. - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=mpigcc-4.7.2" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=mpig++-4.7.2" - -CMAKE_VERBOSE_MAKEFILE=OFF -CMAKE_BUILD_TYPE=RELEASE -# CMAKE_BUILD_TYPE=DEBUG - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Configure packages for kokkos-only: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_VERBOSE_MAKEFILE:BOOL=${CMAKE_VERBOSE_MAKEFILE}" - -#----------------------------------------------------------------------------- - -echo "cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR}" - -cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/configure_kokkos_dev.sh b/lib/kokkos/config/configure_kokkos_dev.sh deleted file mode 100755 index ac61dec602..0000000000 --- a/lib/kokkos/config/configure_kokkos_dev.sh +++ /dev/null @@ -1,216 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -# Additional command-line arguments given to this script will be -# passed directly to CMake. -# - -# -# Force CMake to re-evaluate build options. -# -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -#----------------------------------------------------------------------------- -# Incrementally construct cmake configure options: - -CMAKE_CONFIGURE="" - -#----------------------------------------------------------------------------- -# Location of Trilinos source tree: - -CMAKE_PROJECT_DIR="${HOME}/Trilinos" - -# Location for installation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${HOME}/TrilinosInstall/`date +%F`" - -#----------------------------------------------------------------------------- -# General build options. -# Use a variable so options can be propagated to CUDA compiler. - -CMAKE_VERBOSE_MAKEFILE=OFF -CMAKE_BUILD_TYPE=RELEASE -#CMAKE_BUILD_TYPE=DEBUG -#CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -#----------------------------------------------------------------------------- -# Build for CUDA architecture: - -#CUDA_ARCH="" -#CUDA_ARCH="20" -#CUDA_ARCH="30" -CUDA_ARCH="35" - -# Build with OpenMP - -OPENMP=ON -PTHREADS=ON - -# Build host code with Intel compiler: - -INTEL=OFF - -# Build for MIC architecture: - -INTEL_XEON_PHI=OFF - -# Build with HWLOC at location: - -#HWLOC_BASE_DIR="" -#HWLOC_BASE_DIR="/home/projects/hwloc/1.7.1/host/gnu/4.4.7" -HWLOC_BASE_DIR="/home/projects/hwloc/1.7.1/host/gnu/4.7.3" - -# Location for MPI to use in examples: - -#MPI_BASE_DIR="" -#MPI_BASE_DIR="/home/projects/mvapich/2.0.0b/gnu/4.4.7" -MPI_BASE_DIR="/home/projects/mvapich/2.0.0b/gnu/4.7.3" -#MPI_BASE_DIR="/home/projects/openmpi/1.7.3/llvm/2013-12-02/" - -#----------------------------------------------------------------------------- -# MPI configuation only used for examples: -# -# Must have the MPI_BASE_DIR so that the -# include path can be passed to the Cuda compiler - -if [ -n "${MPI_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D MPI_BASE_DIR:PATH=${MPI_BASE_DIR}" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# Pthread configuation: - -if [ "${PTHREADS}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# OpenMP configuation: - -if [ "${OPENMP}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Configure packages for kokkos-only: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Hardware locality cmake configuration: - -if [ -n "${HWLOC_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" -fi - -#----------------------------------------------------------------------------- -# Cuda cmake configuration: - -if [ -n "${CUDA_ARCH}" ] ; -then - - # Options to CUDA_NVCC_FLAGS must be semi-colon delimited, - # this is different than the standard CMAKE_CXX_FLAGS syntax. - - CUDA_NVCC_FLAGS="-gencode;arch=compute_${CUDA_ARCH},code=sm_${CUDA_ARCH}" - - if [ "${OPENMP}" = "ON" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi,-fopenmp" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi" - fi - - if [ "${CMAKE_BUILD_TYPE}" = "DEBUG" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-g" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-O3" - fi - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_VERBOSE_BUILD:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_NVCC_FLAGS:STRING=${CUDA_NVCC_FLAGS}" - -fi - -#----------------------------------------------------------------------------- - -if [ "${INTEL}" = "ON" -o "${INTEL_XEON_PHI}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=icc" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=icpc" -fi - -#----------------------------------------------------------------------------- - -# Cross-compile for Intel Xeon Phi: - -if [ "${INTEL_XEON_PHI}" = "ON" ] ; -then - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_SYSTEM_NAME=Linux" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_Fortran_COMPILER:FILEPATH=ifort" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_DIRS:FILEPATH=${MKLROOT}/lib/mic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_NAMES='mkl_intel_lp64;mkl_sequential;mkl_core;pthread;m'" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CHECKED_STL:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_WARNINGS_AS_ERRORS_FLAGS:STRING=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BUILD_SHARED_LIBS:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D DART_TESTING_TIMEOUT:STRING=600" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_LIBRARY_NAMES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_LAPACK_LIBRARIES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_BinUtils=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_Pthread_LIBRARIES=pthread" - - # Cannot cross-compile fortran compatibility checks on the MIC: - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" - - # Tell cmake the answers to compile-and-execute tests - # to prevent cmake from executing a cross-compiled program. - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_GCC_ABI_DEMANGLE_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_TEUCHOS_BLASFLOAT_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_SLAPY2_WORKS_EXITCODE=0" - -fi - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_VERBOSE_MAKEFILE:BOOL=${CMAKE_VERBOSE_MAKEFILE}" - -#----------------------------------------------------------------------------- - -echo "cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR}" - -cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/configure_kokkos_nvidia.sh b/lib/kokkos/config/configure_kokkos_nvidia.sh deleted file mode 100644 index f78b7dce78..0000000000 --- a/lib/kokkos/config/configure_kokkos_nvidia.sh +++ /dev/null @@ -1,204 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -# Additional command-line arguments given to this script will be -# passed directly to CMake. -# - -# -# Force CMake to re-evaluate build options. -# -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -#----------------------------------------------------------------------------- -# Incrementally construct cmake configure options: - -CMAKE_CONFIGURE="" - -#----------------------------------------------------------------------------- -# Location of Trilinos source tree: - -CMAKE_PROJECT_DIR="${HOME}/Trilinos" - -# Location for installation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=/home/sems/common/kokkos/`date +%F`" - -#----------------------------------------------------------------------------- -# General build options. -# Use a variable so options can be propagated to CUDA compiler. - -CMAKE_VERBOSE_MAKEFILE=OFF -CMAKE_BUILD_TYPE=RELEASE -# CMAKE_BUILD_TYPE=DEBUG - -#----------------------------------------------------------------------------- -# Build for CUDA architecture: - -# CUDA_ARCH="" -CUDA_ARCH="20" -# CUDA_ARCH="30" -# CUDA_ARCH="35" - -# Build with OpenMP - -OPENMP=ON - -# Build host code with Intel compiler: - -# INTEL=ON - -# Build for MIC architecture: - -# INTEL_XEON_PHI=ON - -# Build with HWLOC at location: - -HWLOC_BASE_DIR="/home/sems/common/hwloc/current" - -# Location for MPI to use in examples: - -MPI_BASE_DIR="/home/sems/common/openmpi/current" - -#----------------------------------------------------------------------------- -# MPI configuation only used for examples: -# -# Must have the MPI_BASE_DIR so that the -# include path can be passed to the Cuda compiler - -if [ -n "${MPI_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D MPI_BASE_DIR:PATH=${MPI_BASE_DIR}" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# Pthread configuation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# OpenMP configuation: - -if [ "${OPENMP}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Configure packages for kokkos-only: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Hardware locality cmake configuration: - -if [ -n "${HWLOC_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" -fi - -#----------------------------------------------------------------------------- -# Cuda cmake configuration: - -if [ -n "${CUDA_ARCH}" ] ; -then - - # Options to CUDA_NVCC_FLAGS must be semi-colon delimited, - # this is different than the standard CMAKE_CXX_FLAGS syntax. - - CUDA_NVCC_FLAGS="-gencode;arch=compute_${CUDA_ARCH},code=sm_${CUDA_ARCH}" - - if [ "${OPENMP}" = "ON" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi,-fopenmp" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi" - fi - - if [ "${CMAKE_BUILD_TYPE}" = "DEBUG" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-g" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-O3" - fi - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_VERBOSE_BUILD:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_NVCC_FLAGS:STRING=${CUDA_NVCC_FLAGS}" - -fi - -#----------------------------------------------------------------------------- - -if [ "${INTEL}" = "ON" -o "${INTEL_XEON_PHI}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=icc" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=icpc" -fi - -#----------------------------------------------------------------------------- - -# Cross-compile for Intel Xeon Phi: - -if [ "${INTEL_XEON_PHI}" = "ON" ] ; -then - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_SYSTEM_NAME=Linux" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_Fortran_COMPILER:FILEPATH=ifort" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_DIRS:FILEPATH=${MKLROOT}/lib/mic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_NAMES='mkl_intel_lp64;mkl_sequential;mkl_core;pthread;m'" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CHECKED_STL:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_WARNINGS_AS_ERRORS_FLAGS:STRING=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BUILD_SHARED_LIBS:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D DART_TESTING_TIMEOUT:STRING=600" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_LIBRARY_NAMES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_LAPACK_LIBRARIES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_BinUtils=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_Pthread_LIBRARIES=pthread" - - # Cannot cross-compile fortran compatibility checks on the MIC: - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" - - # Tell cmake the answers to compile-and-execute tests - # to prevent cmake from executing a cross-compiled program. - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_GCC_ABI_DEMANGLE_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_TEUCHOS_BLASFLOAT_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_SLAPY2_WORKS_EXITCODE=0" - -fi - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_VERBOSE_MAKEFILE:BOOL=${CMAKE_VERBOSE_MAKEFILE}" - -#----------------------------------------------------------------------------- - -echo "cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR}" - -cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/configure_shannon.sh b/lib/kokkos/config/configure_shannon.sh deleted file mode 100644 index 8bd175b031..0000000000 --- a/lib/kokkos/config/configure_shannon.sh +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -# Additional command-line arguments given to this script will be -# passed directly to CMake. -# - -# -# Force CMake to re-evaluate build options. -# -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -#----------------------------------------------------------------------------- -# Incrementally construct cmake configure options: - -CMAKE_CONFIGURE="" - -#----------------------------------------------------------------------------- -# Location of Trilinos source tree: - -CMAKE_PROJECT_DIR="${HOME}/Trilinos" - -# Location for installation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=/home/projects/kokkos/`date +%F`" - -#----------------------------------------------------------------------------- -# General build options. -# Use a variable so options can be propagated to CUDA compiler. - -CMAKE_VERBOSE_MAKEFILE=OFF -CMAKE_BUILD_TYPE=RELEASE -# CMAKE_BUILD_TYPE=DEBUG - -#----------------------------------------------------------------------------- -# Build for CUDA architecture: - -# CUDA_ARCH="" -# CUDA_ARCH="20" -# CUDA_ARCH="30" -CUDA_ARCH="35" - -# Build host code with Intel compiler: - -INTEL=ON - -# Build for MIC architecture: - -# INTEL_XEON_PHI=ON - -# Build with HWLOC at location: - -HWLOC_BASE_DIR="/home/projects/hwloc/1.6.2" - -# Location for MPI to use in examples: - -MPI_BASE_DIR="" - -#----------------------------------------------------------------------------- -# MPI configuation only used for examples: -# -# Must have the MPI_BASE_DIR so that the -# include path can be passed to the Cuda compiler - -if [ -n "${MPI_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D MPI_BASE_DIR:PATH=${MPI_BASE_DIR}" -else - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_MPI:BOOL=OFF" -fi - -#----------------------------------------------------------------------------- -# Pthread configuation: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# OpenMP configuation: - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=OFF" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Configure packages for kokkos-only: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -# Hardware locality cmake configuration: - -if [ -n "${HWLOC_BASE_DIR}" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" -fi - -#----------------------------------------------------------------------------- -# Cuda cmake configuration: - -if [ -n "${CUDA_ARCH}" ] ; -then - - # Options to CUDA_NVCC_FLAGS must be semi-colon delimited, - # this is different than the standard CMAKE_CXX_FLAGS syntax. - - CUDA_NVCC_FLAGS="-gencode;arch=compute_${CUDA_ARCH},code=sm_${CUDA_ARCH}" - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi" - - if [ "${CMAKE_BUILD_TYPE}" = "DEBUG" ] ; - then - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-g" - else - CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-O3" - fi - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_VERBOSE_BUILD:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CUDA_NVCC_FLAGS:STRING=${CUDA_NVCC_FLAGS}" - -fi - -#----------------------------------------------------------------------------- - -if [ "${INTEL}" = "ON" -o "${INTEL_XEON_PHI}" = "ON" ] ; -then - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=icc" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=icpc" -fi - -#----------------------------------------------------------------------------- - -# Cross-compile for Intel Xeon Phi: - -if [ "${INTEL_XEON_PHI}" = "ON" ] ; -then - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_SYSTEM_NAME=Linux" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_FLAGS:STRING=-mmic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_Fortran_COMPILER:FILEPATH=ifort" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_DIRS:FILEPATH=${MKLROOT}/lib/mic" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BLAS_LIBRARY_NAMES='mkl_intel_lp64;mkl_sequential;mkl_core;pthread;m'" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CHECKED_STL:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_WARNINGS_AS_ERRORS_FLAGS:STRING=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D BUILD_SHARED_LIBS:BOOL=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D DART_TESTING_TIMEOUT:STRING=600" - - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_LIBRARY_NAMES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_LAPACK_LIBRARIES=''" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_BinUtils=OFF" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_Pthread_LIBRARIES=pthread" - - # Cannot cross-compile fortran compatibility checks on the MIC: - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" - - # Tell cmake the answers to compile-and-execute tests - # to prevent cmake from executing a cross-compiled program. - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_GCC_ABI_DEMANGLE_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HAVE_TEUCHOS_BLASFLOAT_EXITCODE=0" - CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D LAPACK_SLAPY2_WORKS_EXITCODE=0" - -fi - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_VERBOSE_MAKEFILE:BOOL=${CMAKE_VERBOSE_MAKEFILE}" - -#----------------------------------------------------------------------------- - -echo "cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR}" - -cmake ${CMAKE_CONFIGURE} ${CMAKE_PROJECT_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/configure_tpetra_kokkos_cuda_nvcc_wrapper.sh b/lib/kokkos/config/configure_tpetra_kokkos_cuda_nvcc_wrapper.sh deleted file mode 100755 index 0baa83aefe..0000000000 --- a/lib/kokkos/config/configure_tpetra_kokkos_cuda_nvcc_wrapper.sh +++ /dev/null @@ -1,140 +0,0 @@ -#!/bin/bash -# -# This script uses CUDA, OpenMP, and MPI. -# -# Before invoking this script, set the OMPI_CXX environment variable -# to point to nvcc_wrapper, wherever it happens to live. (If you use -# an MPI implementation other than OpenMPI, set the corresponding -# environment variable instead.) -# - -rm -f CMakeCache.txt; -rm -rf CMakeFiles -EXTRA_ARGS=$@ -MPI_PATH="/opt/mpi/openmpi/1.8.2/nvcc-gcc/4.8.3-6.5" -CUDA_PATH="/opt/nvidia/cuda/6.5.14" - -# -# As long as there are any .cu files in Trilinos, we'll need to set -# CUDA_NVCC_FLAGS. If Trilinos gets rid of all of its .cu files and -# lets nvcc_wrapper handle them as .cpp files, then we won't need to -# set CUDA_NVCC_FLAGS. As it is, given that we need to set -# CUDA_NVCC_FLAGS, we must make sure that they are the same flags as -# nvcc_wrapper passes to nvcc. -# -CUDA_NVCC_FLAGS="-gencode;arch=compute_35,code=sm_35;-I${MPI_PATH}/include" -CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-Xcompiler;-Wall,-ansi,-fopenmp" -CUDA_NVCC_FLAGS="${CUDA_NVCC_FLAGS};-O3;-DKOKKOS_USE_CUDA_UVM" - -cmake \ - -D CMAKE_INSTALL_PREFIX:PATH="$PWD/../install/" \ - -D CMAKE_BUILD_TYPE:STRING=DEBUG \ - -D CMAKE_CXX_FLAGS:STRING="-g -Wall" \ - -D CMAKE_C_FLAGS:STRING="-g -Wall" \ - -D CMAKE_FORTRAN_FLAGS:STRING="" \ - -D CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS="" \ - -D Trilinos_ENABLE_Triutils=OFF \ - -D Trilinos_ENABLE_INSTALL_CMAKE_CONFIG_FILES:BOOL=OFF \ - -D Trilinos_ENABLE_DEBUG:BOOL=OFF \ - -D Trilinos_ENABLE_CHECKED_STL:BOOL=OFF \ - -D Trilinos_ENABLE_EXPLICIT_INSTANTIATION:BOOL=OFF \ - -D Trilinos_WARNINGS_AS_ERRORS_FLAGS:STRING="" \ - -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF \ - -D Trilinos_ENABLE_ALL_OPTIONAL_PACKAGES:BOOL=OFF \ - -D BUILD_SHARED_LIBS:BOOL=OFF \ - -D DART_TESTING_TIMEOUT:STRING=600 \ - -D CMAKE_VERBOSE_MAKEFILE:BOOL=OFF \ - \ - \ - -D CMAKE_CXX_COMPILER:FILEPATH="${MPI_PATH}/bin/mpicxx" \ - -D CMAKE_C_COMPILER:FILEPATH="${MPI_PATH}/bin/mpicc" \ - -D MPI_CXX_COMPILER:FILEPATH="${MPI_PATH}/bin/mpicxx" \ - -D MPI_C_COMPILER:FILEPATH="${MPI_PATH}/bin/mpicc" \ - -D CMAKE_Fortran_COMPILER:FILEPATH="${MPI_PATH}/bin/mpif77" \ - -D MPI_EXEC:FILEPATH="${MPI_PATH}/bin/mpirun" \ - -D MPI_EXEC_POST_NUMPROCS_FLAGS:STRING="-bind-to;socket;--map-by;socket;env;CUDA_MANAGED_FORCE_DEVICE_ALLOC=1;CUDA_LAUNCH_BLOCKING=1;OMP_NUM_THREADS=2" \ - \ - \ - -D Trilinos_ENABLE_CXX11:BOOL=OFF \ - -D TPL_ENABLE_MPI:BOOL=ON \ - -D Trilinos_ENABLE_OpenMP:BOOL=ON \ - -D Trilinos_ENABLE_ThreadPool:BOOL=ON \ - \ - \ - -D TPL_ENABLE_CUDA:BOOL=ON \ - -D CUDA_TOOLKIT_ROOT_DIR:FILEPATH="${CUDA_PATH}" \ - -D CUDA_PROPAGATE_HOST_FLAGS:BOOL=OFF \ - -D TPL_ENABLE_Thrust:BOOL=OFF \ - -D Thrust_INCLUDE_DIRS:FILEPATH="${CUDA_PATH}/include" \ - -D TPL_ENABLE_CUSPARSE:BOOL=OFF \ - -D TPL_ENABLE_Cusp:BOOL=OFF \ - -D Cusp_INCLUDE_DIRS="/home/crtrott/Software/cusp" \ - -D CUDA_VERBOSE_BUILD:BOOL=OFF \ - -D CUDA_NVCC_FLAGS:STRING=${CUDA_NVCC_FLAGS} \ - \ - \ - -D TPL_ENABLE_HWLOC=OFF \ - -D HWLOC_INCLUDE_DIRS="/usr/local/software/hwloc/current/include" \ - -D HWLOC_LIBRARY_DIRS="/usr/local/software/hwloc/current/lib" \ - -D TPL_ENABLE_BinUtils=OFF \ - -D TPL_ENABLE_BLAS:STRING=ON \ - -D TPL_ENABLE_LAPACK:STRING=ON \ - -D TPL_ENABLE_MKL:STRING=OFF \ - -D TPL_ENABLE_HWLOC:STRING=OFF \ - -D TPL_ENABLE_GTEST:STRING=ON \ - -D TPL_ENABLE_SuperLU=ON \ - -D TPL_ENABLE_BLAS=ON \ - -D TPL_ENABLE_LAPACK=ON \ - -D TPL_SuperLU_LIBRARIES="/home/crtrott/Software/SuperLU_4.3/lib/libsuperlu_4.3.a" \ - -D TPL_SuperLU_INCLUDE_DIRS="/home/crtrott/Software/SuperLU_4.3/SRC" \ - \ - \ - -D Trilinos_Enable_Kokkos:BOOL=ON \ - -D Trilinos_ENABLE_KokkosCore:BOOL=ON \ - -D Trilinos_ENABLE_TeuchosKokkosCompat:BOOL=ON \ - -D Trilinos_ENABLE_KokkosContainers:BOOL=ON \ - -D Trilinos_ENABLE_TpetraKernels:BOOL=ON \ - -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON \ - -D Trilinos_ENABLE_TeuchosKokkosComm:BOOL=ON \ - -D Trilinos_ENABLE_KokkosExample:BOOL=ON \ - -D Kokkos_ENABLE_EXAMPLES:BOOL=ON \ - -D Kokkos_ENABLE_TESTS:BOOL=OFF \ - -D KokkosClassic_DefaultNode:STRING="Kokkos::Compat::KokkosCudaWrapperNode" \ - -D TpetraClassic_ENABLE_OpenMPNode=OFF \ - -D TpetraClassic_ENABLE_TPINode=OFF \ - -D TpetraClassic_ENABLE_MKL=OFF \ - -D Kokkos_ENABLE_Cuda_UVM=ON \ - \ - \ - -D Trilinos_ENABLE_Teuchos:BOOL=ON \ - -D Teuchos_ENABLE_COMPLEX:BOOL=OFF \ - \ - \ - -D Trilinos_ENABLE_Tpetra:BOOL=ON \ - -D Tpetra_ENABLE_KokkosCore=ON \ - -D Tpetra_ENABLE_Kokkos_DistObject=OFF \ - -D Tpetra_ENABLE_Kokkos_Refactor=ON \ - -D Tpetra_ENABLE_TESTS=ON \ - -D Tpetra_ENABLE_EXAMPLES=ON \ - -D Tpetra_ENABLE_MPI_CUDA_RDMA:BOOL=ON \ - \ - \ - -D Trilinos_ENABLE_Belos=OFF \ - -D Trilinos_ENABLE_Amesos=OFF \ - -D Trilinos_ENABLE_Amesos2=OFF \ - -D Trilinos_ENABLE_Ifpack=OFF \ - -D Trilinos_ENABLE_Ifpack2=OFF \ - -D Trilinos_ENABLE_Epetra=OFF \ - -D Trilinos_ENABLE_EpetraExt=OFF \ - -D Trilinos_ENABLE_Zoltan=OFF \ - -D Trilinos_ENABLE_Zoltan2=OFF \ - -D Trilinos_ENABLE_MueLu=OFF \ - -D Belos_ENABLE_TESTS=ON \ - -D Belos_ENABLE_EXAMPLES=ON \ - -D MueLu_ENABLE_TESTS=ON \ - -D MueLu_ENABLE_EXAMPLES=ON \ - -D Ifpack2_ENABLE_TESTS=ON \ - -D Ifpack2_ENABLE_EXAMPLES=ON \ - $EXTRA_ARGS \ -${HOME}/Trilinos - diff --git a/lib/kokkos/config/kokkos-trilinos-integration-procedure.txt b/lib/kokkos/config/kokkos-trilinos-integration-procedure.txt deleted file mode 100644 index 0f24487814..0000000000 --- a/lib/kokkos/config/kokkos-trilinos-integration-procedure.txt +++ /dev/null @@ -1,148 +0,0 @@ -// -------------------------------------------------------------------------------- // - -The following steps are for workstations/servers with the SEMS environment installed. - -// -------------------------------------------------------------------------------- // -Summary: - -- Step 1: Rigorous testing of Kokkos' develop branch for each backend (Serial, OpenMP, Threads, Cuda) with all supported compilers. - -- Step 2: Snapshot Kokkos' develop branch into current Trilinos develop branch. - -- Step 3: Build and test Trilinos with combinations of compilers, types, backends. - -- Step 4: Promote Kokkos develop branch to master if the snapshot does not cause any new tests to fail; else track/fix causes of new failures. - -- Step 5: Snapshot Kokkos tagged master branch into Trilinos and push Trilinos. -// -------------------------------------------------------------------------------- // - - -// -------------------------------------------------------------------------------- // - -Step 1: - 1.1. Update kokkos develop branch (NOT a fork) - - (From kokkos directory): - git fetch --all - git checkout develop - git reset --hard origin/develop - - 1.2. Create a testing directory - here the directory is created within the kokkos directory - - mkdir testing - cd testing - - 1.3. Run the test_all_sandia script; various compiler and build-list options can be specified - - ../config/test_all_sandia - - 1.4 Clean repository of untracked files - - cd ../ - git clean -df - -// -------------------------------------------------------------------------------- // - -Step 2: - 2.1 Update Trilinos develop branch - - (From Trilinos directory): - git checkout develop - git fetch --all - git reset --hard origin/develop - git clean -df - - 2.2 Snapshot Kokkos into Trilinos - this requires python/2.7.9 and that both Trilinos and Kokkos be clean - no untracked or modified files - - module load python/2.7.9 - python KOKKOS_PATH/config/snapshot.py KOKKOS_PATH TRILINOS_PATH/packages - -// -------------------------------------------------------------------------------- // - -Step 3: - 3.1. Build and test Trilinos with 4 different configurations; Run scripts for white and shepard are provided in kokkos/config/trilinos-integration - - Usually its a good idea to run those script via nohup. - You can run all four at the same time, use separate directories for each. - - 3.2. Compare the failed test output between the pristine and the updated runs; investigate and fix problems if new tests fail after the Kokkos snapshot - -// -------------------------------------------------------------------------------- // - -Step 4: Once all Trilinos tests pass promote Kokkos develop branch to master on Github - 4.1. Generate Changelog (You need a github API token) - - Close all Open issues with "InDevelop" tag on github - - (Not from kokkos directory) - gitthub_changelog_generator kokkos/kokkos --token TOKEN --no-pull-requests --include-labels 'InDevelop' --enhancement-labels 'enhancement,Feature Request' --future-release 'NEWTAG' --between-tags 'NEWTAG,OLDTAG' - - (Copy the new section from the generated CHANGELOG.md to the kokkos/CHANGELOG.md) - (Make desired changes to CHANGELOG.md to enhance clarity) - (Commit and push the CHANGELOG to develop) - - 4.2 Merge develop into Master - - - DO NOT fast-forward the merge!!!! - - (From kokkos directory): - git checkout master - git fetch --all - # Ensure we are on the current origin/master - git reset --hard origin/master - git merge --no-ff origin/develop - - 4.3. Update the tag in kokkos/config/master_history.txt - Tag description: MajorNumber.MinorNumber.WeeksSinceMinorNumberUpdate - Tag format: #.#.## - - # Prepend master_history.txt with - - # tag: #.#.## - # date: mm/dd/yyyy - # master: sha1 - # develop: sha1 - # ----------------------- - - git commit --amend -a - - git tag -a #.#.## - tag: #.#.## - date: mm/dd/yyyy - master: sha1 - develop: sha1 - - 4.4. Do NOT push yet - -// -------------------------------------------------------------------------------- // - -Step 5: - 5.1. Make sure Trilinos is up-to-date - chances are other changes have been committed since the integration testing process began. If a substantial change has occurred that may be affected by the snapshot the testing procedure may need to be repeated - - (From Trilinos directory): - git checkout develop - git fetch --all - git reset --hard origin/develop - git clean -df - - 5.2. Snapshot Kokkos master branch into Trilinos - - (From kokkos directory): - git fetch --all - git checkout tags/#.#.## - git clean -df - - python KOKKOS_PATH/config/snapshot.py KOKKOS_PATH TRILINOS_PATH/packages - - 5.3. Run checkin-test to push to trilinos using the CI build modules (gcc/4.9.3) - - The modules are listed in kokkos/config/trilinos-integration/checkin-test - Run checkin-test, forward dependencies and optional dependencies must be enabled - If push failed because someone else clearly broke something, push manually. - If push failed for unclear reasons, investigate, fix, and potentially start over from step 2 after reseting your local kokkos/master branch - -Step 6: Push Kokkos to master - - git push --follow-tags origin master - -// -------------------------------------------------------------------------------- // diff --git a/lib/kokkos/config/kokkos_dev/config-core-all.sh b/lib/kokkos/config/kokkos_dev/config-core-all.sh deleted file mode 100755 index 1867de7204..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-all.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# Cuda, OpenMP, Threads, Qthreads, hwloc -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 gcc/4.8.3 cuda/6.5.14 nvcc-wrapper/gnu -# -# The 'nvcc-wrapper' module should load a script that matches -# kokkos/bin/nvcc_wrapper -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=gcc" - -#----------------------------------------------------------------------------- -# Cuda using GNU, use the nvcc_wrapper to build CUDA source - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=g++" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=nvcc_wrapper" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# Hardware locality configuration: - -HWLOC_BASE_DIR="/home/projects/hwloc/1.7.1/host/gnu/4.7.3" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" - -#----------------------------------------------------------------------------- -# Pthread - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=ON" - -#----------------------------------------------------------------------------- -# OpenMP - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_OpenMP:BOOL=ON" - -#----------------------------------------------------------------------------- -# Qthreads - -QTHREADS_BASE_DIR="/home/projects/qthreads/2014-07-08/host/gnu/4.7.3" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_QTHREADS:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D QTHREADS_INCLUDE_DIRS:FILEPATH=${QTHREADS_BASE_DIR}/include" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D QTHREADS_LIBRARY_DIRS:FILEPATH=${QTHREADS_BASE_DIR}/lib" - -#----------------------------------------------------------------------------- -# C++11 - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CXX11:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_CXX11:BOOL=ON" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} diff --git a/lib/kokkos/config/kokkos_dev/config-core-cuda-omp-hwloc.sh b/lib/kokkos/config/kokkos_dev/config-core-cuda-omp-hwloc.sh deleted file mode 100755 index 5a6cc1493e..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-cuda-omp-hwloc.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# Cuda, OpenMP, hwloc -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 gcc/4.8.3 cuda/6.5.14 nvcc-wrapper/gnu -# -# The 'nvcc-wrapper' module should load a script that matches -# kokkos/bin/nvcc_wrapper -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=gcc" - -#----------------------------------------------------------------------------- -# Cuda using GNU, use the nvcc_wrapper to build CUDA source - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=g++" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=nvcc_wrapper" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# Hardware locality configuration: - -HWLOC_BASE_DIR="/home/projects/hwloc/1.7.1/host/gnu/4.7.3" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" - -#----------------------------------------------------------------------------- -# Pthread explicitly OFF so tribits doesn't automatically turn it on - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# OpenMP - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_OpenMP:BOOL=ON" - -#----------------------------------------------------------------------------- -# C++11 - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CXX11:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_CXX11:BOOL=ON" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/kokkos_dev/config-core-cuda.sh b/lib/kokkos/config/kokkos_dev/config-core-cuda.sh deleted file mode 100755 index 606755da81..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-cuda.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# Cuda -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 gcc/4.8.3 cuda/6.5.14 nvcc-wrapper/gnu -# -# The 'nvcc-wrapper' module should load a script that matches -# kokkos/bin/nvcc_wrapper -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=gcc" - -#----------------------------------------------------------------------------- -# Cuda using GNU, use the nvcc_wrapper to build CUDA source - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=g++" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=nvcc_wrapper" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - -# Pthread explicitly OFF, otherwise tribits will automatically turn it on - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# C++11 - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CXX11:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_CXX11:BOOL=ON" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/kokkos_dev/config-core-cxx11-omp.sh b/lib/kokkos/config/kokkos_dev/config-core-cxx11-omp.sh deleted file mode 100755 index b83a535416..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-cxx11-omp.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# C++11, OpenMP -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 gcc/4.8.3 -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=gcc" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=g++" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# Pthread explicitly OFF so tribits doesn't automatically activate - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# OpenMP - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_OpenMP:BOOL=ON" - -#----------------------------------------------------------------------------- -# C++11 - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CXX11:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_CXX11:BOOL=ON" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/kokkos_dev/config-core-dbg-none.sh b/lib/kokkos/config/kokkos_dev/config-core-dbg-none.sh deleted file mode 100755 index d2e06a4ebd..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-dbg-none.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 gcc/4.8.3 -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=gcc" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=g++" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# Kokkos Pthread explicitly OFF, TPL Pthread ON for gtest - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# C++11 - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CXX11:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_CXX11:BOOL=ON" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/kokkos_dev/config-core-intel-cuda-omp.sh b/lib/kokkos/config/kokkos_dev/config-core-intel-cuda-omp.sh deleted file mode 100755 index e2ab1f1c00..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-intel-cuda-omp.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# Intel, OpenMP, Cuda -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 cuda/7.0.4 intel/2015.0.090 nvcc-wrapper/intel -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=icc" - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=icpc" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=nvcc_wrapper" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUDA:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_CUSPARSE:BOOL=ON" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# Pthread explicitly OFF - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# OpenMP - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_OpenMP:BOOL=ON" - -#----------------------------------------------------------------------------- -# C++11 - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CXX11:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_CXX11:BOOL=ON" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/kokkos_dev/config-core-intel-omp.sh b/lib/kokkos/config/kokkos_dev/config-core-intel-omp.sh deleted file mode 100755 index fd56d41161..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-intel-omp.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# Intel, OpenMP -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 intel/13.SP1.1.106 -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=icc" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=icpc" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# Pthread explicitly OFF - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# OpenMP - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_OpenMP:BOOL=ON" - -#----------------------------------------------------------------------------- -# C++11 - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CXX11:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_CXX11:BOOL=ON" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/kokkos_dev/config-core-omp.sh b/lib/kokkos/config/kokkos_dev/config-core-omp.sh deleted file mode 100755 index f91ecd5254..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-omp.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# OpenMP -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 gcc/4.8.3 -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=gcc" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=g++" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# OpenMP - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_OpenMP:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_OpenMP:BOOL=ON" - -# Pthread explicitly OFF, otherwise tribits will automatically turn it on - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=OFF" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/kokkos_dev/config-core-threads-hwloc.sh b/lib/kokkos/config/kokkos_dev/config-core-threads-hwloc.sh deleted file mode 100755 index 19ab969023..0000000000 --- a/lib/kokkos/config/kokkos_dev/config-core-threads-hwloc.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/sh -# -# Copy this script, put it outside the Trilinos source directory, and -# build there. -# -#----------------------------------------------------------------------------- -# Building on 'kokkos-dev.sandia.gov' with enabled capabilities: -# -# Threads, hwloc -# -# module loaded on 'kokkos-dev.sandia.gov' for this build -# -# module load cmake/2.8.11.2 gcc/4.8.3 -# -#----------------------------------------------------------------------------- -# Source and installation directories: - -TRILINOS_SOURCE_DIR=${HOME}/Trilinos -TRILINOS_INSTALL_DIR=${HOME}/TrilinosInstall/`date +%F` - -CMAKE_CONFIGURE="" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_INSTALL_PREFIX=${TRILINOS_INSTALL_DIR}" - -#----------------------------------------------------------------------------- -# Debug/optimized - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=DEBUG" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_BOUNDS_CHECK:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_BUILD_TYPE:STRING=RELEASE" - -#----------------------------------------------------------------------------- - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_FLAGS:STRING=-Wall" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_C_COMPILER=gcc" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D CMAKE_CXX_COMPILER=g++" - -#----------------------------------------------------------------------------- -# Configure for Kokkos subpackages and tests: - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_Fortran:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_EXAMPLES:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TESTS:BOOL=ON" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosCore:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosContainers:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosAlgorithms:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_TpetraKernels:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_KokkosExample:BOOL=ON" - -#----------------------------------------------------------------------------- -# Hardware locality configuration: - -HWLOC_BASE_DIR="/home/projects/hwloc/1.7.1/host/gnu/4.7.3" - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_HWLOC:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_INCLUDE_DIRS:FILEPATH=${HWLOC_BASE_DIR}/include" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D HWLOC_LIBRARY_DIRS:FILEPATH=${HWLOC_BASE_DIR}/lib" - -#----------------------------------------------------------------------------- -# Pthread - -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D TPL_ENABLE_Pthread:BOOL=ON" -CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_Pthread:BOOL=ON" - -#----------------------------------------------------------------------------- -# C++11 - -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Trilinos_ENABLE_CXX11:BOOL=ON" -# CMAKE_CONFIGURE="${CMAKE_CONFIGURE} -D Kokkos_ENABLE_CXX11:BOOL=ON" - -#----------------------------------------------------------------------------- -# -# Remove CMake output files to force reconfigure from scratch. -# - -rm -rf CMake* Trilinos* packages Dart* Testing cmake_install.cmake MakeFile* - -# - -echo cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -cmake ${CMAKE_CONFIGURE} ${TRILINOS_SOURCE_DIR} - -#----------------------------------------------------------------------------- - diff --git a/lib/kokkos/config/nvcc_wrapper b/lib/kokkos/config/nvcc_wrapper deleted file mode 100755 index d339da4fcd..0000000000 --- a/lib/kokkos/config/nvcc_wrapper +++ /dev/null @@ -1,340 +0,0 @@ -#!/bin/bash -# -# This shell script (nvcc_wrapper) wraps both the host compiler and -# NVCC, if you are building legacy C or C++ code with CUDA enabled. -# The script remedies some differences between the interface of NVCC -# and that of the host compiler, in particular for linking. -# It also means that a legacy code doesn't need separate .cu files; -# it can just use .cpp files. -# -# Default settings: change those according to your machine. For -# example, you may have have two different wrappers with either icpc -# or g++ as their back-end compiler. The defaults can be overwritten -# by using the usual arguments (e.g., -arch=sm_30 -ccbin icpc). - -default_arch="sm_35" -#default_arch="sm_50" - -# -# The default C++ compiler. -# -host_compiler=${NVCC_WRAPPER_DEFAULT_COMPILER:-"g++"} -#host_compiler="icpc" -#host_compiler="/usr/local/gcc/4.8.3/bin/g++" -#host_compiler="/usr/local/gcc/4.9.1/bin/g++" - -# -# Internal variables -# - -# C++ files -cpp_files="" - -# Host compiler arguments -xcompiler_args="" - -# Cuda (NVCC) only arguments -cuda_args="" - -# Arguments for both NVCC and Host compiler -shared_args="" - -# Argument -c -compile_arg="" - -# Argument -o -output_arg="" - -# Linker arguments -xlinker_args="" - -# Object files passable to NVCC -object_files="" - -# Link objects for the host linker only -object_files_xlinker="" - -# Shared libraries with version numbers are not handled correctly by NVCC -shared_versioned_libraries_host="" -shared_versioned_libraries="" - -# Does the User set the architecture -arch_set=0 - -# Does the user overwrite the host compiler -ccbin_set=0 - -#Error code of compilation -error_code=0 - -# Do a dry run without actually compiling -dry_run=0 - -# Skip NVCC compilation and use host compiler directly -host_only=0 -host_only_args="" - -# Enable workaround for CUDA 6.5 for pragma ident -replace_pragma_ident=0 - -# Mark first host compiler argument -first_xcompiler_arg=1 - -temp_dir=${TMPDIR:-/tmp} - -# Check if we have an optimization argument already -optimization_applied=0 - -# Check if we have -std=c++X or --std=c++X already -stdcxx_applied=0 - -# Run nvcc a second time to generate dependencies if needed -depfile_separate=0 -depfile_output_arg="" -depfile_target_arg="" - -#echo "Arguments: $# $@" - -while [ $# -gt 0 ] -do - case $1 in - #show the executed command - --show|--nvcc-wrapper-show) - dry_run=1 - ;; - #run host compilation only - --host-only) - host_only=1 - ;; - #replace '#pragma ident' with '#ident' this is needed to compile OpenMPI due to a configure script bug and a non standardized behaviour of pragma with macros - --replace-pragma-ident) - replace_pragma_ident=1 - ;; - #handle source files to be compiled as cuda files - *.cpp|*.cxx|*.cc|*.C|*.c++|*.cu) - cpp_files="$cpp_files $1" - ;; - # Ensure we only have one optimization flag because NVCC doesn't allow muliple - -O*) - if [ $optimization_applied -eq 1 ]; then - echo "nvcc_wrapper - *warning* you have set multiple optimization flags (-O*), only the first is used because nvcc can only accept a single optimization setting." - else - shared_args="$shared_args $1" - optimization_applied=1 - fi - ;; - #Handle shared args (valid for both nvcc and the host compiler) - -D*|-I*|-L*|-l*|-g|--help|--version|-E|-M|-shared) - shared_args="$shared_args $1" - ;; - #Handle compilation argument - -c) - compile_arg="$1" - ;; - #Handle output argument - -o) - output_arg="$output_arg $1 $2" - shift - ;; - # Handle depfile arguments. We map them to a separate call to nvcc. - -MD|-MMD) - depfile_separate=1 - host_only_args="$host_only_args $1" - ;; - -MF) - depfile_output_arg="-o $2" - host_only_args="$host_only_args $1 $2" - shift - ;; - -MT) - depfile_target_arg="$1 $2" - host_only_args="$host_only_args $1 $2" - shift - ;; - #Handle known nvcc args - -gencode*|--dryrun|--verbose|--keep|--keep-dir*|-G|--relocatable-device-code*|-lineinfo|-expt-extended-lambda|--resource-usage|-Xptxas*) - cuda_args="$cuda_args $1" - ;; - #Handle more known nvcc args - --expt-extended-lambda|--expt-relaxed-constexpr) - cuda_args="$cuda_args $1" - ;; - #Handle known nvcc args that have an argument - -rdc|-maxrregcount|--default-stream) - cuda_args="$cuda_args $1 $2" - shift - ;; - #Handle c++11 - --std=c++11|-std=c++11|--std=c++14|-std=c++14|--std=c++1z|-std=c++1z) - if [ $stdcxx_applied -eq 1 ]; then - echo "nvcc_wrapper - *warning* you have set multiple optimization flags (-std=c++1* or --std=c++1*), only the first is used because nvcc can only accept a single std setting" - else - shared_args="$shared_args $1" - stdcxx_applied=1 - fi - ;; - - #strip of -std=c++98 due to nvcc warnings and Tribits will place both -std=c++11 and -std=c++98 - -std=c++98|--std=c++98) - ;; - #strip of pedantic because it produces endless warnings about #LINE added by the preprocessor - -pedantic|-Wpedantic|-ansi) - ;; - #strip of -Woverloaded-virtual to avoid "cc1: warning: command line option ‘-Woverloaded-virtual’ is valid for C++/ObjC++ but not for C" - -Woverloaded-virtual) - ;; - #strip -Xcompiler because we add it - -Xcompiler) - if [ $first_xcompiler_arg -eq 1 ]; then - xcompiler_args="$2" - first_xcompiler_arg=0 - else - xcompiler_args="$xcompiler_args,$2" - fi - shift - ;; - #strip of "-x cu" because we add that - -x) - if [[ $2 != "cu" ]]; then - if [ $first_xcompiler_arg -eq 1 ]; then - xcompiler_args="-x,$2" - first_xcompiler_arg=0 - else - xcompiler_args="$xcompiler_args,-x,$2" - fi - fi - shift - ;; - #Handle -ccbin (if its not set we can set it to a default value) - -ccbin) - cuda_args="$cuda_args $1 $2" - ccbin_set=1 - host_compiler=$2 - shift - ;; - #Handle -arch argument (if its not set use a default - -arch*) - cuda_args="$cuda_args $1" - arch_set=1 - ;; - #Handle -Xcudafe argument - -Xcudafe) - cuda_args="$cuda_args -Xcudafe $2" - shift - ;; - #Handle args that should be sent to the linker - -Wl*) - xlinker_args="$xlinker_args -Xlinker ${1:4:${#1}}" - host_linker_args="$host_linker_args ${1:4:${#1}}" - ;; - #Handle object files: -x cu applies to all input files, so give them to linker, except if only linking - *.a|*.so|*.o|*.obj) - object_files="$object_files $1" - object_files_xlinker="$object_files_xlinker -Xlinker $1" - ;; - #Handle object files which always need to use "-Xlinker": -x cu applies to all input files, so give them to linker, except if only linking - @*|*.dylib) - object_files="$object_files -Xlinker $1" - object_files_xlinker="$object_files_xlinker -Xlinker $1" - ;; - #Handle shared libraries with *.so.* names which nvcc can't do. - *.so.*) - shared_versioned_libraries_host="$shared_versioned_libraries_host $1" - shared_versioned_libraries="$shared_versioned_libraries -Xlinker $1" - ;; - #All other args are sent to the host compiler - *) - if [ $first_xcompiler_arg -eq 1 ]; then - xcompiler_args=$1 - first_xcompiler_arg=0 - else - xcompiler_args="$xcompiler_args,$1" - fi - ;; - esac - - shift -done - -#Add default host compiler if necessary -if [ $ccbin_set -ne 1 ]; then - cuda_args="$cuda_args -ccbin $host_compiler" -fi - -#Add architecture command -if [ $arch_set -ne 1 ]; then - cuda_args="$cuda_args -arch=$default_arch" -fi - -#Compose compilation command -nvcc_command="nvcc $cuda_args $shared_args $xlinker_args $shared_versioned_libraries" -if [ $first_xcompiler_arg -eq 0 ]; then - nvcc_command="$nvcc_command -Xcompiler $xcompiler_args" -fi - -#Compose host only command -host_command="$host_compiler $shared_args $host_only_args $compile_arg $output_arg $xcompiler_args $host_linker_args $shared_versioned_libraries_host" - -#nvcc does not accept '#pragma ident SOME_MACRO_STRING' but it does accept '#ident SOME_MACRO_STRING' -if [ $replace_pragma_ident -eq 1 ]; then - cpp_files2="" - for file in $cpp_files - do - var=`grep pragma ${file} | grep ident | grep "#"` - if [ "${#var}" -gt 0 ] - then - sed 's/#[\ \t]*pragma[\ \t]*ident/#ident/g' $file > $temp_dir/nvcc_wrapper_tmp_$file - cpp_files2="$cpp_files2 $temp_dir/nvcc_wrapper_tmp_$file" - else - cpp_files2="$cpp_files2 $file" - fi - done - cpp_files=$cpp_files2 - #echo $cpp_files -fi - -if [ "$cpp_files" ]; then - nvcc_command="$nvcc_command $object_files_xlinker -x cu $cpp_files" -else - nvcc_command="$nvcc_command $object_files" -fi - -if [ "$cpp_files" ]; then - host_command="$host_command $object_files $cpp_files" -else - host_command="$host_command $object_files" -fi - -if [ $depfile_separate -eq 1 ]; then - # run nvcc a second time to generate dependencies (without compiling) - nvcc_depfile_command="$nvcc_command -M $depfile_target_arg $depfile_output_arg" -else - nvcc_depfile_command="" -fi - -nvcc_command="$nvcc_command $compile_arg $output_arg" - -#Print command for dryrun -if [ $dry_run -eq 1 ]; then - if [ $host_only -eq 1 ]; then - echo $host_command - elif [ -n "$nvcc_depfile_command" ]; then - echo $nvcc_command "&&" $nvcc_depfile_command - else - echo $nvcc_command - fi - exit 0 -fi - -#Run compilation command -if [ $host_only -eq 1 ]; then - $host_command -elif [ -n "$nvcc_depfile_command" ]; then - $nvcc_command && $nvcc_depfile_command -else - $nvcc_command -fi -error_code=$? - -#Report error code -exit $error_code diff --git a/lib/kokkos/config/test_all_sandia b/lib/kokkos/config/test_all_sandia index 660ab91ff5..28b4a64b10 100755 --- a/lib/kokkos/config/test_all_sandia +++ b/lib/kokkos/config/test_all_sandia @@ -14,25 +14,52 @@ PROCESSOR=`uname -p` if [[ "$HOSTNAME" =~ (white|ride).* ]]; then MACHINE=white -elif [[ "$HOSTNAME" =~ .*bowman.* ]]; then + module load git +fi + +if [[ "$HOSTNAME" =~ .*bowman.* ]]; then MACHINE=bowman -elif [[ "$HOSTNAME" =~ n.* ]]; then # Warning: very generic name + module load git +fi + +if [[ "$HOSTNAME" =~ n.* ]]; then # Warning: very generic name if [[ "$PROCESSOR" = "aarch64" ]]; then MACHINE=sullivan + module load git fi -elif [[ "$HOSTNAME" =~ node.* ]]; then # Warning: very generic name +fi + +if [[ "$HOSTNAME" =~ node.* ]]; then # Warning: very generic name + if [[ "$MACHINE" = "" ]]; then MACHINE=shepard -elif [[ "$HOSTNAME" =~ apollo ]]; then + module load git + fi +fi + +if [[ "$HOSTNAME" =~ apollo ]]; then MACHINE=apollo -elif [[ "$HOSTNAME" =~ sullivan ]]; then + module load git +fi + +if [[ "$HOSTNAME" =~ sullivan ]]; then MACHINE=sullivan -elif [ ! -z "$SEMS_MODULEFILES_ROOT" ]; then - MACHINE=sems -else + module load git +fi + +if [ ! -z "$SEMS_MODULEFILES_ROOT" ]; then + if [[ "$MACHINE" = "" ]]; then + MACHINE=sems + module load sems-git + fi +fi + +if [[ "$MACHINE" = "" ]]; then echo "Unrecognized machine" >&2 exit 1 fi +echo "Running on machine: $MACHINE" + GCC_BUILD_LIST="OpenMP,Pthread,Serial,OpenMP_Serial,Pthread_Serial" IBM_BUILD_LIST="OpenMP,Serial,OpenMP_Serial" ARM_GCC_BUILD_LIST="OpenMP,Serial,OpenMP_Serial" @@ -45,7 +72,8 @@ GCC_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits IBM_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized" CLANG_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized" INTEL_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized" -CUDA_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized" +#CUDA_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Werror,-Wsign-compare,-Wtype-limits,-Wuninitialized" +CUDA_WARNING_FLAGS="-Wall,-Wshadow,-pedantic,-Wsign-compare,-Wtype-limits,-Wuninitialized" PGI_WARNING_FLAGS="" # Default. Machine specific can override. @@ -142,6 +170,18 @@ else KOKKOS_PATH=$( cd $KOKKOS_PATH && pwd ) fi +UNCOMMITTED=`cd ${KOKKOS_PATH}; git status --porcelain 2>/dev/null` +if ! [ -z "$UNCOMMITTED" ]; then + echo "WARNING!! THE FOLLOWING CHANGES ARE UNCOMMITTED!! :" + echo "$UNCOMMITTED" + echo "" +fi + +GITSTATUS=`cd ${KOKKOS_PATH}; git log -n 1 --format=oneline` +echo "Repository Status: " ${GITSTATUS} +echo "" +echo "" + # # Machine specific config. # @@ -149,7 +189,7 @@ fi if [ "$MACHINE" = "sems" ]; then source /projects/sems/modulefiles/utils/sems-modules-init.sh - BASE_MODULE_LIST="sems-env,kokkos-env,sems-/,kokkos-hwloc/1.10.1/base" + BASE_MODULE_LIST="sems-env,kokkos-env,kokkos-hwloc/1.10.1/base,sems-/" CUDA_MODULE_LIST="sems-env,kokkos-env,kokkos-/,sems-gcc/4.8.4,kokkos-hwloc/1.10.1/base" CUDA8_MODULE_LIST="sems-env,kokkos-env,kokkos-/,sems-gcc/5.3.0,kokkos-hwloc/1.10.1/base" @@ -178,9 +218,9 @@ if [ "$MACHINE" = "sems" ]; then "clang/3.7.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" "clang/3.8.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" "clang/3.9.0 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" - "cuda/7.0.28 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" - "cuda/7.5.18 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" - "cuda/8.0.44 $CUDA8_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" + "cuda/7.0.28 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" + "cuda/7.5.18 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" + "cuda/8.0.44 $CUDA8_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" ) fi elif [ "$MACHINE" = "white" ]; then @@ -191,14 +231,14 @@ elif [ "$MACHINE" = "white" ]; then BASE_MODULE_LIST="/" IBM_MODULE_LIST="/xl/" CUDA_MODULE_LIST="/,gcc/5.4.0" - CUDA_MODULE_LIST2="/,gcc/6.3.0,ibm/xl/13.1.6-BETA" + CUDA_MODULE_LIST2="/,gcc/6.3.0,ibm/xl/13.1.6" # Don't do pthread on white. GCC_BUILD_LIST="OpenMP,Serial,OpenMP_Serial" # Format: (compiler module-list build-list exe-name warning-flag) COMPILERS=("gcc/5.4.0 $BASE_MODULE_LIST $IBM_BUILD_LIST g++ $GCC_WARNING_FLAGS" - "ibm/13.1.3 $IBM_MODULE_LIST $IBM_BUILD_LIST xlC $IBM_WARNING_FLAGS" + "ibm/13.1.6 $IBM_MODULE_LIST $IBM_BUILD_LIST xlC $IBM_WARNING_FLAGS" "cuda/8.0.44 $CUDA_MODULE_LIST $CUDA_IBM_BUILD_LIST ${KOKKOS_PATH}/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" "cuda/9.0.103 $CUDA_MODULE_LIST2 $CUDA_IBM_BUILD_LIST ${KOKKOS_PATH}/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" ) @@ -281,7 +321,7 @@ elif [ "$MACHINE" = "apollo" ]; then CUDA_MODULE_LIST="sems-env,kokkos-env,kokkos-/,sems-gcc/4.8.4,kokkos-hwloc/1.10.1/base" CUDA8_MODULE_LIST="sems-env,kokkos-env,kokkos-/,sems-gcc/5.3.0,kokkos-hwloc/1.10.1/base" - CLANG_MODULE_LIST="sems-env,kokkos-env,sems-git,sems-cmake/3.5.2,/,cuda/8.0.44" + CLANG_MODULE_LIST="sems-env,kokkos-env,sems-git,sems-cmake/3.5.2,/,cuda/9.0.69" NVCC_MODULE_LIST="sems-env,kokkos-env,sems-git,sems-cmake/3.5.2,/,sems-gcc/5.3.0" BUILD_LIST_CUDA_NVCC="Cuda_Serial,Cuda_OpenMP" @@ -294,13 +334,13 @@ elif [ "$MACHINE" = "apollo" ]; then "gcc/5.1.0 $BASE_MODULE_LIST "Serial" g++ $GCC_WARNING_FLAGS" "intel/16.0.1 $BASE_MODULE_LIST "OpenMP" icpc $INTEL_WARNING_FLAGS" "clang/3.9.0 $BASE_MODULE_LIST "Pthread_Serial" clang++ $CLANG_WARNING_FLAGS" - "clang/4.0.0 $CLANG_MODULE_LIST "Cuda_Pthread" clang++ $CUDA_WARNING_FLAGS" - "cuda/8.0.44 $CUDA_MODULE_LIST "Cuda_OpenMP" $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" + "clang/6.0 $CLANG_MODULE_LIST "Cuda_Pthread" clang++ $CUDA_WARNING_FLAGS" + "cuda/9.1 $CUDA_MODULE_LIST "Cuda_OpenMP" $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" ) else # Format: (compiler module-list build-list exe-name warning-flag) - COMPILERS=("cuda/8.0.44 $CUDA8_MODULE_LIST $BUILD_LIST_CUDA_NVCC $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" - "clang/4.0.0 $CLANG_MODULE_LIST $BUILD_LIST_CUDA_CLANG clang++ $CUDA_WARNING_FLAGS" + COMPILERS=("cuda/9.1 $CUDA8_MODULE_LIST $BUILD_LIST_CUDA_NVCC $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" + "clang/6.0 $CLANG_MODULE_LIST $BUILD_LIST_CUDA_CLANG clang++ $CUDA_WARNING_FLAGS" "clang/3.9.0 $CLANG_MODULE_LIST $BUILD_LIST_CLANG clang++ $CLANG_WARNING_FLAGS" "gcc/4.8.4 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS" "gcc/4.9.3 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS" @@ -311,13 +351,11 @@ elif [ "$MACHINE" = "apollo" ]; then "intel/17.0.1 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS" "clang/3.5.2 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" "clang/3.6.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" - "cuda/7.0.28 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" - "cuda/7.5.18 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" ) fi if [ -z "$ARCH_FLAG" ]; then - ARCH_FLAG="--arch=SNB,Kepler35" + ARCH_FLAG="--arch=SNB,Volta70" fi NUM_JOBS_TO_RUN_IN_PARALLEL=2 @@ -700,17 +738,19 @@ wait_summarize_and_exit() { echo $passed_test $(cat $PASSED_DIR/$passed_test) done - echo "#######################################################" - echo "FAILED TESTS" - echo "#######################################################" - - local failed_test local -i rv=0 - for failed_test in $(\ls -1 $FAILED_DIR | sort) - do - echo $failed_test "("$(cat $FAILED_DIR/$failed_test)" failed)" - rv=$rv+1 - done + if [ "$(ls -A $FAILED_DIR)" ]; then + echo "#######################################################" + echo "FAILED TESTS" + echo "#######################################################" + + local failed_test + for failed_test in $(\ls -1 $FAILED_DIR | sort) + do + echo $failed_test "("$(cat $FAILED_DIR/$failed_test)" failed)" + rv=$rv+1 + done + fi exit $rv } diff --git a/lib/kokkos/containers/performance_tests/TestCuda.cpp b/lib/kokkos/containers/performance_tests/TestCuda.cpp index 208387425f..682f3f52f7 100644 --- a/lib/kokkos/containers/performance_tests/TestCuda.cpp +++ b/lib/kokkos/containers/performance_tests/TestCuda.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/containers/performance_tests/TestDynRankView.hpp b/lib/kokkos/containers/performance_tests/TestDynRankView.hpp index ced74c6f51..0d2fae32a3 100644 --- a/lib/kokkos/containers/performance_tests/TestDynRankView.hpp +++ b/lib/kokkos/containers/performance_tests/TestDynRankView.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -64,8 +64,8 @@ struct InitViewFunctor { KOKKOS_INLINE_FUNCTION void operator()(const int i) const { - for (unsigned j = 0; j < _inview.dimension(1); ++j) { - for (unsigned k = 0; k < _inview.dimension(2); ++k) { + for (unsigned j = 0; j < _inview.extent(1); ++j) { + for (unsigned k = 0; k < _inview.extent(2); ++k) { _inview(i,j,k) = i/2 -j*j + k/3; } } @@ -84,8 +84,8 @@ struct InitViewFunctor { KOKKOS_INLINE_FUNCTION void operator()(const int i) const { - for (unsigned j = 0; j < _inview.dimension(1); ++j) { - for (unsigned k = 0; k < _inview.dimension(2); ++k) { + for (unsigned j = 0; j < _inview.extent(1); ++j) { + for (unsigned k = 0; k < _inview.extent(2); ++k) { _outview(i) += _inview(i,j,k) ; } } @@ -104,8 +104,8 @@ struct InitStrideViewFunctor { KOKKOS_INLINE_FUNCTION void operator()(const int i) const { - for (unsigned j = 0; j < _inview.dimension(1); ++j) { - for (unsigned k = 0; k < _inview.dimension(2); ++k) { + for (unsigned j = 0; j < _inview.extent(1); ++j) { + for (unsigned k = 0; k < _inview.extent(2); ++k) { _inview(i,j,k) = i/2 -j*j + k/3; } } @@ -123,8 +123,8 @@ struct InitViewRank7Functor { KOKKOS_INLINE_FUNCTION void operator()(const int i) const { - for (unsigned j = 0; j < _inview.dimension(1); ++j) { - for (unsigned k = 0; k < _inview.dimension(2); ++k) { + for (unsigned j = 0; j < _inview.extent(1); ++j) { + for (unsigned k = 0; k < _inview.extent(2); ++k) { _inview(i,j,k,0,0,0,0) = i/2 -j*j + k/3; } } @@ -143,8 +143,8 @@ struct InitDynRankViewFunctor { KOKKOS_INLINE_FUNCTION void operator()(const int i) const { - for (unsigned j = 0; j < _inview.dimension(1); ++j) { - for (unsigned k = 0; k < _inview.dimension(2); ++k) { + for (unsigned j = 0; j < _inview.extent(1); ++j) { + for (unsigned k = 0; k < _inview.extent(2); ++k) { _inview(i,j,k) = i/2 -j*j + k/3; } } @@ -163,8 +163,8 @@ struct InitDynRankViewFunctor { KOKKOS_INLINE_FUNCTION void operator()(const int i) const { - for (unsigned j = 0; j < _inview.dimension(1); ++j) { - for (unsigned k = 0; k < _inview.dimension(2); ++k) { + for (unsigned j = 0; j < _inview.extent(1); ++j) { + for (unsigned k = 0; k < _inview.extent(2); ++k) { _outview(i) += _inview(i,j,k) ; } } diff --git a/lib/kokkos/containers/performance_tests/TestGlobal2LocalIds.hpp b/lib/kokkos/containers/performance_tests/TestGlobal2LocalIds.hpp index 66f1fbf092..dcaca776be 100644 --- a/lib/kokkos/containers/performance_tests/TestGlobal2LocalIds.hpp +++ b/lib/kokkos/containers/performance_tests/TestGlobal2LocalIds.hpp @@ -34,7 +34,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -76,7 +76,7 @@ struct generate_ids generate_ids( local_id_view & ids) : local_2_global(ids) { - Kokkos::parallel_for(local_2_global.dimension_0(), *this); + Kokkos::parallel_for(local_2_global.extent(0), *this); } @@ -116,7 +116,7 @@ struct fill_map fill_map( global_id_view gIds, local_id_view lIds) : global_2_local(gIds) , local_2_global(lIds) { - Kokkos::parallel_for(local_2_global.dimension_0(), *this); + Kokkos::parallel_for(local_2_global.extent(0), *this); } KOKKOS_INLINE_FUNCTION @@ -143,7 +143,7 @@ struct find_test find_test( global_id_view gIds, local_id_view lIds, value_type & num_errors) : global_2_local(gIds) , local_2_global(lIds) { - Kokkos::parallel_reduce(local_2_global.dimension_0(), *this, num_errors); + Kokkos::parallel_reduce(local_2_global.extent(0), *this, num_errors); } KOKKOS_INLINE_FUNCTION diff --git a/lib/kokkos/containers/performance_tests/TestMain.cpp b/lib/kokkos/containers/performance_tests/TestMain.cpp index 1224af7cdb..217b01a57a 100644 --- a/lib/kokkos/containers/performance_tests/TestMain.cpp +++ b/lib/kokkos/containers/performance_tests/TestMain.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/containers/performance_tests/TestOpenMP.cpp b/lib/kokkos/containers/performance_tests/TestOpenMP.cpp index 012f45bab7..66d497552e 100644 --- a/lib/kokkos/containers/performance_tests/TestOpenMP.cpp +++ b/lib/kokkos/containers/performance_tests/TestOpenMP.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/containers/performance_tests/TestROCm.cpp b/lib/kokkos/containers/performance_tests/TestROCm.cpp index 6647d23065..3cf9f3bd14 100644 --- a/lib/kokkos/containers/performance_tests/TestROCm.cpp +++ b/lib/kokkos/containers/performance_tests/TestROCm.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/containers/performance_tests/TestScatterView.hpp b/lib/kokkos/containers/performance_tests/TestScatterView.hpp index 4fd69173c0..03129d2b09 100644 --- a/lib/kokkos/containers/performance_tests/TestScatterView.hpp +++ b/lib/kokkos/containers/performance_tests/TestScatterView.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/containers/performance_tests/TestThreads.cpp b/lib/kokkos/containers/performance_tests/TestThreads.cpp index a8910a3c72..a951a5ca56 100644 --- a/lib/kokkos/containers/performance_tests/TestThreads.cpp +++ b/lib/kokkos/containers/performance_tests/TestThreads.cpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/containers/performance_tests/TestUnorderedMapPerformance.hpp b/lib/kokkos/containers/performance_tests/TestUnorderedMapPerformance.hpp index 93a206c996..e8734b259d 100644 --- a/lib/kokkos/containers/performance_tests/TestUnorderedMapPerformance.hpp +++ b/lib/kokkos/containers/performance_tests/TestUnorderedMapPerformance.hpp @@ -34,7 +34,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER diff --git a/lib/kokkos/containers/src/Kokkos_Bitset.hpp b/lib/kokkos/containers/src/Kokkos_Bitset.hpp index 7714506e92..c48058d75d 100644 --- a/lib/kokkos/containers/src/Kokkos_Bitset.hpp +++ b/lib/kokkos/containers/src/Kokkos_Bitset.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -147,7 +147,7 @@ public: if (m_last_block_mask) { //clear the unused bits in the last block typedef Kokkos::Impl::DeepCopy< typename execution_space::memory_space, Kokkos::HostSpace > raw_deep_copy; - raw_deep_copy( m_blocks.ptr_on_device() + (m_blocks.dimension_0() -1u), &m_last_block_mask, sizeof(unsigned)); + raw_deep_copy( m_blocks.data() + (m_blocks.extent(0) -1u), &m_last_block_mask, sizeof(unsigned)); } } @@ -212,7 +212,7 @@ public: KOKKOS_FORCEINLINE_FUNCTION unsigned max_hint() const { - return m_blocks.dimension_0(); + return m_blocks.extent(0); } /// find a bit set to 1 near the hint @@ -221,10 +221,10 @@ public: KOKKOS_INLINE_FUNCTION Kokkos::pair find_any_set_near( unsigned hint , unsigned scan_direction = BIT_SCAN_FORWARD_MOVE_HINT_FORWARD ) const { - const unsigned block_idx = (hint >> block_shift) < m_blocks.dimension_0() ? (hint >> block_shift) : 0; + const unsigned block_idx = (hint >> block_shift) < m_blocks.extent(0) ? (hint >> block_shift) : 0; const unsigned offset = hint & block_mask; unsigned block = volatile_load(&m_blocks[ block_idx ]); - block = !m_last_block_mask || (block_idx < (m_blocks.dimension_0()-1)) ? block : block & m_last_block_mask ; + block = !m_last_block_mask || (block_idx < (m_blocks.extent(0)-1)) ? block : block & m_last_block_mask ; return find_any_helper(block_idx, offset, block, scan_direction); } @@ -238,7 +238,7 @@ public: const unsigned block_idx = hint >> block_shift; const unsigned offset = hint & block_mask; unsigned block = volatile_load(&m_blocks[ block_idx ]); - block = !m_last_block_mask || (block_idx < (m_blocks.dimension_0()-1) ) ? ~block : ~block & m_last_block_mask ; + block = !m_last_block_mask || (block_idx < (m_blocks.extent(0)-1) ) ? ~block : ~block & m_last_block_mask ; return find_any_helper(block_idx, offset, block, scan_direction); } @@ -281,8 +281,8 @@ private: unsigned update_hint( long long block_idx, unsigned offset, unsigned scan_direction ) const { block_idx += scan_direction & MOVE_HINT_BACKWARD ? -1 : 1; - block_idx = block_idx >= 0 ? block_idx : m_blocks.dimension_0() - 1; - block_idx = block_idx < static_cast(m_blocks.dimension_0()) ? block_idx : 0; + block_idx = block_idx >= 0 ? block_idx : m_blocks.extent(0) - 1; + block_idx = block_idx < static_cast(m_blocks.extent(0)) ? block_idx : 0; return static_cast(block_idx)*block_size + offset; } @@ -407,7 +407,7 @@ void deep_copy( Bitset & dst, Bitset const& src) } typedef Kokkos::Impl::DeepCopy< typename DstDevice::memory_space, typename SrcDevice::memory_space > raw_deep_copy; - raw_deep_copy(dst.m_blocks.ptr_on_device(), src.m_blocks.ptr_on_device(), sizeof(unsigned)*src.m_blocks.dimension_0()); + raw_deep_copy(dst.m_blocks.data(), src.m_blocks.data(), sizeof(unsigned)*src.m_blocks.extent(0)); } template @@ -418,7 +418,7 @@ void deep_copy( Bitset & dst, ConstBitset const& src) } typedef Kokkos::Impl::DeepCopy< typename DstDevice::memory_space, typename SrcDevice::memory_space > raw_deep_copy; - raw_deep_copy(dst.m_blocks.ptr_on_device(), src.m_blocks.ptr_on_device(), sizeof(unsigned)*src.m_blocks.dimension_0()); + raw_deep_copy(dst.m_blocks.data(), src.m_blocks.data(), sizeof(unsigned)*src.m_blocks.extent(0)); } template @@ -429,7 +429,7 @@ void deep_copy( ConstBitset & dst, ConstBitset const& src) } typedef Kokkos::Impl::DeepCopy< typename DstDevice::memory_space, typename SrcDevice::memory_space > raw_deep_copy; - raw_deep_copy(dst.m_blocks.ptr_on_device(), src.m_blocks.ptr_on_device(), sizeof(unsigned)*src.m_blocks.dimension_0()); + raw_deep_copy(dst.m_blocks.data(), src.m_blocks.data(), sizeof(unsigned)*src.m_blocks.extent(0)); } } // namespace Kokkos diff --git a/lib/kokkos/containers/src/Kokkos_DualView.hpp b/lib/kokkos/containers/src/Kokkos_DualView.hpp index 35cc8ec753..74fe4418f8 100644 --- a/lib/kokkos/containers/src/Kokkos_DualView.hpp +++ b/lib/kokkos/containers/src/Kokkos_DualView.hpp @@ -35,7 +35,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER @@ -262,14 +262,14 @@ public: modified_host (View ("DualView::modified_host")) { if ( int(d_view.rank) != int(h_view.rank) || - d_view.dimension_0() != h_view.dimension_0() || - d_view.dimension_1() != h_view.dimension_1() || - d_view.dimension_2() != h_view.dimension_2() || - d_view.dimension_3() != h_view.dimension_3() || - d_view.dimension_4() != h_view.dimension_4() || - d_view.dimension_5() != h_view.dimension_5() || - d_view.dimension_6() != h_view.dimension_6() || - d_view.dimension_7() != h_view.dimension_7() || + d_view.extent(0) != h_view.extent(0) || + d_view.extent(1) != h_view.extent(1) || + d_view.extent(2) != h_view.extent(2) || + d_view.extent(3) != h_view.extent(3) || + d_view.extent(4) != h_view.extent(4) || + d_view.extent(5) != h_view.extent(5) || + d_view.extent(6) != h_view.extent(6) || + d_view.extent(7) != h_view.extent(7) || d_view.stride_0() != h_view.stride_0() || d_view.stride_1() != h_view.stride_1() || d_view.stride_2() != h_view.stride_2() || @@ -503,6 +503,18 @@ public: /* Realloc on Device */ ::Kokkos::realloc(d_view,n0,n1,n2,n3,n4,n5,n6,n7); + + const bool sizeMismatch = ( h_view.extent(0) != n0 ) || + ( h_view.extent(1) != n1 ) || + ( h_view.extent(2) != n2 ) || + ( h_view.extent(3) != n3 ) || + ( h_view.extent(4) != n4 ) || + ( h_view.extent(5) != n5 ) || + ( h_view.extent(6) != n6 ) || + ( h_view.extent(7) != n7 ); + if ( sizeMismatch ) + ::Kokkos::resize(h_view,n0,n1,n2,n3,n4,n5,n6,n7); + t_host temp_view = create_mirror_view( d_view ); /* Remap on Host */ @@ -510,6 +522,8 @@ public: h_view = temp_view; + d_view = create_mirror_view( typename t_dev::execution_space(), h_view ); + /* Mark Host copy as modified */ modified_host() = modified_host()+1; } @@ -530,22 +544,34 @@ public: d_view.stride(stride_); } + template< typename iType > + KOKKOS_INLINE_FUNCTION constexpr + typename std::enable_if< std::is_integral::value , size_t >::type + extent( const iType & r ) const + { return d_view.extent(r); } + + template< typename iType > + KOKKOS_INLINE_FUNCTION constexpr + typename std::enable_if< std::is_integral::value , int >::type + extent_int( const iType & r ) const + { return static_cast(d_view.extent(r)); } + /* \brief return size of dimension 0 */ - size_t dimension_0() const {return d_view.dimension_0();} + size_t dimension_0() const {return d_view.extent(0);} /* \brief return size of dimension 1 */ - size_t dimension_1() const {return d_view.dimension_1();} + size_t dimension_1() const {return d_view.extent(1);} /* \brief return size of dimension 2 */ - size_t dimension_2() const {return d_view.dimension_2();} + size_t dimension_2() const {return d_view.extent(2);} /* \brief return size of dimension 3 */ - size_t dimension_3() const {return d_view.dimension_3();} + size_t dimension_3() const {return d_view.extent(3);} /* \brief return size of dimension 4 */ - size_t dimension_4() const {return d_view.dimension_4();} + size_t dimension_4() const {return d_view.extent(4);} /* \brief return size of dimension 5 */ - size_t dimension_5() const {return d_view.dimension_5();} + size_t dimension_5() const {return d_view.extent(5);} /* \brief return size of dimension 6 */ - size_t dimension_6() const {return d_view.dimension_6();} + size_t dimension_6() const {return d_view.extent(6);} /* \brief return size of dimension 7 */ - size_t dimension_7() const {return d_view.dimension_7();} + size_t dimension_7() const {return d_view.extent(7);} //@} }; diff --git a/lib/kokkos/containers/src/Kokkos_DynRankView.hpp b/lib/kokkos/containers/src/Kokkos_DynRankView.hpp index d22d6b865d..ccf53b3d50 100644 --- a/lib/kokkos/containers/src/Kokkos_DynRankView.hpp +++ b/lib/kokkos/containers/src/Kokkos_DynRankView.hpp @@ -35,16 +35,16 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) // // ************************************************************************ //@HEADER */ /// \file Kokkos_DynRankView.hpp -/// \brief Declaration and definition of Kokkos::Experimental::DynRankView. +/// \brief Declaration and definition of Kokkos::DynRankView. /// -/// This header file declares and defines Kokkos::Experimental::DynRankView and its +/// This header file declares and defines Kokkos::DynRankView and its /// related nonmember functions. #ifndef KOKKOS_DYNRANKVIEW_HPP @@ -55,7 +55,6 @@ #include namespace Kokkos { -namespace Experimental { template< typename DataType , class ... Properties > class DynRankView; //forward declare @@ -156,7 +155,7 @@ struct DynRankDimTraits { // Extra overload to match that for specialize types template KOKKOS_INLINE_FUNCTION - static typename std::enable_if< (std::is_same::value || std::is_same::value || std::is_same::value) , typename Traits::array_layout >::type createLayout( const ViewCtorProp& prop, const typename Traits::array_layout& layout ) + static typename std::enable_if< (std::is_same::value || std::is_same::value || std::is_same::value) , typename Traits::array_layout >::type createLayout( const Kokkos::Impl::ViewCtorProp& prop, const typename Traits::array_layout& layout ) { return createLayout( layout ); } @@ -318,7 +317,6 @@ void dyn_rank_view_verify_operator_bounds struct ViewToDynRankViewTag {}; } // namespace Impl -} // namespace Experimental namespace Impl { @@ -348,7 +346,7 @@ class ViewMapping< DstTraits , SrcTraits , ) ) ) - ) , Kokkos::Experimental::Impl::ViewToDynRankViewTag >::type > + ) , Kokkos::Impl::ViewToDynRankViewTag >::type > { private: @@ -375,7 +373,7 @@ public: template < typename DT , typename ... DP , typename ST , typename ... SP > KOKKOS_INLINE_FUNCTION - static void assign( Kokkos::Experimental::DynRankView< DT , DP...> & dst , const Kokkos::View< ST , SP... > & src ) + static void assign( Kokkos::DynRankView< DT , DP...> & dst , const Kokkos::View< ST , SP... > & src ) { static_assert( is_assignable_value_type , "View assignment must have same value type or const = non-const" ); @@ -395,8 +393,6 @@ public: } //end Impl -namespace Experimental { - /* \class DynRankView * \brief Container that creates a Kokkos view with rank determined at runtime. * Essentially this is a rank 7 view @@ -415,7 +411,7 @@ namespace Experimental { template< class > struct is_dyn_rank_view : public std::false_type {}; template< class D, class ... P > -struct is_dyn_rank_view< Kokkos::Experimental::DynRankView > : public std::true_type {}; +struct is_dyn_rank_view< Kokkos::DynRankView > : public std::true_type {}; template< typename DataType , class ... Properties > @@ -425,7 +421,7 @@ class DynRankView : public ViewTraits< DataType , Properties ... > private: template < class , class ... > friend class DynRankView ; - template < class , class ... > friend class Impl::ViewMapping ; + template < class , class ... > friend class Kokkos::Impl::ViewMapping ; public: typedef ViewTraits< DataType , Properties ... > drvtraits ; @@ -437,7 +433,7 @@ public: private: typedef Kokkos::Impl::ViewMapping< traits , void > map_type ; - typedef Kokkos::Experimental::Impl::SharedAllocationTracker track_type ; + typedef Kokkos::Impl::SharedAllocationTracker track_type ; track_type m_track ; map_type m_map ; @@ -601,7 +597,7 @@ private: // rank of the calling operator - included as first argument in ARG #define KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( ARG ) \ DynRankView::template verify_space< Kokkos::Impl::ActiveExecutionMemorySpace >::check(); \ - Kokkos::Experimental::Impl::dyn_rank_view_verify_operator_bounds< typename traits::memory_space > ARG ; + Kokkos::Impl::dyn_rank_view_verify_operator_bounds< typename traits::memory_space > ARG ; #else @@ -778,6 +774,140 @@ public: return m_map.reference(i0,i1,i2,i3,i4,i5,i6); } + // Rank 0 + KOKKOS_INLINE_FUNCTION + reference_type access() const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (0 , this->rank(), m_track, m_map) ) + return implementation_map().reference(); + //return m_map.reference(0,0,0,0,0,0,0); + } + + // Rank 1 + // Rank 1 parenthesis + template< typename iType > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< (std::is_same::value && std::is_integral::value), reference_type>::type + access(const iType & i0 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank(), m_track, m_map, i0) ) + return m_map.reference(i0); + } + + template< typename iType > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type + access(const iType & i0 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank(), m_track, m_map, i0) ) + return m_map.reference(i0,0,0,0,0,0,0); + } + + // Rank 2 + template< typename iType0 , typename iType1 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank(), m_track, m_map, i0, i1) ) + return m_map.reference(i0,i1); + } + + template< typename iType0 , typename iType1 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank(), m_track, m_map, i0, i1) ) + return m_map.reference(i0,i1,0,0,0,0,0); + } + + // Rank 3 + template< typename iType0 , typename iType1 , typename iType2 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank(), m_track, m_map, i0, i1, i2) ) + return m_map.reference(i0,i1,i2); + } + + template< typename iType0 , typename iType1 , typename iType2 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank(), m_track, m_map, i0, i1, i2) ) + return m_map.reference(i0,i1,i2,0,0,0,0); + } + + // Rank 4 + template< typename iType0 , typename iType1 , typename iType2 , typename iType3 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank(), m_track, m_map, i0, i1, i2, i3) ) + return m_map.reference(i0,i1,i2,i3); + } + + template< typename iType0 , typename iType1 , typename iType2 , typename iType3 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank(), m_track, m_map, i0, i1, i2, i3) ) + return m_map.reference(i0,i1,i2,i3,0,0,0); + } + + // Rank 5 + template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4) ) + return m_map.reference(i0,i1,i2,i3,i4); + } + + template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4) ) + return m_map.reference(i0,i1,i2,i3,i4,0,0); + } + + // Rank 6 + template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5) ) + return m_map.reference(i0,i1,i2,i3,i4,i5); + } + + template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5) ) + return m_map.reference(i0,i1,i2,i3,i4,i5,0); + } + + // Rank 7 + template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 , typename iType6 > + KOKKOS_INLINE_FUNCTION + typename std::enable_if< (std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type + access(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 , const iType6 & i6 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (7 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5, i6) ) + return m_map.reference(i0,i1,i2,i3,i4,i5,i6); + } + #undef KOKKOS_IMPL_VIEW_OPERATOR_VERIFY //---------------------------------------- @@ -830,7 +960,6 @@ public: return *this; } -// Experimental // Copy/Assign View to DynRankView template< class RT , class ... RP > KOKKOS_INLINE_FUNCTION @@ -840,7 +969,7 @@ public: , m_rank( rhs.Rank ) { typedef typename View::traits SrcTraits ; - typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Experimental::Impl::ViewToDynRankViewTag > Mapping ; + typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Impl::ViewToDynRankViewTag > Mapping ; static_assert( Mapping::is_assignable , "Incompatible DynRankView copy construction" ); Mapping::assign( *this , rhs ); } @@ -850,7 +979,7 @@ public: DynRankView & operator = ( const View & rhs ) { typedef typename View::traits SrcTraits ; - typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Experimental::Impl::ViewToDynRankViewTag > Mapping ; + typedef Kokkos::Impl::ViewMapping< traits , SrcTraits , Kokkos::Impl::ViewToDynRankViewTag > Mapping ; static_assert( Mapping::is_assignable , "Incompatible View to DynRankView copy assignment" ); Mapping::assign( *this , rhs ); return *this ; @@ -872,8 +1001,8 @@ public: // unused arg_layout dimensions must be set to ~size_t(0) so that rank deduction can properly take place template< class ... P > explicit inline - DynRankView( const Impl::ViewCtorProp< P ... > & arg_prop - , typename std::enable_if< ! Impl::ViewCtorProp< P... >::has_pointer + DynRankView( const Kokkos::Impl::ViewCtorProp< P ... > & arg_prop + , typename std::enable_if< ! Kokkos::Impl::ViewCtorProp< P... >::has_pointer , typename traits::array_layout >::type const & arg_layout ) @@ -882,11 +1011,11 @@ public: , m_rank( Impl::DynRankDimTraits::template computeRank< typename traits::array_layout, P...>(arg_prop, arg_layout) ) { // Append layout and spaces if not input - typedef Impl::ViewCtorProp< P ... > alloc_prop_input ; + typedef Kokkos::Impl::ViewCtorProp< P ... > alloc_prop_input ; // use 'std::integral_constant' for non-types // to avoid duplicate class error. - typedef Impl::ViewCtorProp + typedef Kokkos::Impl::ViewCtorProp < P ... , typename std::conditional < alloc_prop_input::has_label @@ -931,7 +1060,7 @@ public: #endif //------------------------------------------------------------ - Kokkos::Experimental::Impl::SharedAllocationRecord<> * + Kokkos::Impl::SharedAllocationRecord<> * record = m_map.allocate_shared( prop , Impl::DynRankDimTraits::template createLayout(arg_prop, arg_layout) ); //------------------------------------------------------------ @@ -950,8 +1079,8 @@ public: // Wrappers template< class ... P > explicit KOKKOS_INLINE_FUNCTION - DynRankView( const Impl::ViewCtorProp< P ... > & arg_prop - , typename std::enable_if< Impl::ViewCtorProp< P... >::has_pointer + DynRankView( const Kokkos::Impl::ViewCtorProp< P ... > & arg_prop + , typename std::enable_if< Kokkos::Impl::ViewCtorProp< P... >::has_pointer , typename traits::array_layout >::type const & arg_layout ) @@ -972,8 +1101,8 @@ public: // Simple dimension-only layout template< class ... P > explicit inline - DynRankView( const Impl::ViewCtorProp< P ... > & arg_prop - , typename std::enable_if< ! Impl::ViewCtorProp< P... >::has_pointer + DynRankView( const Kokkos::Impl::ViewCtorProp< P ... > & arg_prop + , typename std::enable_if< ! Kokkos::Impl::ViewCtorProp< P... >::has_pointer , size_t >::type const arg_N0 = ~size_t(0) , const size_t arg_N1 = ~size_t(0) @@ -992,8 +1121,8 @@ public: template< class ... P > explicit KOKKOS_INLINE_FUNCTION - DynRankView( const Impl::ViewCtorProp< P ... > & arg_prop - , typename std::enable_if< Impl::ViewCtorProp< P... >::has_pointer + DynRankView( const Kokkos::Impl::ViewCtorProp< P ... > & arg_prop + , typename std::enable_if< Kokkos::Impl::ViewCtorProp< P... >::has_pointer , size_t >::type const arg_N0 = ~size_t(0) , const size_t arg_N1 = ~size_t(0) @@ -1015,10 +1144,10 @@ public: explicit inline DynRankView( const Label & arg_label , typename std::enable_if< - Kokkos::Experimental::Impl::is_view_label

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 _PY%a^4FgUp@ZN1@z15o{-1?+( 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≻6Y>)t_6x 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 diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index ce76b3b9eb..5a4e8b617a 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -195,7 +195,7 @@ int colvar::init(std::string const &conf) // - it is homogeneous // - all cvcs are periodic // - all cvcs have the same period - if (cvcs[0]->b_periodic) { // TODO make this a CVC feature + if (is_enabled(f_cv_homogeneous) && cvcs[0]->b_periodic) { // TODO make this a CVC feature bool b_periodic = true; period = cvcs[0]->period; for (i = 1; i < cvcs.size(); i++) { diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 20dad2771b..32c329460d 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -11,8 +11,6 @@ #define COLVAR_H #include -#include -#include #include "colvarmodule.h" #include "colvarvalue.h" @@ -60,10 +58,13 @@ public: /// \brief Current actual value (not extended DOF) colvarvalue const & actual_value() const; - + + /// \brief Current running average (if calculated as set by analysis flag) + colvarvalue const & run_ave() const; + /// \brief Force constant of the spring cvm::real const & force_constant() const; - + /// \brief Current velocity (previously set by calc() or by read_traj()) colvarvalue const & velocity() const; @@ -516,7 +517,7 @@ public: // collective variable component base class class cvc; - // currently available collective variable components + // list of available collective variable components // scalar colvar components class distance; @@ -611,12 +612,15 @@ inline colvarvalue const & colvar::value() const return x_reported; } - inline colvarvalue const & colvar::actual_value() const { return x; } +inline colvarvalue const & colvar::run_ave() const +{ + return runave; +} inline colvarvalue const & colvar::velocity() const { diff --git a/lib/colvars/colvar_UIestimator.h b/lib/colvars/colvar_UIestimator.h index 7fc7f870a1..36ed938119 100644 --- a/lib/colvars/colvar_UIestimator.h +++ b/lib/colvars/colvar_UIestimator.h @@ -45,7 +45,7 @@ namespace UIestimator { this->width = width; this->dimension = lowerboundary.size(); this->y_size = y_size; // keep in mind the internal (spare) matrix is stored in diagonal form - this->y_total_size = int(pow(double(y_size), dimension) + EPSILON); + this->y_total_size = int(std::pow(double(y_size), double(dimension)) + EPSILON); // the range of the matrix is [lowerboundary, upperboundary] x_total_size = 1; @@ -121,7 +121,7 @@ namespace UIestimator { int index = 0; for (i = 0; i < dimension; i++) { if (i + 1 < dimension) - index += temp[i] * int(pow(double(y_size), dimension - i - 1) + EPSILON); + index += temp[i] * int(std::pow(double(y_size), double(dimension - i - 1)) + EPSILON); else index += temp[i]; } diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index d2a0f0a807..1be6f42e59 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -8,9 +8,11 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarparse.h" #include "colvaratoms.h" + cvm::atom::atom() { index = -1; diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index 71c587e230..0dda6ab792 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -11,6 +11,7 @@ #define COLVARATOMS_H #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarparse.h" #include "colvardeps.h" diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index 301e83e730..29620fbee8 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -8,6 +8,7 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarvalue.h" #include "colvarbias.h" #include "colvargrid.h" diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index e4aea8eb86..b3b5b3eb16 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -8,6 +8,7 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_abf.h" @@ -18,16 +19,18 @@ colvarbias_abf::colvarbias_abf(char const *key) b_CZAR_estimator(false), system_force(NULL), gradients(NULL), + pmf(NULL), samples(NULL), z_gradients(NULL), z_samples(NULL), czar_gradients(NULL), + czar_pmf(NULL), last_gradients(NULL), - last_samples(NULL) + last_samples(NULL), + pabf_freq(0) { } - int colvarbias_abf::init(std::string const &conf) { colvarbias::init(conf); @@ -91,7 +94,7 @@ int colvarbias_abf::init(std::string const &conf) // ************* checking the associated colvars ******************* - if (colvars.size() == 0) { + if (num_variables() == 0) { cvm::error("Error: no collective variables specified for the ABF bias.\n"); return COLVARS_ERROR; } @@ -102,7 +105,8 @@ int colvarbias_abf::init(std::string const &conf) } bool b_extended = false; - for (size_t i = 0; i < colvars.size(); i++) { + size_t i; + for (i = 0; i < num_variables(); i++) { if (colvars[i]->value().type() != colvarvalue::type_scalar) { cvm::error("Error: ABF bias can only use scalar-type variables.\n"); @@ -132,10 +136,10 @@ int colvarbias_abf::init(std::string const &conf) } if (get_keyval(conf, "maxForce", max_force)) { - if (max_force.size() != colvars.size()) { + if (max_force.size() != num_variables()) { cvm::error("Error: Number of parameters to maxForce does not match number of colvars."); } - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { if (max_force[i] < 0.0) { cvm::error("Error: maxForce should be non-negative."); } @@ -145,9 +149,9 @@ int colvarbias_abf::init(std::string const &conf) cap_force = false; } - bin.assign(colvars.size(), 0); - force_bin.assign(colvars.size(), 0); - system_force = new cvm::real [colvars.size()]; + bin.assign(num_variables(), 0); + force_bin.assign(num_variables(), 0); + system_force = new cvm::real [num_variables()]; // Construct empty grids based on the colvars if (cvm::debug()) { @@ -159,14 +163,14 @@ int colvarbias_abf::init(std::string const &conf) gradients->samples = samples; samples->has_parent_data = true; - // Data for eABF z-based estimator - if (b_extended) { + // Data for eAB F z-based estimator + if ( b_extended ) { get_keyval(conf, "CZARestimator", b_CZAR_estimator, true); // CZAR output files for stratified eABF get_keyval(conf, "writeCZARwindowFile", b_czar_window_file, false, colvarparse::parse_silent); - z_bin.assign(colvars.size(), 0); + z_bin.assign(num_variables(), 0); z_samples = new colvar_grid_count(colvars); z_samples->request_actual_value(); z_gradients = new colvar_grid_gradient(colvars); @@ -176,6 +180,27 @@ int colvarbias_abf::init(std::string const &conf) czar_gradients = new colvar_grid_gradient(colvars); } + // For now, we integrate on-the-fly iff the grid is < 3D + if ( num_variables() <= 3 ) { + pmf = new integrate_potential(colvars, gradients); + if ( b_CZAR_estimator ) { + czar_pmf = new integrate_potential(colvars, czar_gradients); + } + get_keyval(conf, "integrate", b_integrate, true); // Integrate for output + if ( num_variables() > 1 ) { + // Projected ABF + get_keyval(conf, "pABFintegrateFreq", pabf_freq, 0); + // Parameters for integrating initial (and final) gradient data + get_keyval(conf, "integrateInitSteps", integrate_initial_steps, 1e4); + get_keyval(conf, "integrateInitTol", integrate_initial_tol, 1e-6); + // for updating the integrated PMF on the fly + get_keyval(conf, "integrateSteps", integrate_steps, 100); + get_keyval(conf, "integrateTol", integrate_tol, 1e-4); + } + } else { + b_integrate = false; + } + // For shared ABF, we store a second set of grids. // This used to be only if "shared" was defined, // but now we allow calling share externally (e.g. from Tcl). @@ -188,6 +213,8 @@ int colvarbias_abf::init(std::string const &conf) // If custom grids are provided, read them if ( input_prefix.size() > 0 ) { read_gradients_samples(); + // Update divergence to account for input data + pmf->set_div(); } // if extendedLangrangian is on, then call UI estimator @@ -202,7 +229,7 @@ int colvarbias_abf::init(std::string const &conf) bool UI_restart = (input_prefix.size() > 0); - for (size_t i = 0; i < colvars.size(); i++) + for (i = 0; i < num_variables(); i++) { UI_lowerboundary.push_back(colvars[i]->lower_boundary); UI_upperboundary.push_back(colvars[i]->upper_boundary); @@ -238,6 +265,11 @@ colvarbias_abf::~colvarbias_abf() gradients = NULL; } + if (pmf) { + delete pmf; + pmf = NULL; + } + if (z_samples) { delete z_samples; z_samples = NULL; @@ -253,6 +285,11 @@ colvarbias_abf::~colvarbias_abf() czar_gradients = NULL; } + if (czar_pmf) { + delete czar_pmf; + czar_pmf = NULL; + } + // shared ABF // We used to only do this if "shared" was defined, // but now we can call shared externally @@ -278,44 +315,48 @@ colvarbias_abf::~colvarbias_abf() int colvarbias_abf::update() { - if (cvm::debug()) cvm::log("Updating ABF bias " + this->name); + int iter; - if (cvm::step_relative() == 0) { - - // At first timestep, do only: - // initialization stuff (file operations relying on n_abf_biases - // compute current value of colvars - - for (size_t i = 0; i < colvars.size(); i++) { - bin[i] = samples->current_bin_scalar(i); - } + if (cvm::debug()) cvm::log("Updating ABF bias " + this->name); - } else { + size_t i; + for (i = 0; i < num_variables(); i++) { + bin[i] = samples->current_bin_scalar(i); + } + if (cvm::proxy->total_forces_same_step()) { + // e.g. in LAMMPS, total forces are current + force_bin = bin; + } - for (size_t i = 0; i < colvars.size(); i++) { - bin[i] = samples->current_bin_scalar(i); - } + if (cvm::step_relative() > 0 || cvm::proxy->total_forces_same_step()) { - if ( update_bias && samples->index_ok(force_bin) ) { - // Only if requested and within bounds of the grid... + if (update_bias) { +// if (b_adiabatic_reweighting) { +// // Update gradients non-locally based on conditional distribution of +// // fictitious variable TODO +// +// } else + if (samples->index_ok(force_bin)) { + // Only if requested and within bounds of the grid... - for (size_t i = 0; i < colvars.size(); i++) { - // get total forces (lagging by 1 timestep) from colvars - // and subtract previous ABF force if necessary - update_system_force(i); - } - if (cvm::proxy->total_forces_same_step()) { - // e.g. in LAMMPS, total forces are current - force_bin = bin; + for (i = 0; i < num_variables(); i++) { + // get total forces (lagging by 1 timestep) from colvars + // and subtract previous ABF force if necessary + update_system_force(i); + } + gradients->acc_force(force_bin, system_force); + if ( b_integrate ) { + pmf->update_div_neighbors(force_bin); + } } - gradients->acc_force(force_bin, system_force); } + if ( z_gradients && update_bias ) { - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { z_bin[i] = z_samples->current_bin_scalar(i); } if ( z_samples->index_ok(z_bin) ) { - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { // If we are outside the range of xi, the force has not been obtained above // the function is just an accessor, so cheap to call again anyway update_system_force(i); @@ -323,6 +364,14 @@ int colvarbias_abf::update() z_gradients->acc_force(z_bin, system_force); } } + + if ( b_integrate ) { + if ( pabf_freq && cvm::step_relative() % pabf_freq == 0 ) { + cvm::real err; + iter = pmf->integrate(integrate_steps, integrate_tol, err); + pmf->set_zero_minimum(); // TODO: do this only when necessary + } + } } if (!cvm::proxy->total_forces_same_step()) { @@ -332,14 +381,14 @@ int colvarbias_abf::update() } // Reset biasing forces from previous timestep - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_forces[i].reset(); } // Compute and apply the new bias, if applicable if (is_enabled(f_cvb_apply_force) && samples->index_ok(bin)) { - size_t count = samples->value(bin); + cvm::real count = samples->value(bin); cvm::real fact = 1.0; // Factor that ensures smooth introduction of the force @@ -348,21 +397,34 @@ int colvarbias_abf::update() (cvm::real(count - min_samples)) / (cvm::real(full_samples - min_samples)); } - const cvm::real * grad = &(gradients->value(bin)); + std::vector grad(num_variables()); + if ( pabf_freq ) { + // In projected ABF, the force is the PMF gradient estimate + pmf->vector_gradient_finite_diff(bin, grad); + } else { + // Normal ABF + gradients->vector_value(bin, grad); + } + +// if ( b_adiabatic_reweighting) { +// // Average of force according to conditional distribution of fictitious variable +// // need freshly integrated PMF, gradient TODO +// } else if ( fact != 0.0 ) { - if ( (colvars.size() == 1) && colvars[0]->periodic_boundaries() ) { + if ( (num_variables() == 1) && colvars[0]->periodic_boundaries() ) { // Enforce a zero-mean bias on periodic, 1D coordinates // in other words: boundary condition is that the biasing potential is periodic - colvar_forces[0].real_value = fact * (grad[0] / cvm::real(count) - gradients->average()); + // This is enforced naturally if using integrated PMF + colvar_forces[0].real_value = fact * (grad[0] - gradients->average ()); } else { - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { // subtracting the mean force (opposite of the FE gradient) means adding the gradient - colvar_forces[i].real_value = fact * grad[i] / cvm::real(count); + colvar_forces[i].real_value = fact * grad[i]; } } if (cap_force) { - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { if ( colvar_forces[i].real_value * colvar_forces[i].real_value > max_force[i] * max_force[i] ) { colvar_forces[i].real_value = (colvar_forces[i].real_value > 0 ? max_force[i] : -1.0 * max_force[i]); } @@ -407,9 +469,9 @@ int colvarbias_abf::update() // update UI estimator every step if (b_UI_estimator) { - std::vector x(colvars.size(),0); - std::vector y(colvars.size(),0); - for (size_t i = 0; i < colvars.size(); i++) + std::vector x(num_variables(),0); + std::vector y(num_variables(),0); + for (size_t i = 0; i < num_variables(); i++) { x[i] = colvars[i]->actual_value(); y[i] = colvars[i]->value(); @@ -509,26 +571,60 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(samples_out_name, mode); if (!samples_os) { cvm::error("Error opening ABF samples file " + samples_out_name + " for writing"); + return; } samples->write_multicol(*samples_os); cvm::proxy->close_output_stream(samples_out_name); + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string samples_dx_out_name = prefix + ".count.dx"; + std::ostream *samples_dx_os = cvm::proxy->output_stream(samples_dx_out_name, mode); + if (!samples_os) { + cvm::error("Error opening samples file " + samples_dx_out_name + " for writing"); + return; + } + samples->write_opendx(*samples_dx_os); + *samples_dx_os << std::endl; + cvm::proxy->close_output_stream(samples_dx_out_name); + } + std::ostream *gradients_os = cvm::proxy->output_stream(gradients_out_name, mode); if (!gradients_os) { cvm::error("Error opening ABF gradient file " + gradients_out_name + " for writing"); + return; } gradients->write_multicol(*gradients_os); cvm::proxy->close_output_stream(gradients_out_name); - if (colvars.size() == 1) { - // Do numerical integration and output a PMF + if (b_integrate) { + // Do numerical integration (to high precision) and output a PMF + cvm::real err; + pmf->integrate(integrate_initial_steps, integrate_initial_tol, err); + pmf->set_zero_minimum(); + std::string pmf_out_name = prefix + ".pmf"; std::ostream *pmf_os = cvm::proxy->output_stream(pmf_out_name, mode); if (!pmf_os) { cvm::error("Error opening pmf file " + pmf_out_name + " for writing"); + return; + } + pmf->write_multicol(*pmf_os); + + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string pmf_dx_out_name = prefix + ".pmf.dx"; + std::ostream *pmf_dx_os = cvm::proxy->output_stream(pmf_dx_out_name, mode); + if (!pmf_dx_os) { + cvm::error("Error opening pmf file " + pmf_dx_out_name + " for writing"); + return; + } + pmf->write_opendx(*pmf_dx_os); + *pmf_dx_os << std::endl; + cvm::proxy->close_output_stream(pmf_dx_out_name); } - gradients->write_1D_integral(*pmf_os); + *pmf_os << std::endl; cvm::proxy->close_output_stream(pmf_out_name); } @@ -542,6 +638,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(z_samples_out_name, mode); if (!z_samples_os) { cvm::error("Error opening eABF z-histogram file " + z_samples_out_name + " for writing"); + return; } z_samples->write_multicol(*z_samples_os); cvm::proxy->close_output_stream(z_samples_out_name); @@ -553,6 +650,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(z_gradients_out_name, mode); if (!z_gradients_os) { cvm::error("Error opening eABF z-gradient file " + z_gradients_out_name + " for writing"); + return; } z_gradients->write_multicol(*z_gradients_os); cvm::proxy->close_output_stream(z_gradients_out_name); @@ -563,8 +661,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app czar_gradients->index_ok(ix); czar_gradients->incr(ix)) { for (size_t n = 0; n < czar_gradients->multiplicity(); n++) { czar_gradients->set_value(ix, z_gradients->value_output(ix, n) - - cvm::temperature() * cvm::boltzmann() * z_samples->log_gradient_finite_diff(ix, n), - n); + - cvm::temperature() * cvm::boltzmann() * z_samples->log_gradient_finite_diff(ix, n), n); } } @@ -574,17 +671,39 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app cvm::proxy->output_stream(czar_gradients_out_name, mode); if (!czar_gradients_os) { cvm::error("Error opening CZAR gradient file " + czar_gradients_out_name + " for writing"); + return; } czar_gradients->write_multicol(*czar_gradients_os); cvm::proxy->close_output_stream(czar_gradients_out_name); - if (colvars.size() == 1) { - // Do numerical integration and output a PMF + if (b_integrate) { + // Do numerical integration (to high precision) and output a PMF + cvm::real err; + czar_pmf->set_div(); + czar_pmf->integrate(integrate_initial_steps, integrate_initial_tol, err); + czar_pmf->set_zero_minimum(); + std::string czar_pmf_out_name = prefix + ".czar.pmf"; - std::ostream *czar_pmf_os = - cvm::proxy->output_stream(czar_pmf_out_name, mode); - if (!czar_pmf_os) cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); - czar_gradients->write_1D_integral(*czar_pmf_os); + std::ostream *czar_pmf_os = cvm::proxy->output_stream(czar_pmf_out_name, mode); + if (!czar_pmf_os) { + cvm::error("Error opening CZAR pmf file " + czar_pmf_out_name + " for writing"); + return; + } + czar_pmf->write_multicol(*czar_pmf_os); + + // In dimension higher than 2, dx is easier to handle and visualize + if (num_variables() > 2) { + std::string czar_pmf_dx_out_name = prefix + ".czar.pmf.dx"; + std::ostream *czar_pmf_dx_os = cvm::proxy->output_stream(czar_pmf_dx_out_name, mode); + if (!czar_pmf_dx_os) { + cvm::error("Error opening CZAR pmf file " + czar_pmf_dx_out_name + " for writing"); + return; + } + czar_pmf->write_opendx(*czar_pmf_dx_os); + *czar_pmf_dx_os << std::endl; + cvm::proxy->close_output_stream(czar_pmf_dx_out_name); + } + *czar_pmf_os << std::endl; cvm::proxy->close_output_stream(czar_pmf_out_name); } @@ -708,6 +827,10 @@ std::istream & colvarbias_abf::read_state_data(std::istream& is) if (! gradients->read_raw(is)) { return is; } + if (b_integrate) { + // Update divergence to account for restart data + pmf->set_div(); + } if (b_CZAR_estimator) { diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index 1defe72268..0260401292 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -40,28 +40,44 @@ private: /// Base filename(s) for reading previous gradient data (replaces data from restart file) std::vector input_prefix; - bool update_bias; - bool hide_Jacobian; - size_t full_samples; - size_t min_samples; + bool update_bias; + bool hide_Jacobian; + bool b_integrate; + + size_t full_samples; + size_t min_samples; /// frequency for updating output files - int output_freq; + int output_freq; /// Write combined files with a history of all output data? - bool b_history_files; + bool b_history_files; /// Write CZAR output file for stratified eABF (.zgrad) - bool b_czar_window_file; - size_t history_freq; + bool b_czar_window_file; + size_t history_freq; /// Umbrella Integration estimator of free energy from eABF UIestimator::UIestimator eabf_UI; - // Run UI estimator? - bool b_UI_estimator; - // Run CZAR estimator? - bool b_CZAR_estimator; - - /// Cap applied biasing force? + /// Run UI estimator? + bool b_UI_estimator; + /// Run CZAR estimator? + bool b_CZAR_estimator; + + /// Frequency for updating pABF PMF (if zero, pABF is not used) + int pabf_freq; + /// Max number of CG iterations for integrating PMF at startup and for file output + int integrate_initial_steps; + /// Tolerance for integrating PMF at startup and for file output + cvm::real integrate_initial_tol; + /// Max number of CG iterations for integrating PMF at on-the-fly pABF updates + int integrate_steps; + /// Tolerance for integrating PMF at on-the-fly pABF updates + cvm::real integrate_tol; + + /// Cap the biasing force to be applied? bool cap_force; std::vector max_force; + // Frequency for updating 2D gradients + int integrate_freq; + // Internal data and methods std::vector bin, force_bin, z_bin; @@ -71,12 +87,16 @@ private: colvar_grid_gradient *gradients; /// n-dim grid of number of samples colvar_grid_count *samples; + /// n-dim grid of pmf (dimension 1 to 3) + integrate_potential *pmf; /// n-dim grid: average force on "real" coordinate for eABF z-based estimator colvar_grid_gradient *z_gradients; /// n-dim grid of number of samples on "real" coordinate for eABF z-based estimator colvar_grid_count *z_samples; /// n-dim grid contining CZAR estimator of "real" free energy gradients colvar_grid_gradient *czar_gradients; + /// n-dim grid of CZAR pmf (dimension 1 to 3) + integrate_potential *czar_pmf; inline int update_system_force(size_t i) { @@ -96,9 +116,9 @@ private: } // shared ABF - bool shared_on; - size_t shared_freq; - int shared_last_step; + bool shared_on; + size_t shared_freq; + int shared_last_step; // Share between replicas -- may be called independently of update virtual int replica_share(); @@ -114,12 +134,12 @@ private: //// Give the count at a given bin index. virtual int bin_count(int bin_index); - /// Write human-readable FE gradients and sample count - void write_gradients_samples(const std::string &prefix, bool append = false); - void write_last_gradients_samples(const std::string &prefix, bool append = false); + /// Write human-readable FE gradients and sample count, and DX file in dim > 2 + void write_gradients_samples(const std::string &prefix, bool append = false); + void write_last_gradients_samples(const std::string &prefix, bool append = false); /// Read human-readable FE gradients and sample count (if not using restart) - void read_gradients_samples(); + void read_gradients_samples(); std::istream& read_state_data(std::istream&); std::ostream& write_state_data(std::ostream&); diff --git a/lib/colvars/colvarbias_alb.cpp b/lib/colvars/colvarbias_alb.cpp index 124a15c5da..187ecc363a 100644 --- a/lib/colvars/colvarbias_alb.cpp +++ b/lib/colvars/colvarbias_alb.cpp @@ -7,13 +7,11 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. -#include -#include -#include +#include #include "colvarmodule.h" -#include "colvarbias_alb.h" #include "colvarbias.h" +#include "colvarbias_alb.h" #ifdef _MSC_VER #if _MSC_VER <= 1700 @@ -45,22 +43,22 @@ int colvarbias_alb::init(std::string const &conf) size_t i; // get the initial restraint centers - colvar_centers.resize(colvars.size()); + colvar_centers.resize(num_variables()); - means.resize(colvars.size()); - ssd.resize(colvars.size()); //sum of squares of differences from mean + means.resize(num_variables()); + ssd.resize(num_variables()); //sum of squares of differences from mean //setup force vectors - max_coupling_range.resize(colvars.size()); - max_coupling_rate.resize(colvars.size()); - coupling_accum.resize(colvars.size()); - set_coupling.resize(colvars.size()); - current_coupling.resize(colvars.size()); - coupling_rate.resize(colvars.size()); + max_coupling_range.resize(num_variables()); + max_coupling_rate.resize(num_variables()); + coupling_accum.resize(num_variables()); + set_coupling.resize(num_variables()); + current_coupling.resize(num_variables()); + coupling_rate.resize(num_variables()); enable(f_cvb_apply_force); - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_centers[i].type(colvars[i]->value()); //zero moments means[i] = ssd[i] = 0; @@ -70,7 +68,7 @@ int colvarbias_alb::init(std::string const &conf) } if (get_keyval(conf, "centers", colvar_centers, colvar_centers)) { - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvar_centers[i].apply_constraints(); } } else { @@ -78,7 +76,7 @@ int colvarbias_alb::init(std::string const &conf) cvm::fatal_error("Error: must define the initial centers of adaptive linear bias .\n"); } - if (colvar_centers.size() != colvars.size()) + if (colvar_centers.size() != num_variables()) cvm::fatal_error("Error: number of centers does not match " "that of collective variables.\n"); @@ -100,17 +98,17 @@ int colvarbias_alb::init(std::string const &conf) //initial guess if (!get_keyval(conf, "forceConstant", set_coupling, set_coupling)) - for (i =0 ; i < colvars.size(); i++) + for (i =0 ; i < num_variables(); i++) set_coupling[i] = 0.; //how we're going to increase to that point - for (i = 0; i < colvars.size(); i++) + for (i = 0; i < num_variables(); i++) coupling_rate[i] = (set_coupling[i] - current_coupling[i]) / update_freq; if (!get_keyval(conf, "forceRange", max_coupling_range, max_coupling_range)) { //set to default - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { if (cvm::temperature() > 0) max_coupling_range[i] = 3 * cvm::temperature() * cvm::boltzmann(); else @@ -120,7 +118,7 @@ int colvarbias_alb::init(std::string const &conf) if (!get_keyval(conf, "rateMax", max_coupling_rate, max_coupling_rate)) { //set to default - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { max_coupling_rate[i] = max_coupling_range[i] / (10 * update_freq); } } @@ -151,7 +149,7 @@ int colvarbias_alb::update() // Force and energy calculation bool finished_equil_flag = 1; cvm::real delta; - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { colvar_forces[i] = -1.0 * restraint_force(restraint_convert_k(current_coupling[i], colvars[i]->width), colvars[i], colvar_centers[i]); @@ -168,7 +166,9 @@ int colvarbias_alb::update() } else { //check if we've reached the setpoint - if (coupling_rate[i] == 0 || pow(current_coupling[i] - set_coupling[i],2) < pow(coupling_rate[i],2)) { + cvm::real const coupling_diff = current_coupling[i] - set_coupling[i]; + if ((coupling_rate[i] == 0) || + ((coupling_diff*coupling_diff) < (coupling_rate[i]*coupling_rate[i]))) { finished_equil_flag &= 1; //we continue equilibrating as long as we haven't reached all the set points } else { @@ -209,7 +209,7 @@ int colvarbias_alb::update() cvm::real temp; //reset means and sum of squares of differences - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { temp = 2. * (means[i] / (static_cast (colvar_centers[i])) - 1) * ssd[i] / (update_calls - 1); @@ -222,7 +222,7 @@ int colvarbias_alb::update() ssd[i] = 0; //stochastic if we do that update or not - if (colvars.size() == 1 || rand() < RAND_MAX / ((int) colvars.size())) { + if (num_variables() == 1 || rand() < RAND_MAX / ((int) num_variables())) { coupling_accum[i] += step_size * step_size; current_coupling[i] = set_coupling[i]; set_coupling[i] += max_coupling_range[i] / sqrt(coupling_accum[i]) * step_size; @@ -284,37 +284,37 @@ std::string const colvarbias_alb::get_state_params() const std::ostringstream os; os << " setCoupling "; size_t i; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << set_coupling[i] << "\n"; } os << " currentCoupling "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << current_coupling[i] << "\n"; } os << " maxCouplingRange "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << max_coupling_range[i] << "\n"; } os << " couplingRate "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << coupling_rate[i] << "\n"; } os << " couplingAccum "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << coupling_accum[i] << "\n"; } os << " mean "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << means[i] << "\n"; } os << " ssd "; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << ssd[i] << "\n"; } @@ -350,7 +350,7 @@ std::ostream & colvarbias_alb::write_traj_label(std::ostream &os) } if (b_output_centers) - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { size_t const this_cv_width = (colvars[i]->value()).output_width(cvm::cv_width); os << " x0_" << cvm::wrap_string(colvars[i]->name, this_cv_width-3); @@ -378,7 +378,7 @@ std::ostream & colvarbias_alb::write_traj(std::ostream &os) if (b_output_centers) - for (size_t i = 0; i < colvars.size(); i++) { + for (size_t i = 0; i < num_variables(); i++) { os << " " << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) << colvar_centers[i]; diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 0722e6384d..329b1d9dc0 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -8,10 +8,10 @@ // Colvars repository at GitHub. #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_histogram.h" -/// Histogram "bias" constructor colvarbias_histogram::colvarbias_histogram(char const *key) : colvarbias(key), @@ -44,7 +44,7 @@ int colvarbias_histogram::init(std::string const &conf) get_keyval(conf, "gatherVectorColvars", colvar_array, colvar_array); if (colvar_array) { - for (i = 0; i < colvars.size(); i++) { // should be all vector + for (i = 0; i < num_variables(); i++) { // should be all vector if (colvars[i]->value().type() != colvarvalue::type_vector) { cvm::error("Error: used gatherVectorColvars with non-vector colvar.\n", INPUT_ERROR); return INPUT_ERROR; @@ -63,7 +63,7 @@ int colvarbias_histogram::init(std::string const &conf) } } } else { - for (i = 0; i < colvars.size(); i++) { // should be all scalar + for (i = 0; i < num_variables(); i++) { // should be all scalar if (colvars[i]->value().type() != colvarvalue::type_scalar) { cvm::error("Error: only scalar colvars are supported when gatherVectorColvars is off.\n", INPUT_ERROR); return INPUT_ERROR; @@ -77,7 +77,7 @@ int colvarbias_histogram::init(std::string const &conf) get_keyval(conf, "weights", weights, weights); } - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { colvars[i]->enable(f_cv_grid); } @@ -116,7 +116,7 @@ int colvarbias_histogram::update() } // assign a valid bin size - bin.assign(colvars.size(), 0); + bin.assign(num_variables(), 0); if (out_name.size() == 0) { // At the first timestep, we need to assign out_name since @@ -137,7 +137,7 @@ int colvarbias_histogram::update() if (colvar_array_size == 0) { // update indices for scalar values size_t i; - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { bin[i] = grid->current_bin_scalar(i); } @@ -148,7 +148,7 @@ int colvarbias_histogram::update() // update indices for vector/array values size_t iv, i; for (iv = 0; iv < colvar_array_size; iv++) { - for (i = 0; i < colvars.size(); i++) { + for (i = 0; i < num_variables(); i++) { bin[i] = grid->current_bin_scalar(i, iv); } diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index b0d154dfc9..f3ae3631a0 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -27,7 +27,8 @@ #define PATHSEP "/" #endif - +#include "colvarmodule.h" +#include "colvarproxy.h" #include "colvar.h" #include "colvarbias_meta.h" diff --git a/lib/colvars/colvarbias_restraint.cpp b/lib/colvars/colvarbias_restraint.cpp index 23534f56eb..4ed1a95f94 100644 --- a/lib/colvars/colvarbias_restraint.cpp +++ b/lib/colvars/colvarbias_restraint.cpp @@ -7,7 +7,10 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. +#include + #include "colvarmodule.h" +#include "colvarproxy.h" #include "colvarvalue.h" #include "colvarbias_restraint.h" @@ -150,13 +153,14 @@ colvarbias_restraint_k::colvarbias_restraint_k(char const *key) : colvarbias(key), colvarbias_ti(key), colvarbias_restraint(key) { force_k = -1.0; + check_positive_k = true; } int colvarbias_restraint_k::init(std::string const &conf) { get_keyval(conf, "forceConstant", force_k, (force_k > 0.0 ? force_k : 1.0)); - if (force_k < 0.0) { + if (check_positive_k && (force_k < 0.0)) { cvm::error("Error: undefined or invalid force constant.\n", INPUT_ERROR); return INPUT_ERROR; } @@ -177,6 +181,7 @@ colvarbias_restraint_moving::colvarbias_restraint_moving(char const *key) target_nstages = 0; target_nsteps = 0; stage = 0; + acc_work = 0.0; b_chg_centers = false; b_chg_force_k = false; } @@ -203,6 +208,14 @@ int colvarbias_restraint_moving::init(std::string const &conf) cvm::error("Error: targetNumStages and lambdaSchedule are incompatible.\n", INPUT_ERROR); return cvm::get_error(); } + + get_keyval_feature(this, conf, "outputAccumulatedWork", + f_cvb_output_acc_work, + is_enabled(f_cvb_output_acc_work)); + if (is_enabled(f_cvb_output_acc_work) && (target_nstages > 0)) { + return cvm::error("Error: outputAccumulatedWork and targetNumStages " + "are incompatible.\n", INPUT_ERROR); + } } return COLVARS_OK; @@ -246,8 +259,6 @@ colvarbias_restraint_centers_moving::colvarbias_restraint_centers_moving(char co { b_chg_centers = false; b_output_centers = false; - b_output_acc_work = false; - acc_work = 0.0; } @@ -288,9 +299,6 @@ int colvarbias_restraint_centers_moving::init(std::string const &conf) 0.5); } - get_keyval(conf, "outputAccumulatedWork", b_output_acc_work, - b_output_acc_work); // TODO this conflicts with stages - } else { target_centers.clear(); } @@ -382,12 +390,14 @@ int colvarbias_restraint_centers_moving::update() int colvarbias_restraint_centers_moving::update_acc_work() { - if (b_output_acc_work) { - if ((cvm::step_relative() > 0) && - (cvm::step_absolute() <= target_nsteps)) { - for (size_t i = 0; i < num_variables(); i++) { - // project forces on the calculated increments at this step - acc_work += colvar_forces[i] * centers_incr[i]; + if (b_chg_centers) { + if (is_enabled(f_cvb_output_acc_work)) { + if ((cvm::step_relative() > 0) && + (cvm::step_absolute() <= target_nsteps)) { + for (size_t i = 0; i < num_variables(); i++) { + // project forces on the calculated increments at this step + acc_work += colvar_forces[i] * centers_incr[i]; + } } } } @@ -410,7 +420,7 @@ std::string const colvarbias_restraint_centers_moving::get_state_params() const } os << "\n"; - if (b_output_acc_work) { + if (is_enabled(f_cvb_output_acc_work)) { os << "accumulatedWork " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << acc_work << "\n"; @@ -429,7 +439,7 @@ int colvarbias_restraint_centers_moving::set_state_params(std::string const &con // cvm::log ("Reading the updated restraint centers from the restart.\n"); if (!get_keyval(conf, "centers", colvar_centers)) cvm::error("Error: restraint centers are missing from the restart.\n"); - if (b_output_acc_work) { + if (is_enabled(f_cvb_output_acc_work)) { if (!get_keyval(conf, "accumulatedWork", acc_work)) cvm::error("Error: accumulatedWork is missing from the restart.\n"); } @@ -449,7 +459,7 @@ std::ostream & colvarbias_restraint_centers_moving::write_traj_label(std::ostrea } } - if (b_output_acc_work) { + if (b_chg_centers && is_enabled(f_cvb_output_acc_work)) { os << " W_" << cvm::wrap_string(this->name, cvm::en_width-2); } @@ -468,7 +478,7 @@ std::ostream & colvarbias_restraint_centers_moving::write_traj(std::ostream &os) } } - if (b_output_acc_work) { + if (b_chg_centers && is_enabled(f_cvb_output_acc_work)) { os << " " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << acc_work; @@ -488,10 +498,11 @@ colvarbias_restraint_k_moving::colvarbias_restraint_k_moving(char const *key) { b_chg_force_k = false; target_equil_steps = 0; - target_force_k = 0.0; - starting_force_k = 0.0; + target_force_k = -1.0; + starting_force_k = -1.0; force_k_exp = 1.0; restraint_FE = 0.0; + force_k_incr = 0.0; } @@ -569,14 +580,13 @@ int colvarbias_restraint_k_moving::update() if (target_equil_steps == 0 || cvm::step_absolute() % target_nsteps >= target_equil_steps) { // Start averaging after equilibration period, if requested - // Square distance normalized by square colvar width - cvm::real dist_sq = 0.0; + // Derivative of energy with respect to force_k + cvm::real dU_dk = 0.0; for (size_t i = 0; i < num_variables(); i++) { - dist_sq += d_restraint_potential_dk(i); + dU_dk += d_restraint_potential_dk(i); } - - restraint_FE += 0.5 * force_k_exp * std::pow(lambda, force_k_exp - 1.0) - * (target_force_k - starting_force_k) * dist_sq; + restraint_FE += force_k_exp * std::pow(lambda, force_k_exp - 1.0) + * (target_force_k - starting_force_k) * dU_dk; } // Finish current stage... @@ -607,10 +617,13 @@ int colvarbias_restraint_k_moving::update() } else if (cvm::step_absolute() <= target_nsteps) { + // update force constant (slow growth) lambda = cvm::real(cvm::step_absolute()) / cvm::real(target_nsteps); + cvm::real const force_k_old = force_k; force_k = starting_force_k + (target_force_k - starting_force_k) * std::pow(lambda, force_k_exp); + force_k_incr = force_k - force_k_old; } } @@ -618,6 +631,23 @@ int colvarbias_restraint_k_moving::update() } +int colvarbias_restraint_k_moving::update_acc_work() +{ + if (b_chg_force_k) { + if (is_enabled(f_cvb_output_acc_work)) { + if (cvm::step_relative() > 0) { + cvm::real dU_dk = 0.0; + for (size_t i = 0; i < num_variables(); i++) { + dU_dk += d_restraint_potential_dk(i); + } + acc_work += dU_dk * force_k_incr; + } + } + } + return COLVARS_OK; +} + + std::string const colvarbias_restraint_k_moving::get_state_params() const { std::ostringstream os; @@ -626,6 +656,12 @@ std::string const colvarbias_restraint_k_moving::get_state_params() const os << "forceConstant " << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) << force_k << "\n"; + + if (is_enabled(f_cvb_output_acc_work)) { + os << "accumulatedWork " + << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) + << acc_work << "\n"; + } } return os.str(); } @@ -639,6 +675,10 @@ int colvarbias_restraint_k_moving::set_state_params(std::string const &conf) // cvm::log ("Reading the updated force constant from the restart.\n"); if (!get_keyval(conf, "forceConstant", force_k, force_k)) cvm::error("Error: force constant is missing from the restart.\n"); + if (is_enabled(f_cvb_output_acc_work)) { + if (!get_keyval(conf, "accumulatedWork", acc_work)) + cvm::error("Error: accumulatedWork is missing from the restart.\n"); + } } return COLVARS_OK; @@ -647,12 +687,21 @@ int colvarbias_restraint_k_moving::set_state_params(std::string const &conf) std::ostream & colvarbias_restraint_k_moving::write_traj_label(std::ostream &os) { + if (b_chg_force_k && is_enabled(f_cvb_output_acc_work)) { + os << " W_" + << cvm::wrap_string(this->name, cvm::en_width-2); + } return os; } std::ostream & colvarbias_restraint_k_moving::write_traj(std::ostream &os) { + if (b_chg_force_k && is_enabled(f_cvb_output_acc_work)) { + os << " " + << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width) + << acc_work; + } return os; } @@ -765,6 +814,7 @@ int colvarbias_restraint_harmonic::update() // update accumulated work using the current forces error_code |= colvarbias_restraint_centers_moving::update_acc_work(); + error_code |= colvarbias_restraint_k_moving::update_acc_work(); return error_code; } @@ -876,8 +926,8 @@ colvarbias_restraint_harmonic_walls::colvarbias_restraint_harmonic_walls(char co colvarbias_restraint_moving(key), colvarbias_restraint_k_moving(key) { - lower_wall_k = 0.0; - upper_wall_k = 0.0; + lower_wall_k = -1.0; + upper_wall_k = -1.0; } @@ -887,26 +937,6 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) colvarbias_restraint_moving::init(conf); colvarbias_restraint_k_moving::init(conf); - get_keyval(conf, "lowerWallConstant", lower_wall_k, - (lower_wall_k > 0.0) ? lower_wall_k : force_k); - get_keyval(conf, "upperWallConstant", upper_wall_k, - (upper_wall_k > 0.0) ? upper_wall_k : force_k); - - if (lower_wall_k * upper_wall_k > 0.0) { - for (size_t i = 0; i < num_variables(); i++) { - if (variables(i)->width != 1.0) - cvm::log("The lower and upper wall force constants for colvar \""+ - variables(i)->name+ - "\" will be rescaled to "+ - cvm::to_str(lower_wall_k / - (variables(i)->width * variables(i)->width))+ - " and "+ - cvm::to_str(upper_wall_k / - (variables(i)->width * variables(i)->width))+ - " according to the specified width.\n"); - } - } - enable(f_cvb_scalar_variables); size_t i; @@ -942,16 +972,23 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) } if ((lower_walls.size() == 0) && (upper_walls.size() == 0)) { - cvm::error("Error: no walls provided.\n", INPUT_ERROR); - return INPUT_ERROR; + return cvm::error("Error: no walls provided.\n", INPUT_ERROR); + } + + if (lower_walls.size() > 0) { + get_keyval(conf, "lowerWallConstant", lower_wall_k, + (lower_wall_k > 0.0) ? lower_wall_k : force_k); + } + if (upper_walls.size() > 0) { + get_keyval(conf, "upperWallConstant", upper_wall_k, + (upper_wall_k > 0.0) ? upper_wall_k : force_k); } if ((lower_walls.size() == 0) || (upper_walls.size() == 0)) { for (i = 0; i < num_variables(); i++) { if (variables(i)->is_enabled(f_cv_periodic)) { - cvm::error("Error: at least one variable is periodic, " - "both walls must be provided.\n", INPUT_ERROR); - return INPUT_ERROR; + return cvm::error("Error: at least one variable is periodic, " + "both walls must be provided.\n", INPUT_ERROR); } } } @@ -972,19 +1009,49 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf) INPUT_ERROR); return INPUT_ERROR; } - force_k = lower_wall_k * upper_wall_k; - // transform the two constants to relative values + force_k = std::sqrt(lower_wall_k * upper_wall_k); + // transform the two constants to relative values using gemetric mean as ref + // to preserve force_k if provided as single parameter // (allow changing both via force_k) lower_wall_k /= force_k; upper_wall_k /= force_k; + } else { + // If only one wall is defined, need to rescale as well + if (lower_walls.size() > 0) { + force_k = lower_wall_k; + lower_wall_k = 1.0; + } + if (upper_walls.size() > 0) { + force_k = upper_wall_k; + upper_wall_k = 1.0; + } } - for (i = 0; i < num_variables(); i++) { - if (variables(i)->width != 1.0) - cvm::log("The force constant for colvar \""+variables(i)->name+ - "\" will be rescaled to "+ - cvm::to_str(force_k / (variables(i)->width * variables(i)->width))+ - " according to the specified width.\n"); + // Initialize starting value of the force constant (in case it's changing) + starting_force_k = force_k; + + if (lower_walls.size() > 0) { + for (i = 0; i < num_variables(); i++) { + if (variables(i)->width != 1.0) + cvm::log("The lower wall force constant for colvar \""+ + variables(i)->name+ + "\" will be rescaled to "+ + cvm::to_str(lower_wall_k * force_k / + (variables(i)->width * variables(i)->width))+ + " according to the specified width.\n"); + } + } + + if (upper_walls.size() > 0) { + for (i = 0; i < num_variables(); i++) { + if (variables(i)->width != 1.0) + cvm::log("The upper wall force constant for colvar \""+ + variables(i)->name+ + "\" will be rescaled to "+ + cvm::to_str(upper_wall_k * force_k / + (variables(i)->width * variables(i)->width))+ + " according to the specified width.\n"); + } } return COLVARS_OK; @@ -1001,6 +1068,8 @@ int colvarbias_restraint_harmonic_walls::update() error_code |= colvarbias_restraint::update(); + error_code |= colvarbias_restraint_k_moving::update_acc_work(); + return error_code; } @@ -1134,6 +1203,7 @@ colvarbias_restraint_linear::colvarbias_restraint_linear(char const *key) colvarbias_restraint_centers_moving(key), colvarbias_restraint_k_moving(key) { + check_positive_k = false; } @@ -1177,6 +1247,7 @@ int colvarbias_restraint_linear::update() // update accumulated work using the current forces error_code |= colvarbias_restraint_centers_moving::update_acc_work(); + error_code |= colvarbias_restraint_k_moving::update_acc_work(); return error_code; } diff --git a/lib/colvars/colvarbias_restraint.h b/lib/colvars/colvarbias_restraint.h index b10649cab1..3ee999c262 100644 --- a/lib/colvars/colvarbias_restraint.h +++ b/lib/colvars/colvarbias_restraint.h @@ -89,8 +89,12 @@ public: virtual int change_configuration(std::string const &conf); protected: + /// \brief Restraint force constant cvm::real force_k; + + /// \brief Whether the force constant should be positive + bool check_positive_k; }; @@ -129,6 +133,9 @@ protected: /// \brief Number of steps required to reach the target force constant /// or restraint centers long target_nsteps; + + /// \brief Accumulated work (computed when outputAccumulatedWork == true) + cvm::real acc_work; }; @@ -157,8 +164,7 @@ protected: /// \brief Initial value of the restraint centers std::vector initial_centers; - /// \brief Amplitude of the restraint centers' increment at each step - /// towards the new values (calculated from target_nsteps) + /// \brief Increment of the restraint centers at each step std::vector centers_incr; /// \brief Update the centers by interpolating between initial and target @@ -167,12 +173,6 @@ protected: /// Whether to write the current restraint centers to the trajectory file bool b_output_centers; - /// Whether to write the current accumulated work to the trajectory file - bool b_output_acc_work; - - /// \brief Accumulated work - cvm::real acc_work; - /// Update the accumulated work int update_acc_work(); }; @@ -212,6 +212,12 @@ protected: /// \brief Equilibration steps for restraint FE calculation through TI cvm::real target_equil_steps; + + /// \brief Increment of the force constant at each step + cvm::real force_k_incr; + + /// Update the accumulated work + int update_acc_work(); }; diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index b94d798be9..52078a3a30 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -20,52 +20,48 @@ // simple_scalar_dist_functions (derived_class) -#include -#include - - #include "colvarmodule.h" #include "colvar.h" #include "colvaratoms.h" -/// \brief Colvar component (base class); most implementations of -/// \link cvc \endlink utilize one or more \link -/// colvarmodule::atom \endlink or \link colvarmodule::atom_group -/// \endlink objects to access atoms. +/// \brief Colvar component (base class for collective variables) /// /// A \link cvc \endlink object (or an object of a -/// cvc-derived class) specifies how to calculate a collective -/// variable, its gradients and other related physical quantities -/// which do not depend only on the numeric value (the \link colvar -/// \endlink class already serves this purpose). +/// cvc-derived class) implements the calculation of a collective +/// variable, its gradients and any other related physical quantities +/// that depend on microscopic degrees of freedom. +/// +/// No restriction is set to what kind of calculation a \link cvc \endlink +/// object performs (usually an analytical function of atomic coordinates). +/// The only constraints are that: \par /// -/// No restriction is set to what kind of calculation a \link -/// cvc \endlink object performs (usually calculate an -/// analytical function of atomic coordinates). The only constraint -/// is that the value calculated is implemented as a \link colvarvalue -/// \endlink object. This serves to provide a unique way to calculate -/// scalar and non-scalar collective variables, and specify if and how -/// they can be combined together by the parent \link colvar \endlink -/// object. +/// - The value is calculated by the \link calc_value() \endlink +/// method, and is an object of \link colvarvalue \endlink class. This +/// provides a transparent way to treat scalar and non-scalar variables +/// alike, and allows an automatic selection of the applicable algorithms. +/// +/// - The object provides an implementation \link apply_force() \endlink to +/// apply forces to atoms. Typically, one or more \link cvm::atom_group +/// \endlink objects are used, but this is not a requirement for as long as +/// the \link cvc \endlink object communicates with the simulation program. /// /// If you wish to implement a new collective variable component, you /// should write your own class by inheriting directly from \link -/// cvc \endlink, or one of its derived classes (for instance, -/// \link distance \endlink is frequently used, because it provides +/// colvar::cvc \endlink, or one of its derived classes (for instance, +/// \link colvar::distance \endlink is frequently used, because it provides /// useful data and function members for any colvar based on two -/// atom groups). The steps are: \par -/// 1. add the name of this class under colvar.h \par -/// 2. add a call to the parser in colvar.C, within the function colvar::colvar() \par -/// 3. declare the class in colvarcomp.h \par -/// 4. implement the class in one of the files colvarcomp_*.C +/// atom groups). +/// +/// The steps are: \par +/// 1. Declare the new class as a derivative of \link colvar::cvc \endlink +/// in the file \link colvarcomp.h \endlink +/// 2. Implement the new class in a file named colvarcomp_.cpp +/// 3. Declare the name of the new class inside the \link colvar \endlink class +/// in \link colvar.h \endlink (see "list of available components") +/// 4. Add a call for the new class in colvar::init_components() +//// (file: colvar.cpp) /// -/// -/// The cvm::atom and cvm::atom_group classes are available to -/// transparently communicate with the simulation program. However, -/// they are not strictly needed, as long as all the degrees of -/// freedom associated to the cvc are properly evolved by a simple -/// call to e.g. apply_force(). class colvar::cvc : public colvarparse, public colvardeps @@ -155,7 +151,7 @@ public: /// \brief Calculate the atomic gradients, to be reused later in /// order to apply forces - virtual void calc_gradients() = 0; + virtual void calc_gradients() {} /// \brief Calculate the atomic fit gradients void calc_fit_gradients(); diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index ce8055843f..9911f4c87e 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -581,6 +581,12 @@ colvar::distance_inv::distance_inv(std::string const &conf) } } + if (is_enabled(f_cvc_debug_gradient)) { + cvm::log("Warning: debugGradients will not give correct results " + "for distanceInv, because its value and gradients are computed " + "simultaneously.\n"); + } + x.type(colvarvalue::type_scalar); } @@ -601,11 +607,9 @@ void colvar::distance_inv::calc_value() for (cvm::atom_iter ai2 = group2->begin(); ai2 != group2->end(); ai2++) { cvm::rvector const dv = ai2->pos - ai1->pos; cvm::real const d2 = dv.norm2(); - cvm::real dinv = 1.0; - for (int ne = 0; ne < exponent/2; ne++) - dinv *= 1.0/d2; + cvm::real const dinv = cvm::integer_power(d2, -1*(exponent/2)); x.real_value += dinv; - cvm::rvector const dsumddv = -(cvm::real(exponent)) * dinv/d2 * dv; + cvm::rvector const dsumddv = -1.0*(exponent/2) * dinv/d2 * 2.0 * dv; ai1->grad += -1.0 * dsumddv; ai2->grad += dsumddv; } @@ -615,11 +619,9 @@ void colvar::distance_inv::calc_value() for (cvm::atom_iter ai2 = group2->begin(); ai2 != group2->end(); ai2++) { cvm::rvector const dv = cvm::position_distance(ai1->pos, ai2->pos); cvm::real const d2 = dv.norm2(); - cvm::real dinv = 1.0; - for (int ne = 0; ne < exponent/2; ne++) - dinv *= 1.0/d2; + cvm::real const dinv = cvm::integer_power(d2, -1*(exponent/2)); x.real_value += dinv; - cvm::rvector const dsumddv = -(cvm::real(exponent)) * dinv/d2 * dv; + cvm::rvector const dsumddv = -1.0*(exponent/2) * dinv/d2 * 2.0 * dv; ai1->grad += -1.0 * dsumddv; ai2->grad += dsumddv; } @@ -627,13 +629,11 @@ void colvar::distance_inv::calc_value() } x.real_value *= 1.0 / cvm::real(group1->size() * group2->size()); - x.real_value = std::pow(x.real_value, -1.0/(cvm::real(exponent))); -} + x.real_value = std::pow(x.real_value, -1.0/cvm::real(exponent)); - -void colvar::distance_inv::calc_gradients() -{ - cvm::real const dxdsum = (-1.0/(cvm::real(exponent))) * std::pow(x.real_value, exponent+1) / cvm::real(group1->size() * group2->size()); + cvm::real const dxdsum = (-1.0/(cvm::real(exponent))) * + cvm::integer_power(x.real_value, exponent+1) / + cvm::real(group1->size() * group2->size()); for (cvm::atom_iter ai1 = group1->begin(); ai1 != group1->end(); ai1++) { ai1->grad *= dxdsum; } @@ -643,6 +643,11 @@ void colvar::distance_inv::calc_gradients() } +void colvar::distance_inv::calc_gradients() +{ +} + + void colvar::distance_inv::apply_force(colvarvalue const &force) { if (!group1->noforce) diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index ac906e7be7..a058ad55c2 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -8,10 +8,16 @@ // Colvars repository at GitHub. +#include "colvarmodule.h" +#include "colvarproxy.h" #include "colvardeps.h" + colvardeps::colvardeps() - : time_step_factor (1) {} +{ + time_step_factor = 1; +} + colvardeps::~colvardeps() { size_t i; @@ -416,6 +422,9 @@ void colvardeps::init_cvb_requires() { init_feature(f_cvb_get_total_force, "obtain total force", f_type_dynamic); f_req_children(f_cvb_get_total_force, f_cv_total_force); + init_feature(f_cvb_output_acc_work, "output accumulated work", f_type_user); + f_req_self(f_cvb_output_acc_work, f_cvb_apply_force); + init_feature(f_cvb_history_dependent, "history-dependent", f_type_static); init_feature(f_cvb_time_dependent, "time-dependent", f_type_static); diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index bd892fbca8..940eefb01b 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -225,6 +225,8 @@ public: f_cvb_apply_force, /// \brief requires total forces f_cvb_get_total_force, + /// \brief whether this bias should record the accumulated work + f_cvb_output_acc_work, /// \brief depends on simulation history f_cvb_history_dependent, /// \brief depends on time diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index 9016e2c23a..1ac4aae133 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -14,6 +14,7 @@ #include "colvarcomp.h" #include "colvargrid.h" +#include colvar_grid_count::colvar_grid_count() : colvar_grid() @@ -22,43 +23,37 @@ colvar_grid_count::colvar_grid_count() } colvar_grid_count::colvar_grid_count(std::vector const &nx_i, - size_t const &def_count) + size_t const &def_count) : colvar_grid(nx_i, def_count, 1) {} colvar_grid_count::colvar_grid_count(std::vector &colvars, - size_t const &def_count) - : colvar_grid(colvars, def_count, 1) + size_t const &def_count, + bool margin) + : colvar_grid(colvars, def_count, 1, margin) {} colvar_grid_scalar::colvar_grid_scalar() - : colvar_grid(), samples(NULL), grad(NULL) + : colvar_grid(), samples(NULL) {} colvar_grid_scalar::colvar_grid_scalar(colvar_grid_scalar const &g) - : colvar_grid(g), samples(NULL), grad(NULL) + : colvar_grid(g), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::colvar_grid_scalar(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, 1), samples(NULL), grad(NULL) + : colvar_grid(nx_i, 0.0, 1), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::colvar_grid_scalar(std::vector &colvars, bool margin) - : colvar_grid(colvars, 0.0, 1, margin), samples(NULL), grad(NULL) + : colvar_grid(colvars, 0.0, 1, margin), samples(NULL) { - grad = new cvm::real[nd]; } colvar_grid_scalar::~colvar_grid_scalar() { - if (grad) { - delete [] grad; - grad = NULL; - } } cvm::real colvar_grid_scalar::maximum_value() const @@ -143,18 +138,18 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) os << "# xi A(xi)\n"; - if ( cv.size() != 1 ) { + if (cv.size() != 1) { cvm::error("Cannot write integral for multi-dimensional gradient grids."); return; } integral = 0.0; - int_vals.push_back( 0.0 ); + int_vals.push_back(0.0); min = 0.0; // correction for periodic colvars, so that the PMF is periodic cvm::real corr; - if ( periodic[0] ) { + if (periodic[0]) { corr = average(); } else { corr = 0.0; @@ -171,7 +166,7 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) } if ( integral < min ) min = integral; - int_vals.push_back( integral ); + int_vals.push_back(integral); } bin = 0.0; @@ -192,3 +187,670 @@ void colvar_grid_gradient::write_1D_integral(std::ostream &os) +integrate_potential::integrate_potential(std::vector &colvars, colvar_grid_gradient * gradients) + : colvar_grid_scalar(colvars, true), + gradients(gradients) +{ + // parent class colvar_grid_scalar is constructed with margin option set to true + // hence PMF grid is wider than gradient grid if non-PBC + + if (nd > 1) { + divergence.resize(nt); + + // Compute inverse of Laplacian diagonal for Jacobi preconditioning + // For now all code related to preconditioning is commented out + // until a method better than Jacobi is implemented +// cvm::log("Preparing inverse diagonal for preconditioning..."); +// inv_lap_diag.resize(nt); +// std::vector id(nt), lap_col(nt); +// for (int i = 0; i < nt; i++) { +// if (i % (nt / 100) == 0) +// cvm::log(cvm::to_str(i)); +// id[i] = 1.; +// atimes(id, lap_col); +// id[i] = 0.; +// inv_lap_diag[i] = 1. / lap_col[i]; +// } +// cvm::log("Done."); + } +} + + +int integrate_potential::integrate(const int itmax, const cvm::real &tol, cvm::real & err) +{ + int iter = 0; + + if (nd == 1) { + + cvm::real sum = 0.0; + cvm::real corr; + if ( periodic[0] ) { + corr = gradients->average(); // Enforce PBC by subtracting average gradient + } else { + corr = 0.0; + } + + std::vector ix; + // Iterate over valid indices in gradient grid + for (ix = new_index(); gradients->index_ok(ix); incr(ix)) { + set_value(ix, sum); + sum += (gradients->value_output(ix) - corr) * widths[0]; + } + if (index_ok(ix)) { + // This will happen if non-periodic: then PMF grid has one extra bin wrt gradient grid + set_value(ix, sum); + } + + } else if (nd <= 3) { + + nr_linbcg_sym(divergence, data, tol, itmax, iter, err); + cvm::log("Integrated in " + cvm::to_str(iter) + " steps, error: " + cvm::to_str(err)); + + } else { + cvm::error("Cannot integrate PMF in dimension > 3\n"); + } + + return iter; +} + + +void integrate_potential::set_div() +{ + if (nd == 1) return; + for (std::vector ix = new_index(); index_ok(ix); incr(ix)) { + update_div_local(ix); + } +} + + +void integrate_potential::update_div_neighbors(const std::vector &ix0) +{ + std::vector ix(ix0); + int i, j, k; + + // If not periodic, expanded grid ensures that neighbors of ix0 are valid grid points + if (nd == 1) { + return; + + } else if (nd == 2) { + + update_div_local(ix); + ix[0]++; wrap(ix); + update_div_local(ix); + ix[1]++; wrap(ix); + update_div_local(ix); + ix[0]--; wrap(ix); + update_div_local(ix); + + } else if (nd == 3) { + + for (i = 0; i<2; i++) { + ix[1] = ix0[1]; + for (j = 0; j<2; j++) { + ix[2] = ix0[2]; + for (k = 0; k<2; k++) { + wrap(ix); + update_div_local(ix); + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + } +} + +void integrate_potential::get_grad(cvm::real * g, std::vector &ix) +{ + size_t count, i; + bool edge = gradients->wrap_edge(ix); // Detect edge if non-PBC + + if (gradients->samples) { + count = gradients->samples->value(ix); + } else { + count = 1; + } + + if (!edge && count) { + cvm::real const *grad = &(gradients->value(ix)); + cvm::real const fact = 1.0 / count; + for ( i = 0; i &ix0) +{ + const int linear_index = address(ix0); + int i, j, k; + std::vector ix = ix0; + const cvm::real * g; + + if (nd == 2) { + // gradients at grid points surrounding the current scalar grid point + cvm::real g00[2], g01[2], g10[2], g11[2]; + + get_grad(g11, ix); + ix[0] = ix0[0] - 1; + get_grad(g01, ix); + ix[1] = ix0[1] - 1; + get_grad(g00, ix); + ix[0] = ix0[0]; + get_grad(g10, ix); + + divergence[linear_index] = ((g10[0]-g00[0] + g11[0]-g01[0]) / widths[0] + + (g01[1]-g00[1] + g11[1]-g10[1]) / widths[1]) * 0.5; + } else if (nd == 3) { + cvm::real gc[24]; // stores 3d gradients in 8 contiguous bins + int index = 0; + + ix[0] = ix0[0] - 1; + for (i = 0; i<2; i++) { + ix[1] = ix0[1] - 1; + for (j = 0; j<2; j++) { + ix[2] = ix0[2] - 1; + for (k = 0; k<2; k++) { + get_grad(gc + index, ix); + index += 3; + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + + divergence[linear_index] = + ((gc[3*4]-gc[0] + gc[3*5]-gc[3*1] + gc[3*6]-gc[3*2] + gc[3*7]-gc[3*3]) + / widths[0] + + (gc[3*2+1]-gc[0+1] + gc[3*3+1]-gc[3*1+1] + gc[3*6+1]-gc[3*4+1] + gc[3*7+1]-gc[3*5+1]) + / widths[1] + + (gc[3*1+2]-gc[0+2] + gc[3*3+2]-gc[3*2+2] + gc[3*5+2]-gc[3*4+2] + gc[3*7+2]-gc[3*6+2]) + / widths[2]) * 0.25; + } +} + + +/// Multiplication by sparse matrix representing Laplacian +/// NOTE: Laplacian must be symmetric for solving with CG +void integrate_potential::atimes(const std::vector &A, std::vector &LA) +{ + if (nd == 2) { + // DIMENSION 2 + + size_t index, index2; + int i, j; + cvm::real fact; + const cvm::real ffx = 1.0 / (widths[0] * widths[0]); + const cvm::real ffy = 1.0 / (widths[1] * widths[1]); + const int h = nx[1]; + const int w = nx[0]; + // offsets for 4 reference points of the Laplacian stencil + int xm = -h; + int xp = h; + int ym = -1; + int yp = 1; + + // NOTE on performance: this version is slightly sub-optimal because + // it contains two double loops on the core of the array (for x and y terms) + // The slightly faster version is in commit 0254cb5a2958cb2e135f268371c4b45fad34866b + // yet it is much uglier, and probably horrible to extend to dimension 3 + // All terms in the matrix are assigned (=) during the x loops, then updated (+=) + // with the y (and z) contributions + + + // All x components except on x edges + index = h; // Skip first column + + // Halve the term on y edges (if any) to preserve symmetry of the Laplacian matrix + // (Long Chen, Finite Difference Methods, UCI, 2017) + fact = periodic[1] ? 1.0 : 0.5; + + for (i=1; i &b, std::vector &x) +{ + for (size_t i=0; i &b, std::vector &x, const cvm::real &tol, + const int itmax, int &iter, cvm::real &err) +{ + cvm::real ak,akden,bk,bkden,bknum,bnrm; + const cvm::real EPS=1.0e-14; + int j; + std::vector p(nt), r(nt), z(nt); + + iter=0; + atimes(x,r); + for (j=0;j &colvars, - size_t const &def_count = 0); + size_t const &def_count = 0, + bool margin = false); /// Increment the counter at given position inline void incr_count(std::vector const &ix) @@ -1210,12 +1236,13 @@ public: int A0, A1, A2; std::vector ix = ix0; + // TODO this can be rewritten more concisely with wrap_edge() if (periodic[n]) { ix[n]--; wrap(ix); - A0 = data[address(ix)]; + A0 = value(ix); ix = ix0; ix[n]++; wrap(ix); - A1 = data[address(ix)]; + A1 = value(ix); if (A0 * A1 == 0) { return 0.; // can't handle empty bins } else { @@ -1224,10 +1251,10 @@ public: } } else if (ix[n] > 0 && ix[n] < nx[n]-1) { // not an edge ix[n]--; - A0 = data[address(ix)]; + A0 = value(ix); ix = ix0; ix[n]++; - A1 = data[address(ix)]; + A1 = value(ix); if (A0 * A1 == 0) { return 0.; // can't handle empty bins } else { @@ -1238,9 +1265,9 @@ public: // edge: use 2nd order derivative int increment = (ix[n] == 0 ? 1 : -1); // move right from left edge, or the other way around - A0 = data[address(ix)]; - ix[n] += increment; A1 = data[address(ix)]; - ix[n] += increment; A2 = data[address(ix)]; + A0 = value(ix); + ix[n] += increment; A1 = value(ix); + ix[n] += increment; A2 = value(ix); if (A0 * A1 * A2 == 0) { return 0.; // can't handle empty bins } else { @@ -1249,6 +1276,49 @@ public: } } } + + /// \brief Return the gradient of discrete count from finite differences + /// on the *same* grid for dimension n + inline cvm::real gradient_finite_diff(const std::vector &ix0, + int n = 0) + { + int A0, A1, A2; + std::vector ix = ix0; + + // FIXME this can be rewritten more concisely with wrap_edge() + if (periodic[n]) { + ix[n]--; wrap(ix); + A0 = value(ix); + ix = ix0; + ix[n]++; wrap(ix); + A1 = value(ix); + if (A0 * A1 == 0) { + return 0.; // can't handle empty bins + } else { + return cvm::real(A1 - A0) / (widths[n] * 2.); + } + } else if (ix[n] > 0 && ix[n] < nx[n]-1) { // not an edge + ix[n]--; + A0 = value(ix); + ix = ix0; + ix[n]++; + A1 = value(ix); + if (A0 * A1 == 0) { + return 0.; // can't handle empty bins + } else { + return cvm::real(A1 - A0) / (widths[n] * 2.); + } + } else { + // edge: use 2nd order derivative + int increment = (ix[n] == 0 ? 1 : -1); + // move right from left edge, or the other way around + A0 = value(ix); + ix[n] += increment; A1 = value(ix); + ix[n] += increment; A2 = value(ix); + return (-1.5 * cvm::real(A0) + 2. * cvm::real(A1) + - 0.5 * cvm::real(A2)) * increment / widths[n]; + } + } }; @@ -1289,27 +1359,57 @@ public: has_data = true; } - /// Return the gradient of the scalar field from finite differences - inline const cvm::real * gradient_finite_diff( const std::vector &ix0 ) + /// \brief Return the gradient of the scalar field from finite differences + /// Input coordinates are those of gradient grid, shifted wrt scalar grid + /// Should not be called on edges of scalar grid, provided the latter has margins + /// wrt gradient grid + inline void vector_gradient_finite_diff( const std::vector &ix0, std::vector &grad) { cvm::real A0, A1; std::vector ix; - if (nd != 2) { - cvm::error("Finite differences available in dimension 2 only."); - return grad; - } - for (unsigned int n = 0; n < nd; n++) { + size_t i, j, k, n; + + if (nd == 2) { + for (n = 0; n < 2; n++) { + ix = ix0; + A0 = value(ix); + ix[n]++; wrap(ix); + A1 = value(ix); + ix[1-n]++; wrap(ix); + A1 += value(ix); + ix[n]--; wrap(ix); + A0 += value(ix); + grad[n] = 0.5 * (A1 - A0) / widths[n]; + } + } else if (nd == 3) { + + cvm::real p[8]; // potential values within cube, indexed in binary (4 i + 2 j + k) ix = ix0; - A0 = data[address(ix)]; - ix[n]++; wrap(ix); - A1 = data[address(ix)]; - ix[1-n]++; wrap(ix); - A1 += data[address(ix)]; - ix[n]--; wrap(ix); - A0 += data[address(ix)]; - grad[n] = 0.5 * (A1 - A0) / widths[n]; + int index = 0; + for (i = 0; i<2; i++) { + ix[1] = ix0[1]; + for (j = 0; j<2; j++) { + ix[2] = ix0[2]; + for (k = 0; k<2; k++) { + wrap(ix); + p[index++] = value(ix); + ix[2]++; + } + ix[1]++; + } + ix[0]++; + } + + // The following would be easier to read using binary literals + // 100 101 110 111 000 001 010 011 + grad[0] = 0.25 * ((p[4] + p[5] + p[6] + p[7]) - (p[0] + p[1] + p[2] + p[3])) / widths[0]; + // 010 011 110 111 000 001 100 101 + grad[1] = 0.25 * ((p[2] + p[3] + p[6] + p[7]) - (p[0] + p[1] + p[4] + p[5])) / widths[0]; + // 001 011 101 111 000 010 100 110 + grad[2] = 0.25 * ((p[1] + p[3] + p[5] + p[7]) - (p[0] + p[2] + p[4] + p[6])) / widths[0]; + } else { + cvm::error("Finite differences available in dimension 2 and 3 only."); } - return grad; } /// \brief Return the value of the function at ix divided by its @@ -1373,10 +1473,6 @@ public: /// \brief Assuming that the map is a normalized probability density, /// calculates the entropy (uses widths if they are defined) cvm::real entropy() const; - -private: - // gradient - cvm::real * grad; }; @@ -1390,6 +1486,10 @@ public: /// should be divided colvar_grid_count *samples; + /// \brief Provide the floating point weights by which each binned value + /// should be divided (alternate to samples, only one should be non-null) + colvar_grid_scalar *weights; + /// Default constructor colvar_grid_gradient(); @@ -1403,6 +1503,29 @@ public: /// Constructor from a vector of colvars colvar_grid_gradient(std::vector &colvars); + /// \brief Get a vector with the binned value(s) indexed by ix, normalized if applicable + inline void vector_value(std::vector const &ix, std::vector &v) const + { + cvm::real const * p = &value(ix); + if (samples) { + int count = samples->value(ix); + if (count) { + cvm::real invcount = 1.0 / count; + for (size_t i = 0; i < mult; i++) { + v[i] = invcount * p[i]; + } + } else { + for (size_t i = 0; i < mult; i++) { + v[i] = 0.0; + } + } + } else { + for (size_t i = 0; i < mult; i++) { + v[i] = p[i]; + } + } + } + /// \brief Accumulate the value inline void acc_value(std::vector const &ix, std::vector const &values) { for (size_t imult = 0; imult < mult; imult++) { @@ -1412,23 +1535,25 @@ public: samples->incr_count(ix); } - /// \brief Accumulate the gradient - inline void acc_grad(std::vector const &ix, cvm::real const *grads) { + /// \brief Accumulate the gradient based on the force (i.e. sums the + /// opposite of the force) + inline void acc_force(std::vector const &ix, cvm::real const *forces) { for (size_t imult = 0; imult < mult; imult++) { - data[address(ix) + imult] += grads[imult]; + data[address(ix) + imult] -= forces[imult]; } if (samples) samples->incr_count(ix); } /// \brief Accumulate the gradient based on the force (i.e. sums the - /// opposite of the force) - inline void acc_force(std::vector const &ix, cvm::real const *forces) { + /// opposite of the force) with a non-integer weight + inline void acc_force_weighted(std::vector const &ix, + cvm::real const *forces, + cvm::real weight) { for (size_t imult = 0; imult < mult; imult++) { - data[address(ix) + imult] -= forces[imult]; + data[address(ix) + imult] -= forces[imult] * weight; } - if (samples) - samples->incr_count(ix); + weights->acc_value(ix, weight); } /// \brief Return the value of the function at ix divided by its @@ -1498,5 +1623,70 @@ public: }; + +/// Integrate (1D, 2D or 3D) gradients + +class integrate_potential : public colvar_grid_scalar +{ + public: + + integrate_potential(); + + virtual ~integrate_potential() + {} + + /// Constructor from a vector of colvars + gradient grid + integrate_potential (std::vector &colvars, colvar_grid_gradient * gradients); + + /// \brief Calculate potential from divergence (in 2D); return number of steps + int integrate (const int itmax, const cvm::real & tol, cvm::real & err); + + /// \brief Update matrix containing divergence and boundary conditions + /// based on new gradient point value, in neighboring bins + void update_div_neighbors(const std::vector &ix); + + /// \brief Set matrix containing divergence and boundary conditions + /// based on complete gradient grid + void set_div(); + + /// \brief Add constant to potential so that its minimum value is zero + /// Useful e.g. for output + inline void set_zero_minimum() { + add_constant(-1.0 * minimum_value()); + } + + protected: + + // Reference to gradient grid + colvar_grid_gradient *gradients; + + /// Array holding divergence + boundary terms (modified Neumann) if not periodic + std::vector divergence; + +// std::vector inv_lap_diag; // Inverse of the diagonal of the Laplacian; for conditioning + + /// \brief Update matrix containing divergence and boundary conditions + /// called by update_div_neighbors + void update_div_local(const std::vector &ix); + + /// Obtain the gradient vector at given location ix, if available + /// or zero if it is on the edge of the gradient grid + /// ix gets wrapped in PBC + void get_grad(cvm::real * g, std::vector &ix); + + /// \brief Solve linear system based on CG, valid for symmetric matrices only + void nr_linbcg_sym(const std::vector &b, std::vector &x, + const cvm::real &tol, const int itmax, int &iter, cvm::real &err); + + /// l2 norm of a vector + cvm::real l2norm(const std::vector &x); + + /// Multiplication by sparse matrix representing Lagrangian (or its transpose) + void atimes(const std::vector &x, std::vector &r); + +// /// Inversion of preconditioner matrix +// void asolve(const std::vector &b, std::vector &x); +}; + #endif diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 200c2d6848..9898e2d5e8 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -24,6 +24,7 @@ #include "colvaratoms.h" #include "colvarcomp.h" + colvarmodule::colvarmodule(colvarproxy *proxy_in) { depth_s = 0; @@ -417,10 +418,10 @@ int colvarmodule::parse_biases(std::string const &conf) "Please ensure that their forces do not counteract each other.\n"); } - if (biases.size() || use_scripted_forces) { + if (num_biases() || use_scripted_forces) { cvm::log(cvm::line_marker); cvm::log("Collective variables biases initialized, "+ - cvm::to_str(biases.size())+" in total.\n"); + cvm::to_str(num_biases())+" in total.\n"); } else { if (!use_scripted_forces) { cvm::log("No collective variables biases were defined.\n"); @@ -431,12 +432,37 @@ int colvarmodule::parse_biases(std::string const &conf) } +int colvarmodule::num_variables() const +{ + return colvars.size(); +} + + +int colvarmodule::num_variables_feature(int feature_id) const +{ + size_t n = 0; + for (std::vector::const_iterator cvi = colvars.begin(); + cvi != colvars.end(); + cvi++) { + if ((*cvi)->is_enabled(feature_id)) { + n++; + } + } + return n; +} + + +int colvarmodule::num_biases() const +{ + return biases.size(); +} + + int colvarmodule::num_biases_feature(int feature_id) const { - colvarmodule *cv = cvm::main(); size_t n = 0; - for (std::vector::iterator bi = cv->biases.begin(); - bi != cv->biases.end(); + for (std::vector::const_iterator bi = biases.begin(); + bi != biases.end(); bi++) { if ((*bi)->is_enabled(feature_id)) { n++; @@ -448,10 +474,9 @@ int colvarmodule::num_biases_feature(int feature_id) const int colvarmodule::num_biases_type(std::string const &type) const { - colvarmodule *cv = cvm::main(); size_t n = 0; - for (std::vector::iterator bi = cv->biases.begin(); - bi != cv->biases.end(); + for (std::vector::const_iterator bi = biases.begin(); + bi != biases.end(); bi++) { if ((*bi)->bias_type == type) { n++; @@ -465,7 +490,7 @@ std::vector const colvarmodule::time_dependent_biases() const { size_t i; std::vector biases_names; - for (i = 0; i < biases.size(); i++) { + for (i = 0; i < num_biases(); i++) { if (biases[i]->is_enabled(colvardeps::f_cvb_apply_force) && biases[i]->is_enabled(colvardeps::f_cvb_active) && (biases[i]->is_enabled(colvardeps::f_cvb_history_dependent) || @@ -790,7 +815,7 @@ int colvarmodule::calc_biases() { // update the biases and communicate their forces to the collective // variables - if (cvm::debug() && biases.size()) + if (cvm::debug() && num_biases()) cvm::log("Updating collective variable biases.\n"); std::vector::iterator bi; @@ -852,7 +877,7 @@ int colvarmodule::update_colvar_forces() std::vector::iterator bi; // sum the forces from all biases for each collective variable - if (cvm::debug() && biases.size()) + if (cvm::debug() && num_biases()) cvm::log("Collecting forces from all biases.\n"); cvm::increase_depth(); for (bi = biases_active()->begin(); bi != biases_active()->end(); bi++) { @@ -1073,8 +1098,6 @@ int colvarmodule::reset() int colvarmodule::setup_input() { - if (this->size() == 0) return cvm::get_error(); - std::string restart_in_name(""); // read the restart configuration, if available @@ -1107,14 +1130,12 @@ int colvarmodule::setup_input() } } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return cvm::get_error(); } int colvarmodule::setup_output() { - if (this->size() == 0) return cvm::get_error(); - int error_code = COLVARS_OK; // output state file (restart) @@ -1123,7 +1144,8 @@ int colvarmodule::setup_output() std::string(""); if (restart_out_name.size()) { - cvm::log("The restart output state file will be \""+restart_out_name+"\".\n"); + cvm::log("The restart output state file will be \""+ + restart_out_name+"\".\n"); } output_prefix() = proxy->output_prefix(); @@ -1154,7 +1176,7 @@ int colvarmodule::setup_output() set_error_bits(FILE_ERROR); } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return cvm::get_error(); } @@ -1738,6 +1760,89 @@ int cvm::load_coords_xyz(char const *filename, } + +// Wrappers to proxy functions: these may go in the future + +cvm::real cvm::unit_angstrom() +{ + return proxy->unit_angstrom(); +} + + +cvm::real cvm::boltzmann() +{ + return proxy->boltzmann(); +} + + +cvm::real cvm::temperature() +{ + return proxy->temperature(); +} + + +cvm::real cvm::dt() +{ + return proxy->dt(); +} + + +void cvm::request_total_force() +{ + proxy->request_total_force(true); +} + +cvm::rvector cvm::position_distance(atom_pos const &pos1, + atom_pos const &pos2) +{ + return proxy->position_distance(pos1, pos2); +} + +cvm::real cvm::position_dist2(cvm::atom_pos const &pos1, + cvm::atom_pos const &pos2) +{ + return proxy->position_dist2(pos1, pos2); +} + +cvm::real cvm::rand_gaussian(void) +{ + return proxy->rand_gaussian(); +} + + + +bool cvm::replica_enabled() +{ + return proxy->replica_enabled(); +} + +int cvm::replica_index() +{ + return proxy->replica_index(); +} + +int cvm::replica_num() +{ + return proxy->replica_num(); +} + +void cvm::replica_comm_barrier() +{ + return proxy->replica_comm_barrier(); +} + +int cvm::replica_comm_recv(char* msg_data, int buf_len, int src_rep) +{ + return proxy->replica_comm_recv(msg_data,buf_len,src_rep); +} + +int cvm::replica_comm_send(char* msg_data, int msg_len, int dest_rep) +{ + return proxy->replica_comm_send(msg_data,msg_len,dest_rep); +} + + + // shared pointer to the proxy object colvarproxy *colvarmodule::proxy = NULL; diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index 14e5d56701..64a98b77a0 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -39,16 +39,14 @@ You can browse the class hierarchy or the list of source files. #define FILE_ERROR (1<<4) #define MEMORY_ERROR (1<<5) #define FATAL_ERROR (1<<6) // Should be set, or not, together with other bits -#define DELETE_COLVARS (1<<7) // Instruct the caller to delete cvm +//#define DELETE_COLVARS (1<<7) // Instruct the caller to delete cvm #define COLVARS_NO_SUCH_FRAME (1<<8) // Cannot load the requested frame #include #include -#include -#include -#include #include -#include +#include +#include #include #include @@ -84,12 +82,18 @@ public: /// Defining an abstract real number allows to switch precision typedef double real; - /// Override std::pow with a product for n positive integer - static inline real integer_power(real x, int n) + /// Override std::pow with a product for n integer + static inline real integer_power(real const &x, int const n) { - real result = 1.0; - for (int i = 0; i < n; i++) result *= x; - return result; + // Original code: math_special.h in LAMMPS + double yy, ww; + if (x == 0.0) return 0.0; + int nn = (n > 0) ? n : -n; + ww = x; + for (yy = 1.0; nn != 0; nn >>= 1, ww *=ww) { + if (nn & 1) yy *= ww; + } + return (n > 0) ? yy : 1.0/yy; } /// Residue identifier @@ -301,13 +305,23 @@ private: public: + /// Return how many variables are defined + int num_variables() const; + + /// Return how many variables have this feature enabled + int num_variables_feature(int feature_id) const; + + /// Return how many biases are defined + int num_biases() const; + /// Return how many biases have this feature enabled int num_biases_feature(int feature_id) const; - /// Return how many biases are defined with this type + /// Return how many biases of this type are defined int num_biases_type(std::string const &type) const; - /// Return the names of time-dependent biases with forces enabled + /// Return the names of time-dependent biases with forces enabled (ABF, + /// metadynamics, etc) std::vector const time_dependent_biases() const; private: @@ -602,16 +616,14 @@ public: typedef colvarmodule cvm; -#include "colvartypes.h" - std::ostream & operator << (std::ostream &os, cvm::rvector const &v); std::istream & operator >> (std::istream &is, cvm::rvector &v); template std::string cvm::to_str(T const &x, - size_t const &width, - size_t const &prec) { + size_t const &width, + size_t const &prec) { std::ostringstream os; if (width) os.width(width); if (prec) { @@ -622,9 +634,10 @@ template std::string cvm::to_str(T const &x, return os.str(); } + template std::string cvm::to_str(std::vector const &x, - size_t const &width, - size_t const &prec) { + size_t const &width, + size_t const &prec) { if (!x.size()) return std::string(""); std::ostringstream os; if (prec) { @@ -645,70 +658,4 @@ template std::string cvm::to_str(std::vector const &x, } -#include "colvarproxy.h" - - -inline cvm::real cvm::unit_angstrom() -{ - return proxy->unit_angstrom(); -} - -inline cvm::real cvm::boltzmann() -{ - return proxy->boltzmann(); -} - -inline cvm::real cvm::temperature() -{ - return proxy->temperature(); -} - -inline cvm::real cvm::dt() -{ - return proxy->dt(); -} - -// Replica exchange commands -inline bool cvm::replica_enabled() { - return proxy->replica_enabled(); -} -inline int cvm::replica_index() { - return proxy->replica_index(); -} -inline int cvm::replica_num() { - return proxy->replica_num(); -} -inline void cvm::replica_comm_barrier() { - return proxy->replica_comm_barrier(); -} -inline int cvm::replica_comm_recv(char* msg_data, int buf_len, int src_rep) { - return proxy->replica_comm_recv(msg_data,buf_len,src_rep); -} -inline int cvm::replica_comm_send(char* msg_data, int msg_len, int dest_rep) { - return proxy->replica_comm_send(msg_data,msg_len,dest_rep); -} - - -inline void cvm::request_total_force() -{ - proxy->request_total_force(true); -} - -inline cvm::rvector cvm::position_distance(atom_pos const &pos1, - atom_pos const &pos2) -{ - return proxy->position_distance(pos1, pos2); -} - -inline cvm::real cvm::position_dist2(cvm::atom_pos const &pos1, - cvm::atom_pos const &pos2) -{ - return proxy->position_dist2(pos1, pos2); -} - -inline cvm::real cvm::rand_gaussian(void) -{ - return proxy->rand_gaussian(); -} - #endif diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 9f333b7b76..43c8c69c04 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -553,7 +553,8 @@ bool colvarparse::key_lookup(std::string const &conf, size_t *save_pos) { if (cvm::debug()) { - cvm::log("Looking for the keyword \""+std::string(key_in)+"\" and its value.\n"); + cvm::log("Looking for the keyword \""+std::string(key_in)+ + "\" and its value.\n"); } // add this keyword to the register (in its camelCase version) diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index 8160144c6b..8767d5f459 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -14,6 +14,11 @@ #include #endif +#if defined(NAMD_TCL) || defined(VMDTCL) +#define COLVARS_TCL +#include +#endif + #include "colvarmodule.h" #include "colvarproxy.h" #include "colvarscript.h" @@ -420,8 +425,10 @@ colvarproxy_script::colvarproxy_script() colvarproxy_script::~colvarproxy_script() {} -char *colvarproxy_script::script_obj_to_str(unsigned char *obj) +char const *colvarproxy_script::script_obj_to_str(unsigned char *obj) { + cvm::error("Error: trying to print a script object without a scripting " + "language interface.\n", BUG_ERROR); return reinterpret_cast(obj); } @@ -451,6 +458,140 @@ int colvarproxy_script::run_colvar_gradient_callback( +colvarproxy_tcl::colvarproxy_tcl() +{ + _tcl_interp = NULL; +} + + +colvarproxy_tcl::~colvarproxy_tcl() +{ +} + + +void colvarproxy_tcl::init_tcl_pointers() +{ + cvm::error("Error: Tcl support is currently unavailable " + "outside NAMD or VMD.\n", COLVARS_NOT_IMPLEMENTED); +} + + +char const *colvarproxy_tcl::tcl_obj_to_str(unsigned char *obj) +{ +#if defined(COLVARS_TCL) + return Tcl_GetString(reinterpret_cast(obj)); +#else + return NULL; +#endif +} + + +int colvarproxy_tcl::tcl_run_force_callback() +{ +#if defined(COLVARS_TCL) + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + std::string cmd = std::string("calc_colvar_forces ") + + cvm::to_str(cvm::step_absolute()); + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + if (err != TCL_OK) { + cvm::log(std::string("Error while executing calc_colvar_forces:\n")); + cvm::error(Tcl_GetStringResult(tcl_interp)); + return COLVARS_ERROR; + } + return cvm::get_error(); +#else + return COLVARS_NOT_IMPLEMENTED; +#endif +} + + +int colvarproxy_tcl::tcl_run_colvar_callback( + std::string const &name, + std::vector const &cvc_values, + colvarvalue &value) +{ +#if defined(COLVARS_TCL) + + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + size_t i; + std::string cmd = std::string("calc_") + name; + for (i = 0; i < cvc_values.size(); i++) { + cmd += std::string(" {") + (*(cvc_values[i])).to_simple_string() + + std::string("}"); + } + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + const char *result = Tcl_GetStringResult(tcl_interp); + if (err != TCL_OK) { + return cvm::error(std::string("Error while executing ") + + cmd + std::string(":\n") + + std::string(Tcl_GetStringResult(tcl_interp)), COLVARS_ERROR); + } + std::istringstream is(result); + if (value.from_simple_string(is.str()) != COLVARS_OK) { + cvm::log("Error parsing colvar value from script:"); + cvm::error(result); + return COLVARS_ERROR; + } + return cvm::get_error(); + +#else + + return COLVARS_NOT_IMPLEMENTED; + +#endif +} + + +int colvarproxy_tcl::tcl_run_colvar_gradient_callback( + std::string const &name, + std::vector const &cvc_values, + std::vector > &gradient) +{ +#if defined(COLVARS_TCL) + + Tcl_Interp *const tcl_interp = reinterpret_cast(_tcl_interp); + size_t i; + std::string cmd = std::string("calc_") + name + "_gradient"; + for (i = 0; i < cvc_values.size(); i++) { + cmd += std::string(" {") + (*(cvc_values[i])).to_simple_string() + + std::string("}"); + } + int err = Tcl_Eval(tcl_interp, cmd.c_str()); + if (err != TCL_OK) { + return cvm::error(std::string("Error while executing ") + + cmd + std::string(":\n") + + std::string(Tcl_GetStringResult(tcl_interp)), COLVARS_ERROR); + } + Tcl_Obj **list; + int n; + Tcl_ListObjGetElements(tcl_interp, Tcl_GetObjResult(tcl_interp), + &n, &list); + if (n != int(gradient.size())) { + cvm::error("Error parsing list of gradient values from script: found " + + cvm::to_str(n) + " values instead of " + + cvm::to_str(gradient.size())); + return COLVARS_ERROR; + } + for (i = 0; i < gradient.size(); i++) { + std::istringstream is(Tcl_GetString(list[i])); + if (gradient[i].from_simple_string(is.str()) != COLVARS_OK) { + cvm::log("Gradient matrix size: " + cvm::to_str(gradient[i].size())); + cvm::log("Gradient string: " + cvm::to_str(Tcl_GetString(list[i]))); + cvm::error("Error parsing gradient value from script", COLVARS_ERROR); + return COLVARS_ERROR; + } + } + + return cvm::get_error(); + +#else + + return COLVARS_NOT_IMPLEMENTED; + +#endif +} + + colvarproxy_io::colvarproxy_io() {} @@ -541,6 +682,7 @@ colvarproxy::colvarproxy() { colvars = NULL; b_simulation_running = true; + b_delete_requested = false; } @@ -556,6 +698,14 @@ int colvarproxy::reset() } +int colvarproxy::request_deletion() +{ + return cvm::error("Error: \"delete\" command is only available in VMD; " + "please use \"reset\" instead.\n", + COLVARS_NOT_IMPLEMENTED); +} + + int colvarproxy::setup() { return COLVARS_OK; @@ -579,13 +729,3 @@ size_t colvarproxy::restart_frequency() return 0; } - - - - - - - - - - diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index e51ddfbe3b..bf29048270 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -415,7 +415,7 @@ public: }; -/// Method for scripting language interface (Tcl or Python) +/// Methods for scripting language interface (Tcl or Python) class colvarproxy_script { public: @@ -427,7 +427,7 @@ public: virtual ~colvarproxy_script(); /// Convert a script object (Tcl or Python call argument) to a C string - virtual char *script_obj_to_str(unsigned char *obj); + virtual char const *script_obj_to_str(unsigned char *obj); /// Pointer to the scripting interface object /// (does not need to be allocated in a new interface) @@ -454,6 +454,46 @@ public: }; +/// Methods for using Tcl within Colvars +class colvarproxy_tcl { + +public: + + /// Constructor + colvarproxy_tcl(); + + /// Destructor + virtual ~colvarproxy_tcl(); + + /// Is Tcl available? (trigger initialization if needed) + int tcl_available(); + + /// Tcl implementation of script_obj_to_str() + char const *tcl_obj_to_str(unsigned char *obj); + + /// Run a user-defined colvar forces script + int tcl_run_force_callback(); + + int tcl_run_colvar_callback( + std::string const &name, + std::vector const &cvcs, + colvarvalue &value); + + int tcl_run_colvar_gradient_callback( + std::string const &name, + std::vector const &cvcs, + std::vector > &gradient); + +protected: + + /// Pointer to Tcl interpreter object + void *_tcl_interp; + + /// Set Tcl pointers + virtual void init_tcl_pointers(); +}; + + /// Methods for data input/output class colvarproxy_io { @@ -540,6 +580,7 @@ class colvarproxy public colvarproxy_smp, public colvarproxy_replicas, public colvarproxy_script, + public colvarproxy_tcl, public colvarproxy_io { @@ -554,6 +595,15 @@ public: /// Destructor virtual ~colvarproxy(); + /// Request deallocation of the module (currently only implemented by VMD) + virtual int request_deletion(); + + /// Whether deallocation was requested + inline bool delete_requested() + { + return b_delete_requested; + } + /// \brief Reset proxy state, e.g. requested atoms virtual int reset(); @@ -591,6 +641,9 @@ protected: /// Whether a simulation is running (warn against irrecovarable errors) bool b_simulation_running; + /// Whether the entire module should be deallocated by the host engine + bool b_delete_requested; + }; diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h index a92a776f8a..dc4b8bd07e 100644 --- a/lib/colvars/colvars_version.h +++ b/lib/colvars/colvars_version.h @@ -1,5 +1,5 @@ #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2017-10-20" +#define COLVARS_VERSION "2018-01-17" // This file is part of the Collective Variables module (Colvars). // The original version of Colvars and its updates are located at: // https://github.com/colvars/colvars diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index 9570acd832..0977496b9e 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -74,7 +74,9 @@ int colvarscript::run(int objc, unsigned char *const objv[]) } if (objc < 2) { - return exec_command(cv_help, NULL, objc, objv); + set_str_result("No commands given: use \"cv help\" " + "for a list of commands."); + return COLVARSCRIPT_ERROR; } std::string const cmd(obj_to_str(objv[1])); @@ -123,8 +125,7 @@ int colvarscript::run(int objc, unsigned char *const objv[]) if (cmd == "delete") { // Note: the delete bit may be ignored by some backends // it is mostly useful in VMD - colvars->set_error_bits(DELETE_COLVARS); - return COLVARS_OK; + return proxy->request_deletion(); } if (cmd == "update") { @@ -272,6 +273,11 @@ int colvarscript::proc_colvar(colvar *cv, int objc, unsigned char *const objv[]) return COLVARS_OK; } + if (subcmd == "run_ave") { + result = (cv->run_ave()).to_simple_string(); + return COLVARS_OK; + } + if (subcmd == "width") { result = cvm::to_str(cv->width, 0, cvm::cv_prec); return COLVARS_OK; diff --git a/src/USER-COLVARS/colvarproxy_lammps_version.h b/src/USER-COLVARS/colvarproxy_lammps_version.h index 45ecea867f..79f77dad4e 100644 --- a/src/USER-COLVARS/colvarproxy_lammps_version.h +++ b/src/USER-COLVARS/colvarproxy_lammps_version.h @@ -1,5 +1,5 @@ #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2017-10-20" +#define COLVARPROXY_VERSION "2017-12-01" // This file is part of the Collective Variables module (Colvars). // The original version of Colvars and its updates are located at: // https://github.com/colvars/colvars -- GitLab From 4a875dc67df5ce640eed198f9ca7de25c74e3a2f Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 23 Feb 2018 09:01:34 -0700 Subject: [PATCH 09/46] Workaround for compiler bug in gcc v4.9.3, manifest in KOKKOS SNAP --- src/SNAP/pair_snap.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index 9d330f0d6f..e0d7c45063 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -37,8 +37,11 @@ public: virtual double init_one(int, int); virtual double memory_usage(); + double rcutfac, quadraticflag; // declared public to workaround gcc 4.9 + int ncoeff; // compiler bug, manifest in KOKKOS package + protected: - int ncoeff, ncoeffq, ncoeffall; + int ncoeffq, ncoeffall; double **bvec, ***dbvec; class SNA** sna; int nmax; @@ -97,8 +100,8 @@ protected: double *wjelem; // elements weights double **coeffelem; // element bispectrum coefficients int *map; // mapping from atom types to elements - int twojmax, diagonalstyle, switchflag, bzeroflag, quadraticflag; - double rcutfac, rfac0, rmin0, wj1, wj2; + int twojmax, diagonalstyle, switchflag, bzeroflag; + double rfac0, rmin0, wj1, wj2; int rcutfacflag, twojmaxflag; // flags for required parameters }; -- GitLab From bba4bd148985896dde1096e4a7d1c0ad726fde8f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Feb 2018 18:02:05 -0500 Subject: [PATCH 10/46] support offsets for molecule IDs (if available) in read_data similar to atomIDs suggested by felipe perez in https://sourceforge.net/p/lammps/mailman/message/36236631/ --- doc/src/read_data.txt | 35 +++++++++++++++++++++-------------- src/atom.cpp | 5 +++-- src/atom.h | 2 +- src/read_data.cpp | 28 +++++++++++++++++++++------- src/read_data.h | 2 +- 5 files changed, 47 insertions(+), 25 deletions(-) diff --git a/doc/src/read_data.txt b/doc/src/read_data.txt index 4ea60163b2..fd297e36c1 100644 --- a/doc/src/read_data.txt +++ b/doc/src/read_data.txt @@ -15,10 +15,11 @@ read_data file keyword args ... :pre file = name of data file to read in :ulb,l zero or more keyword/arg pairs may be appended :l keyword = {add} or {offset} or {shift} or {extra/atom/types} or {extra/bond/types} or {extra/angle/types} or {extra/dihedral/types} or {extra/improper/types} or {extra/bond/per/atom} or {extra/angle/per/atom} or {extra/dihedral/per/atom} or {extra/improper/per/atom} or {group} or {nocoeff} or {fix} :l - {add} arg = {append} or {Nstart} or {merge} - append = add new atoms with IDs appended to current IDs - Nstart = add new atoms with IDs starting with Nstart - merge = add new atoms with their IDs unchanged + {add} arg = {append} or {IDoffset} or {IDoffset MOLoffset} or {merge} + append = add new atoms with atom IDs appended to current IDs + IDoffset = add new atoms with atom IDs having IDoffset added + MOLoffset = add new atoms with molecule IDs having MOLoffset added (only when molecule IDs are enabled) + merge = add new atoms with their atom IDs (and molecule IDs) unchanged {offset} args = toff boff aoff doff ioff toff = offset to add to atom types boff = offset to add to bond types @@ -120,20 +121,26 @@ boundary, then the atoms may become far apart if the box size grows. This will separate the atoms in the bond, which can lead to "lost" bond atoms or bad dynamics. -The three choices for the {add} argument affect how the IDs of atoms -in the data file are treated. If {append} is specified, atoms in the -data file are added to the current system, with their atom IDs reset -so that an atomID = M in the data file becomes atomID = N+M, where N -is the largest atom ID in the current system. This rule is applied to -all occurrences of atom IDs in the data file, e.g. in the Velocity or -Bonds section. If {Nstart} is specified, then {Nstart} is a numeric -value is given, e.g. 1000, so that an atomID = M in the data file -becomes atomID = 1000+M. If {merge} is specified, the data file atoms +The three choices for the {add} argument affect how the atom IDs and +molecule IDs of atoms in the data file are treated. If {append} is +specified, atoms in the data file are added to the current system, +with their atom IDs reset so that an atomID = M in the data file +becomes atomID = N+M, where N is the largest atom ID in the current +system. This rule is applied to all occurrences of atom IDs in the +data file, e.g. in the Velocity or Bonds section. This is also done +for molecule IDs, if the atom style does support molecule IDs or +they are enabled via fix property/atom. If {IDoffset} is specified, +then {IDoffset} is a numeric value is given, e.g. 1000, so that an +atomID = M in the data file becomes atomID = 1000+M. For systems +with enabled molecule IDs, another numerical argument {MOLoffset} +is required representing the equivalent offset for molecule IDs. +If {merge} is specified, the data file atoms are added to the current system without changing their IDs. They are assumed to merge (without duplication) with the currently defined atoms. It is up to you to insure there are no multiply defined atom IDs, as LAMMPS only performs an incomplete check that this is the case -by insuring the resulting max atomID >= the number of atoms. +by insuring the resulting max atomID >= the number of atoms. For +molecule IDs, there is no check done at all. The {offset} and {shift} keywords can only be used if the {add} keyword is also specified. diff --git a/src/atom.cpp b/src/atom.cpp index 3fa470efd5..fa86046d23 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -822,8 +822,8 @@ void Atom::deallocate_topology() call style-specific routine to parse line ------------------------------------------------------------------------- */ -void Atom::data_atoms(int n, char *buf, tagint id_offset, int type_offset, - int shiftflag, double *shift) +void Atom::data_atoms(int n, char *buf, tagint id_offset, tagint mol_offset, + int type_offset, int shiftflag, double *shift) { int m,xptr,iptr; imageint imagedata; @@ -948,6 +948,7 @@ void Atom::data_atoms(int n, char *buf, tagint id_offset, int type_offset, coord[2] >= sublo[2] && coord[2] < subhi[2]) { avec->data_atom(xdata,imagedata,values); if (id_offset) tag[nlocal-1] += id_offset; + if (mol_offset) molecule[nlocal-1] += mol_offset; if (type_offset) { type[nlocal-1] += type_offset; if (type[nlocal-1] > ntypes) diff --git a/src/atom.h b/src/atom.h index 007142a1c0..62c2d64ca7 100644 --- a/src/atom.h +++ b/src/atom.h @@ -229,7 +229,7 @@ class Atom : protected Pointers { void deallocate_topology(); - void data_atoms(int, char *, tagint, int, int, double *); + void data_atoms(int, char *, tagint, tagint, int, int, double *); void data_vels(int, char *, tagint); void data_bonds(int, char *, int *, tagint, int); void data_angles(int, char *, int *, tagint, int); diff --git a/src/read_data.cpp b/src/read_data.cpp index b1a42608c0..3b93098a6e 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -124,7 +124,7 @@ void ReadData::command(int narg, char **arg) addflag = NONE; coeffflag = 1; - id_offset = 0; + id_offset = mol_offset = 0; offsetflag = shiftflag = 0; toffset = boffset = aoffset = doffset = ioffset = 0; shift[0] = shift[1] = shift[2] = 0.0; @@ -145,11 +145,21 @@ void ReadData::command(int narg, char **arg) if (strcmp(arg[iarg+1],"append") == 0) addflag = APPEND; else if (strcmp(arg[iarg+1],"merge") == 0) addflag = MERGE; else { + if (atom->molecule_flag && (iarg+3 > narg)) + error->all(FLERR,"Illegal read_data command"); addflag = VALUE; bigint offset = force->bnumeric(FLERR,arg[iarg+1]); if (offset > MAXTAGINT) - error->all(FLERR,"Read data add offset is too big"); + error->all(FLERR,"Read data add atomID offset is too big"); id_offset = offset; + + if (atom->molecule_flag) { + offset = force->bnumeric(FLERR,arg[iarg+2]); + if (offset > MAXTAGINT) + error->all(FLERR,"Read data add molID offset is too big"); + mol_offset = offset; + iarg++; + } } iarg += 2; } else if (strcmp(arg[iarg],"offset") == 0) { @@ -310,14 +320,18 @@ void ReadData::command(int narg, char **arg) update->ntimestep = 0; } - // compute atomID offset for addflag = MERGE + // compute atomID and optionally moleculeID offset for addflag = APPEND if (addflag == APPEND) { tagint *tag = atom->tag; + tagint *molecule = atom->molecule; int nlocal = atom->nlocal; - tagint max = 0; - for (int i = 0; i < nlocal; i++) max = MAX(max,tag[i]); - MPI_Allreduce(&max,&id_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); + tagint maxid = 0, maxmol = 0; + for (int i = 0; i < nlocal; i++) maxid = MAX(maxid,tag[i]); + if (atom->molecule_flag) + for (int i = 0; i < nlocal; i++) maxmol = MAX(maxmol,molecule[i]); + MPI_Allreduce(&maxid,&id_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); + MPI_Allreduce(&maxmol,&mol_offset,1,MPI_LMP_TAGINT,MPI_MAX,world); } // set up pointer to hold original styles while we replace them with "zero" @@ -1137,7 +1151,7 @@ void ReadData::atoms() nchunk = MIN(natoms-nread,CHUNK); eof = comm->read_lines_from_file(fp,nchunk,MAXLINE,buffer); if (eof) error->all(FLERR,"Unexpected end of data file"); - atom->data_atoms(nchunk,buffer,id_offset,toffset,shiftflag,shift); + atom->data_atoms(nchunk,buffer,id_offset,mol_offset,toffset,shiftflag,shift); nread += nchunk; } diff --git a/src/read_data.h b/src/read_data.h index 730229c722..b85ed67dcd 100644 --- a/src/read_data.h +++ b/src/read_data.h @@ -39,7 +39,7 @@ class ReadData : protected Pointers { int narg,maxarg; char argoffset1[8],argoffset2[8]; - bigint id_offset; + bigint id_offset, mol_offset; int nlocal_previous; bigint natoms; -- GitLab From fb6e7e8aeaa88592b838b2fe60d72fa23724dcd2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Feb 2018 16:41:10 +0100 Subject: [PATCH 11/46] add sanity checks for ring communication we do not call memcpy() unless nbytes != 0 and source/target pointer is not NULL we error out on illegal combinations of nbytes and inbuf/outbuf --- src/comm.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index 88edf98ca6..9fae8347e0 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -696,10 +696,15 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, if (maxbytes == 0) return; + // sanity check 1 + + if ((nbytes > 0) && inbuf == NULL) + error->one(FLERR,"Cannot put data on ring from NULL pointer"); + char *buf,*bufcopy; memory->create(buf,maxbytes,"comm:buf"); memory->create(bufcopy,maxbytes,"comm:bufcopy"); - memcpy(buf,inbuf,nbytes); + if (nbytes && inbuf) memcpy(buf,inbuf,nbytes); int next = me + 1; int prev = me - 1; @@ -712,12 +717,17 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, MPI_Send(buf,nbytes,MPI_CHAR,next,messtag,world); MPI_Wait(&request,&status); MPI_Get_count(&status,MPI_CHAR,&nbytes); - memcpy(buf,bufcopy,nbytes); + if (nbytes) memcpy(buf,bufcopy,nbytes); } if (self || loop < nprocs-1) callback(nbytes/nper,buf,ptr); } - if (outbuf) memcpy(outbuf,buf,nbytes); + // sanity check 2 + + if ((nbytes > 0) && outbuf == NULL) + error->one(FLERR,"Cannot put data from ring to NULL pointer"); + + if (nbytes && outbuf) memcpy(outbuf,buf,nbytes); memory->destroy(buf); memory->destroy(bufcopy); -- GitLab From 948f4783aadcf4d628099d88a6b608642a36c592 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Feb 2018 17:17:45 +0100 Subject: [PATCH 12/46] ring communication *is* called with outbut set to NULL, so don't error out on that. --- src/comm.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index 9fae8347e0..d997c2914f 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -696,7 +696,7 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, if (maxbytes == 0) return; - // sanity check 1 + // sanity check if ((nbytes > 0) && inbuf == NULL) error->one(FLERR,"Cannot put data on ring from NULL pointer"); @@ -722,11 +722,6 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag, if (self || loop < nprocs-1) callback(nbytes/nper,buf,ptr); } - // sanity check 2 - - if ((nbytes > 0) && outbuf == NULL) - error->one(FLERR,"Cannot put data from ring to NULL pointer"); - if (nbytes && outbuf) memcpy(outbuf,buf,nbytes); memory->destroy(buf); -- GitLab From 5fb2979da73ff9e1e06c55b8793d46185e5cb0a6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Feb 2018 13:50:42 -0500 Subject: [PATCH 13/46] allow dynamic groups for some standard walls interacting with point particles --- src/fix_wall_harmonic.cpp | 5 ++++- src/fix_wall_lj1043.cpp | 5 ++++- src/fix_wall_lj126.cpp | 5 ++++- src/fix_wall_lj93.cpp | 5 ++++- src/fix_wall_reflect.cpp | 2 ++ src/fix_wall_region.cpp | 2 ++ 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/fix_wall_harmonic.cpp b/src/fix_wall_harmonic.cpp index f91295d469..20d5dbebd4 100644 --- a/src/fix_wall_harmonic.cpp +++ b/src/fix_wall_harmonic.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallHarmonic::FixWallHarmonic(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- interaction of all particles in group with a wall diff --git a/src/fix_wall_lj1043.cpp b/src/fix_wall_lj1043.cpp index e8e706ed5e..064a5a8d60 100644 --- a/src/fix_wall_lj1043.cpp +++ b/src/fix_wall_lj1043.cpp @@ -26,7 +26,10 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ FixWallLJ1043::FixWallLJ1043(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/fix_wall_lj126.cpp b/src/fix_wall_lj126.cpp index 22199fed5b..f556952ab3 100644 --- a/src/fix_wall_lj126.cpp +++ b/src/fix_wall_lj126.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallLJ126::FixWallLJ126(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/fix_wall_lj93.cpp b/src/fix_wall_lj93.cpp index 281a1fafc4..f5d6a7e147 100644 --- a/src/fix_wall_lj93.cpp +++ b/src/fix_wall_lj93.cpp @@ -22,7 +22,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixWallLJ93::FixWallLJ93(LAMMPS *lmp, int narg, char **arg) : - FixWall(lmp, narg, arg) {} + FixWall(lmp, narg, arg) +{ + dynamic_group_allow = 1; +} /* ---------------------------------------------------------------------- */ diff --git a/src/fix_wall_reflect.cpp b/src/fix_wall_reflect.cpp index dba7cf7036..86607dbe8e 100644 --- a/src/fix_wall_reflect.cpp +++ b/src/fix_wall_reflect.cpp @@ -39,6 +39,8 @@ FixWallReflect::FixWallReflect(LAMMPS *lmp, int narg, char **arg) : { if (narg < 4) error->all(FLERR,"Illegal fix wall/reflect command"); + dynamic_group_allow = 1; + // parse args nwall = 0; diff --git a/src/fix_wall_region.cpp b/src/fix_wall_region.cpp index 1d22e6141b..67b0bcd713 100644 --- a/src/fix_wall_region.cpp +++ b/src/fix_wall_region.cpp @@ -67,6 +67,8 @@ FixWallRegion::FixWallRegion(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[4],"harmonic") == 0) style = HARMONIC; else error->all(FLERR,"Illegal fix wall/region command"); + if (style != COLLOID) dynamic_group_allow = 1; + epsilon = force->numeric(FLERR,arg[5]); sigma = force->numeric(FLERR,arg[6]); cutoff = force->numeric(FLERR,arg[7]); -- GitLab From 58e01a9eee0b700a807da11cf3f4bb130c74e8a3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Feb 2018 14:03:07 +0100 Subject: [PATCH 14/46] plug memory leak in pair style lj/class2/coul/long with coulomb tables --- src/CLASS2/pair_lj_class2_coul_long.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CLASS2/pair_lj_class2_coul_long.cpp b/src/CLASS2/pair_lj_class2_coul_long.cpp index 5d2ae891d0..9278703e2a 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.cpp +++ b/src/CLASS2/pair_lj_class2_coul_long.cpp @@ -66,6 +66,7 @@ PairLJClass2CoulLong::~PairLJClass2CoulLong() memory->destroy(offset); } } + if (ftable) free_tables(); } /* ---------------------------------------------------------------------- */ -- GitLab From eadac1546651b38af5f53e8135f72f8c6aba8522 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Feb 2018 14:02:16 +0100 Subject: [PATCH 15/46] avoid multiple calls to delete [] on the same pointer. thanks to @ExHP for pointing out this issue --- src/library.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/library.cpp b/src/library.cpp index f0bd7f7ca6..233bb3122c 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -285,7 +285,6 @@ void lammps_commands_string(void *ptr, char *str) BEGIN_CAPTURE { if (lmp->update->whichflag != 0) { - delete [] copy; lmp->error->all(FLERR,"Library error: issuing LAMMPS command during run"); } -- GitLab From 8d0fdb17a6aaab437d0a672d4d48b5eb0647f5b2 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 1 Mar 2018 10:39:06 -0700 Subject: [PATCH 16/46] Add make package-installed command --- doc/src/Section_start.txt | 4 ++++ src/Makefile | 7 +++++++ src/Package.sh | 7 +++++++ 3 files changed, 18 insertions(+) diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt index affcae1e54..6473c346dc 100644 --- a/doc/src/Section_start.txt +++ b/doc/src/Section_start.txt @@ -803,6 +803,10 @@ currently installed. For those that are installed, it will list any files that are different in the src directory and package sub-directory. +Typing "make package-installed" or "make pi" will list which packages are +currently installed, without listing the status of packages that are not +installed. + Typing "make package-update" or "make pu" will overwrite src files with files from the package sub-directories if the package is installed. It should be used after a patch has been applied, since diff --git a/src/Makefile b/src/Makefile index e0f0db77fe..03f4072132 100644 --- a/src/Makefile +++ b/src/Makefile @@ -100,6 +100,7 @@ help: @echo '' @echo 'make package list available packages and their dependencies' @echo 'make package-status (ps) status of all packages' + @echo 'make package-installed (pi) list of installed packages' @echo 'make yes-package install a single pgk in src dir' @echo 'make no-package remove a single pkg from src dir' @echo 'make yes-all install all pgks in src dir' @@ -260,6 +261,7 @@ package: @echo 'make package list available packages' @echo 'make package list available packages' @echo 'make package-status (ps) status of all packages' + @echo 'make package-installed (pi) list of installed packages' @echo 'make yes-package install a single pgk in src dir' @echo 'make no-package remove a single pkg from src dir' @echo 'make yes-all install all pgks in src dir' @@ -354,6 +356,7 @@ lib-%: fi; touch main.cpp # status = list src files that differ from package files +# installed = list of installed packages # update = replace src files with newer package files # overwrite = overwrite package files with newer src files # diff = show differences between src and package files @@ -364,6 +367,10 @@ package-status ps: @echo '' @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p status; done +package-installed pi: + @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p installed; done + @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p installed; done + package-update pu: purge @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p update; done @echo '' diff --git a/src/Package.sh b/src/Package.sh index ce3819b590..72e8761e21 100644 --- a/src/Package.sh +++ b/src/Package.sh @@ -34,6 +34,13 @@ if (test $2 = "status") then echo "Installed NO: package $1" fi +# installed, list only if installed + +elif (test $2 = "installed") then + if (test $installed = 1) then + echo "Installed YES: package $1" + fi + # update, only if installed # perform a re-install, but only if the package is already installed -- GitLab From b1d3b56a17ae4ccf1fd728209d5f4d66ed2cbfaa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 2 Mar 2018 04:33:13 -0500 Subject: [PATCH 17/46] apply bugfix reported in issue #820 --- src/compute_chunk_atom.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compute_chunk_atom.cpp b/src/compute_chunk_atom.cpp index aa1210caad..d08f462907 100644 --- a/src/compute_chunk_atom.cpp +++ b/src/compute_chunk_atom.cpp @@ -1809,13 +1809,13 @@ void ComputeChunkAtom::atom2binsphere() } yremap = x[i][1]; if (periodicity[1]) { - if (xremap < boxlo[1]) yremap += prd[1]; - if (xremap >= boxhi[1]) yremap -= prd[1]; + if (yremap < boxlo[1]) yremap += prd[1]; + if (yremap >= boxhi[1]) yremap -= prd[1]; } zremap = x[i][2]; if (periodicity[2]) { - if (xremap < boxlo[2]) zremap += prd[2]; - if (xremap >= boxhi[2]) zremap -= prd[2]; + if (zremap < boxlo[2]) zremap += prd[2]; + if (zremap >= boxhi[2]) zremap -= prd[2]; } dx = xremap - sorigin[0]; -- GitLab From d18ba3b18834187bda0dd7240fb443271f1288d5 Mon Sep 17 00:00:00 2001 From: Anders Hafreager Date: Thu, 1 Mar 2018 23:22:03 -0800 Subject: [PATCH 18/46] Added error if gcmc is used with molecules on more than one processor --- src/MC/fix_gcmc.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 0230084490..61629aa30d 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -714,6 +714,12 @@ void FixGCMC::init() } } + // Current implementation is broken using + // full_flag on molecules on more than one processor. + // Print error if this is the current mode + if (full_flag && (exchmode == EXCHMOL || movemode == MOVEMOL) && comm->nprocs > 1) + error->all(FLERR,"fix gcmc does currently not support full_energy option with molecules on more than 1 MPI process."); + } /* ---------------------------------------------------------------------- -- GitLab From a1bdea1dd862072e9078e606d266ca1eb319d104 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Mar 2018 14:03:10 -0500 Subject: [PATCH 19/46] avoid division by zero for pair styles meam and meam/c --- lib/meam/meam_dens_final.F | 18 +++++++++++++++--- src/USER-MEAMC/meam_dens_final.cpp | 6 +++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/meam/meam_dens_final.F b/lib/meam/meam_dens_final.F index cdc47067e2..098b00f296 100644 --- a/lib/meam/meam_dens_final.F +++ b/lib/meam/meam_dens_final.F @@ -72,9 +72,21 @@ c Complete the calculation of density if( rho0(i) .gt. 0.0 ) then if (ialloy.eq.1) then - t_ave(1,i) = t_ave(1,i)/tsq_ave(1,i) - t_ave(2,i) = t_ave(2,i)/tsq_ave(2,i) - t_ave(3,i) = t_ave(3,i)/tsq_ave(3,i) + if (tsq_ave(1,i) .ne. 0.0d0) then + t_ave(1,i) = t_ave(1,i)/tsq_ave(1,i) + else + t_ave(1,i) = 0.0d0 + endif + if (tsq_ave(2,i) .ne. 0.0d0) then + t_ave(2,i) = t_ave(2,i)/tsq_ave(2,i) + else + t_ave(2,i) = 0.0d0 + endif + if (tsq_ave(3,i) .ne. 0.0d0) then + t_ave(3,i) = t_ave(3,i)/tsq_ave(3,i) + else + t_ave(3,i) = 0.0d0 + endif else if (ialloy.eq.2) then t_ave(1,i) = t1_meam(elti) t_ave(2,i) = t2_meam(elti) diff --git a/src/USER-MEAMC/meam_dens_final.cpp b/src/USER-MEAMC/meam_dens_final.cpp index 2adf4000f1..e25c2e7299 100644 --- a/src/USER-MEAMC/meam_dens_final.cpp +++ b/src/USER-MEAMC/meam_dens_final.cpp @@ -33,9 +33,9 @@ MEAM::meam_dens_final(int nlocal, int eflag_either, int eflag_global, int eflag_ if (rho0[i] > 0.0) { if (this->ialloy == 1) { - t_ave[i][0] = t_ave[i][0] / tsq_ave[i][0]; - t_ave[i][1] = t_ave[i][1] / tsq_ave[i][1]; - t_ave[i][2] = t_ave[i][2] / tsq_ave[i][2]; + t_ave[i][0] = (tsq_ave[i][0] != 0.0 ) ? t_ave[i][0] / tsq_ave[i][0] : 0.0; + t_ave[i][1] = (tsq_ave[i][1] != 0.0 ) ? t_ave[i][1] / tsq_ave[i][1] : 0.0; + t_ave[i][0] = (tsq_ave[i][2] != 0.0 ) ? t_ave[i][2] / tsq_ave[i][2] : 0.0; } else if (this->ialloy == 2) { t_ave[i][0] = this->t1_meam[elti]; t_ave[i][1] = this->t2_meam[elti]; -- GitLab From 1ca928b3313fccbc851183f87938182511d612b8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Mar 2018 20:33:19 -0500 Subject: [PATCH 20/46] dead code removal --- src/USER-DPD/fix_shardlow.cpp | 6 ++---- src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/USER-DPD/fix_shardlow.cpp b/src/USER-DPD/fix_shardlow.cpp index 2b7a69503a..cee67cfcf9 100644 --- a/src/USER-DPD/fix_shardlow.cpp +++ b/src/USER-DPD/fix_shardlow.cpp @@ -530,10 +530,9 @@ while (ct-- > 0) { void FixShardlow::initial_integrate(int vflag) { int ii; - int *ilist; - int nlocal = atom->nlocal; - int nghost = atom->nghost; + const int nlocal = atom->nlocal; + const int nghost = atom->nghost; const bool useDPDE = (pairDPDE != NULL); @@ -592,7 +591,6 @@ void FixShardlow::initial_integrate(int vflag) // Allocate memory for v_t0 to hold the initial velocities for the ghosts v_t0 = (double (*)[3]) memory->smalloc(sizeof(double)*3*nghost, "FixShardlow:v_t0"); - ilist = list->ilist; dtsqrt = sqrt(update->dt); // process neighbors in the local AIR diff --git a/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp index f5dc03e368..51574b2ee7 100644 --- a/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_coul_wolf_omp.cpp @@ -83,7 +83,7 @@ void PairLJCutCoulWolfOMP::eval(int iifrom, int iito, ThrData * const thr) int i,j,ii,jj,jnum,itype,jtype; double qitmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; double r,rsq,r2inv,r6inv,forcecoul,forcelj,factor_coul,factor_lj; - double prefactor,erfcc,erfcd,v_sh,dvdrr,e_self,qisq; + double prefactor,erfcc,erfcd,v_sh,dvdrr,e_self; int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; -- GitLab From 64779eb5761a468640e0bc4a0de98570386202f6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Mar 2018 13:21:34 -0500 Subject: [PATCH 21/46] documentation update for MEAM to clarify the I,J,K indices in the MEAM parameter file --- doc/src/pair_meam.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/src/pair_meam.txt b/doc/src/pair_meam.txt index 62fa59f406..a25f96021f 100644 --- a/doc/src/pair_meam.txt +++ b/doc/src/pair_meam.txt @@ -164,7 +164,14 @@ keyword(I) = value keyword(I,J) = value keyword(I,J,K) = value :pre -The recognized keywords are as follows: +The indices I, J, K correspond to the elements selected from the +MEAM library file numbered in the order of how those elements were +selected starting from 1. Thus for the example given below + +pair_coeff * * library.meam Si C sic.meam Si Si Si C :pre + +an index of 1 would refer to Si and an index of 2 to C. The recognized +keywords for the parameter file are as follows: Ec, alpha, rho0, delta, lattce, attrac, repuls, nn2, Cmin, Cmax, rc, delr, augt1, gsmooth_factor, re -- GitLab From 070e85b44b80b3724eb1197fa503e89645f11bb9 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Tue, 6 Mar 2018 12:45:40 -0700 Subject: [PATCH 22/46] add restartinfo=0 to manbody file it was missing from --- doc/src/pair_meam.txt | 16 +++++++++++++--- src/MANYBODY/pair_airebo.cpp | 1 + src/MANYBODY/pair_bop.cpp | 1 + src/MANYBODY/pair_lcbop.cpp | 4 +++- src/MANYBODY/pair_nb3b_harmonic.cpp | 1 + src/MANYBODY/pair_polymorphic.cpp | 1 + src/USER-MISC/pair_kolmogorov_crespi_z.cpp | 1 + src/USER-MISC/pair_list.cpp | 1 + src/USER-MISC/pair_tersoff_table.cpp | 1 + 9 files changed, 23 insertions(+), 4 deletions(-) diff --git a/doc/src/pair_meam.txt b/doc/src/pair_meam.txt index a25f96021f..c7449428bd 100644 --- a/doc/src/pair_meam.txt +++ b/doc/src/pair_meam.txt @@ -77,7 +77,7 @@ See the "pair_coeff"_pair_coeff.html doc page for alternate ways to specify the path for the potential files. As an example, the potentials/library.meam file has generic MEAM -settings for a variety of elements. The potentials/sic.meam file has +settings for a variety of elements. The potentials/SiC.meam file has specific parameter settings for a Si and C alloy system. If your LAMMPS simulation has 4 atoms types and you want the 1st 3 to be Si, and the 4th to be C, you would use the following pair_coeff command: @@ -105,6 +105,15 @@ This can be used when a {meam} potential is used as part of the {hybrid} pair style. The NULL values are placeholders for atom types that will be used with other potentials. +NOTE: If the 2nd filename is NULL, the element names between the two +filenames can appear in any order, e.g. "Si C" or "C Si" in the +example above. However, if the 2nd filename is not NULL (as in the +example above), it contains settings that are Fortran-indexed for the +elements that preceed it. Thus you need to insure you list the +elements between the filenames in an order consistent with how the +values in the 2nd filename are indexed. See details below on the +syntax for settings in the 2nd file. + The MEAM library file provided with LAMMPS has the name potentials/library.meam. It is the "meamf" file used by other MD codes. Aside from blank and comment lines (start with #) which can @@ -170,8 +179,9 @@ selected starting from 1. Thus for the example given below pair_coeff * * library.meam Si C sic.meam Si Si Si C :pre -an index of 1 would refer to Si and an index of 2 to C. The recognized -keywords for the parameter file are as follows: +an index of 1 would refer to Si and an index of 2 to C. + +The recognized keywords for the parameter file are as follows: Ec, alpha, rho0, delta, lattce, attrac, repuls, nn2, Cmin, Cmax, rc, delr, augt1, gsmooth_factor, re diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index b363ad1472..5a56b0cd59 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -52,6 +52,7 @@ using namespace MathSpecial; PairAIREBO::PairAIREBO(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; ghostneigh = 1; ljflag = torflag = 1; diff --git a/src/MANYBODY/pair_bop.cpp b/src/MANYBODY/pair_bop.cpp index 219acc50af..a934d5a1e8 100644 --- a/src/MANYBODY/pair_bop.cpp +++ b/src/MANYBODY/pair_bop.cpp @@ -61,6 +61,7 @@ using namespace LAMMPS_NS; PairBOP::PairBOP(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; manybody_flag = 1; ghostneigh = 1; diff --git a/src/MANYBODY/pair_lcbop.cpp b/src/MANYBODY/pair_lcbop.cpp index fde0342dcc..414f2adb74 100644 --- a/src/MANYBODY/pair_lcbop.cpp +++ b/src/MANYBODY/pair_lcbop.cpp @@ -44,8 +44,10 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairLCBOP::PairLCBOP(LAMMPS *lmp) : Pair(lmp) { +PairLCBOP::PairLCBOP(LAMMPS *lmp) : Pair(lmp) +{ single_enable = 0; + restartinfo = 0; one_coeff = 1; manybody_flag = 1; ghostneigh = 1; diff --git a/src/MANYBODY/pair_nb3b_harmonic.cpp b/src/MANYBODY/pair_nb3b_harmonic.cpp index 231119fe24..d1d5880839 100644 --- a/src/MANYBODY/pair_nb3b_harmonic.cpp +++ b/src/MANYBODY/pair_nb3b_harmonic.cpp @@ -44,6 +44,7 @@ using namespace LAMMPS_NS; PairNb3bHarmonic::PairNb3bHarmonic(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; manybody_flag = 1; diff --git a/src/MANYBODY/pair_polymorphic.cpp b/src/MANYBODY/pair_polymorphic.cpp index 2429dd0638..02075ed5b4 100644 --- a/src/MANYBODY/pair_polymorphic.cpp +++ b/src/MANYBODY/pair_polymorphic.cpp @@ -43,6 +43,7 @@ using namespace MathConst; PairPolymorphic::PairPolymorphic(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; nelements = 0; diff --git a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp b/src/USER-MISC/pair_kolmogorov_crespi_z.cpp index c03aee6362..dc1f56a318 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_z.cpp @@ -43,6 +43,7 @@ using namespace LAMMPS_NS; PairKolmogorovCrespiZ::PairKolmogorovCrespiZ(LAMMPS *lmp) : Pair(lmp) { writedata = 1; + restartinfo = 0; // initialize element to parameter maps nelements = 0; diff --git a/src/USER-MISC/pair_list.cpp b/src/USER-MISC/pair_list.cpp index 458c228d58..6bb71d05c8 100644 --- a/src/USER-MISC/pair_list.cpp +++ b/src/USER-MISC/pair_list.cpp @@ -54,6 +54,7 @@ typedef struct { double x,y,z; } dbl3_t; PairList::PairList(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; respa_enable = 0; cut_global = 0.0; style = NULL; diff --git a/src/USER-MISC/pair_tersoff_table.cpp b/src/USER-MISC/pair_tersoff_table.cpp index 0afb963402..1c96b3d002 100644 --- a/src/USER-MISC/pair_tersoff_table.cpp +++ b/src/USER-MISC/pair_tersoff_table.cpp @@ -55,6 +55,7 @@ using namespace LAMMPS_NS; PairTersoffTable::PairTersoffTable(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; + restartinfo = 0; one_coeff = 1; manybody_flag = 1; -- GitLab From 47e2ca6eb200b6dc7921a3d79b2a439f93084558 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Mar 2018 09:52:14 -0500 Subject: [PATCH 23/46] apply bugfix to reaxff taper function as described in issue #828 --- lib/reax/reax_charges.F | 2 +- src/KOKKOS/pair_reaxc_kokkos.cpp | 2 +- src/QEQ/fix_qeq_shielded.cpp | 2 +- src/REAX/pair_reax.cpp | 2 +- src/USER-REAXC/fix_qeq_reax.cpp | 2 +- src/USER-REAXC/reaxc_init_md.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/reax/reax_charges.F b/lib/reax/reax_charges.F index 5a884d82c6..5815501a29 100644 --- a/lib/reax/reax_charges.F +++ b/lib/reax/reax_charges.F @@ -78,7 +78,7 @@ c$$$ end if SWC3= 140.0D0*(SWA3*SWB+3.0D0*SWA2*SWB2+SWA*SWB3)/D7 SWC2=-210.0D0*(SWA3*SWB2+SWA2*SWB3)/D7 SWC1= 140.0D0*SWA3*SWB3/D7 - SWC0=(-35.0D0*SWA3*SWB2*SWB2+21.0D0*SWA2*SWB3*SWB2+ + SWC0=(-35.0D0*SWA3*SWB2*SWB2+21.0D0*SWA2*SWB3*SWB2- $7.0D0*SWA*SWB3*SWB3+SWB3*SWB3*SWB)/D7 return diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 1f59637767..032e428162 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -358,7 +358,7 @@ void PairReaxCKokkos::init_md() k_tap.h_view(3) = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; k_tap.h_view(2) =-210.0 * (swa3*swb2 + swa2*swb3) / d7; k_tap.h_view(1) = 140.0 * swa3 * swb3 / d7; - k_tap.h_view(0) = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + + k_tap.h_view(0) = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; k_tap.template modify(); diff --git a/src/QEQ/fix_qeq_shielded.cpp b/src/QEQ/fix_qeq_shielded.cpp index 661dd73f7b..a5e0324d69 100644 --- a/src/QEQ/fix_qeq_shielded.cpp +++ b/src/QEQ/fix_qeq_shielded.cpp @@ -105,7 +105,7 @@ void FixQEqShielded::init_shielding() Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; Tap[1] = 140.0 * swa3 * swb3 / d7; - Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + + Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; } diff --git a/src/REAX/pair_reax.cpp b/src/REAX/pair_reax.cpp index be270b3ede..202051fc52 100644 --- a/src/REAX/pair_reax.cpp +++ b/src/REAX/pair_reax.cpp @@ -720,7 +720,7 @@ void PairREAX::taper_setup() swc3= 140.0e0*(swa3*swb+3.0e0*swa2*swb2+swa*swb3)/d7; swc2=-210.0e0*(swa3*swb2+swa2*swb3)/d7; swc1= 140.0e0*swa3*swb3/d7; - swc0=(-35.0e0*swa3*swb2*swb2+21.0e0*swa2*swb3*swb2+ + swc0=(-35.0e0*swa3*swb2*swb2+21.0e0*swa2*swb3*swb2- 7.0e0*swa*swb3*swb3+swb3*swb3*swb)/d7; } diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index d1c4f90771..a79c5edd07 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -428,7 +428,7 @@ void FixQEqReax::init_taper() Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3) / d7; Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; Tap[1] = 140.0 * swa3 * swb3 / d7; - Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + + Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; } diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index b11cdd2fbc..4af21284f2 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -113,7 +113,7 @@ void Init_Taper( control_params *control, storage *workspace, MPI_Comm comm ) workspace->Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; workspace->Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; workspace->Tap[1] = 140.0 * swa3 * swb3 / d7; - workspace->Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + + workspace->Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; } -- GitLab From fd1edaf04f777360156a83945f00d7e58cdbe5fe Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Wed, 7 Mar 2018 08:52:46 -0700 Subject: [PATCH 24/46] allow for mpi4py version 2 or 3 in Python wrapper --- python/lammps.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python/lammps.py b/python/lammps.py index c895037c00..62ed272d4b 100644 --- a/python/lammps.py +++ b/python/lammps.py @@ -46,17 +46,15 @@ class MPIAbortException(Exception): def __str__(self): return repr(self.message) - class lammps(object): # detect if Python is using version of mpi4py that can pass a communicator - has_mpi4py_v2 = False + has_mpi4py = False try: from mpi4py import MPI from mpi4py import __version__ as mpi4py_version - if mpi4py_version.split('.')[0] == '2': - has_mpi4py_v2 = True + if mpi4py_version.split('.')[0] in ['2','3']: has_mpi4py = True except: pass @@ -111,7 +109,9 @@ class lammps(object): # need to adjust for type of MPI communicator object # allow for int (like MPICH) or void* (like OpenMPI) - if lammps.has_mpi4py_v2 and comm != None: + if comm: + if not lammps.has_mpi4py: + raise Exception('Python mpi4py version is not 2 or 3') if lammps.MPI._sizeof(lammps.MPI.Comm) == sizeof(c_int): MPI_Comm = c_int else: -- GitLab From f91c36878c645defee3d86ace188a9beb1c5fe20 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Mar 2018 10:57:07 -0500 Subject: [PATCH 25/46] remove dead code --- src/REAX/pair_reax.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/REAX/pair_reax.cpp b/src/REAX/pair_reax.cpp index 202051fc52..0c3374d106 100644 --- a/src/REAX/pair_reax.cpp +++ b/src/REAX/pair_reax.cpp @@ -943,7 +943,7 @@ void PairREAX::cg_solve(const int & nlocal, const int & nghost, double aval[], int acol_ind[], int arow_ptr[], double x[], double b[]) { - double one, zero, rho, rho_old, alpha, beta, gamma; + double one, rho, rho_old, alpha, beta, gamma; int iter, maxiter; int n; double sumtmp; @@ -963,7 +963,6 @@ void PairREAX::cg_solve(const int & nlocal, const int & nghost, n = nlocal+nghost+1; one = 1.0; - zero = 0.0; maxiter = 100; for (int i = 0; i < n; i++) w[i] = 0; -- GitLab From 812572ea973c6c9f2b84db76f2338600d6d3ff70 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Mar 2018 10:57:56 -0500 Subject: [PATCH 26/46] update dependencies for colvars library --- lib/colvars/Makefile.deps | 112 +++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 57 deletions(-) diff --git a/lib/colvars/Makefile.deps b/lib/colvars/Makefile.deps index e0c768dbc9..9a7de0647d 100644 --- a/lib/colvars/Makefile.deps +++ b/lib/colvars/Makefile.deps @@ -1,9 +1,9 @@ $(COLVARS_OBJ_DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h \ colvarparse.h colvaratoms.h colvardeps.h $(COLVARS_OBJ_DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvar.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h colvar.h \ colvarparse.h colvardeps.h lepton/include/Lepton.h \ lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ @@ -16,9 +16,9 @@ $(COLVARS_OBJ_DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvarbias_abf.h colvarbias.h colvargrid.h colvar_UIestimator.h $(COLVARS_OBJ_DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarbias_alb.h colvar.h colvarparse.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + colvars_version.h colvarbias.h colvar.h colvarvalue.h colvartypes.h \ + colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ lepton/include/lepton/CustomFunction.h \ @@ -27,9 +27,9 @@ $(COLVARS_OBJ_DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarbias.h + colvarbias_alb.h $(COLVARS_OBJ_DIR)colvarbias.o: colvarbias.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvarbias.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h colvarbias.h \ colvar.h colvarparse.h colvardeps.h lepton/include/Lepton.h \ lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ @@ -42,8 +42,8 @@ $(COLVARS_OBJ_DIR)colvarbias.o: colvarbias.cpp colvarmodule.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvargrid.h $(COLVARS_OBJ_DIR)colvarbias_histogram.o: colvarbias_histogram.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h \ + colvarmodule.h colvars_version.h colvarproxy.h colvarvalue.h \ + colvartypes.h colvar.h colvarparse.h colvardeps.h \ lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ @@ -54,9 +54,9 @@ $(COLVARS_OBJ_DIR)colvarbias_histogram.o: colvarbias_histogram.cpp \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvarbias_histogram.h colvarbias.h colvargrid.h -$(COLVARS_OBJ_DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h lepton/include/Lepton.h \ +$(COLVARS_OBJ_DIR)colvarbias_meta.o: colvarbias_meta.cpp colvarmodule.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h colvar.h \ + colvarparse.h colvardeps.h lepton/include/Lepton.h \ lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ @@ -68,8 +68,8 @@ $(COLVARS_OBJ_DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvarbias_meta.h colvarbias.h colvargrid.h $(COLVARS_OBJ_DIR)colvarbias_restraint.o: colvarbias_restraint.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias_restraint.h colvarbias.h colvar.h colvarparse.h \ + colvarmodule.h colvars_version.h colvarproxy.h colvarvalue.h \ + colvartypes.h colvarbias_restraint.h colvarbias.h colvar.h colvarparse.h \ colvardeps.h lepton/include/Lepton.h \ lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ @@ -81,9 +81,9 @@ $(COLVARS_OBJ_DIR)colvarbias_restraint.o: colvarbias_restraint.cpp \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h $(COLVARS_OBJ_DIR)colvarcomp_angles.o: colvarcomp_angles.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + colvarmodule.h colvars_version.h colvar.h colvarvalue.h colvartypes.h \ + colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ lepton/include/lepton/CustomFunction.h \ @@ -92,10 +92,10 @@ $(COLVARS_OBJ_DIR)colvarcomp_angles.o: colvarcomp_angles.cpp \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvaratoms.h colvardeps.h colvar.h \ + colvarmodule.h colvars_version.h colvarparse.h colvarvalue.h \ + colvartypes.h colvaratoms.h colvarproxy.h colvardeps.h colvar.h \ lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ @@ -107,8 +107,8 @@ $(COLVARS_OBJ_DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvarcomp.h $(COLVARS_OBJ_DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h colvar.h \ - colvarparse.h colvardeps.h lepton/include/Lepton.h \ + colvars_version.h colvarvalue.h colvartypes.h colvar.h colvarparse.h \ + colvardeps.h lepton/include/Lepton.h \ lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ @@ -118,11 +118,11 @@ $(COLVARS_OBJ_DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvarcomp_distances.o: colvarcomp_distances.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ + colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ lepton/include/lepton/CustomFunction.h \ @@ -131,11 +131,11 @@ $(COLVARS_OBJ_DIR)colvarcomp_distances.o: colvarcomp_distances.cpp \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvarcomp_protein.o: colvarcomp_protein.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ + colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ lepton/include/lepton/CustomFunction.h \ @@ -144,11 +144,11 @@ $(COLVARS_OBJ_DIR)colvarcomp_protein.o: colvarcomp_protein.cpp \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ + colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ lepton/include/lepton/CustomFunction.h \ @@ -157,11 +157,10 @@ $(COLVARS_OBJ_DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h + colvarcomp.h colvaratoms.h colvarproxy.h $(COLVARS_OBJ_DIR)colvar.o: colvar.cpp colvarmodule.h colvars_version.h \ - colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ - colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ + colvarvalue.h colvartypes.h colvarparse.h colvar.h colvardeps.h \ + lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ lepton/include/lepton/CustomFunction.h \ @@ -170,13 +169,13 @@ $(COLVARS_OBJ_DIR)colvar.o: colvar.cpp colvarmodule.h colvars_version.h \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvarscript.h colvarbias.h -$(COLVARS_OBJ_DIR)colvardeps.o: colvardeps.cpp colvardeps.h \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h + colvarcomp.h colvaratoms.h colvarproxy.h colvarscript.h colvarbias.h +$(COLVARS_OBJ_DIR)colvardeps.o: colvardeps.cpp colvarmodule.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h colvardeps.h \ + colvarparse.h $(COLVARS_OBJ_DIR)colvargrid.o: colvargrid.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ + colvars_version.h colvarvalue.h colvartypes.h colvarparse.h colvar.h \ + colvardeps.h lepton/include/Lepton.h \ lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ @@ -186,10 +185,10 @@ $(COLVARS_OBJ_DIR)colvargrid.o: colvargrid.cpp colvarmodule.h \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvargrid.h + colvarcomp.h colvaratoms.h colvarproxy.h colvargrid.h $(COLVARS_OBJ_DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ + colvars_version.h colvarparse.h colvarvalue.h colvartypes.h \ + colvarproxy.h colvar.h colvardeps.h lepton/include/Lepton.h \ lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ @@ -203,10 +202,9 @@ $(COLVARS_OBJ_DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h \ colvarbias_alb.h colvarbias_histogram.h colvarbias_meta.h \ colvarbias_restraint.h colvarscript.h colvaratoms.h colvarcomp.h $(COLVARS_OBJ_DIR)colvarparse.o: colvarparse.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarparse.h + colvars_version.h colvarvalue.h colvartypes.h colvarparse.h $(COLVARS_OBJ_DIR)colvarproxy.o: colvarproxy.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ + colvars_version.h colvarproxy.h colvarvalue.h colvartypes.h \ colvarscript.h colvarbias.h colvar.h colvarparse.h colvardeps.h \ lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ @@ -219,9 +217,9 @@ $(COLVARS_OBJ_DIR)colvarproxy.o: colvarproxy.cpp colvarmodule.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvaratoms.h $(COLVARS_OBJ_DIR)colvarscript.o: colvarscript.cpp colvarscript.h \ - colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarbias.h colvar.h colvarparse.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ + colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ + colvarbias.h colvar.h colvarparse.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/windowsIncludes.h \ lepton/include/lepton/CustomFunction.h \ @@ -229,9 +227,9 @@ $(COLVARS_OBJ_DIR)colvarscript.o: colvarscript.cpp colvarscript.h \ lepton/include/lepton/ExpressionTreeNode.h \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarproxy.h $(COLVARS_OBJ_DIR)colvartypes.o: colvartypes.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ - colvarparse.h + colvars_version.h colvartypes.h colvarparse.h colvarvalue.h $(COLVARS_OBJ_DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h + colvars_version.h colvarvalue.h colvartypes.h -- GitLab From 63c0a35fabf402b1f62af354418bb293685979fd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Mar 2018 11:12:08 -0500 Subject: [PATCH 27/46] remove code that has no effect --- src/REAX/pair_reax.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/REAX/pair_reax.cpp b/src/REAX/pair_reax.cpp index 0c3374d106..f6217c69a4 100644 --- a/src/REAX/pair_reax.cpp +++ b/src/REAX/pair_reax.cpp @@ -172,10 +172,6 @@ void PairREAX::compute(int eflag, int vflag) FORTRAN(srtbon1, SRTBON1)(&iprune, &ihb, &hbcut, &ihbnew, &itripstaball); - // communicate with other processors for the atomic bond order calculations - - FORTRAN(cbkabo, CBKABO).abo; - // communicate local atomic bond order to ghost atomic bond order packflag = 0; -- GitLab From a1bb877d5526130c56d72e7d982cff6c1f7db475 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Mar 2018 11:17:03 -0500 Subject: [PATCH 28/46] correct commented out MPI examples --- python/examples/simple.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/python/examples/simple.py b/python/examples/simple.py index da07a69997..ff777c8a09 100755 --- a/python/examples/simple.py +++ b/python/examples/simple.py @@ -88,8 +88,6 @@ lmp.command("run 10"); # uncomment if running in parallel via Pypar #print("Proc %d out of %d procs has" % (me,nprocs), lmp) -#pypar.finalize() # uncomment if running in parallel via mpi4py -#print "Proc %d out of %d procs has" % (me,nprocs), lmp -#MPI.Finalize() +#print("Proc %d out of %d procs has" % (me,nprocs), lmp) -- GitLab From 0c4c002f34131b9d196c32c1f95bca06b65df5f4 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Thu, 8 Mar 2018 08:19:46 -0700 Subject: [PATCH 29/46] patch 8Mar18 --- doc/src/Manual.txt | 4 ++-- src/version.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index ac6bfee64a..2f957eb113 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -21,7 +21,7 @@