From 91e4c363f737727c7358a914f4ac7881fc710227 Mon Sep 17 00:00:00 2001
From: Sebastian Eibl <sebastian.eibl@fau.de>
Date: Tue, 10 Mar 2020 16:33:32 +0100
Subject: [PATCH] added springdashpotspring to granular gas benchmark

---
 apps/benchmarks/GranularGas/GenerateModule.py |  8 +++++
 .../GranularGas/MESA_PD_GranularGas.cpp       | 31 ++++++++++++++-----
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/apps/benchmarks/GranularGas/GenerateModule.py b/apps/benchmarks/GranularGas/GenerateModule.py
index 7931cebb7..8971a0ad5 100755
--- a/apps/benchmarks/GranularGas/GenerateModule.py
+++ b/apps/benchmarks/GranularGas/GenerateModule.py
@@ -36,6 +36,14 @@ if __name__ == '__main__':
     ps.add_include("blockforest/BlockForest.h")
     ps.add_property("currentBlock",     "blockforest::BlockID",    defValue="",          syncMode="NEVER")
 
+    ps.add_property("oldContactHistory", "std::map<walberla::id_t, walberla::mesa_pd::data::ContactHistory>",
+                    defValue="", syncMode="ALWAYS")
+    ps.add_property("newContactHistory", "std::map<walberla::id_t, walberla::mesa_pd::data::ContactHistory>",
+                    defValue="", syncMode="NEVER")
+
+    ch = mpd.add(data.ContactHistory())
+    ch.add_property("tangentialSpringDisplacement", "walberla::mesa_pd::Vec3", defValue="real_t(0)")
+
     mpd.add(data.LinkedCells())
     mpd.add(data.SparseLinkedCells())
     mpd.add(data.ShapeStorage(ps))
diff --git a/apps/benchmarks/GranularGas/MESA_PD_GranularGas.cpp b/apps/benchmarks/GranularGas/MESA_PD_GranularGas.cpp
index 59682aa03..6712c5584 100644
--- a/apps/benchmarks/GranularGas/MESA_PD_GranularGas.cpp
+++ b/apps/benchmarks/GranularGas/MESA_PD_GranularGas.cpp
@@ -42,7 +42,9 @@
 #include <mesa_pd/kernel/InsertParticleIntoLinkedCells.h>
 #include <mesa_pd/kernel/ParticleSelector.h>
 #include <mesa_pd/kernel/SpringDashpot.h>
+#include <mesa_pd/kernel/SpringDashpotSpring.h>
 #include <mesa_pd/mpi/ContactFilter.h>
+#include <mesa_pd/mpi/ReduceContactHistory.h>
 #include <mesa_pd/mpi/ReduceProperty.h>
 #include <mesa_pd/mpi/SyncNextNeighbors.h>
 #include <mesa_pd/mpi/SyncNextNeighborsBlockForest.h>
@@ -75,11 +77,16 @@ class DEM
 {
 public:
    DEM(const std::shared_ptr<domain::BlockForestDomain>& domain, real_t dt, real_t mass)
-   : domain_(domain)
+   : dt_(dt)
+   , domain_(domain)
    {
-      dem_.setDampingT(0, 0, real_t(0));
-      dem_.setFriction(0, 0, real_t(0));
-      dem_.setParametersFromCOR(0, 0, real_t(0.9), dt*real_t(20), mass * real_t(0.5));
+      sd_.setDampingT(0, 0, real_t(0));
+      sd_.setFriction(0, 0, real_t(0));
+      sd_.setParametersFromCOR(0, 0, real_t(0.9), dt*real_t(20), mass * real_t(0.5));
+
+      sds_.setParametersFromCOR(0, 0, real_t(0.9), dt*real_t(20), mass * real_t(0.5));
+      sds_.setCoefficientOfFriction(0,0,real_t(0.4));
+      sds_.setStiffnessT(0,0,real_t(0.9) * sds_.getStiffnessN(0,0));
    }
 
    inline
@@ -94,8 +101,10 @@ public:
                              *domain_))
          {
             ++contactsTreated_;
-            dem_(acd_.getIdx1(), acd_.getIdx2(), ac, acd_.getContactPoint(),
-                 acd_.getContactNormal(), acd_.getPenetrationDepth());
+//            sd_(acd_.getIdx1(), acd_.getIdx2(), ac, acd_.getContactPoint(),
+//                 acd_.getContactNormal(), acd_.getPenetrationDepth());
+            sds_(acd_.getIdx1(), acd_.getIdx2(), ac, acd_.getContactPoint(),
+                 acd_.getContactNormal(), acd_.getPenetrationDepth(), dt_);
          }
       }
    }
@@ -127,10 +136,12 @@ public:
    }
 
 private:
+   real_t dt_;
    kernel::DoubleCast double_cast_;
    mpi::ContactFilter contact_filter_;
    std::shared_ptr<domain::BlockForestDomain> domain_;
-   kernel::SpringDashpot dem_ = kernel::SpringDashpot(1);
+   kernel::SpringDashpot sd_ = kernel::SpringDashpot(1);
+   kernel::SpringDashpotSpring sds_ = kernel::SpringDashpotSpring(1);
    collision_detection::AnalyticContactDetection acd_;
    int64_t contactsChecked_ = 0;
    int64_t contactsDetected_ = 0;
@@ -239,6 +250,7 @@ int main( int argc, char ** argv )
    DEM dem(domain, params.dt, ss->shapes[smallSphere]->getMass());
    kernel::InsertParticleIntoLinkedCells ipilc;
    kernel::AssocToBlock                  assoc(forest);
+   mpi::ReduceContactHistory             RCH;
    mpi::ReduceProperty                   RP;
    mpi::SyncNextNeighborsBlockForest     SNN;
 
@@ -297,6 +309,11 @@ int main( int argc, char ** argv )
          if (params.bBarrier) WALBERLA_MPI_BARRIER();
          tp["ReduceForce"].end();
 
+         tp["ReduceContactHistory"].start();
+         RCH(*ps);
+         if (params.bBarrier) WALBERLA_MPI_BARRIER();
+         tp["ReduceContactHistory"].end();
+
          tp["Euler"].start();
          //ps->forEachParticle(false, [&](const size_t idx){WALBERLA_CHECK_EQUAL(ps->getForce(idx), Vec3(0,0,0), *(*ps)[idx] << "\n" << idx);});
          ps->forEachParticle(true, kernel::SelectLocal(), accessor, explicitEulerWithShape, accessor);
-- 
GitLab