From c1678f897a75a5179139f796169e13e2ddba5d3e Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Thu, 21 Oct 2010 11:18:50 +0100
Subject: [PATCH] ENH: Added copy/clone functionality to cloud integration
 schemes

---
 .../IntegrationScheme/Analytical/Analytical.C | 14 ++++++-
 .../IntegrationScheme/Analytical/Analytical.H | 12 ++++++
 .../IntegrationScheme/Euler/Euler.C           |  7 ++++
 .../IntegrationScheme/Euler/Euler.H           |  9 +++++
 .../IntegrationScheme/IntegrationScheme.C     | 40 +++++++++++++++++++
 .../IntegrationScheme/IntegrationScheme.H     | 17 ++++++--
 6 files changed, 93 insertions(+), 6 deletions(-)

diff --git a/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.C b/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.C
index 11f09d9697b..7075f2152a8 100644
--- a/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.C
+++ b/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.C
@@ -39,6 +39,13 @@ Foam::Analytical<Type>::Analytical
 {}
 
 
+template<class Type>
+Foam::Analytical<Type>::Analytical(const Analytical& is)
+:
+    IntegrationScheme<Type>(is)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class Type>
@@ -59,8 +66,11 @@ Foam::Analytical<Type>::integrate
 ) const
 {
     typename IntegrationScheme<Type>::integrationResult retValue;
-    retValue.average() = alpha + (phi - alpha)*(1 - exp(-beta*dt))/(beta*dt);
-    retValue.value() =  alpha + (phi - alpha)*exp(-beta*dt);
+
+    const scalar expTerm = exp(min(50, -beta*dt));
+
+    retValue.average() = alpha + (phi - alpha)*(1 - expTerm)/(beta*dt);
+    retValue.value() =  alpha + (phi - alpha)*expTerm;
 
     return retValue;
 }
diff --git a/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.H b/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.H
index e18af027f9c..39c6b3f8230 100644
--- a/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.H
+++ b/src/lagrangian/intermediate/IntegrationScheme/Analytical/Analytical.H
@@ -59,6 +59,18 @@ public:
         //- Construct from components
         Analytical(const word& phiName, const dictionary& dict);
 
+        //- Copy constructor
+        Analytical(const Analytical& is);
+
+        //- Construct and return clone
+        virtual autoPtr<IntegrationScheme<Type> > clone() const
+        {
+            return autoPtr<IntegrationScheme<Type> >
+            (
+                new Analytical<Type>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~Analytical();
diff --git a/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.C b/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.C
index e065b54780c..0ae13e16e83 100644
--- a/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.C
+++ b/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.C
@@ -39,6 +39,13 @@ Foam::Euler<Type>::Euler
 {}
 
 
+template<class Type>
+Foam::Euler<Type>::Euler(const Euler& is)
+:
+    IntegrationScheme<Type>(is)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class Type>
diff --git a/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.H b/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.H
index 39989c22e6a..b0ffb86ef22 100644
--- a/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.H
+++ b/src/lagrangian/intermediate/IntegrationScheme/Euler/Euler.H
@@ -59,6 +59,15 @@ public:
         //- Construct from components
         Euler(const word& phiName, const dictionary& dict);
 
+        //- Copy constructor
+        Euler(const Euler& is);
+
+        //- Construct and return clone
+        virtual autoPtr<IntegrationScheme<Type> > clone() const
+        {
+            return autoPtr<IntegrationScheme<Type> >(new Euler<Type>(*this));
+        }
+
 
     //- Destructor
     virtual ~Euler();
diff --git a/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.C b/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.C
index 0388788c8e2..33efb86687b 100644
--- a/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.C
+++ b/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.C
@@ -39,6 +39,14 @@ Foam::IntegrationScheme<Type>::IntegrationScheme
 {}
 
 
+template<class Type>
+Foam::IntegrationScheme<Type>::IntegrationScheme(const IntegrationScheme& is)
+:
+    phiName_(is.phiName_),
+    dict_(is.dict_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor    * * * * * * * * * * * * * * //
 
 template<class Type>
@@ -48,6 +56,38 @@ Foam::IntegrationScheme<Type>::~IntegrationScheme()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+template<class Type>
+typename Foam::IntegrationScheme<Type>::integrationResult
+Foam::IntegrationScheme<Type>::integrate
+(
+    const Type phi,
+    const scalar dt,
+    const Type alpha,
+    const scalar beta
+) const
+{
+    notImplemented
+    (
+        "Foam::IntegrationScheme<Type>::integrationResult"
+        "Foam::IntegrationScheme<Type>::integrate"
+        "("
+            "const Type, "
+            "const scalar, "
+            "const Type, "
+            "const scalar"
+        ") const"
+    );
+
+    typename IntegrationScheme<Type>::integrationResult retValue;
+    retValue.average() = pTraits<Type>::zero;
+    retValue.value() = pTraits<Type>::zero;
+
+    return retValue;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #include "IntegrationSchemeNew.C"
 
 // ************************************************************************* //
diff --git a/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.H b/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.H
index 6bf976d081f..3558bdc83be 100644
--- a/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.H
+++ b/src/lagrangian/intermediate/IntegrationScheme/IntegrationScheme/IntegrationScheme.H
@@ -121,9 +121,6 @@ private:
 
     // Private Member Functions
 
-        //- Disallow default bitwise copy construct
-        IntegrationScheme(const IntegrationScheme&);
-
         //- Disallow default bitwise assignment
         void operator=(const IntegrationScheme&);
 
@@ -154,6 +151,18 @@ public:
         //- Construct from components
         IntegrationScheme(const word& phiName, const dictionary& dict);
 
+        //- Copy constructor
+        IntegrationScheme(const IntegrationScheme& is);
+
+        //- Construct and return clone
+        virtual autoPtr<IntegrationScheme<Type> > clone() const
+        {
+            return autoPtr<IntegrationScheme<Type> >
+            (
+                new IntegrationScheme<Type>(*this)
+            );
+        }
+
 
     // Selectors
 
@@ -178,7 +187,7 @@ public:
             const scalar dt,
             const Type alpha,
             const scalar beta
-        ) const = 0;
+        ) const;
 };
 
 
-- 
GitLab