From 2715804c8547a3cb6747d4ccb091d06f9ae19ffa Mon Sep 17 00:00:00 2001 From: Rafael Ravedutti <rafaelravedutti@gmail.com> Date: Fri, 27 Oct 2023 14:54:36 +0200 Subject: [PATCH] Fix nans Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com> --- examples/dem.py | 5 ++++- src/pairs/mapping/keywords.py | 14 ++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/examples/dem.py b/examples/dem.py index b6123d8..4e914e2 100644 --- a/examples/dem.py +++ b/examples/dem.py @@ -4,6 +4,9 @@ import sys def update_mass_and_inertia(i): + rotation_matrix[i] = diagonal_matrix(1.0) + rotation_quat[i] = default_quaternion() + if is_sphere(i): mass[i] = ((4.0 / 3.0) * pi) * radius[i] * radius[i] * radius[i] * densityParticle_SI inv_inertia[i] = inversed(diagonal_matrix(0.4 * mass[i] * radius[i] * radius[i])) @@ -109,7 +112,7 @@ restitutionCoefficient = 0.1 collisionTime_SI = 5e-4 poissonsRatio = 0.22 timeSteps = 10000 -visSpacing = 100 +visSpacing = 1 denseBottomLayer = False bottomLayerOffsetFactor = 1.0 kappa = 2.0 * (1.0 - poissonsRatio) / (2.0 - poissonsRatio) # from Thornton et al diff --git a/src/pairs/mapping/keywords.py b/src/pairs/mapping/keywords.py index 76574ea..b7379af 100644 --- a/src/pairs/mapping/keywords.py +++ b/src/pairs/mapping/keywords.py @@ -187,6 +187,10 @@ class Keywords: # Matrix * Scalar return Matrix(self.sim, [lhs[i] * rhs for i in range(nelems)]) + def keyword_default_quaternion(self, args): + assert len(args) == 0, "default_quaternion() requires no parameters!" + return Quaternion(self.sim, [1.0, 0.0, 0.0, 0.0]) + def keyword_quaternion(self, args): assert len(args) == 2, "quaternion() keyword requires two parameters!" axis = args[0] @@ -197,10 +201,12 @@ class Keywords: axis_length = self.keyword_length([axis]) zero_cond = Abs(self.sim, axis_length) < epsilon or Abs(self.sim, angle) < epsilon - sina = Select(self.sim, zero_cond, 0.0, Sin(self.sim, angle * 0.5)) - cosa = Select(self.sim, zero_cond, 1.0, Cos(self.sim, angle * 0.5)) + sina = Sin(self.sim, angle * 0.5) + cosa = Cos(self.sim, angle * 0.5) axisN = axis * (1.0 / axis_length) - return Quaternion(self.sim, [cosa, sina * axisN[0], sina * axisN[1], sina * axisN[2]]) + return Select(self.sim, zero_cond, + Quaternion(self.sim, [1.0, 0.0, 0.0, 0.0]), + Quaternion(self.sim, [cosa, sina * axisN[0], sina * axisN[1], sina * axisN[2]])) def keyword_quaternion_multiplication(self, args): assert len(args) == 2, "quaternion_multiplication() keyword requires two parameters!" @@ -217,7 +223,7 @@ class Keywords: k = lhs[0] * rhs[3] + lhs[3] * rhs[0] + lhs[1] * rhs[2] - lhs[2] * rhs[1] len2 = r * r + i * i + j * j + k * k - ilen = Select(self.sim, len2 - 1.0 < 1E-8, 1.0, 1.0 / Sqrt(self.sim, len2)) + ilen = Select(self.sim, Abs(self.sim, len2 - 1.0) < 1E-8, 1.0, 1.0 / Sqrt(self.sim, len2)) return Quaternion(self.sim, [r * ilen, i * ilen, j * ilen, k * ilen]) def keyword_quaternion_to_rotation_matrix(self, args): -- GitLab