From eb676f08a1b17e7ce0b2ac99814647628e21dc08 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Wed, 2 Mar 2022 14:16:19 +0100
Subject: [PATCH] BUG: access of non-const tmp value in surface writers

- was inadvertently introduced with the previous commit.
  Affected non-parallel use of the surface writers.
---
 .../writers/abaqus/abaqusSurfaceWriterImpl.C  |  4 +--
 .../boundary/boundaryDataSurfaceWriter.C      |  4 +--
 src/surfMesh/writers/common/surfaceWriter.C   | 34 +++++++++++++++----
 src/surfMesh/writers/common/surfaceWriter.H   | 11 ++++--
 .../ensight/ensightSurfaceWriterCollated.C    |  4 +--
 .../ensight/ensightSurfaceWriterUncollated.C  |  4 +--
 src/surfMesh/writers/foam/foamSurfaceWriter.C |  4 +--
 .../nastran/nastranSurfaceWriterImpl.C        |  4 +--
 .../writers/raw/rawSurfaceWriterImpl.C        |  4 +--
 .../writers/starcd/starcdSurfaceWriter.C      |  4 +--
 src/surfMesh/writers/vtk/vtkSurfaceWriter.C   |  4 +--
 src/surfMesh/writers/x3d/x3dSurfaceWriter.C   |  4 +--
 12 files changed, 45 insertions(+), 40 deletions(-)

diff --git a/src/surfMesh/writers/abaqus/abaqusSurfaceWriterImpl.C b/src/surfMesh/writers/abaqus/abaqusSurfaceWriterImpl.C
index 5de351d28ee..1ca932b147e 100644
--- a/src/surfMesh/writers/abaqus/abaqusSurfaceWriterImpl.C
+++ b/src/surfMesh/writers/abaqus/abaqusSurfaceWriterImpl.C
@@ -118,9 +118,7 @@ Foam::fileName Foam::surfaceWriters::abaqusWriter::writeTemplate
 
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/boundary/boundaryDataSurfaceWriter.C b/src/surfMesh/writers/boundary/boundaryDataSurfaceWriter.C
index 85c095f7664..fde30e2ebcc 100644
--- a/src/surfMesh/writers/boundary/boundaryDataSurfaceWriter.C
+++ b/src/surfMesh/writers/boundary/boundaryDataSurfaceWriter.C
@@ -219,9 +219,7 @@ Foam::fileName Foam::surfaceWriters::boundaryDataWriter::writeTemplate
     const fileName outputFile(surfaceDir/timeName()/fieldName);
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/common/surfaceWriter.C b/src/surfMesh/writers/common/surfaceWriter.C
index 2b73f957ef9..382e9d0fd9b 100644
--- a/src/surfMesh/writers/common/surfaceWriter.C
+++ b/src/surfMesh/writers/common/surfaceWriter.C
@@ -506,10 +506,10 @@ Foam::tmp<Foam::Field<Type>> Foam::surfaceWriter::mergeFieldTemplate
 
 
 template<class Type>
-void Foam::surfaceWriter::adjustOutputFieldTemplate
+Foam::tmp<Foam::Field<Type>> Foam::surfaceWriter::adjustFieldTemplate
 (
     const word& fieldName,
-    Field<Type>& fld
+    const tmp<Field<Type>>& tfield
 ) const
 {
     if (verbose_)
@@ -517,6 +517,8 @@ void Foam::surfaceWriter::adjustOutputFieldTemplate
         Info<< "Writing field " << fieldName;
     }
 
+    tmp<Field<Type>> tadjusted;
+
     // Output scaling for the variable, but not for integer types
     // which are typically ids etc.
     if (!std::is_integral<Type>::value)
@@ -544,7 +546,14 @@ void Foam::surfaceWriter::adjustOutputFieldTemplate
                 Info<< " [level " << refLevel << ']';
             }
 
-            fld -= refLevel;
+            if (!tadjusted)
+            {
+                // Steal or clone
+                tadjusted.reset(tfield.ptr());
+            }
+
+            // Remove offset level
+            tadjusted.ref() -= refLevel;
         }
 
         // Apply scaling
@@ -558,9 +567,19 @@ void Foam::surfaceWriter::adjustOutputFieldTemplate
             {
                 Info<< " [scaling " << value << ']';
             }
-            fld *= value;
+
+            if (!tadjusted)
+            {
+                // Steal or clone
+                tadjusted.reset(tfield.ptr());
+            }
+
+            // Apply scaling
+            tadjusted.ref() *= value;
         }
     }
+
+    return (tadjusted ? tadjusted : tfield);
 }
 
 
@@ -571,13 +590,14 @@ void Foam::surfaceWriter::adjustOutputFieldTemplate
         return mergeFieldTemplate(fld);                                        \
     }                                                                          \
                                                                                \
-    void ThisClass::adjustOutputField                                          \
+    Foam::tmp<Foam::Field<Type>>                                               \
+    ThisClass::adjustField                                                     \
     (                                                                          \
         const word& fieldName,                                                 \
-        Field<Type>& fld                                                       \
+        const tmp<Field<Type>>& tfield                                         \
     ) const                                                                    \
     {                                                                          \
-        adjustOutputFieldTemplate(fieldName, fld);                             \
+        return adjustFieldTemplate(fieldName, tfield);                         \
     }
 
 defineSurfaceFieldMethods(Foam::surfaceWriter, Foam::label);
diff --git a/src/surfMesh/writers/common/surfaceWriter.H b/src/surfMesh/writers/common/surfaceWriter.H
index 4d22644f1fc..bb9817e2d2d 100644
--- a/src/surfMesh/writers/common/surfaceWriter.H
+++ b/src/surfMesh/writers/common/surfaceWriter.H
@@ -195,17 +195,22 @@ protected:
 
         //- Apply refLevel and fieldScaling
         template<class Type>
-        void adjustOutputFieldTemplate
+        tmp<Field<Type>> adjustFieldTemplate
         (
             const word& fieldName,
-            Field<Type>& fld
+            const tmp<Field<Type>>& tfield
         ) const;
 
 #undef  declareSurfaceFieldMethod
 #define declareSurfaceFieldMethods(Type)                                      \
                                                                               \
         tmp<Field<Type>> mergeField(const Field<Type>& fld) const;            \
-        void adjustOutputField(const word& fieldName, Field<Type>& fld) const;
+                                                                              \
+        tmp<Field<Type>> adjustField                                          \
+        (                                                                     \
+            const word& fieldName,                                            \
+            const tmp<Field<Type>>& tfield                                    \
+        ) const;
 
         declareSurfaceFieldMethods(label);
         declareSurfaceFieldMethods(scalar);
diff --git a/src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C b/src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C
index 473676df975..179cfbdb8e0 100644
--- a/src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C
+++ b/src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C
@@ -87,9 +87,7 @@ Foam::fileName Foam::surfaceWriters::ensightWriter::writeCollated
     }
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C b/src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C
index 8d334dea37a..6519f49205c 100644
--- a/src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C
+++ b/src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C
@@ -152,9 +152,7 @@ Foam::fileName Foam::surfaceWriters::ensightWriter::writeUncollated
     }
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/foam/foamSurfaceWriter.C b/src/surfMesh/writers/foam/foamSurfaceWriter.C
index 693df2f839f..0006c67eb85 100644
--- a/src/surfMesh/writers/foam/foamSurfaceWriter.C
+++ b/src/surfMesh/writers/foam/foamSurfaceWriter.C
@@ -194,9 +194,7 @@ Foam::fileName Foam::surfaceWriters::foamWriter::writeTemplate
 
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
index 9dcb111d5b5..1653bdbcfd3 100644
--- a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
+++ b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C
@@ -224,9 +224,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
     outputFile.ext("bdf");
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C b/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C
index d4a089bd649..fec67c262f5 100644
--- a/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C
+++ b/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C
@@ -107,9 +107,7 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
 
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/starcd/starcdSurfaceWriter.C b/src/surfMesh/writers/starcd/starcdSurfaceWriter.C
index cc1797fc38d..4817d1f4f1d 100644
--- a/src/surfMesh/writers/starcd/starcdSurfaceWriter.C
+++ b/src/surfMesh/writers/starcd/starcdSurfaceWriter.C
@@ -207,9 +207,7 @@ Foam::fileName Foam::surfaceWriters::starcdWriter::writeTemplate
     outputFile.ext("usr");
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/vtk/vtkSurfaceWriter.C b/src/surfMesh/writers/vtk/vtkSurfaceWriter.C
index 8fc7b438651..862a616967b 100644
--- a/src/surfMesh/writers/vtk/vtkSurfaceWriter.C
+++ b/src/surfMesh/writers/vtk/vtkSurfaceWriter.C
@@ -286,9 +286,7 @@ Foam::fileName Foam::surfaceWriters::vtkWriter::writeTemplate
     fileName outputFile = this->write();
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
diff --git a/src/surfMesh/writers/x3d/x3dSurfaceWriter.C b/src/surfMesh/writers/x3d/x3dSurfaceWriter.C
index a97f94e9240..25b657f8a0e 100644
--- a/src/surfMesh/writers/x3d/x3dSurfaceWriter.C
+++ b/src/surfMesh/writers/x3d/x3dSurfaceWriter.C
@@ -270,9 +270,7 @@ Foam::fileName Foam::surfaceWriters::x3dWriter::writeTemplate
     outputFile.ext("x3d");
 
     // Implicit geometry merge()
-    tmp<Field<Type>> tfield = mergeField(localValues);
-
-    adjustOutputField(fieldName, tfield.ref());
+    tmp<Field<Type>> tfield = adjustField(fieldName, mergeField(localValues));
 
     if (verbose_)
     {
-- 
GitLab