From 63cfb77fa5c4e9321ca6864b7b239f6956579aed Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Fri, 10 Jun 2022 13:45:12 +0200
Subject: [PATCH] ENH: use vector removeCollinear/normalise in NVDscheme

---
 src/finiteArea/faMesh/faMesh.C                |  8 +++++-
 .../schemes/NVDscheme/faNVDscheme.C           | 25 ++++++++-----------
 .../schemes/NVDscheme/faNVDscheme.H           | 12 +++------
 3 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/src/finiteArea/faMesh/faMesh.C b/src/finiteArea/faMesh/faMesh.C
index 5703a8ad3d6..87ad1d36406 100644
--- a/src/finiteArea/faMesh/faMesh.C
+++ b/src/finiteArea/faMesh/faMesh.C
@@ -284,11 +284,17 @@ bool Foam::faMesh::init(const bool doInit)
     // Calculate the geometry for the patches (transformation tensors etc.)
     boundary_.calcGeometry();
 
-    // Ensure area information is properly synchronised
+    // Ensure processor/processor information is properly synchronised
     if (Pstream::parRun())
     {
         const_cast<areaVectorField&>(areaCentres()).boundaryFieldRef()
             .evaluateCoupled<processorFaPatch>();
+
+        // This roughly corresponds to what OpenFOAM-v2112 (and earlier) had,
+        // but should nominally be unnecessary.
+        //
+        /// const_cast<areaVectorField&>(faceAreaNormals()).boundaryFieldRef()
+        ///     .evaluateCoupled<processorFaPatch>();
     }
 
     return false;
diff --git a/src/finiteArea/interpolation/edgeInterpolation/schemes/NVDscheme/faNVDscheme.C b/src/finiteArea/interpolation/edgeInterpolation/schemes/NVDscheme/faNVDscheme.C
index c58f9958917..c659ad3f4f0 100644
--- a/src/finiteArea/interpolation/edgeInterpolation/schemes/NVDscheme/faNVDscheme.C
+++ b/src/finiteArea/interpolation/edgeInterpolation/schemes/NVDscheme/faNVDscheme.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -94,20 +95,18 @@ Foam::tmp<Foam::edgeScalarField> Foam::faNVDscheme<Type,NVDweight>::weights
 
     forAll(weights, edge)
     {
-        vector d(Zero);
+        vector d(c[neighbour[edge]] - c[owner[edge]]);
 
         if (edgeFlux_[edge] > 0)
         {
-            d = c[neighbour[edge]] - c[owner[edge]];
-            d -= n[owner[edge]]*(n[owner[edge]]&d);
-            d /= mag(d)/mesh.edgeInterpolation::lPN().internalField()[edge];
+            d.removeCollinear(n[owner[edge]]);
         }
         else
         {
-            d = c[neighbour[edge]] - c[owner[edge]];
-            d -= n[neighbour[edge]]*(n[neighbour[edge]]&d);
-            d /= mag(d)/mesh.edgeInterpolation::lPN().internalField()[edge];
+            d.removeCollinear(n[neighbour[edge]]);
         }
+        d.normalise();
+        d *= mesh.edgeInterpolation::lPN().internalField()[edge];
 
         weights[edge] =
             this->weight
@@ -177,20 +176,18 @@ Foam::tmp<Foam::edgeScalarField> Foam::faNVDscheme<Type,NVDweight>::weights
 
             forAll(pWeights, edgeI)
             {
-                vector d(Zero);
+                vector d(CN[edgeI] - CP[edgeI]);
 
                 if (pEdgeFlux[edgeI] > 0)
                 {
-                    d = CN[edgeI] - CP[edgeI];
-                    d -= nP[edgeI]*(nP[edgeI]&d);
-                    d /= mag(d)/pLPN[edgeI];
+                    d.removeCollinear(nP[edgeI]);
                 }
                 else
                 {
-                    d = CN[edgeI] - CP[edgeI];
-                    d -= nN[edgeI]*(nN[edgeI]&d);
-                    d /= mag(d)/pLPN[edgeI];
+                    d.removeCollinear(nN[edgeI]);
                 }
+                d.normalise();
+                d *= pLPN[edgeI];
 
                 pWeights[edgeI] =
                     this->weight
diff --git a/src/finiteArea/interpolation/edgeInterpolation/schemes/NVDscheme/faNVDscheme.H b/src/finiteArea/interpolation/edgeInterpolation/schemes/NVDscheme/faNVDscheme.H
index fad7dbe9712..67270a7f128 100644
--- a/src/finiteArea/interpolation/edgeInterpolation/schemes/NVDscheme/faNVDscheme.H
+++ b/src/finiteArea/interpolation/edgeInterpolation/schemes/NVDscheme/faNVDscheme.H
@@ -46,8 +46,8 @@ SourceFiles
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef faNVDscheme_H
-#define faNVDscheme_H
+#ifndef Foam_faNVDscheme_H
+#define Foam_faNVDscheme_H
 
 #include "edgeInterpolationScheme.H"
 
@@ -66,17 +66,13 @@ class faNVDscheme
     public edgeInterpolationScheme<Type>,
     public NVDweight
 {
-
 protected:
 
-    // Protected data
+    // Protected Data
 
         const edgeScalarField& edgeFlux_;
 
-
-private:
-
-    // Private Member Functions
+    // Protected Member Functions
 
         //- No copy construct
         faNVDscheme(const faNVDscheme&) = delete;
-- 
GitLab