From 944ada0414f7a5105e01911960e50942eb2005ef Mon Sep 17 00:00:00 2001
From: Sergio Ferraris <sergio@alex.opencfd.co.uk>
Date: Fri, 20 Dec 2013 17:57:11 +0000
Subject: [PATCH] ENH: Correcting righ lib for option file for fvOption source
 coded in CodedSource.C      Adding contact resistance to
 turbulentTemperatureCoupledBaffleMixed and
 turbulentTemperatureRadCoupledMixed

---
 .../sources/general/codedSource/CodedSource.C |  4 +-
 ...tureCoupledBaffleMixedFvPatchScalarField.C | 54 ++++++++++--
 ...tureCoupledBaffleMixedFvPatchScalarField.H | 58 +++++++++----
 ...eratureRadCoupledMixedFvPatchScalarField.C | 83 ++++++++++++++++---
 ...eratureRadCoupledMixedFvPatchScalarField.H | 62 ++++++++++----
 5 files changed, 208 insertions(+), 53 deletions(-)

diff --git a/src/fvOptions/sources/general/codedSource/CodedSource.C b/src/fvOptions/sources/general/codedSource/CodedSource.C
index 80be8bf45f5..43e73377e38 100644
--- a/src/fvOptions/sources/general/codedSource/CodedSource.C
+++ b/src/fvOptions/sources/general/codedSource/CodedSource.C
@@ -65,14 +65,14 @@ void Foam::fv::CodedSource<Type>::prepare
     dynCode.setMakeOptions
         (
             "EXE_INC = -g \\\n"
-            "-I$(LIB_SRC)/fieldSources/lnInclude \\\n"
+            "-I$(LIB_SRC)/fvOptions/lnInclude \\\n"
             "-I$(LIB_SRC)/finiteVolume/lnInclude \\\n"
             "-I$(LIB_SRC)/meshTools/lnInclude \\\n"
             "-I$(LIB_SRC)/sampling/lnInclude \\\n"
             + context.options()
             + "\n\nLIB_LIBS = \\\n"
             + "    -lmeshTools \\\n"
-            + "    -lfieldSources \\\n"
+            + "    -lfvOptions \\\n"
             + "    -lsampling \\\n"
             + "    -lfiniteVolume \\\n"
             + context.libs()
diff --git a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C
index ef835546edc..0267cac34cd 100644
--- a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C
+++ b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C
@@ -101,6 +101,24 @@ turbulentTemperatureCoupledBaffleMixedFvPatchScalarField
             << exit(FatalError);
     }
 
+    if (dict.found("thicknessLayers"))
+    {
+        dict.lookup("thicknessLayers") >> thicknessLayers_;
+        dict.lookup("kappaLayers") >> kappaLayers_;
+
+        if (thicknessLayers_.size() > 0)
+        {
+            forAll (thicknessLayers_, iLayer)
+            {
+                const scalar l = thicknessLayers_[iLayer];
+                if (l > 0.0)
+                {
+                    contactRes_ += kappaLayers_[iLayer]/l;
+                }
+            }
+        }
+    }
+
     fvPatchScalarField::operator=(scalarField("value", dict, p.size()));
 
     if (dict.found("refValue"))
@@ -129,7 +147,10 @@ turbulentTemperatureCoupledBaffleMixedFvPatchScalarField
 :
     mixedFvPatchScalarField(wtcsf, iF),
     temperatureCoupledBase(patch(), wtcsf.KMethod(), wtcsf.kappaName()),
-    TnbrName_(wtcsf.TnbrName_)
+    TnbrName_(wtcsf.TnbrName_),
+    thicknessLayers_(wtcsf.thicknessLayers_),
+    kappaLayers_(wtcsf.kappaLayers_),
+    contactRes_(wtcsf.contactRes_)
 {}
 
 
@@ -155,7 +176,7 @@ void turbulentTemperatureCoupledBaffleMixedFvPatchScalarField::updateCoeffs()
     const fvPatch& nbrPatch =
         refCast<const fvMesh>(nbrMesh).boundary()[samplePatchI];
 
-    tmp<scalarField> intFld = patchInternalField();
+    //tmp<scalarField> intFld = patchInternalField();
 
 
     // Calculate the temperature by harmonic averaging
@@ -174,12 +195,22 @@ void turbulentTemperatureCoupledBaffleMixedFvPatchScalarField::updateCoeffs()
     );
 
     // Swap to obtain full local values of neighbour internal field
-    scalarField nbrIntFld(nbrField.patchInternalField());
-    mpp.distribute(nbrIntFld);
+    tmp<scalarField> nbrIntFld(new scalarField(nbrField.size(), 0.0));
+    tmp<scalarField> nbrKDelta(new scalarField(nbrField.size(), 0.0));
+
+    if (contactRes_ == 0.0)
+    {
+        nbrIntFld() = nbrField.patchInternalField();
+        nbrKDelta() = nbrField.kappa(nbrField)*nbrPatch.deltaCoeffs();
+    }
+    else
+    {
+        nbrIntFld() = nbrField;
+        nbrKDelta() = contactRes_;
+    }
 
-    // Swap to obtain full local values of neighbour kappa*delta
-    scalarField nbrKDelta(nbrField.kappa(nbrField)*nbrPatch.deltaCoeffs());
-    mpp.distribute(nbrKDelta);
+    mpp.distribute(nbrIntFld());
+    mpp.distribute(nbrKDelta());
 
     tmp<scalarField> myKDelta = kappa(*this)*patch().deltaCoeffs();
 
@@ -200,11 +231,11 @@ void turbulentTemperatureCoupledBaffleMixedFvPatchScalarField::updateCoeffs()
     //    - mixFraction = nbrKDelta / (nbrKDelta + myKDelta())
 
 
-    this->refValue() = nbrIntFld;
+    this->refValue() = nbrIntFld();
 
     this->refGrad() = 0.0;
 
-    this->valueFraction() = nbrKDelta/(nbrKDelta + myKDelta());
+    this->valueFraction() = nbrKDelta()/(nbrKDelta() + myKDelta());
 
     mixedFvPatchScalarField::updateCoeffs();
 
@@ -239,6 +270,11 @@ void turbulentTemperatureCoupledBaffleMixedFvPatchScalarField::write
     mixedFvPatchScalarField::write(os);
     os.writeKeyword("Tnbr")<< TnbrName_
         << token::END_STATEMENT << nl;
+    os.writeKeyword("thicknessLayers")<< thicknessLayers_
+        << token::END_STATEMENT << nl;
+    os.writeKeyword("kappaLayers")<< kappaLayers_
+        << token::END_STATEMENT << nl;
+
     temperatureCoupledBase::write(os);
 }
 
diff --git a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.H b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.H
index 0484337b9a8..e2b163f5080 100644
--- a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.H
+++ b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.H
@@ -22,11 +22,20 @@ License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
 Class
-    Foam::compressible::turbulentTemperatureCoupledBaffleMixedFvPatchScalarField
+    Foam::
+    compressible::
+    turbulentTemperatureCoupledBaffleMixedFvPatchScalarField
 
 Description
     Mixed boundary condition for temperature, to be used for heat-transfer
-    on back-to-back baffles.
+    on back-to-back baffles.Optional thin thermal layer
+    resistances can be specified through thicknessLayers and kappaLayers
+    entries.
+
+    The thermal conductivity, \c kappa, can either be retrieved from the
+    mesh database using the \c lookup option, or from a \c solidThermo
+    or \c fluidThermo thermophysical package.
+
 
     Specifies gradient and temperature such that the equations are the same
     on both sides:
@@ -36,29 +45,41 @@ Description
 
     where KDelta is heat-transfer coefficient K * deltaCoeffs
 
-    Example usage:
-        myInterfacePatchName
-        {
-            type        compressible::turbulentTemperatureCoupledBaffleMixed;
-            Tnbr        T;
-            kappa       lookup;
-            kappaName   kappa;
-            value       uniform 300;
-        }
+    \heading Patch usage
+
+    \table
+        Property     | Description             | Required    | Default value
+        kappa        | thermal conductivity option | yes     |
+        kappaName    | name of thermal conductivity field | no  |
+        Tnbr         | name of the field    | no | T
+        thicknessLayers | list of thicknesses per layer [m] | no |
+        kappaLayers  | list of thermal conductivites per layer [W/m/K] | no |
+    \endtable
+
+    Example of the boundary condition specification:
+    \verbatim
+    myPatch
+    {
+        type            compressible::turbulentTemperatureCoupledBaffleMixed;
+        Tnbr            T;
+        kappa           lookup;
+        KappaName       kappa;
+        thicknessLayers (0.1 0.2 0.3 0.4);
+        kappaLayers     (1 2 3 4)
+        value           uniform 300;
+    }
 
     Needs to be on underlying mapped(Wall)FvPatch.
 
     Note: kappa : heat conduction at patch. Gets supplied how to lookup
         calculate kappa:
+
     - 'lookup' : lookup volScalarField (or volSymmTensorField) with name
     - 'fluidThermo' : use fluidThermo and compressible::RASmodel to calculate
         kappa
     - 'solidThermo' : use solidThermo kappa()
     - 'directionalSolidThermo' directionalKappa()
 
-    Note: runs in parallel with arbitrary decomposition. Uses mapped
-    functionality to calculate exchange.
-
 SourceFiles
     turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C
 
@@ -91,6 +112,15 @@ class turbulentTemperatureCoupledBaffleMixedFvPatchScalarField
         //- Name of field on the neighbour region
         const word TnbrName_;
 
+        //- Thickness of layers
+        scalarField thicknessLayers_;
+
+        //- Conductivity of layers
+        scalarField kappaLayers_;
+
+        //- Total contact resistance
+        scalar contactRes_;
+
 
 public:
 
diff --git a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.C b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.C
index 6d512d50bd5..7f1b0b232f5 100644
--- a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.C
+++ b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.C
@@ -49,7 +49,10 @@ turbulentTemperatureRadCoupledMixedFvPatchScalarField
     temperatureCoupledBase(patch(), "undefined", "undefined-K"),
     TnbrName_("undefined-Tnbr"),
     QrNbrName_("undefined-QrNbr"),
-    QrName_("undefined-Qr")
+    QrName_("undefined-Qr"),
+    thicknessLayers_(),
+    kappaLayers_(),
+    contactRes_(0)
 {
     this->refValue() = 0.0;
     this->refGrad() = 0.0;
@@ -70,7 +73,10 @@ turbulentTemperatureRadCoupledMixedFvPatchScalarField
     temperatureCoupledBase(patch(), psf.KMethod(), psf.kappaName()),
     TnbrName_(psf.TnbrName_),
     QrNbrName_(psf.QrNbrName_),
-    QrName_(psf.QrName_)
+    QrName_(psf.QrName_),
+    thicknessLayers_(psf.thicknessLayers_),
+    kappaLayers_(psf.kappaLayers_),
+    contactRes_(psf.contactRes_)
 {}
 
 
@@ -86,7 +92,10 @@ turbulentTemperatureRadCoupledMixedFvPatchScalarField
     temperatureCoupledBase(patch(), dict),
     TnbrName_(dict.lookupOrDefault<word>("Tnbr", "T")),
     QrNbrName_(dict.lookupOrDefault<word>("QrNbr", "none")),
-    QrName_(dict.lookupOrDefault<word>("Qr", "none"))
+    QrName_(dict.lookupOrDefault<word>("Qr", "none")),
+    thicknessLayers_(),
+    kappaLayers_(),
+    contactRes_(0.0)
 {
     if (!isA<mappedPatchBase>(this->patch().patch()))
     {
@@ -107,6 +116,24 @@ turbulentTemperatureRadCoupledMixedFvPatchScalarField
             << exit(FatalError);
     }
 
+    if (dict.found("thicknessLayers"))
+    {
+        dict.lookup("thicknessLayers") >> thicknessLayers_;
+        dict.lookup("kappaLayers") >> kappaLayers_;
+
+        if (thicknessLayers_.size() > 0)
+        {
+            forAll (thicknessLayers_, iLayer)
+            {
+                const scalar l = thicknessLayers_[iLayer];
+                if (l > 0.0)
+                {
+                    contactRes_ += kappaLayers_[iLayer]/l;
+                }
+            }
+        }
+    }
+
     fvPatchScalarField::operator=(scalarField("value", dict, p.size()));
 
     if (dict.found("refValue"))
@@ -137,7 +164,10 @@ turbulentTemperatureRadCoupledMixedFvPatchScalarField
     temperatureCoupledBase(patch(), psf.KMethod(), psf.kappaName()),
     TnbrName_(psf.TnbrName_),
     QrNbrName_(psf.QrNbrName_),
-    QrName_(psf.QrName_)
+    QrName_(psf.QrName_),
+    thicknessLayers_(psf.thicknessLayers_),
+    kappaLayers_(psf.kappaLayers_),
+    contactRes_(psf.contactRes_)
 {}
 
 
@@ -180,9 +210,17 @@ void turbulentTemperatureRadCoupledMixedFvPatchScalarField::updateCoeffs()
 
 
     // Swap to obtain full local values of neighbour K*delta
-    scalarField KDeltaNbr(nbrField.kappa(nbrField)*nbrPatch.deltaCoeffs());
-    mpp.distribute(KDeltaNbr);
-
+    tmp<scalarField> KDeltaNbr(new scalarField(TcNbr.size(), 0.0));
+    if (contactRes_ == 0.0)
+    {
+        // Swap to obtain full local values of neighbour K*delta
+        KDeltaNbr() = nbrField.kappa(nbrField)*nbrPatch.deltaCoeffs();
+    }
+    else
+    {
+        KDeltaNbr() = contactRes_;
+    }
+    mpp.distribute(KDeltaNbr());
 
     scalarField KDelta(kappa(*this)*patch().deltaCoeffs());
 
@@ -199,16 +237,34 @@ void turbulentTemperatureRadCoupledMixedFvPatchScalarField::updateCoeffs()
         mpp.distribute(QrNbr);
     }
 
-    scalarField alpha(KDeltaNbr - (Qr + QrNbr)/Tp);
+    scalarField alpha(KDeltaNbr() - (Qr + QrNbr)/Tp);
 
     valueFraction() = alpha/(alpha + KDelta);
 
-    refValue() = (KDeltaNbr*TcNbr)/alpha;
+    refValue() = (KDeltaNbr()*TcNbr)/alpha;
+
+    mixedFvPatchScalarField::updateCoeffs();
+
+    if (debug)
+    {
+        scalar Q = gSum(kappa(*this)*patch().magSf()*snGrad());
+
+        Info<< patch().boundaryMesh().mesh().name() << ':'
+            << patch().name() << ':'
+            << this->dimensionedInternalField().name() << " <- "
+            << nbrMesh.name() << ':'
+            << nbrPatch.name() << ':'
+            << this->dimensionedInternalField().name() << " :"
+            << " heat transfer rate:" << Q
+            << " walltemperature "
+            << " min:" << gMin(*this)
+            << " max:" << gMax(*this)
+            << " avg:" << gAverage(*this)
+            << endl;
+    }
 
     // Restore tag
     UPstream::msgType() = oldTag;
-
-    mixedFvPatchScalarField::updateCoeffs();
 }
 
 
@@ -221,6 +277,11 @@ void turbulentTemperatureRadCoupledMixedFvPatchScalarField::write
     os.writeKeyword("Tnbr")<< TnbrName_ << token::END_STATEMENT << nl;
     os.writeKeyword("QrNbr")<< QrNbrName_ << token::END_STATEMENT << nl;
     os.writeKeyword("Qr")<< QrName_ << token::END_STATEMENT << nl;
+    os.writeKeyword("Qr")<< QrName_ << token::END_STATEMENT << nl;
+    os.writeKeyword("thicknessLayers")<< thicknessLayers_
+                << token::END_STATEMENT << nl;
+    os.writeKeyword("kappaLayers")<< kappaLayers_
+                << token::END_STATEMENT << nl;
     temperatureCoupledBase::write(os);
 }
 
diff --git a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H
index 3d4b80085a1..b272ff8c535 100644
--- a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H
+++ b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H
@@ -28,23 +28,45 @@ Class
 
 Description
     Mixed boundary condition for temperature and radiation heat transfer
-    to be used for in multiregion cases
-
-    Example usage:
-        myInterfacePatchName
-        {
-            type compressible::turbulentTemperatureRadCoupledMixed;
-            Tnbr        T;      // name of T field on neighbour region
-            kappa       lookup;
-            KappaName   kappa;
-            QrNbr       Qr; // or none. Name of Qr field on neighbour region
-            Qr          Qr; // or none. Name of Qr field on local region
-            value       uniform 300;
-        }
+    to be used for in multiregion cases. Optional thin thermal layer
+    resistances can be specified through thicknessLayers and kappaLayers
+    entries.
+
+    The thermal conductivity, \c kappa, can either be retrieved from the
+    mesh database using the \c lookup option, or from a \c solidThermo
+    or \c fluidThermo thermophysical package.
+
+    \heading Patch usage
+
+    \table
+        Property     | Description             | Required    | Default value
+        kappa        | thermal conductivity option | yes     |
+        kappaName    | name of thermal conductivity field | no  |
+        Tnbr         | name of the field    | no | T
+        QrNbr      | name of the radiative flux in the nbr region | no | none
+        Qr         | name of the radiative flux in this region | no | none
+        thicknessLayers | list of thicknesses per layer [m] | no |
+        kappaLayers  | list of thermal conductivites per layer [W/m/K] | no |
+    \endtable
+
+    Example of the boundary condition specification:
+    \verbatim
+    myPatch
+    {
+        type            compressible::turbulentTemperatureRadCoupledMixed;
+        Tnbr            T;
+        kappa           lookup;
+        KappaName       kappa;
+        QrNbr           Qr; // or none. Name of Qr field on neighbour region
+        Qr              Qr; // or none. Name of Qr field on local region
+        thicknessLayers (0.1 0.2 0.3 0.4);
+        kappaLayers     (1 2 3 4)
+        value           uniform 300;
+    }
 
     Needs to be on underlying mapped(Wall)FvPatch.
 
-     Note: kappa : heat conduction at patch. Gets supplied how to
+    Note: kappa : heat conduction at patch. Gets supplied how to
             lookup/calculate
      kappa:
     - 'lookup' : lookup volScalarField (or volSymmTensorField) with name
@@ -52,9 +74,6 @@ Description
     - 'solidThermo' : use solidThermo kappa()
     - 'directionalSolidThermo' directionalKappa()
 
-    Note: runs in parallel with arbitrary decomposition. Uses mapped
-    functionality to calculate exchange.
-
 SourceFiles
     turbulentTemperatureRadCoupledMixedFvPatchScalarField.C
 
@@ -93,6 +112,15 @@ class turbulentTemperatureRadCoupledMixedFvPatchScalarField
         //- Name of the radiative heat flux in local region
         const word QrName_;
 
+        //- Thickness of layers
+        scalarField thicknessLayers_;
+
+        //- Conductivity of layers
+        scalarField kappaLayers_;
+
+        //- Total contact resistance
+        scalar contactRes_;
+
 
 public:
 
-- 
GitLab