From 789db1d554623f6af5881497e90f51369a3ac7d3 Mon Sep 17 00:00:00 2001
From: Kutalmis Bercin <kutalmis.bercin@esi-group.com>
Date: Mon, 22 May 2023 08:22:27 +0100
Subject: [PATCH] ENH: sixDoF: enable time-variant constraints in body motions

---
 .../sixDoFRigidBodyMotion.C                   | 30 ++++++++++++++++++-
 .../sixDoFRigidBodyMotion.H                   | 11 ++++++-
 .../sixDoFRigidBodyMotionI.H                  |  7 ++++-
 .../sixDoFRigidBodyMotionIO.C                 |  4 ++-
 .../CrankNicolson/CrankNicolson.C             |  5 +++-
 .../sixDoFSolvers/Newmark/Newmark.C           |  5 +++-
 .../sixDoFSolvers/sixDoFSolver/sixDoFSolver.H |  4 +++
 .../sixDoFSolver/sixDoFSolverI.H              |  6 ++++
 .../sixDoFSolvers/symplectic/symplectic.C     |  4 +++
 9 files changed, 70 insertions(+), 6 deletions(-)

diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.C
index 8240a1305cb..349493e0962 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2016-2020 OpenCFD Ltd.
+    Copyright (C) 2016-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -90,6 +90,7 @@ Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion(const Time& time)
     aRelax_(1.0),
     aDamp_(1.0),
     report_(false),
+    updateConstraints_(false),
     solver_(nullptr)
 {}
 
@@ -130,6 +131,7 @@ Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
     aRelax_(dict.getOrDefault<scalar>("accelerationRelaxation", 1)),
     aDamp_(dict.getOrDefault<scalar>("accelerationDamping", 1)),
     report_(dict.getOrDefault("report", false)),
+    updateConstraints_(dict.getOrDefault("updateConstraints", false)),
     solver_(sixDoFSolver::New(dict.subDict("solver"), *this))
 {
     addRestraints(dict);
@@ -178,6 +180,7 @@ Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
     aRelax_(sDoFRBM.aRelax_),
     aDamp_(sDoFRBM.aDamp_),
     report_(sDoFRBM.report_),
+    updateConstraints_(sDoFRBM.updateConstraints_),
     solver_(sDoFRBM.solver_.clone())
 {}
 
@@ -304,6 +307,31 @@ void Foam::sixDoFRigidBodyMotion::updateAcceleration
 }
 
 
+void Foam::sixDoFRigidBodyMotion::updateConstraints()
+{
+    if (!updateConstraints_)
+    {
+        return;
+    }
+
+    pointConstraint pct;
+    pointConstraint pcr;
+
+    forAll(constraints_, i)
+    {
+        constraints_[i].setCentreOfRotation(initialCentreOfRotation_);
+        constraints_[i].constrainTranslation(pct);
+        constraints_[i].constrainRotation(pcr);
+    }
+
+    tConstraints_ = pct.constraintTransformation();
+    rConstraints_ = pcr.constraintTransformation();
+
+    Info<< "Translational constraint tensor " << tConstraints_ << nl
+        << "Rotational constraint tensor " << rConstraints_ << endl;
+}
+
+
 void Foam::sixDoFRigidBodyMotion::update
 (
     bool firstIter,
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.H
index c9dd5e7ab7d..8365882d842 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2015 OpenFOAM Foundation
-    Copyright (C) 2016-2019 OpenCFD Ltd.
+    Copyright (C) 2016-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -119,6 +119,9 @@ class sixDoFRigidBodyMotion
         //- Reporting of motion data (on or off)
         bool report_;
 
+        //- Flag to enable time-variant constraints
+        bool updateConstraints_;
+
         //- Motion solver
         autoPtr<sixDoFSolver> solver_;
 
@@ -152,6 +155,9 @@ class sixDoFRigidBodyMotion
         //- Update and relax accelerations from the force and torque
         void updateAcceleration(const vector& fGlobal, const vector& tauGlobal);
 
+        //- Update the constraints to the object
+        void updateConstraints();
+
 
         // Access functions retained as private because of the risk of
         // confusion over what is a body local frame vector and what is global
@@ -271,6 +277,9 @@ public:
             //- Return the report Switch
             inline bool report() const;
 
+            //- Return the update-constraints flag
+            inline bool updateConstraints() const;
+
             //- Return time
             inline const Time& time() const;
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionI.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionI.H
index 91eabdc3414..f42f3045b5a 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionI.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionI.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2015 OpenFOAM Foundation
-    Copyright (C) 2016-2019 OpenCFD Ltd.
+    Copyright (C) 2016-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -275,6 +275,11 @@ inline bool Foam::sixDoFRigidBodyMotion::report() const
     return report_;
 }
 
+inline bool Foam::sixDoFRigidBodyMotion::updateConstraints() const
+{
+    return updateConstraints_;
+}
+
 
 inline void Foam::sixDoFRigidBodyMotion::newTime()
 {
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C
index e6cbb4d5989..df005017e1e 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2014 OpenFOAM Foundation
-    Copyright (C) 2020 OpenCFD Ltd.
+    Copyright (C) 2020-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -39,6 +39,7 @@ bool Foam::sixDoFRigidBodyMotion::read(const dictionary& dict)
     aRelax_ = dict.getOrDefault<scalar>("accelerationRelaxation", 1);
     aDamp_ = dict.getOrDefault<scalar>("accelerationDamping", 1);
     report_ = dict.getOrDefault<Switch>("report", false);
+    updateConstraints_ = dict.getOrDefault("updateConstraints", false);
 
     restraints_.clear();
     addRestraints(dict);
@@ -61,6 +62,7 @@ void Foam::sixDoFRigidBodyMotion::write(Ostream& os) const
     os.writeEntry("accelerationRelaxation", aRelax_);
     os.writeEntry("accelerationDamping", aDamp_);
     os.writeEntry("report", report_);
+    os.writeEntry("updateConstraints", updateConstraints_);
 
     if (!restraints_.empty())
     {
diff --git a/src/sixDoFRigidBodyMotion/sixDoFSolvers/CrankNicolson/CrankNicolson.C b/src/sixDoFRigidBodyMotion/sixDoFSolvers/CrankNicolson/CrankNicolson.C
index 7d446dd6ee6..f9fa6739f12 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFSolvers/CrankNicolson/CrankNicolson.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFSolvers/CrankNicolson/CrankNicolson.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
-    Copyright (C) 2020 OpenCFD Ltd.
+    Copyright (C) 2020-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -75,6 +75,9 @@ void Foam::sixDoFSolvers::CrankNicolson::solve
     // Update the linear acceleration and torque
     updateAcceleration(fGlobal, tauGlobal);
 
+    // Update the constraints to the object
+    updateConstraints();
+
     // Correct linear velocity
     v() = tConstraints()
       & (v0() + aDamp()*deltaT*(aoc_*a() + (1 - aoc_)*a0()));
diff --git a/src/sixDoFRigidBodyMotion/sixDoFSolvers/Newmark/Newmark.C b/src/sixDoFRigidBodyMotion/sixDoFSolvers/Newmark/Newmark.C
index 35e506a8714..0ed1ef9beb3 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFSolvers/Newmark/Newmark.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFSolvers/Newmark/Newmark.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015-2016 OpenFOAM Foundation
-    Copyright (C) 2020 OpenCFD Ltd.
+    Copyright (C) 2020-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -82,6 +82,9 @@ void Foam::sixDoFSolvers::Newmark::solve
     // Update the linear acceleration and torque
     updateAcceleration(fGlobal, tauGlobal);
 
+    // Update the constraints to the object
+    updateConstraints();
+
     // Correct linear velocity
     v() =
         tConstraints()
diff --git a/src/sixDoFRigidBodyMotion/sixDoFSolvers/sixDoFSolver/sixDoFSolver.H b/src/sixDoFRigidBodyMotion/sixDoFSolvers/sixDoFSolver/sixDoFSolver.H
index 800d819d1bb..97cc1a12561 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFSolvers/sixDoFSolver/sixDoFSolver.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFSolvers/sixDoFSolver/sixDoFSolver.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
+    Copyright (C) 2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -128,6 +129,9 @@ protected:
             const vector& tauGlobal
         );
 
+        //- Update the constraints to the object
+        inline void updateConstraints();
+
 
 public:
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFSolvers/sixDoFSolver/sixDoFSolverI.H b/src/sixDoFRigidBodyMotion/sixDoFSolvers/sixDoFSolver/sixDoFSolverI.H
index f059b83c07c..e7fca2c5d17 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFSolvers/sixDoFSolver/sixDoFSolverI.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFSolvers/sixDoFSolver/sixDoFSolverI.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
+    Copyright (C) 2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -129,5 +130,10 @@ inline void Foam::sixDoFSolver::updateAcceleration
     body_.updateAcceleration(fGlobal, tauGlobal);
 }
 
+inline void Foam::sixDoFSolver::updateConstraints()
+{
+    body_.updateConstraints();
+}
+
 
 // ************************************************************************* //
diff --git a/src/sixDoFRigidBodyMotion/sixDoFSolvers/symplectic/symplectic.C b/src/sixDoFRigidBodyMotion/sixDoFSolvers/symplectic/symplectic.C
index 0fdd3f86323..d5875361e7a 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFSolvers/symplectic/symplectic.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFSolvers/symplectic/symplectic.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015-2016 OpenFOAM Foundation
+    Copyright (C) 2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -85,6 +86,9 @@ void Foam::sixDoFSolvers::symplectic::solve
     // Update the linear acceleration and torque
     updateAcceleration(fGlobal, tauGlobal);
 
+    // Update the constraints to the object
+    updateConstraints();
+
     // Second simplectic step:
     //     Complete update of linear and angular velocities
 
-- 
GitLab