diff --git a/src/fileFormats/ensight/type/ensightPTraits.C b/src/fileFormats/ensight/type/ensightPTraits.C
index f1a8894077acf73b1560ae11814f0158f5e8d659..9eaf9d30f6452fad75bc03945ae282800e7294ec 100644
--- a/src/fileFormats/ensight/type/ensightPTraits.C
+++ b/src/fileFormats/ensight/type/ensightPTraits.C
@@ -62,16 +62,15 @@ template<>
 const char* const
 Foam::ensightPTraits<Foam::sphericalTensor>::typeName = "scalar";
 
-
 template<>
 const Foam::direction
 Foam::ensightPTraits<Foam::sphericalTensor>::componentOrder[] = {0};
 
+
 template<>
 const char* const
 Foam::ensightPTraits<Foam::symmTensor>::typeName = "tensor symm";
 
-
 template<>
 const Foam::direction
 Foam::ensightPTraits<Foam::symmTensor>::componentOrder[] = {0, 3, 5, 1, 2, 4};
diff --git a/src/fileFormats/ensight/type/ensightPTraits.H b/src/fileFormats/ensight/type/ensightPTraits.H
index 2aed592598d64ad029eb283528b92fee751effb5..63a86e0ee01a2150691410f97f138be07daa3ec6 100644
--- a/src/fileFormats/ensight/type/ensightPTraits.H
+++ b/src/fileFormats/ensight/type/ensightPTraits.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2013-2015 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -28,7 +28,7 @@ Class
     Foam::ensightPTraits
 
 Description
-    Conversion of OpenFOAM pTraits into the Ensight equivalent
+    Ensight names and component order for base types.
 
     For the purpose of traits, integers (label) are treated like
     floating point (scalar). Spherical tensors are mapped as a scalar.
@@ -38,7 +38,6 @@ Description
 #ifndef ensightPTraits_H
 #define ensightPTraits_H
 
-#include "pTraits.H"
 #include "fieldTypes.H"
 #include "direction.H"
 
@@ -51,20 +50,20 @@ namespace Foam
                          Class ensightPTraits Declaration
 \*---------------------------------------------------------------------------*/
 
-template<class PrimitiveType>
-class ensightPTraits
+template<class Type>
+struct ensightPTraits
 {
-public:
+    //- The type name used in ensight case files
+    static const char* const typeName;
 
-    // Static data members
+    //- Ordering table: return OpenFOAM component given Ensight component
+    //  This is used for the symmTensor ordering: Ensight requires
+    //  xx yy zz xy xz yz
+    static const direction componentOrder[];
+};
 
-        static const char* const typeName;
 
-        //- Ordering table: return OpenFOAM component given Ensight component
-        //  This is used for the symmTensor ordering: Ensight requires
-        //  xx yy zz xy xz yz
-        static const direction componentOrder[];
-};
+// Specializations
 
 template<>
 const char* const ensightPTraits<label>::typeName;
diff --git a/src/fileFormats/sampledSetWriters/ensight/ensightSetWriter.C b/src/fileFormats/sampledSetWriters/ensight/ensightSetWriter.C
index 3e7fa87bfe093834dc9d8f5a58f578d4727a2dc4..46880d0bd92353c907414af5af9fa92f12bfe535 100644
--- a/src/fileFormats/sampledSetWriters/ensight/ensightSetWriter.C
+++ b/src/fileFormats/sampledSetWriters/ensight/ensightSetWriter.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
+    Copyright (C) 2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -27,10 +28,10 @@ License
 
 #include "ensightSetWriter.H"
 #include "coordSet.H"
-#include "OFstream.H"
-#include "addToRunTimeSelectionTable.H"
 #include "IOmanip.H"
+#include "ensightGeoFile.H"
 #include "ensightPTraits.H"
+#include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
@@ -85,14 +86,15 @@ void Foam::ensightSetWriter<Type>::write
         << nl
         << "VARIABLE"
         << nl;
-    forAll(valueSetNames, setI)
+
+    for (const word& valueName : valueSetNames)
     {
-        fileName dataFile(base + ".***." + valueSetNames[setI]);
+        fileName dataFile(base + ".***." + valueName);
 
         os.setf(ios_base::left);
         os  << ensightPTraits<Type>::typeName
             << " per node:            1       "
-            << setw(15) << valueSetNames[setI]
+            << setw(15) << valueName
             << " " << dataFile.name().c_str()
             << nl;
     }
@@ -122,19 +124,12 @@ void Foam::ensightSetWriter<Type>::write
             << "coordinates" << nl
             << setw(10) << points.size() << nl;
 
-        for (direction cmpt = 0; cmpt < vector::nComponents; cmpt++)
+        for (direction cmpt = 0; cmpt < vector::nComponents; ++cmpt)
         {
-            forAll(points, pointi)
+            for (const point& p : points)
             {
-                const scalar comp = points[pointi][cmpt];
-                if (mag(comp) >= scalar(floatScalarVSMALL))
-                {
-                    os  << setw(12) << comp << nl;
-                }
-                else
-                {
-                    os  << setw(12) << scalar(0) << nl;
-                }
+                const float comp = narrowFloat(p[cmpt]);
+                os  << setw(12) << comp << nl;
             }
         }
         os  << "point" << nl
@@ -146,34 +141,29 @@ void Foam::ensightSetWriter<Type>::write
     }
 
     // Write data files
-    forAll(valueSetNames, setI)
+    forAll(valueSetNames, seti)
     {
-        fileName dataFile(base + ".000." + valueSetNames[setI]);
+        const word& valueName = valueSetNames[seti];
+        const Field<Type>& fld = *(valueSets[seti]);
+
+        fileName dataFile(base + ".000." + valueName);
         OFstream os(dataFile);
         os.setf(ios_base::scientific, ios_base::floatfield);
         os.precision(5);
+
+        os  << ensightPTraits<Type>::typeName << nl
+            << "part" << nl
+            << setw(10) << 1 << nl
+            << "coordinates" << nl;
+
+        for (direction d=0; d < pTraits<Type>::nComponents; ++d)
         {
-            os  << ensightPTraits<Type>::typeName << nl
-                << "part" << nl
-                << setw(10) << 1 << nl
-                << "coordinates" << nl;
+            const direction cmpt = ensightPTraits<Type>::componentOrder[d];
 
-            for (direction i=0; i < pTraits<Type>::nComponents; ++i)
+            for (const Type& val : fld)
             {
-                label cmpt = ensightPTraits<Type>::componentOrder[i];
-
-                const scalarField fld(valueSets[setI]->component(cmpt));
-                forAll(fld, i)
-                {
-                    if (mag(fld[i]) >= scalar(floatScalarVSMALL))
-                    {
-                        os  << setw(12) << fld[i] << nl;
-                    }
-                    else
-                    {
-                        os  << setw(12) << scalar(0) << nl;
-                    }
-                }
+                const float comp = narrowFloat(component(val, cmpt));
+                os  << setw(12) << comp << nl;
             }
         }
     }
@@ -202,14 +192,15 @@ void Foam::ensightSetWriter<Type>::write
         << nl
         << "VARIABLE"
         << nl;
-    forAll(valueSetNames, setI)
+
+    for (const word& valueName : valueSetNames)
     {
-        fileName dataFile(base + ".***." + valueSetNames[setI]);
+        fileName dataFile(base + ".***." + valueName);
 
         os.setf(ios_base::left);
         os  << ensightPTraits<Type>::typeName
             << " per node:            1       "
-            << setw(15) << valueSetNames[setI]
+            << setw(15) << valueName
             << " " << dataFile.name().c_str()
             << nl;
     }
@@ -233,29 +224,22 @@ void Foam::ensightSetWriter<Type>::write
             << "node id assign" << nl
             << "element id assign" << nl;
 
-        forAll(tracks, trackI)
+        forAll(tracks, tracki)
         {
-            const coordSet& points = tracks[trackI];
+            const coordSet& points = tracks[tracki];
 
             os  << "part" << nl
-                << setw(10) << trackI+1 << nl
+                << setw(10) << tracki+1 << nl
                 << "internalMesh" << nl
                 << "coordinates" << nl
                 << setw(10) << points.size() << nl;
 
-            for (direction cmpt = 0; cmpt < vector::nComponents; cmpt++)
+            for (direction cmpt = 0; cmpt < vector::nComponents; ++cmpt)
             {
-                forAll(points, pointi)
+                for (const point& p : points)
                 {
-                    const scalar comp = points[pointi][cmpt];
-                    if (mag(comp) >= scalar(floatScalarVSMALL))
-                    {
-                        os  << setw(12) << comp << nl;
-                    }
-                    else
-                    {
-                        os  << setw(12) << scalar(0) << nl;
-                    }
+                    const float comp = narrowFloat(p[cmpt]);
+                    os  << setw(12) << comp << nl;
                 }
             }
 
@@ -275,37 +259,35 @@ void Foam::ensightSetWriter<Type>::write
 
 
     // Write data files
-    forAll(valueSetNames, setI)
+    forAll(valueSetNames, seti)
     {
-        fileName dataFile(base + ".000." + valueSetNames[setI]);
+        const word& valueName = valueSetNames[seti];
+        const List<Field<Type>>& fieldVals = valueSets[seti];
+
+        fileName dataFile(base + ".000." + valueName);
         OFstream os(dataFile);
         os.setf(ios_base::scientific, ios_base::floatfield);
         os.precision(5);
         {
             os  << ensightPTraits<Type>::typeName << nl;
 
-            const List<Field<Type>>& fieldVals = valueSets[setI];
-            forAll(fieldVals, trackI)
+            forAll(fieldVals, tracki)
             {
+                const Field<Type>& fld = fieldVals[tracki];
+
                 os  << "part" << nl
-                    << setw(10) << trackI+1 << nl
+                    << setw(10) << tracki+1 << nl
                     << "coordinates" << nl;
 
-                for (direction i=0; i < pTraits<Type>::nComponents; ++i)
+                for (direction d=0; d < pTraits<Type>::nComponents; ++d)
                 {
-                    label cmpt = ensightPTraits<Type>::componentOrder[i];
+                    const direction cmpt =
+                        ensightPTraits<Type>::componentOrder[d];
 
-                    const scalarField fld(fieldVals[trackI].component(cmpt));
-                    forAll(fld, i)
+                    for (const Type& val : fld)
                     {
-                        if (mag(fld[i]) >= scalar(floatScalarVSMALL))
-                        {
-                            os  << setw(12) << fld[i] << nl;
-                        }
-                        else
-                        {
-                            os  << setw(12) << scalar(0) << nl;
-                        }
+                        const float comp = narrowFloat(component(val, cmpt));
+                        os  << setw(12) << comp << nl;
                     }
                 }
             }