diff --git a/src/ODE/Make/files b/src/ODE/Make/files
index 79e742a77..de6b5fcb0 100644
--- a/src/ODE/Make/files
+++ b/src/ODE/Make/files
@@ -26,6 +26,7 @@ $(sixDOF)/sixDOFODE/restraints/translationalRestraints/translationalRestraint/tr
$(sixDOF)/sixDOFODE/restraints/translationalRestraints/linearSpringDamper/linearSpringDamper.C
$(sixDOF)/sixDOFODE/restraints/rotationalRestraints/rotationalRestraint/rotationalRestraint.C
$(sixDOF)/sixDOFODE/restraints/rotationalRestraints/angularDamper/angularDamper.C
+$(sixDOF)/sixDOFODE/restraints/combinedRestraints/combinedRestraint/combinedRestraint.C
$(sixDOF)/sixDOFODE/sixDOFODE.C
$(sixDOF)/sixDOFODE/newSixDOFODE.C
diff --git a/src/ODE/sixDOF/sixDOFODE/constraintsAndRestraints.H b/src/ODE/sixDOF/sixDOFODE/constraintsAndRestraints.H
index b63af2b9e..e76803efe 100644
--- a/src/ODE/sixDOF/sixDOFODE/constraintsAndRestraints.H
+++ b/src/ODE/sixDOF/sixDOFODE/constraintsAndRestraints.H
@@ -6,5 +6,6 @@
#include "translationalRestraint.H"
#include "rotationalRestraint.H"
+#include "combinedRestraint.H"
#endif
diff --git a/src/ODE/sixDOF/sixDOFODE/restraints/combinedRestraints/combinedRestraint/combinedRestraint.C b/src/ODE/sixDOF/sixDOFODE/restraints/combinedRestraints/combinedRestraint/combinedRestraint.C
new file mode 100644
index 000000000..4a088aed5
--- /dev/null
+++ b/src/ODE/sixDOF/sixDOFODE/restraints/combinedRestraints/combinedRestraint/combinedRestraint.C
@@ -0,0 +1,131 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | foam-extend: Open Source CFD
+ \\ / O peration | Version: 4.1
+ \\ / A nd | Web: http://www.foam-extend.org
+ \\/ M anipulation | For copyright notice see file Copyright
+-------------------------------------------------------------------------------
+License
+ This file is part of foam-extend.
+
+ foam-extend 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.
+
+ foam-extend 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 foam-extend. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "combinedRestraint.H"
+#include "sixDOFODE.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineTypeNameAndDebug(combinedRestraint, 0);
+ defineRunTimeSelectionTable(combinedRestraint, word);
+}
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::combinedRestraint::combinedRestraint
+(
+ const word& name,
+ const dictionary& dict,
+ const sixDOFODE& sixDOF
+)
+:
+ name_(name),
+ sixDOF_(sixDOF)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::combinedRestraint::~combinedRestraint()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+const Foam::word& Foam::combinedRestraint::name() const
+{
+ return name_;
+}
+
+
+const Foam::sixDOFODE& Foam::combinedRestraint::sixDOF() const
+{
+ return sixDOF_;
+}
+
+
+Foam::autoPtr Foam::combinedRestraint::New
+(
+ const word& name,
+ const dictionary& dict,
+ const sixDOFODE& sixDOF
+)
+{
+ const word restraintType(dict.lookup("type"));
+
+ wordConstructorTable::iterator cstrIter =
+ wordConstructorTablePtr_->find(restraintType);
+
+ if (cstrIter == wordConstructorTablePtr_->end())
+ {
+ FatalErrorIn
+ (
+ "combinedRestraint::New"
+ "\n("
+ "\n const word& name,"
+ "\n const dictionary& dict"
+ "\n)"
+ ) << "Unknown combined restraint type: " << restraintType
+ << endl << endl
+ << "Valid combined restraint types are: " << endl
+ << wordConstructorTablePtr_->sortedToc()
+ << exit(FatalError);
+ }
+
+ return autoPtr
+ (
+ cstrIter()
+ (
+ name,
+ dict,
+ sixDOF
+ )
+ );
+}
+
+
+// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
+
+Foam::Ostream& Foam::operator<<
+(
+ Ostream& os,
+ const combinedRestraint& tr
+)
+{
+ os << tr.name_ << nl << token::BEGIN_BLOCK << nl;
+
+ tr.write(os);
+
+ os << token::END_BLOCK << endl;
+
+ os.check("Ostream& operator<<(Ostream&, const combinedRestraint&");
+
+ return os;
+}
+
+
+// ************************************************************************* //
diff --git a/src/ODE/sixDOF/sixDOFODE/restraints/combinedRestraints/combinedRestraint/combinedRestraint.H b/src/ODE/sixDOF/sixDOFODE/restraints/combinedRestraints/combinedRestraint/combinedRestraint.H
new file mode 100644
index 000000000..15519b7a3
--- /dev/null
+++ b/src/ODE/sixDOF/sixDOFODE/restraints/combinedRestraints/combinedRestraint/combinedRestraint.H
@@ -0,0 +1,200 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | foam-extend: Open Source CFD
+ \\ / O peration | Version: 4.1
+ \\ / A nd | Web: http://www.foam-extend.org
+ \\/ M anipulation | For copyright notice see file Copyright
+-------------------------------------------------------------------------------
+License
+ This file is part of foam-extend.
+
+ foam-extend 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.
+
+ foam-extend 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 foam-extend. If not, see .
+
+Class
+ Foam::combinedRestraint
+
+Description
+ Abstract base class containing interface for translational and rotational
+ restraints used within sixDOFODE classes.
+
+ Interface provides restraining forces and moments to the translational and
+ rotational equations of motion via force() and moment() member function.
+
+Author
+ Inno Gatin, FSB Zagreb. All rights reserved.
+
+SourceFiles
+ combinedRestraint.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef combinedRestraint_H
+#define combinedRestraint_H
+
+#include "typeInfo.H"
+#include "runTimeSelectionTables.H"
+#include "autoPtr.H"
+#include "dimensionedTypes.H"
+#include "dictionary.H"
+#include "Switch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class sixDOFODE;
+
+/*---------------------------------------------------------------------------*\
+ Class combinedRestraint Declaration
+\*---------------------------------------------------------------------------*/
+
+class combinedRestraint
+{
+ // Private Data
+
+ //- Name of the restraint
+ word name_;
+
+ //- Reference to underlying sixDOFODE
+ const sixDOFODE& sixDOF_;
+
+public:
+
+ //- Runtime type information
+ TypeName("combinedRestraint");
+
+
+ // Declare run-time constructor selection table
+
+ declareRunTimeSelectionTable
+ (
+ autoPtr,
+ combinedRestraint,
+ word,
+ (
+ const word& name,
+ const dictionary& dict,
+ const sixDOFODE& sixDOF
+ ),
+ (name, dict, sixDOF)
+ );
+
+
+ //- Class used for the read-construction of
+ // PtrLists of combinedRestraint
+ class iNew
+ {
+ const sixDOFODE& sixDOF_;
+
+ public:
+
+ iNew(const sixDOFODE& sixDOF)
+ :
+ sixDOF_(sixDOF)
+ {}
+
+ autoPtr operator()(Istream& is) const
+ {
+ word name(is);
+ dictionary dict(is);
+ return combinedRestraint::New(name, dict, sixDOF_);
+ }
+ };
+
+
+ // Constructors
+
+ //- Construct from dictionary
+ combinedRestraint
+ (
+ const word& name,
+ const dictionary& dict,
+ const sixDOFODE& sixDOF
+ );
+
+ //- Construct and return a clone
+ virtual autoPtr clone() const = 0;
+
+
+ // Selectors
+
+ //- Return a reference to the selected combinedRestraint
+ static autoPtr New
+ (
+ const word& name,
+ const dictionary& dict,
+ const sixDOFODE& sixDOF
+ );
+
+
+ // Destructor
+
+ virtual ~combinedRestraint();
+
+
+ // Member Functions
+
+ // Access functions
+
+ //- Return name
+ const word& name() const;
+
+ //- Return underlying sixDOFODE object
+ const sixDOFODE& sixDOF() const;
+
+
+ // Restraint specific functions
+
+ //- Return restraining force (in the global coordinate system)
+ virtual vector restrainingForce
+ (
+ const scalar t,
+ const tensor& toRelative,
+ const vector& x,
+ const vector& u
+ ) const = 0;
+
+ //- Return restraining moment (in the local coordinate system)
+ virtual vector restrainingMoment
+ (
+ const scalar t,
+ const tensor& toRelative,
+ const vector& omega
+ ) const = 0;
+
+
+ // I-O Functions and Operators
+
+ //- Virtual write function
+ virtual void write(Ostream& os) const = 0;
+
+ //- Ostream operator implemented in terms of write operator
+ friend Ostream& operator<<
+ (
+ Ostream& os,
+ const combinedRestraint& tr
+ );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/ODE/sixDOF/sixDOFODE/sixDOFODE.C b/src/ODE/sixDOF/sixDOFODE/sixDOFODE.C
index f85ffedbe..be61738f2 100644
--- a/src/ODE/sixDOF/sixDOFODE/sixDOFODE.C
+++ b/src/ODE/sixDOF/sixDOFODE/sixDOFODE.C
@@ -244,6 +244,17 @@ void Foam::sixDOFODE::setState(const sixDOFODE& sd)
sd.rotationalRestraints_[rrI].clone()
);
}
+
+ // Combined restraints
+ combinedRestraints_.setSize(sd.combinedRestraints_.size());
+ forAll(sd.combinedRestraints_, rrI)
+ {
+ combinedRestraints_.set
+ (
+ rrI,
+ sd.combinedRestraints_[rrI].clone()
+ );
+ }
}
@@ -272,6 +283,17 @@ Foam::dimensionedVector Foam::sixDOFODE::force
);
}
+ forAll(combinedRestraints_, trI)
+ {
+ rForce.value() += combinedRestraints_[trI].restrainingForce
+ (
+ t, // Time
+ toRelative, // Transformation tensor
+ x, // Position in the global c.s.
+ u // Velocity in the global c.s.
+ );
+ }
+
// Return linearly interpolated external force with restraining force
return (alpha*oldStatePtr_->force() + (1 - alpha)*force()) + rForce;
}
@@ -300,6 +322,16 @@ Foam::dimensionedVector Foam::sixDOFODE::moment
);
}
+ forAll(combinedRestraints_, rrI)
+ {
+ rMoment.value() += combinedRestraints_[rrI].restrainingMoment
+ (
+ t, // Time
+ toRelative, // Transformation tensor
+ omega // Angular velocity in local c.s.
+ );
+ }
+
// Return linearly interpolated external moment with restraining moment
return (alpha*oldStatePtr_->moment() + (1 - alpha)*moment() + rMoment);
}
@@ -344,7 +376,8 @@ Foam::sixDOFODE::sixDOFODE(const IOobject& io)
rotationalConstraints_(),
translationalRestraints_(),
- rotationalRestraints_()
+ rotationalRestraints_(),
+ combinedRestraints_()
{
// Sanity checks
if (mass_.value() < SMALL)
@@ -431,6 +464,17 @@ Foam::sixDOFODE::sixDOFODE(const IOobject& io)
);
rotationalRestraints_.transfer(rcList);
}
+
+ // Read rotation restraints if they are present
+ if (dict().found("combinedRestraints"))
+ {
+ PtrList rcList
+ (
+ dict().lookup("combinedRestraints"),
+ combinedRestraint::iNew(*this)
+ );
+ combinedRestraints_.transfer(rcList);
+ }
}
@@ -468,7 +512,8 @@ Foam::sixDOFODE::sixDOFODE(const word& name, const sixDOFODE& sd)
rotationalConstraints_(sd.rotationalConstraints_),
translationalRestraints_(sd.translationalRestraints_),
- rotationalRestraints_(sd.rotationalRestraints_)
+ rotationalRestraints_(sd.rotationalRestraints_),
+ combinedRestraints_(sd.combinedRestraints_)
{}
@@ -536,6 +581,13 @@ bool Foam::sixDOFODE::writeData(Ostream& os) const
<< token::END_STATEMENT << endl;
}
+ if (!combinedRestraints_.empty())
+ {
+ os.writeKeyword("combinedRestraints")
+ << combinedRestraints_
+ << token::END_STATEMENT << endl;
+ }
+
return os.good();
}
diff --git a/src/ODE/sixDOF/sixDOFODE/sixDOFODE.H b/src/ODE/sixDOF/sixDOFODE/sixDOFODE.H
index 2a8e991c8..0bf3858e9 100644
--- a/src/ODE/sixDOF/sixDOFODE/sixDOFODE.H
+++ b/src/ODE/sixDOF/sixDOFODE/sixDOFODE.H
@@ -166,6 +166,9 @@ class sixDOFODE
//- List of rotational restraints
PtrList rotationalRestraints_;
+ //- List of combined trans and rot restraints
+ PtrList combinedRestraints_;
+
// Private Member Functions
@@ -345,6 +348,10 @@ public:
inline const PtrList&
rotationalRestraints() const;
+ //- Return const reference to combined restraints
+ inline const PtrList&
+ combinedRestraints() const;
+
// Virtual interface for 6DOF motion state