From 4344a732318d953c08e406d30bf1205a73af7a7c Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Sun, 3 Apr 2016 22:17:10 +0100
Subject: [PATCH] applications/test/rigidBodyDynamics/pendulum: Very simple
 test/demonstration of the rigidBodyDynamics library

    Simple swinging pendulum simulation with 1-DoF.  The motion is integrated
    using a symplectic method for just over 2-periods.
---
 .../rigidBodyDynamics/pendulum/Make/files     |  3 +
 .../rigidBodyDynamics/pendulum/Make/options   |  5 +
 .../rigidBodyDynamics/pendulum/pendulum.C     | 98 +++++++++++++++++++
 3 files changed, 106 insertions(+)
 create mode 100644 applications/test/rigidBodyDynamics/pendulum/Make/files
 create mode 100644 applications/test/rigidBodyDynamics/pendulum/Make/options
 create mode 100644 applications/test/rigidBodyDynamics/pendulum/pendulum.C

diff --git a/applications/test/rigidBodyDynamics/pendulum/Make/files b/applications/test/rigidBodyDynamics/pendulum/Make/files
new file mode 100644
index 00000000000..f860e98af44
--- /dev/null
+++ b/applications/test/rigidBodyDynamics/pendulum/Make/files
@@ -0,0 +1,3 @@
+pendulum.C
+
+EXE = $(FOAM_USER_APPBIN)/pendulum
diff --git a/applications/test/rigidBodyDynamics/pendulum/Make/options b/applications/test/rigidBodyDynamics/pendulum/Make/options
new file mode 100644
index 00000000000..4a9d828b67c
--- /dev/null
+++ b/applications/test/rigidBodyDynamics/pendulum/Make/options
@@ -0,0 +1,5 @@
+EXE_INC = \
+    -I$(LIB_SRC)/rigidBodyDynamics/lnInclude
+
+EXE_LIBS = \
+    -lrigidBodyDynamics
diff --git a/applications/test/rigidBodyDynamics/pendulum/pendulum.C b/applications/test/rigidBodyDynamics/pendulum/pendulum.C
new file mode 100644
index 00000000000..23c35c4af34
--- /dev/null
+++ b/applications/test/rigidBodyDynamics/pendulum/pendulum.C
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Application
+    pendulum
+
+Description
+    Simple swinging pendulum simulation with 1-DoF.  The motion is integrated
+    using a symplectic method for just over 2-periods.
+
+\*---------------------------------------------------------------------------*/
+
+#include "rigidBodyModel.H"
+#include "joints.H"
+
+using namespace Foam;
+using namespace RBD;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+    // Create a model for the pendulum
+    rigidBodyModel pendulum;
+
+    // Join a weight to the origin with a centre of mass -1m below the origin
+    // by a hinge which rotates about the z-axis
+    pendulum.join
+    (
+        0,
+        Xt(vector(0, 0, 0)),
+        joint::New(new joints::Rz(pendulum)),
+        rigidBody::New("hinge", 1, vector(0, -1, 0), 0.02*I)
+    );
+
+    // Create the joint-space state fields
+    scalarField q(pendulum.nDoF(), Zero);
+    scalarField w(pendulum.nw(), Zero);
+    scalarField qdot(pendulum.nDoF(), Zero);
+    scalarField qddot(pendulum.nDoF(), Zero);
+    scalarField tau(pendulum.nDoF(), Zero);
+
+    // Set the angle of the pendulum to 0.3rad
+    q[0] = 0.3;
+
+    // Set the gravitational acceleration
+    pendulum.g() = vector(0, -9.81, 0);
+
+    // Integrate the motion of the pendulum for 4.1s (~2-periods) using a
+    // symplectic method
+    scalar deltaT = 0.01;
+    for (scalar t=0; t<4.1; t+=deltaT)
+    {
+        qdot += 0.5*deltaT*qddot;
+        q += deltaT*qdot;
+
+        pendulum.forwardDynamics
+        (
+            q,
+            w,
+            qdot,
+            tau,
+            Field<spatialVector>(),
+            qddot
+        );
+
+        qdot += 0.5*deltaT*qddot;
+
+        Info<< "Time << " << t << "s, angle = " << q[0] << "rad" << endl;
+    }
+
+    Info<< "\nEnd\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
-- 
GitLab