From 141e0d43cadf56cbbb0d62ca8a31c03821ceb274 Mon Sep 17 00:00:00 2001
From: "h.weller@opencfd.co.uk" <h.weller@opencfd.co.uk>
Date: Tue, 24 Jun 2008 17:01:01 +0100
Subject: [PATCH] Fixed a bug introduced by maintaining the coupled patch
 fields in sliced fields.

---
 .../SlicedGeometricField/SlicedGeometricField.C | 17 ++++++++++-------
 .../SlicedGeometricField/SlicedGeometricField.H | 13 ++++++++-----
 .../fvMatrices/solvers/MULES/MULESTemplates.C   | 16 ++++++++++++----
 3 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/src/OpenFOAM/fields/GeometricFields/SlicedGeometricField/SlicedGeometricField.C b/src/OpenFOAM/fields/GeometricFields/SlicedGeometricField/SlicedGeometricField.C
index e86b9e9bb28..84ecd5d124f 100644
--- a/src/OpenFOAM/fields/GeometricFields/SlicedGeometricField/SlicedGeometricField.C
+++ b/src/OpenFOAM/fields/GeometricFields/SlicedGeometricField/SlicedGeometricField.C
@@ -35,12 +35,13 @@ template
     template<class> class SlicedPatchField,
     class GeoMesh
 >
-Foam::tmp<Foam::FieldField<PatchField, Type> > 
+Foam::tmp<Foam::FieldField<PatchField, Type> >
 Foam::SlicedGeometricField<Type, PatchField, SlicedPatchField, GeoMesh>::
 slicedBoundaryField
 (
     const Mesh& mesh,
-    const Field<Type>& completeField
+    const Field<Type>& completeField,
+    const bool preserveCouples
 )
 {
     tmp<FieldField<PatchField, Type> > tbf
@@ -52,7 +53,7 @@ slicedBoundaryField
 
     forAll (mesh.boundary(), patchi)
     {
-        if (mesh.boundary()[patchi].coupled())
+        if (preserveCouples && mesh.boundary()[patchi].coupled())
         {
             // For coupled patched construct the correct patch field type
             bf.set
@@ -143,7 +144,8 @@ SlicedGeometricField
     const IOobject& io,
     const Mesh& mesh,
     const dimensionSet& ds,
-    const Field<Type>& completeField
+    const Field<Type>& completeField,
+    const bool preserveCouples
 )
 :
     GeometricField<Type, PatchField, GeoMesh>
@@ -152,7 +154,7 @@ SlicedGeometricField
         mesh,
         ds,
         Field<Type>(),
-        slicedBoundaryField(mesh, completeField)
+        slicedBoundaryField(mesh, completeField, preserveCouples)
     )
 {
     // Set the internalField to the slice of the complete field
@@ -179,7 +181,8 @@ SlicedGeometricField
     const Mesh& mesh,
     const dimensionSet& ds,
     const Field<Type>& completeIField,
-    const Field<Type>& completeBField
+    const Field<Type>& completeBField,
+    const bool preserveCouples
 )
 :
     GeometricField<Type, PatchField, GeoMesh>
@@ -188,7 +191,7 @@ SlicedGeometricField
         mesh,
         ds,
         Field<Type>(),
-        slicedBoundaryField(mesh, completeBField)
+        slicedBoundaryField(mesh, completeBField, preserveCouples)
     )
 {
     // Set the internalField to the slice of the complete field
diff --git a/src/OpenFOAM/fields/GeometricFields/SlicedGeometricField/SlicedGeometricField.H b/src/OpenFOAM/fields/GeometricFields/SlicedGeometricField/SlicedGeometricField.H
index 37eea9a3b58..18f9abe05cc 100644
--- a/src/OpenFOAM/fields/GeometricFields/SlicedGeometricField/SlicedGeometricField.H
+++ b/src/OpenFOAM/fields/GeometricFields/SlicedGeometricField/SlicedGeometricField.H
@@ -28,11 +28,11 @@ Class
 Description
     Specialization of GeometricField which holds slices of given complete
     fields in a form that they act as a GeometricField.
- 
+
     The destructor is wrapped to avoid deallocation of the storage of the
     complete fields when this is destroyed.
 
-    SlicedGeometricField can only be instantiated with a valid form of 
+    SlicedGeometricField can only be instantiated with a valid form of
     SlicedPatchField to handle the slicing and storage deallocation of the
     boundary field.
 
@@ -83,7 +83,8 @@ private:
         tmp<FieldField<PatchField, Type> >  slicedBoundaryField
         (
             const Mesh& mesh,
-            const Field<Type>& completeField
+            const Field<Type>& completeField,
+            const bool preserveCouples
         );
 
         //- Disallow default bitwise copy construct
@@ -111,7 +112,8 @@ public:
             const IOobject&,
             const Mesh&,
             const dimensionSet&,
-            const Field<Type>& completeField
+            const Field<Type>& completeField,
+            const bool preserveCouples=true
         );
 
         //- Construct from components and separate fields to slice for the
@@ -122,7 +124,8 @@ public:
             const Mesh&,
             const dimensionSet&,
             const Field<Type>& completeIField,
-            const Field<Type>& completeBField
+            const Field<Type>& completeBField,
+            const bool preserveCouples=true
         );
 
 
diff --git a/src/finiteVolume/fvMatrices/solvers/MULES/MULESTemplates.C b/src/finiteVolume/fvMatrices/solvers/MULES/MULESTemplates.C
index e9e012a09d0..daded730b9b 100644
--- a/src/finiteVolume/fvMatrices/solvers/MULES/MULESTemplates.C
+++ b/src/finiteVolume/fvMatrices/solvers/MULES/MULESTemplates.C
@@ -55,6 +55,7 @@ void Foam::MULES::explicitSolve
     Info<< "MULES: Solving for " << psi.name() << endl;
 
     const fvMesh& mesh = psi.mesh();
+    psi.correctBoundaryConditions();
 
     surfaceScalarField phiBD = upwind<scalar>(psi.mesh(), phi).flux(psi);
 
@@ -76,7 +77,8 @@ void Foam::MULES::explicitSolve
         ),
         mesh,
         dimless,
-        allLambda
+        allLambda,
+        false   // Use slices for the couples
     );
 
     limiter
@@ -183,7 +185,8 @@ void Foam::MULES::implicitSolve
             ),
             mesh,
             dimless,
-            allCoLambda
+            allCoLambda,
+            false   // Use slices for the couples
         );
 
         CoLambda == 1.0/max(CoCoeff*Cof, scalar(1));
@@ -205,7 +208,8 @@ void Foam::MULES::implicitSolve
         ),
         mesh,
         dimless,
-        allLambda
+        allLambda,
+        false   // Use slices for the couples
     );
 
     linear<scalar> CDs(mesh);
@@ -347,7 +351,8 @@ void Foam::MULES::limiter
         ),
         mesh,
         dimless,
-        allLambda
+        allLambda,
+        false   // Use slices for the couples
     );
 
     scalarField& lambdaIf = lambda;
@@ -406,6 +411,9 @@ void Foam::MULES::limiter
             {
                 label pfCelli = pFaceCells[pFacei];
 
+                psiMaxn[pfCelli] = max(psiMaxn[pfCelli], psiPf[pFacei]);
+                psiMinn[pfCelli] = min(psiMinn[pfCelli], psiPf[pFacei]);
+
                 psiMaxn[pfCelli] = max(psiMaxn[pfCelli], psiPNf[pFacei]);
                 psiMinn[pfCelli] = min(psiMinn[pfCelli], psiPNf[pFacei]);
             }
-- 
GitLab