diff --git a/applications/test/dimensionSet/Test-dimensionSet.C b/applications/test/dimensionSet/Test-dimensionSet.C
index 1c48defacce57d90eb1b629446c355799c6d59f7..61735fac16451d36ec3a63380377b9c352ddc323 100644
--- a/applications/test/dimensionSet/Test-dimensionSet.C
+++ b/applications/test/dimensionSet/Test-dimensionSet.C
@@ -27,7 +27,9 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "dimensionSet.H"
+#include "dimensionedScalar.H"
 #include "IOmanip.H"
+#include <tuple>
 
 using namespace Foam;
 
@@ -39,6 +41,96 @@ using namespace Foam;
     Info<< STRING_QUOTE(arg) << "  " << arg << nl
 
 
+bool hadDimensionError
+(
+    const std::tuple<bool, dimensionSet, dimensionSet>& input,
+    bool dimsOk,
+    std::string errMsg
+)
+{
+    if (dimsOk)
+    {
+        if (std::get<0>(input))
+        {
+            Info<< "(pass) dimension check ok ";
+        }
+        else
+        {
+            Info<< "(fail) unexpected success for dimension check ";
+        }
+        Info<< std::get<1>(input) << " == " << std::get<2>(input) << nl;
+    }
+    else
+    {
+        if (std::get<0>(input))
+        {
+            Info<< "(fail) unexpected";
+        }
+        else
+        {
+            Info<< "(pass) expected";
+        }
+
+        Info<< " failure" << nl << errMsg.c_str() << nl;
+    }
+
+    return (std::get<0>(input) != dimsOk);
+}
+
+
+unsigned checkDimensions
+(
+    std::initializer_list
+    <
+        std::tuple<bool, dimensionSet, dimensionSet>
+    > tests
+)
+{
+    Info<< nl << "Verify dimension checks" << nl << nl;
+
+    unsigned nFail = 0;
+    std::string errMsg;
+
+    // Expect some failures
+    const bool prev = FatalError.throwExceptions();
+
+    for
+    (
+        const std::tuple<bool, dimensionSet, dimensionSet>& test
+      : tests
+    )
+    {
+        const bool expected = std::get<0>(test);
+        const dimensionSet& a = std::get<1>(test);
+        const dimensionSet& b = std::get<2>(test);
+
+        bool dimsOk = false;
+
+        try
+        {
+            // min(a, b);
+            clip(a, b);
+            dimsOk = true;
+        }
+        catch (Foam::error& err)
+        {
+            errMsg = err.message();
+        }
+
+        if (expected != dimsOk)
+        {
+            ++nFail;
+        }
+
+        hadDimensionError(test, dimsOk, errMsg);
+    }
+
+    FatalError.throwExceptions(prev);
+
+    return nFail;
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 // Main program:
 
@@ -92,6 +184,21 @@ int main(int argc, char *argv[])
     }
 
 
+    unsigned nFail = 0;
+
+    nFail += checkDimensions
+    ({
+        { true, dimless, dimless },
+        { false, dimless, dimPressure }
+    });
+
+
+    if (nFail)
+    {
+        Info<< nl << "failed " << nFail << " tests" << nl;
+        return 1;
+    }
+
     Info<< nl << "End\n" << endl;
 
     return 0;
diff --git a/applications/test/primitives/Test-primitives.C b/applications/test/primitives/Test-primitives.C
index d45a9feb73676b2c9a67ea7c0bfb404f465f9b83..b8ce8f922cd9c5b15822328a376d1579bc127a8c 100644
--- a/applications/test/primitives/Test-primitives.C
+++ b/applications/test/primitives/Test-primitives.C
@@ -47,14 +47,49 @@ inline scalar readNasScalar(const std::string& str)
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-template<class TYPE>
+template<class T>
+bool hadParsingError
+(
+    const std::pair<bool, std::string>& input,
+    const std::pair<bool, T>& result,
+    std::string errMsg
+)
+{
+    if (result.first)
+    {
+        if (input.first)
+        {
+            Info<< "(pass) parsed "
+                << input.second << " = " << result.second << nl;
+        }
+        else
+        {
+            Info<< "(fail) unexpected success for " << input.second << nl;
+        }
+    }
+    else
+    {
+        if (input.first)
+        {
+            Info<< "(fail) unexpected";
+        }
+        else
+        {
+            Info<< "(pass) expected";
+        }
+
+        Info<< " failure " << input.second << "  >> " << errMsg.c_str() << nl;
+    }
+
+    return (input.first != result.first);
+}
+
+
+template<class T>
 unsigned testParsing
 (
-    TYPE (*function)(const std::string&),
-    std::initializer_list
-    <
-        Tuple2<bool, std::string>
-    > tests
+    T (*function)(const std::string&),
+    std::initializer_list<std::pair<bool, std::string>> tests
 )
 {
     unsigned nFail = 0;
@@ -63,51 +98,26 @@ unsigned testParsing
     // Expect some failures
     const bool prev = FatalIOError.throwExceptions();
 
-    for (const Tuple2<bool, std::string>& test : tests)
+    for (const std::pair<bool, std::string>& test : tests)
     {
-        const bool expected = test.first();
-        const std::string& str = test.second();
+        std::pair<bool, T> result(false, T());
 
-        bool parsed = true;
-
-        TYPE val;
         try
         {
-            val = function (str);
+            result.second = function (test.second);
+            result.first = true;
         }
         catch (Foam::error& err)
         {
-            parsed = false;
             errMsg = err.message();
         }
 
-        if (parsed)
+        if (test.first != result.first)
         {
-            if (expected)
-            {
-                Info<< "(pass) parsed " << str << " = " << val << nl;
-            }
-            else
-            {
-                ++nFail;
-                Info<< "(fail) unexpected success for " << str << nl;
-            }
+            ++nFail;
         }
-        else
-        {
-            if (expected)
-            {
-                ++nFail;
-                Info<< "(fail) unexpected";
-            }
-            else
-            {
-                Info<< "(pass) expected";
-            }
 
-            Info<< " failure " << str
-                << "  >> " << errMsg.c_str() << nl;
-        }
+        hadParsingError(test, result, errMsg);
     }
 
     FatalIOError.throwExceptions(prev);
diff --git a/src/OpenFOAM/dimensionSet/dimensionSet.C b/src/OpenFOAM/dimensionSet/dimensionSet.C
index 3386fd370bcb730511e532afda75f6513cd5d65f..6c202d5041f6dbfd18a3470e013c5a1b8c0b406a 100644
--- a/src/OpenFOAM/dimensionSet/dimensionSet.C
+++ b/src/OpenFOAM/dimensionSet/dimensionSet.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2017-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -36,6 +36,33 @@ namespace Foam
 const Foam::scalar Foam::dimensionSet::smallExponent = SMALL;
 
 
+// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+static inline bool checkDims
+(
+    const char* what,
+    const dimensionSet& a,
+    const dimensionSet& b
+)
+{
+    if (a != b)
+    {
+        FatalErrorInFunction
+            << "Different dimensions for '" << what
+            << "'\n     dimensions : " << a << " != " << b << nl
+            << abort(FatalError);
+        return false;
+    }
+
+    return true;
+}
+
+} // End namespace Foam
+
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 Foam::dimensionSet::dimensionSet()
@@ -166,12 +193,9 @@ bool Foam::dimensionSet::operator!=(const dimensionSet& ds) const
 
 bool Foam::dimensionSet::operator=(const dimensionSet& ds) const
 {
-    if (dimensionSet::debug && *this != ds)
+    if (dimensionSet::debug)
     {
-        FatalErrorInFunction
-            << "Different dimensions for =" << nl
-            << "     dimensions : " << *this << " = " << ds << endl
-            << abort(FatalError);
+        checkDims("(a = b)", *this, ds);
     }
 
     return true;
@@ -180,12 +204,9 @@ bool Foam::dimensionSet::operator=(const dimensionSet& ds) const
 
 bool Foam::dimensionSet::operator+=(const dimensionSet& ds) const
 {
-    if (dimensionSet::debug && *this != ds)
+    if (dimensionSet::debug)
     {
-        FatalErrorInFunction
-            << "Different dimensions for +=" << nl
-            << "     dimensions : " << *this << " = " << ds << endl
-            << abort(FatalError);
+        checkDims("(a += b)", *this, ds);
     }
 
     return true;
@@ -194,12 +215,9 @@ bool Foam::dimensionSet::operator+=(const dimensionSet& ds) const
 
 bool Foam::dimensionSet::operator-=(const dimensionSet& ds) const
 {
-    if (dimensionSet::debug && *this != ds)
+    if (dimensionSet::debug)
     {
-        FatalErrorInFunction
-            << "Different dimensions for -=" << nl
-            << "     dimensions : " << *this << " = " << ds << endl
-            << abort(FatalError);
+        checkDims("(a -= b)", *this, ds);
     }
 
     return true;
@@ -226,12 +244,9 @@ bool Foam::dimensionSet::operator/=(const dimensionSet& ds)
 
 Foam::dimensionSet Foam::min(const dimensionSet& ds1, const dimensionSet& ds2)
 {
-    if (dimensionSet::debug && ds1 != ds2)
+    if (dimensionSet::debug)
     {
-        FatalErrorInFunction
-            << "Arguments of min have different dimensions" << nl
-            << "     dimensions : " << ds1 << " and " << ds2 << endl
-            << abort(FatalError);
+        checkDims("min(a, b)", ds1, ds2);
     }
 
     return ds1;
@@ -240,12 +255,20 @@ Foam::dimensionSet Foam::min(const dimensionSet& ds1, const dimensionSet& ds2)
 
 Foam::dimensionSet Foam::max(const dimensionSet& ds1, const dimensionSet& ds2)
 {
-    if (dimensionSet::debug && ds1 != ds2)
+    if (dimensionSet::debug)
     {
-        FatalErrorInFunction
-            << "Arguments of max have different dimensions" << nl
-            << "     dimensions : " << ds1 << " and " << ds2 << endl
-            << abort(FatalError);
+        checkDims("max(a, b)", ds1, ds2);
+    }
+
+    return ds1;
+}
+
+
+Foam::dimensionSet Foam::clip(const dimensionSet& ds1, const dimensionSet& ds2)
+{
+    if (dimensionSet::debug)
+    {
+        checkDims("clip(a, b)", ds1, ds2);
     }
 
     return ds1;
@@ -464,12 +487,9 @@ Foam::dimensionSet Foam::trans(const dimensionSet& ds)
 
 Foam::dimensionSet Foam::atan2(const dimensionSet& ds1, const dimensionSet& ds2)
 {
-    if (dimensionSet::debug && ds1 != ds2)
+    if (dimensionSet::debug)
     {
-        FatalErrorInFunction
-            << "Arguments of atan2 have different dimensions" << nl
-            << "     dimensions : " << ds1 << " and " << ds2 << endl
-            << abort(FatalError);
+        checkDims("atan2(a, b)", ds1, ds2);
     }
 
     return dimless;
@@ -508,12 +528,9 @@ Foam::dimensionSet Foam::operator+
     const dimensionSet& ds2
 )
 {
-    if (dimensionSet::debug && ds1 != ds2)
+    if (dimensionSet::debug)
     {
-        FatalErrorInFunction
-            << "LHS and RHS of '+' have different dimensions" << nl
-            << "     dimensions : " << ds1 << " + " << ds2 << endl
-            << abort(FatalError);
+        checkDims("(a + b)", ds1, ds2);
     }
 
     return ds1;
@@ -526,12 +543,9 @@ Foam::dimensionSet Foam::operator-
     const dimensionSet& ds2
 )
 {
-    if (dimensionSet::debug && ds1 != ds2)
+    if (dimensionSet::debug)
     {
-        FatalErrorInFunction
-            << "LHS and RHS of '-' have different dimensions" << nl
-            << "     dimensions : " << ds1 << " - " << ds2 << endl
-            << abort(FatalError);
+        checkDims("(a - b)", ds1, ds2);
     }
 
     return ds1;
diff --git a/src/OpenFOAM/dimensionSet/dimensionSet.H b/src/OpenFOAM/dimensionSet/dimensionSet.H
index 6218815af5b8bf75f406181aec107a526152a01c..f58b6f5cd25b1fce12d0f01faf9bfca67e66cbb5 100644
--- a/src/OpenFOAM/dimensionSet/dimensionSet.H
+++ b/src/OpenFOAM/dimensionSet/dimensionSet.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2017-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -70,10 +70,8 @@ public:
 
     // Member Constants
 
-        enum
-        {
-            nDimensions = 7     //!< 7 base dimensions
-        };
+        //- There are 7 base dimensions
+        static constexpr int nDimensions = 7;
 
         //- Enumeration for the dimension exponents
         enum dimensionType
@@ -88,8 +86,9 @@ public:
         };
 
 
-    // Static data members
+    // Static Data Members
 
+        //- Tolerance for 'small' exponents, for near-zero rounding
         static const scalar smallExponent;
 
 
@@ -216,6 +215,7 @@ public:
         //- Return non-const access to the exponents as a list
         FixedList<scalar,7>& values();
 
+        //- Copy assign the exponents from the dimensionSet
         void reset(const dimensionSet& ds);
 
 
@@ -291,6 +291,7 @@ Ostream& operator<<(Ostream& os, const dimensionSet& ds);
 
 dimensionSet min(const dimensionSet& ds1, const dimensionSet& ds2);
 dimensionSet max(const dimensionSet& ds1, const dimensionSet& ds2);
+dimensionSet clip(const dimensionSet& ds1, const dimensionSet& ds2);
 
 dimensionSet cmptMultiply(const dimensionSet& ds1, const dimensionSet& ds2);
 dimensionSet cmptDivide(const dimensionSet& ds1, const dimensionSet& ds2);
diff --git a/src/OpenFOAM/dimensionSet/dimensionSetIO.C b/src/OpenFOAM/dimensionSet/dimensionSetIO.C
index 4b1f1f7bc3415926d2396b62b7e860af0270454d..cb74d1ee61002373f74b54c0826afb3e44cd42b9 100644
--- a/src/OpenFOAM/dimensionSet/dimensionSetIO.C
+++ b/src/OpenFOAM/dimensionSet/dimensionSetIO.C
@@ -421,8 +421,8 @@ Foam::Istream& Foam::dimensionSet::read
     if (startToken != token::BEGIN_SQR)
     {
         FatalIOErrorInFunction(is)
-            << "Expected a " << token::BEGIN_SQR << " in dimensionSet"
-            << endl << "in stream " << is.info()
+            << "Expected a '" << token::BEGIN_SQR << "' in dimensionSet\n"
+            << "in stream " << is.info() << nl
             << exit(FatalIOError);
     }
 
@@ -444,7 +444,7 @@ Foam::Istream& Foam::dimensionSet::read
     {
         // Read first five dimensions
         exponents_[dimensionSet::MASS] = nextToken.number();
-        for (int d=1; d<dimensionSet::CURRENT; ++d)
+        for (int d=1; d < dimensionSet::CURRENT; ++d)
         {
             is >> exponents_[d];
         }
@@ -472,8 +472,8 @@ Foam::Istream& Foam::dimensionSet::read
         if (nextToken != token::END_SQR)
         {
             FatalIOErrorInFunction(is)
-                << "Expected a " << token::END_SQR << " in dimensionSet "
-                << endl << "in stream " << is.info()
+                << "Expected a '" << token::END_SQR << "' in dimensionSet\n"
+                << "in stream " << is.info() << nl
                 << exit(FatalIOError);
         }
     }
@@ -508,8 +508,8 @@ Foam::Istream& Foam::dimensionSet::read
     if (startToken != token::BEGIN_SQR)
     {
         FatalIOErrorInFunction(is)
-            << "Expected a " << token::BEGIN_SQR << " in dimensionSet"
-            << endl << "in stream " << is.info()
+            << "Expected a '" << token::BEGIN_SQR << "' in dimensionSet\n"
+            << "in stream " << is.info() << nl
             << exit(FatalIOError);
     }
 
@@ -606,8 +606,8 @@ Foam::Istream& Foam::dimensionSet::read
         if (nextToken != token::END_SQR)
         {
             FatalIOErrorInFunction(is)
-                << "Expected a " << token::END_SQR << " in dimensionSet " << nl
-                << "in stream " << is.info() << endl
+                << "Expected a '" << token::END_SQR << "' in dimensionSet\n"
+                << "in stream " << is.info() << nl
                 << exit(FatalIOError);
         }
     }
@@ -631,7 +631,7 @@ Foam::Ostream& Foam::dimensionSet::write
     if (writeUnits.valid() && os.format() == IOstream::ASCII)
     {
         scalarField exponents(dimensionSet::nDimensions);
-        for (int d=0; d<dimensionSet::nDimensions; ++d)
+        for (int d=0; d < dimensionSet::nDimensions; ++d)
         {
             exponents[d] = exponents_[d];
         }
@@ -675,7 +675,7 @@ Foam::Ostream& Foam::dimensionSet::write
     }
     else
     {
-        for (int d=0; d<dimensionSet::nDimensions; ++d)
+        for (int d=0; d < dimensionSet::nDimensions; ++d)
         {
             if (d) os << token::SPACE;
             os << exponents_[d];