From 719cce655e22ad205512237173db867457c0e7a2 Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafaelravedutti@gmail.com>
Date: Mon, 23 Oct 2023 01:16:14 +0200
Subject: [PATCH] Adjust stiffness and damping

Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com>
---
 examples/dem.py               | 49 +++++++++++++++++++++--------------
 src/pairs/mapping/keywords.py |  6 +++++
 2 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/examples/dem.py b/examples/dem.py
index a64139b..a2e326e 100644
--- a/examples/dem.py
+++ b/examples/dem.py
@@ -17,13 +17,20 @@ def linear_spring_dashpot(i, j):
     delta_ij = -penetration_depth(i, j)
     skip_when(delta_ij < 0.0)
 
+    meff = 1.0 / ((1.0 / mass[i]) + (1.0 / mass[j]))
+    stiffness_norm = meff * (pi * pi + lnDryResCoeff * lnDryResCoeff) / \
+                     (collisionTime_SI * collisionTime_SI)
+    stiffness_tan = kappa * stiffness_norm
+    damping_norm = -2.0 * meff * lnDryResCoeff / collisionTime_SI
+    damping_tan = sqrt(kappa) * damping_norm
+
     velocity_wf_i = linear_velocity[i] + cross(angular_velocity[i], contact_point(i, j) - position[i])
     velocity_wf_j = linear_velocity[j] + cross(angular_velocity[j], contact_point(i, j) - position[j])
 
     rel_vel = -velocity_wf_i - velocity_wf_j
     rel_vel_n = dot(rel_vel, contact_normal(i, j)) * contact_normal(i, j)
     rel_vel_t = rel_vel - rel_vel_n
-    fN = stiffness_norm[i, j] * delta_ij * contact_normal(i, j) + damping_norm[i, j] * rel_vel_n;
+    fN = stiffness_norm * delta_ij * contact_normal(i, j) + damping_norm * rel_vel_n;
 
     tan_spring_disp = tangential_spring_displacement[i, j]
     impact_vel_magnitude = impact_velocity_magnitude[i, j]
@@ -36,7 +43,7 @@ def linear_spring_dashpot(i, j):
                                  zero_vector(),
                                  rotated_tan_disp * length(tan_spring_disp) / length(rotated_tan_disp))
 
-    fTLS = stiffness_tan[i, j] * new_tan_spring_disp + damping_tan[i, j] * rel_vel_t
+    fTLS = stiffness_tan * new_tan_spring_disp + damping_tan * rel_vel_t
     fTLS_len = length(fTLS)
     t = normalized(fTLS)
 
@@ -49,8 +56,8 @@ def linear_spring_dashpot(i, j):
     f_friction_abs = select(cond1, f_friction_abs_static, f_friction_abs_dynamic)
     n_sticking = select(cond1 or cond2 or fTLS_len < f_friction_abs_dynamic, 1, 0)
 
-    if not cond1 and not cond2 and stiffness_tan[i, j] > 0.0:
-        tangential_spring_displacement[i, j] = (f_friction_abs * t - damping_tan[i, j] * rel_vel_t) / stiffness_tan[i, j]
+    if not cond1 and not cond2 and stiffness_tan > 0.0:
+        tangential_spring_displacement[i, j] = (f_friction_abs * t - damping_tan * rel_vel_t) / stiffness_tan
 
     else:
         tangential_spring_displacement[i, j] = new_tan_spring_disp
@@ -114,13 +121,7 @@ linkedCellWidth = 1.01 * maxDiameter_SI
 skin = 0.003
 ntypes = 1
 
-meff = 0.5 # 1.0 / (inv_mass[i] + inv_mass[j])
 lnDryResCoeff = math.log(restitutionCoefficient);
-stiffnessNorm = meff * (math.pi * math.pi + lnDryResCoeff * lnDryResCoeff) / (collisionTime_SI * collisionTime_SI)
-stiffnessTan = kappa * stiffnessNorm
-dampingNorm = -2.0 * meff * lnDryResCoeff / collisionTime_SI
-dampingTan = math.sqrt(kappa) * dampingNorm
-
 frictionStatic = frictionCoefficient # TODO: check if this is correct
 frictionDynamic = frictionCoefficient
 
@@ -138,10 +139,10 @@ psim.add_property('inv_inertia', pairs.matrix())
 psim.add_property('rotation_matrix', pairs.matrix())
 psim.add_property('rotation_quat', pairs.quaternion())
 psim.add_feature('type', ntypes)
-psim.add_feature_property('type', 'stiffness_norm', pairs.double(), [stiffnessNorm for i in range(ntypes * ntypes)])
-psim.add_feature_property('type', 'stiffness_tan', pairs.double(), [stiffnessTan for i in range(ntypes * ntypes)])
-psim.add_feature_property('type', 'damping_norm', pairs.double(), [dampingNorm for i in range(ntypes * ntypes)])
-psim.add_feature_property('type', 'damping_tan', pairs.double(), [dampingTan for i in range(ntypes * ntypes)])
+#psim.add_feature_property('type', 'stiffness_norm', pairs.double(), [stiffnessNorm for i in range(ntypes * ntypes)])
+#psim.add_feature_property('type', 'stiffness_tan', pairs.double(), [stiffnessTan for i in range(ntypes * ntypes)])
+#psim.add_feature_property('type', 'damping_norm', pairs.double(), [dampingNorm for i in range(ntypes * ntypes)])
+#psim.add_feature_property('type', 'damping_tan', pairs.double(), [dampingTan for i in range(ntypes * ntypes)])
 psim.add_feature_property('type', 'friction_static', pairs.double(), [frictionStatic for i in range(ntypes * ntypes)])
 psim.add_feature_property('type', 'friction_dynamic', pairs.double(), [frictionDynamic for i in range(ntypes * ntypes)])
 psim.add_contact_property('is_sticking', pairs.int32(), 0)
@@ -171,11 +172,21 @@ psim.setup(update_mass_and_inertia, {'densityParticle_SI': densityParticle_SI,
 
 psim.build_neighbor_lists(linkedCellWidth + skin)
 psim.vtk_output(f"output/dem_{target}", frequency=visSpacing)
-psim.compute(gravity, symbols={'densityParticle_SI': densityParticle_SI,
-                               'densityFluid_SI': densityFluid_SI,
-                               'gravity_SI': gravity_SI,
-                               'pi': math.pi })
-psim.compute(linear_spring_dashpot, linkedCellWidth + skin, symbols={'dt': dt_SI})
+
+psim.compute(gravity,
+             symbols={'densityParticle_SI': densityParticle_SI,
+                      'densityFluid_SI': densityFluid_SI,
+                      'gravity_SI': gravity_SI,
+                      'pi': math.pi })
+
+psim.compute(linear_spring_dashpot,
+             linkedCellWidth + skin,
+             symbols={'dt': dt_SI,
+                      'pi': math.pi,
+                      'kappa': kappa,
+                      'lnDryResCoeff': lnDryResCoeff,
+                      'collisionTime_SI': collisionTime_SI})
+
 psim.compute(euler, symbols={'dt': dt_SI})
 
 if target == 'gpu':
diff --git a/src/pairs/mapping/keywords.py b/src/pairs/mapping/keywords.py
index c5e8459..76574ea 100644
--- a/src/pairs/mapping/keywords.py
+++ b/src/pairs/mapping/keywords.py
@@ -45,6 +45,12 @@ class Keywords:
         assert len(args) == 3, "select() keyword requires three parameters!"
         return Select(self.sim, args[0], args[1], args[2])
 
+    def keyword_sqrt(self, args):
+        assert len(args) == 1, "sqrt() keyword requires one parameter!"
+        value = args[0]
+        assert value.type() == Types.Double, "sqrt(): Value must be a real."
+        return Sqrt(self.sim, value)
+
     def keyword_skip_when(self, args):
         assert len(args) == 1, "skip_when() keyword requires one parameter!"
         for _ in Filter(self.sim, args[0]):
-- 
GitLab