From 228ae5a027d86c260198cbe345a24340a1e1ea97 Mon Sep 17 00:00:00 2001
From: Sriramkrishnan Muralikrishnan <sriramkrishnan.muralikrishnan@psi.ch>
Date: Mon, 21 Feb 2022 09:40:04 +0100
Subject: [PATCH 1/3] Solve warmup added and timings reorganized

---
 alpine/BumponTailInstability.cpp |  7 +++++++
 alpine/LandauDamping.cpp         |  6 ++++++
 alpine/PenningTrap.cpp           | 23 ++++++++++++++++-------
 alpine/UniformPlasmaTest.cpp     | 11 +++++++----
 4 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/alpine/BumponTailInstability.cpp b/alpine/BumponTailInstability.cpp
index c8f1e3d1..4e98bebd 100644
--- a/alpine/BumponTailInstability.cpp
+++ b/alpine/BumponTailInstability.cpp
@@ -183,6 +183,7 @@ int main(int argc, char *argv[]){
     static IpplTimings::TimerRef PTimer = IpplTimings::getTimer("kick");
     static IpplTimings::TimerRef RTimer = IpplTimings::getTimer("drift");
     static IpplTimings::TimerRef updateTimer = IpplTimings::getTimer("update");
+    static IpplTimings::TimerRef DummySolveTimer = IpplTimings::getTimer("solveWarmup");
     static IpplTimings::TimerRef SolveTimer = IpplTimings::getTimer("solve");
     static IpplTimings::TimerRef domainDecomposition = IpplTimings::getTimer("domainDecomp");
 
@@ -366,6 +367,12 @@ int main(int argc, char *argv[]){
     //The update after the particle creation is not needed as the 
     //particles are generated locally
 
+    IpplTimings::startTimer(DummySolveTimer);
+    P->rho_m = 0.0;
+    P->solver_mp->solve();
+    IpplTimings::stopTimer(DummySolveTimer);
+    
+    
     P->scatterCIC(totalP, 0, hr);
 
     IpplTimings::startTimer(SolveTimer);
diff --git a/alpine/LandauDamping.cpp b/alpine/LandauDamping.cpp
index 98b7eb15..4febc3bd 100644
--- a/alpine/LandauDamping.cpp
+++ b/alpine/LandauDamping.cpp
@@ -168,6 +168,7 @@ int main(int argc, char *argv[]){
     static IpplTimings::TimerRef PTimer = IpplTimings::getTimer("kick");
     static IpplTimings::TimerRef RTimer = IpplTimings::getTimer("drift");
     static IpplTimings::TimerRef updateTimer = IpplTimings::getTimer("update");
+    static IpplTimings::TimerRef DummySolveTimer = IpplTimings::getTimer("solveWarmup");
     static IpplTimings::TimerRef SolveTimer = IpplTimings::getTimer("solve");
     static IpplTimings::TimerRef domainDecomposition = IpplTimings::getTimer("domainDecomp");
 
@@ -315,6 +316,11 @@ int main(int argc, char *argv[]){
     //The update after the particle creation is not needed as the 
     //particles are generated locally
 
+    IpplTimings::startTimer(DummySolveTimer);
+    P->rho_m = 0.0;
+    P->solver_mp->solve();
+    IpplTimings::stopTimer(DummySolveTimer);
+
     P->scatterCIC(totalP, 0, hr);
 
     IpplTimings::startTimer(SolveTimer);
diff --git a/alpine/PenningTrap.cpp b/alpine/PenningTrap.cpp
index 35437b01..fbbdfd3d 100644
--- a/alpine/PenningTrap.cpp
+++ b/alpine/PenningTrap.cpp
@@ -168,7 +168,18 @@ int main(int argc, char *argv[]){
     };
 
     static IpplTimings::TimerRef mainTimer = IpplTimings::getTimer("mainTimer");
+    static IpplTimings::TimerRef particleCreation = IpplTimings::getTimer("particlesCreation");
+    static IpplTimings::TimerRef dumpDataTimer = IpplTimings::getTimer("dumpData");
+    static IpplTimings::TimerRef PTimer = IpplTimings::getTimer("kick");
+    static IpplTimings::TimerRef RTimer = IpplTimings::getTimer("drift");
+    static IpplTimings::TimerRef updateTimer = IpplTimings::getTimer("update");
+    static IpplTimings::TimerRef DummySolveTimer = IpplTimings::getTimer("solveWarmup");
+    static IpplTimings::TimerRef SolveTimer = IpplTimings::getTimer("Solve");
+    static IpplTimings::TimerRef domainDecomposition = IpplTimings::getTimer("domainDecomp");
+    
+    
     IpplTimings::startTimer(mainTimer);
+    
     size_type totalP = std::atol(argv[4]);
     const unsigned int nt     = std::atoi(argv[5]);
 
@@ -217,13 +228,6 @@ int main(int argc, char *argv[]){
 
     P->nr_m = nr;
 
-    static IpplTimings::TimerRef particleCreation = IpplTimings::getTimer("particlesCreation");
-    static IpplTimings::TimerRef updateTimer = IpplTimings::getTimer("update");
-    static IpplTimings::TimerRef domainDecomposition = IpplTimings::getTimer("domainDecomp");
-    static IpplTimings::TimerRef SolveTimer = IpplTimings::getTimer("Solve");
-    static IpplTimings::TimerRef dumpDataTimer = IpplTimings::getTimer("dumpData");
-    static IpplTimings::TimerRef PTimer = IpplTimings::getTimer("velocityPush");
-    static IpplTimings::TimerRef RTimer = IpplTimings::getTimer("positionPush");
 
     Vector_t length = rmax - rmin;
 
@@ -333,6 +337,11 @@ int main(int argc, char *argv[]){
     //The update after the particle creation is not needed as the 
     //particles are generated locally
     
+    IpplTimings::startTimer(DummySolveTimer);
+    P->rho_m = 0.0;
+    P->solver_mp->solve();
+    IpplTimings::stopTimer(DummySolveTimer);
+    
     P->scatterCIC(totalP, 0, hr);
 
     IpplTimings::startTimer(SolveTimer);
diff --git a/alpine/UniformPlasmaTest.cpp b/alpine/UniformPlasmaTest.cpp
index d740a705..6a662d6d 100644
--- a/alpine/UniformPlasmaTest.cpp
+++ b/alpine/UniformPlasmaTest.cpp
@@ -92,12 +92,12 @@ int main(int argc, char *argv[]){
 
     static IpplTimings::TimerRef mainTimer = IpplTimings::getTimer("mainTimer");
     static IpplTimings::TimerRef particleCreation = IpplTimings::getTimer("particlesCreation");
-    static IpplTimings::TimerRef FirstUpdateTimer = IpplTimings::getTimer("initialisation");
     static IpplTimings::TimerRef dumpDataTimer = IpplTimings::getTimer("dumpData");
     static IpplTimings::TimerRef PTimer = IpplTimings::getTimer("kick");
     static IpplTimings::TimerRef temp = IpplTimings::getTimer("randomMove");
     static IpplTimings::TimerRef RTimer = IpplTimings::getTimer("drift");
     static IpplTimings::TimerRef updateTimer = IpplTimings::getTimer("update");
+    static IpplTimings::TimerRef DummySolveTimer = IpplTimings::getTimer("solveWarmup");
     static IpplTimings::TimerRef SolveTimer = IpplTimings::getTimer("solve");
     static IpplTimings::TimerRef domainDecomposition = IpplTimings::getTimer("domainDecomp");
 
@@ -172,7 +172,6 @@ int main(int argc, char *argv[]){
     P->P = 0.0;
     IpplTimings::stopTimer(particleCreation);
 
-    IpplTimings::startTimer(FirstUpdateTimer);
     P->E_m.initialize(mesh, FL);
     P->rho_m.initialize(mesh, FL);
 
@@ -188,7 +187,12 @@ int main(int argc, char *argv[]){
     P->initSolver();
     P->time_m = 0.0;
     P->loadbalancefreq_m = std::atoi(argv[7]);
-   
+  
+    IpplTimings::startTimer(DummySolveTimer);
+    P->rho_m = 0.0;
+    P->solver_mp->solve();
+    IpplTimings::stopTimer(DummySolveTimer);
+
 
     P->scatterCIC(totalP, 0, hr);
     P->initializeORB(FL, mesh);
@@ -205,7 +209,6 @@ int main(int argc, char *argv[]){
     P->gatherStatistics(totalP);
     IpplTimings::stopTimer(dumpDataTimer);
 
-    IpplTimings::stopTimer(FirstUpdateTimer);
 
     // begin main timestep loop
     msg << "Starting iterations ..." << endl;
-- 
GitLab


From 12e19c52bdf3dc5829251b9b431bbd374709fa65 Mon Sep 17 00:00:00 2001
From: Sriramkrishnan Muralikrishnan <sriramkrishnan.muralikrishnan@psi.ch>
Date: Mon, 7 Mar 2022 12:05:27 +0100
Subject: [PATCH 2/3] Changes needed for comping with latest intel 2021.3.0
 compiler

---
 alpine/LandauDamping.cpp              |  2 +-
 src/Particle/ParticleAttrib.h         |  4 +-
 src/Particle/ParticleBase.hpp         |  4 +-
 src/Solver/FFTPeriodicPoissonSolver.h |  2 +-
 src/Utility/ParameterList.h           | 62 +++++++++++++--------------
 test/particle/PIC3d.cpp               |  2 +-
 test/serialization/serialize01.cpp    |  2 +-
 7 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/alpine/LandauDamping.cpp b/alpine/LandauDamping.cpp
index 4febc3bd..f8fdc1be 100644
--- a/alpine/LandauDamping.cpp
+++ b/alpine/LandauDamping.cpp
@@ -199,7 +199,7 @@ int main(int argc, char *argv[]){
 
     // create mesh and layout objects for this problem domain
     Vector_t kw = {0.5, 0.5, 0.5};
-    double alpha = 0.05;
+    double alpha = 0.5;
     Vector_t rmin(0.0);
     Vector_t rmax = 2 * pi / kw ;
     double dx = rmax[0] / nr[0];
diff --git a/src/Particle/ParticleAttrib.h b/src/Particle/ParticleAttrib.h
index 16a05513..99276a82 100644
--- a/src/Particle/ParticleAttrib.h
+++ b/src/Particle/ParticleAttrib.h
@@ -79,11 +79,11 @@ namespace ippl {
 
         virtual ~ParticleAttrib() = default;
        
-        size_type size() const {
+        size_type size() const override {
             return dview_m.extent(0);
         }
 
-        size_type packedSize(const size_type count) const {
+        size_type packedSize(const size_type count) const override {
             return count * sizeof(value_type);
         }
 
diff --git a/src/Particle/ParticleBase.hpp b/src/Particle/ParticleBase.hpp
index c7ffc972..71e9d033 100644
--- a/src/Particle/ParticleBase.hpp
+++ b/src/Particle/ParticleBase.hpp
@@ -116,7 +116,7 @@ namespace ippl {
         auto nextID = this->nextID_m;
         auto numNodes = this->numNodes_m;
         Kokkos::parallel_for("ParticleBase<PLayout, Properties...>::create(size_t)",
-                             Kokkos::RangePolicy(localNum_m, nLocal),
+                             Kokkos::RangePolicy<size_type>(localNum_m, nLocal),
                              KOKKOS_LAMBDA(const std::int64_t i) {
                                  pIDs(i) = nextID + numNodes * i;
                              });
@@ -208,7 +208,7 @@ namespace ippl {
 
         // Find the indices of the valid particles in the invalid region
         Kokkos::parallel_scan("Second scan in ParticleBase::destroy()",
-                              Kokkos::RangePolicy(localNum_m - destroyNum, localNum_m),
+                              Kokkos::RangePolicy<size_type>(localNum_m - destroyNum, localNum_m),
                               KOKKOS_LAMBDA(const size_t i, int& idx, const bool final)
                               {
                                   if (final && !invalid(i)) locKeepIndex(idx) = i;
diff --git a/src/Solver/FFTPeriodicPoissonSolver.h b/src/Solver/FFTPeriodicPoissonSolver.h
index 91d29945..85b00732 100644
--- a/src/Solver/FFTPeriodicPoissonSolver.h
+++ b/src/Solver/FFTPeriodicPoissonSolver.h
@@ -60,7 +60,7 @@ namespace ippl {
 
         //~FFTPeriodicPoissonSolver() {}
 
-        void setRhs(rhs_type& rhs);
+        void setRhs(rhs_type& rhs) override;
 
         void solve() override;
 
diff --git a/src/Utility/ParameterList.h b/src/Utility/ParameterList.h
index 74cea3ce..cd857d58 100644
--- a/src/Utility/ParameterList.h
+++ b/src/Utility/ParameterList.h
@@ -133,37 +133,37 @@ namespace ippl {
 
 // Disable parameter list printing for Cuda builds until
 // the lambda issue is resolved
-#ifndef KOKKOS_ENABLE_CUDA
-        /*!
-         * Print this parameter list.
-         */
-        friend
-        std::ostream& operator<<(std::ostream& os, const ParameterList& sp) {
-            static int indent = -4;
-
-            indent += 4;
-            if (indent > 0) {
-                os << '\n';
-            }
-            for (const auto& [key, value] : sp.params_m) {
-                std::visit([&](auto&& arg){
-                    // 21 March 2021
-                    // https://stackoverflow.com/questions/15884284/c-printing-spaces-or-tabs-given-a-user-input-integer
-                    os << std::string(indent, ' ')
-                       << std::left << std::setw(20) << key
-                       << " " << arg;
-                }, value);
-                // 21 March 2021
-                // https://stackoverflow.com/questions/289715/last-key-in-a-stdmap
-                if (key != std::prev(sp.params_m.end())->first) {
-                    os << '\n';
-                }
-            }
-            indent -= 4;
-
-            return os;
-        }
-#endif
+//#ifndef KOKKOS_ENABLE_CUDA
+//        /*!
+//         * Print this parameter list.
+//         */
+//        friend
+//        std::ostream& operator<<(std::ostream& os, const ParameterList& sp) {
+//            static int indent = -4;
+//
+//            indent += 4;
+//            if (indent > 0) {
+//                os << '\n';
+//            }
+//            for (const auto& [key, value] : sp.params_m) {
+//                std::visit([&](auto&& arg){
+//                    // 21 March 2021
+//                    // https://stackoverflow.com/questions/15884284/c-printing-spaces-or-tabs-given-a-user-input-integer
+//                    os << std::string(indent, ' ')
+//                       << std::left << std::setw(20) << key
+//                       << " " << arg;
+//                }, value);
+//                // 21 March 2021
+//                // https://stackoverflow.com/questions/289715/last-key-in-a-stdmap
+//                if (key != std::prev(sp.params_m.end())->first) {
+//                    os << '\n';
+//                }
+//            }
+//            indent -= 4;
+//
+//            return os;
+//        }
+//#endif
 
     private:
         std::map<std::string, variant_t> params_m;
diff --git a/test/particle/PIC3d.cpp b/test/particle/PIC3d.cpp
index e2b1a1d5..fb04e1c5 100644
--- a/test/particle/PIC3d.cpp
+++ b/test/particle/PIC3d.cpp
@@ -249,7 +249,7 @@ public:
            val += viewqm(i);
         }, lqm);
 
-        double lQ = lq / this->EFDMag_m.sum();
+        //double lQ = lq / this->EFDMag_m.sum();
      }
 
      void initFields() {
diff --git a/test/serialization/serialize01.cpp b/test/serialization/serialize01.cpp
index 97eb90ac..0df7dbc3 100644
--- a/test/serialization/serialize01.cpp
+++ b/test/serialization/serialize01.cpp
@@ -105,7 +105,7 @@ public:
                 auto& this_view = this->getView(j);
 
                 Kokkos::parallel_for("assign",
-                                     Kokkos::RangePolicy(5, 15), KOKKOS_LAMBDA(const size_t i) {
+                                     Kokkos::RangePolicy<size_t>(5, 15), KOKKOS_LAMBDA(const size_t i) {
                     bview(i-5) = this_view(i);
                 });
             }
-- 
GitLab


From 3e61e84c82fcc11c8c151c35d995d279fea47d3e Mon Sep 17 00:00:00 2001
From: Sriramkrishnan Muralikrishnan <sriramkrishnan.muralikrishnan@psi.ch>
Date: Mon, 4 Jul 2022 12:31:36 +0200
Subject: [PATCH 3/3] Comment added to Parameter list and a commented portion
 removed

---
 alpine/LandauDamping.cpp    | 2 +-
 src/Utility/ParameterList.h | 1 +
 test/particle/PIC3d.cpp     | 1 -
 3 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/alpine/LandauDamping.cpp b/alpine/LandauDamping.cpp
index f8fdc1be..4febc3bd 100644
--- a/alpine/LandauDamping.cpp
+++ b/alpine/LandauDamping.cpp
@@ -199,7 +199,7 @@ int main(int argc, char *argv[]){
 
     // create mesh and layout objects for this problem domain
     Vector_t kw = {0.5, 0.5, 0.5};
-    double alpha = 0.5;
+    double alpha = 0.05;
     Vector_t rmin(0.0);
     Vector_t rmax = 2 * pi / kw ;
     double dx = rmax[0] / nr[0];
diff --git a/src/Utility/ParameterList.h b/src/Utility/ParameterList.h
index cd857d58..edd986fe 100644
--- a/src/Utility/ParameterList.h
+++ b/src/Utility/ParameterList.h
@@ -131,6 +131,7 @@ namespace ippl {
             params_m[key] = value;
         }
 
+// The following commented portion has compiler errors with Intel and Clang
 // Disable parameter list printing for Cuda builds until
 // the lambda issue is resolved
 //#ifndef KOKKOS_ENABLE_CUDA
diff --git a/test/particle/PIC3d.cpp b/test/particle/PIC3d.cpp
index fb04e1c5..dd507bd6 100644
--- a/test/particle/PIC3d.cpp
+++ b/test/particle/PIC3d.cpp
@@ -249,7 +249,6 @@ public:
            val += viewqm(i);
         }, lqm);
 
-        //double lQ = lq / this->EFDMag_m.sum();
      }
 
      void initFields() {
-- 
GitLab