From 160efd89a63aa45f10e7768646312a9cbf99c2f8 Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Wed, 8 Feb 2017 10:40:14 +0000
Subject: [PATCH] porosityModels::solidification: Added optional phase-fraction
 for VoF solvers etc.

Description
    Simple solidification porosity model

    This is a simple approximation to solidification where the solid phase
    is represented as a porous blockage with the drag-coefficient evaluated from

        \f[
            S = - \alpha \rho D(T) U
        \f]

    where
    \vartable
        \alpha  | Optional phase-fraction of solidifying phase
        D(T)    | User-defined drag-coefficient as function of temperature
    \endvartable

    Note that the latent heat of solidification is not included and the
    temperature is unchanged by the modelled change of phase.

    Example of the solidification model specification:
    \verbatim
        type            solidification;

        solidificationCoeffs
        {
            // Solidify between 330K and 330.5K
            D table
            (
                (330.0     10000) // Solid below 330K
                (330.5     0)     // Liquid above 330.5K
            );

            // Optional phase-fraction of solidifying phase
            alpha alpha.liquid;

            // Solidification porosity is isotropic
            // use the global coordinate system
            coordinateSystem
            {
                type    cartesian;
                origin  (0 0 0);
                coordinateRotation
                {
                    type    axesRotation;
                    e1      (1 0 0);
                    e2      (0 1 0);
                }
            }
        }
    \endverbatim
---
 .../solidification/solidification.C           |  1 +
 .../solidification/solidification.H           | 32 +++++++++-
 .../solidification/solidificationTemplates.C  | 62 +++++++++++++++++--
 3 files changed, 89 insertions(+), 6 deletions(-)

diff --git a/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidification.C b/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidification.C
index ac60cf0d04c..68d3edcf774 100644
--- a/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidification.C
+++ b/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidification.C
@@ -53,6 +53,7 @@ Foam::porosityModels::solidification::solidification
 :
     porosityModel(name, modelType, mesh, dict, cellZoneName),
     TName_(coeffs_.lookupOrDefault<word>("T", "T")),
+    alphaName_(coeffs_.lookupOrDefault<word>("alpha", "none")),
     rhoName_(coeffs_.lookupOrDefault<word>("rho", "rho")),
     D_(Function1<scalar>::New("D", coeffs_))
 {}
diff --git a/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidification.H b/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidification.H
index 7f86849f64d..119ba568053 100644
--- a/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidification.H
+++ b/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidification.H
@@ -31,12 +31,13 @@ Description
     is represented as a porous blockage with the drag-coefficient evaluated from
 
         \f[
-            S = - \rho D(T) U
+            S = - \alpha \rho D(T) U
         \f]
 
     where
     \vartable
-        D(T) | User-defined drag-coefficient as function of temperature
+        \alpha  | Optional phase-fraction of solidifying phase
+        D(T)    | User-defined drag-coefficient as function of temperature
     \endvartable
 
     Note that the latent heat of solidification is not included and the
@@ -55,6 +56,9 @@ Description
                 (330.5     0)     // Liquid above 330.5K
             );
 
+            // Optional phase-fraction of solidifying phase
+            alpha alpha.liquid;
+
             // Solidification porosity is isotropic
             // use the global coordinate system
             coordinateSystem
@@ -103,6 +107,9 @@ class solidification
         //- Name of temperature field, default = "T"
         word TName_;
 
+        //- Name of optional phase-fraction field, default = "none"
+        word alphaName_;
+
         //- Name of density field, default = "rho"
         word rhoName_;
 
@@ -112,6 +119,27 @@ class solidification
 
     // Private Member Functions
 
+        //- Apply resistance
+        template<class AlphaFieldType, class RhoFieldType>
+        void apply
+        (
+            scalarField& Udiag,
+            const scalarField& V,
+            const AlphaFieldType& alpha,
+            const RhoFieldType& rho,
+            const volVectorField& U
+        ) const;
+
+        //- Apply resistance
+        template<class AlphaFieldType, class RhoFieldType>
+        void apply
+        (
+            tensorField& AU,
+            const AlphaFieldType& alpha,
+            const RhoFieldType& rho,
+            const volVectorField& U
+        ) const;
+
         //- Apply resistance
         template<class RhoFieldType>
         void apply
diff --git a/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidificationTemplates.C b/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidificationTemplates.C
index 71b290af178..d9ea04d59eb 100644
--- a/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidificationTemplates.C
+++ b/src/finiteVolume/cfdTools/general/porosityModel/solidification/solidificationTemplates.C
@@ -24,14 +24,16 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "volFields.H"
+#include "geometricOneField.H"
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-template<class RhoFieldType>
+template<class AlphaFieldType, class RhoFieldType>
 void Foam::porosityModels::solidification::apply
 (
     scalarField& Udiag,
     const scalarField& V,
+    const AlphaFieldType& alpha,
     const RhoFieldType& rho,
     const volVectorField& U
 ) const
@@ -48,16 +50,18 @@ void Foam::porosityModels::solidification::apply
         forAll(cells, i)
         {
             const label celli = cells[i];
-            Udiag[celli] += V[celli]*rho[celli]*D_->value(T[celli]);
+            Udiag[celli] +=
+                V[celli]*alpha[celli]*rho[celli]*D_->value(T[celli]);
         }
     }
 }
 
 
-template<class RhoFieldType>
+template<class AlphaFieldType, class RhoFieldType>
 void Foam::porosityModels::solidification::apply
 (
     tensorField& AU,
+    const AlphaFieldType& alpha,
     const RhoFieldType& rho,
     const volVectorField& U
 ) const
@@ -74,10 +78,60 @@ void Foam::porosityModels::solidification::apply
         forAll(cells, i)
         {
             const label celli = cells[i];
-            AU[celli] += tensor::I*rho[celli]*D_->value(T[celli]);
+            AU[celli] +=
+                tensor::I*alpha[celli]*rho[celli]*D_->value(T[celli]);
         }
     }
 }
 
 
+template<class RhoFieldType>
+void Foam::porosityModels::solidification::apply
+(
+    scalarField& Udiag,
+    const scalarField& V,
+    const RhoFieldType& rho,
+    const volVectorField& U
+) const
+{
+    if (alphaName_ == "none")
+    {
+        return apply(Udiag, V, geometricOneField(), rho, U);
+    }
+    else
+    {
+        const volScalarField& alpha = mesh_.lookupObject<volScalarField>
+        (
+            IOobject::groupName(alphaName_, U.group())
+        );
+
+        return apply(Udiag, V, alpha, rho, U);
+    }
+}
+
+
+template<class RhoFieldType>
+void Foam::porosityModels::solidification::apply
+(
+    tensorField& AU,
+    const RhoFieldType& rho,
+    const volVectorField& U
+) const
+{
+    if (alphaName_ == "none")
+    {
+        return apply(AU, geometricOneField(), rho, U);
+    }
+    else
+    {
+        const volScalarField& alpha = mesh_.lookupObject<volScalarField>
+        (
+            IOobject::groupName(alphaName_, U.group())
+        );
+
+        return apply(AU, alpha, rho, U);
+    }
+}
+
+
 // ************************************************************************* //
-- 
GitLab