diff --git a/src/OpenFOAM/primitives/SphericalTensor/SphericalTensorI.H b/src/OpenFOAM/primitives/SphericalTensor/SphericalTensorI.H
index 7d0ed79041c0974d2faeb1c280b6b4e405e2ae72..d56e366f5b1b7a032cabbbdde4cc609a87f2375b 100644
--- a/src/OpenFOAM/primitives/SphericalTensor/SphericalTensorI.H
+++ b/src/OpenFOAM/primitives/SphericalTensor/SphericalTensorI.H
@@ -157,6 +157,34 @@ inline Cmpt magSqr(const SphericalTensor<Cmpt>& st)
 }
 
 
+template<class Cmpt>
+inline Cmpt cmptMax(const SphericalTensor<Cmpt>& st)
+{
+    return st.ii();
+}
+
+
+template<class Cmpt>
+inline Cmpt cmptMin(const SphericalTensor<Cmpt>& st)
+{
+    return st.ii();
+}
+
+
+template<class Cmpt>
+inline Cmpt cmptSum(const SphericalTensor<Cmpt>& st)
+{
+    return 3*st.ii();
+}
+
+
+template<class Cmpt>
+inline Cmpt cmptAv(const SphericalTensor<Cmpt>& st)
+{
+    return st.ii();
+}
+
+
 //- Return the trace of a spherical tensor
 template<class Cmpt>
 inline Cmpt tr(const SphericalTensor<Cmpt>& st)
diff --git a/src/OpenFOAM/primitives/VectorSpace/VectorSpaceOps.H b/src/OpenFOAM/primitives/VectorSpace/VectorSpaceOps.H
index 5df70b1e5bf3ab8398c9cb789e49788b6b4c3af4..6af5c9f028934053e09b163eed3227c74b08e907 100644
--- a/src/OpenFOAM/primitives/VectorSpace/VectorSpaceOps.H
+++ b/src/OpenFOAM/primitives/VectorSpace/VectorSpaceOps.H
@@ -44,27 +44,37 @@ class VectorSpaceOps
 {
 public:
 
-    static const int endLoop = (I < N-1) ? 1 : 0;
+    //- End for next loop. Is 0 for loop termination.
+    static constexpr direction loopN() noexcept
+    {
+        return (I+1 < N) ? N : 0;
+    }
+
+    //- Index for next loop. Is 0 for loop termination.
+    static constexpr direction loopI1() noexcept
+    {
+        return (I+1 < N) ? I+1 : 0;
+    }
 
     template<class V, class S, class EqOp>
     static inline void eqOpS(V& vs, const S& s, EqOp eo)
     {
         eo(vs.v_[I], s);
-        VectorSpaceOps<endLoop*N, endLoop*(I+1)>::eqOpS(vs, s, eo);
+        VectorSpaceOps<loopN(), loopI1()>::eqOpS(vs, s, eo);
     }
 
     template<class S, class V, class EqOp>
     static inline void SeqOp(S& s, const V& vs, EqOp eo)
     {
         eo(s, vs.v_[I]);
-        VectorSpaceOps<endLoop*N, endLoop*(I+1)>::SeqOp(s, vs, eo);
+        VectorSpaceOps<loopN(), loopI1()>::SeqOp(s, vs, eo);
     }
 
     template<class V1, class V2, class EqOp>
     static inline void eqOp(V1& vs1, const V2& vs2, EqOp eo)
     {
         eo(vs1.v_[I], vs2.v_[I]);
-        VectorSpaceOps<endLoop*N, endLoop*(I+1)>::eqOp(vs1, vs2, eo);
+        VectorSpaceOps<loopN(), loopI1()>::eqOp(vs1, vs2, eo);
     }
 
 
@@ -72,25 +82,26 @@ public:
     static inline void opVS(V& vs, const V1& vs1, const S& s, Op o)
     {
         vs.v_[I] = o(vs1.v_[I], s);
-        VectorSpaceOps<endLoop*N, endLoop*(I+1)>::opVS(vs, vs1, s, o);
+        VectorSpaceOps<loopN(), loopI1()>::opVS(vs, vs1, s, o);
     }
 
     template<class V, class S, class V1, class Op>
     static inline void opSV(V& vs, const S& s,  const V1& vs1, Op o)
     {
         vs.v_[I] = o(s, vs1.v_[I]);
-        VectorSpaceOps<endLoop*N, endLoop*(I+1)>::opSV(vs, s, vs1, o);
+        VectorSpaceOps<loopN(), loopI1()>::opSV(vs, s, vs1, o);
     }
 
     template<class V, class V1, class Op>
     static inline void op(V& vs, const V1& vs1, const V1& vs2, Op o)
     {
         vs.v_[I] = o(vs1.v_[I], vs2.v_[I]);
-        VectorSpaceOps<endLoop*N, endLoop*(I+1)>::op(vs, vs1, vs2, o);
+        VectorSpaceOps<loopN(), loopI1()>::op(vs, vs1, vs2, o);
     }
 };
 
 
+//- Specialization for loop termination of vector space ops
 template<>
 class VectorSpaceOps<0, 0>
 {