diff --git a/src/functionObjects/field/fieldMinMax/fieldMinMax.C b/src/functionObjects/field/fieldMinMax/fieldMinMax.C
index 59b9f814db373a5585f2f26e8a382f39e28df53f..ff81147a1d6ebb44d7482b5ad10b9c4bdc31d444 100644
--- a/src/functionObjects/field/fieldMinMax/fieldMinMax.C
+++ b/src/functionObjects/field/fieldMinMax/fieldMinMax.C
@@ -123,12 +123,6 @@ Foam::functionObjects::fieldMinMax::fieldMinMax
 }
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-Foam::functionObjects::fieldMinMax::~fieldMinMax()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 bool Foam::functionObjects::fieldMinMax::read(const dictionary& dict)
diff --git a/src/functionObjects/field/fieldMinMax/fieldMinMax.H b/src/functionObjects/field/fieldMinMax/fieldMinMax.H
index 40e392f7ed1f0db3b312104720366e4d235f790f..a18e63a687ab1f6792ada52fafde54a9eb73f5e0 100644
--- a/src/functionObjects/field/fieldMinMax/fieldMinMax.H
+++ b/src/functionObjects/field/fieldMinMax/fieldMinMax.H
@@ -156,6 +156,14 @@ protected:
         //- No copy assignment
         void operator=(const fieldMinMax&) = delete;
 
+        //- Calculate the field min/max for a given field type
+        template<class Type>
+        void calcMinMaxFieldType
+        (
+            const GeometricField<Type, fvPatchField, volMesh>& field,
+            const word& outputFieldName
+        );
+
         //- Calculate the field min/max
         template<class Type>
         void calcMinMaxFields
@@ -183,7 +191,7 @@ public:
 
 
     //- Destructor
-    virtual ~fieldMinMax();
+    virtual ~fieldMinMax() = default;
 
 
     // Member Functions
diff --git a/src/functionObjects/field/fieldMinMax/fieldMinMaxTemplates.C b/src/functionObjects/field/fieldMinMax/fieldMinMaxTemplates.C
index 8d8397210146624aa3ac0ff8cdbb627baacaa1bb..11d9c65d5cd122dcbaef73a1196f1c45dcfb0123 100644
--- a/src/functionObjects/field/fieldMinMax/fieldMinMaxTemplates.C
+++ b/src/functionObjects/field/fieldMinMax/fieldMinMaxTemplates.C
@@ -110,6 +110,126 @@ void Foam::functionObjects::fieldMinMax::output
 }
 
 
+template<class Type>
+void Foam::functionObjects::fieldMinMax::calcMinMaxFieldType
+(
+    const GeometricField<Type, fvPatchField, volMesh>& field,
+    const word& outputFieldName
+)
+{
+    const label proci = Pstream::myProcNo();
+
+    // Find min internal field value info
+    List<Type> minVs(Pstream::nProcs());
+    labelList minCells(Pstream::nProcs());
+    List<vector> minCs(Pstream::nProcs());
+
+    label minProci = findMin(field);
+    if (minProci != -1)
+    {
+        minVs[proci] = field[minProci];
+        minCells[proci] = minProci;
+        minCs[proci] = mesh_.C()[minProci];
+    }
+    else
+    {
+        minVs[proci] = pTraits<Type>::max;
+        minCells[proci] = -1;
+        minCs[proci] = vector::max;
+    }
+
+    // Find max internal field value info
+    List<Type> maxVs(Pstream::nProcs());
+    labelList maxCells(Pstream::nProcs());
+    List<vector> maxCs(Pstream::nProcs());
+
+    label maxProci = findMax(field);
+    if (maxProci != -1)
+    {
+        maxVs[proci] = field[maxProci];
+        maxCells[proci] = maxProci;
+        maxCs[proci] = mesh_.C()[maxProci];
+    }
+    else
+    {
+        maxVs[proci] = pTraits<Type>::min;
+        maxCells[proci] = -1;
+        maxCs[proci] = vector::max;
+    }
+
+    // Find min and max boundary field info
+    const auto& fieldBoundary = field.boundaryField();
+    const auto& CfBoundary = mesh_.C().boundaryField();
+
+    forAll(fieldBoundary, patchi)
+    {
+        const Field<Type>& fp = fieldBoundary[patchi];
+        if (fp.size())
+        {
+            const vectorField& Cfp = CfBoundary[patchi];
+
+            const labelList& faceCells =
+                fieldBoundary[patchi].patch().faceCells();
+
+            label minPi = findMin(fp);
+            if (fp[minPi] < minVs[proci])
+            {
+                minVs[proci] = fp[minPi];
+                minCells[proci] = faceCells[minPi];
+                minCs[proci] = Cfp[minPi];
+            }
+
+            label maxPi = findMax(fp);
+            if (fp[maxPi] > maxVs[proci])
+            {
+                maxVs[proci] = fp[maxPi];
+                maxCells[proci] = faceCells[maxPi];
+                maxCs[proci] = Cfp[maxPi];
+            }
+        }
+    }
+
+    // Collect info from all processors and output
+    Pstream::gatherList(minVs);
+    Pstream::scatterList(minVs);
+    Pstream::gatherList(minCells);
+    Pstream::scatterList(minCells);
+    Pstream::gatherList(minCs);
+    Pstream::scatterList(minCs);
+
+    Pstream::gatherList(maxVs);
+    Pstream::scatterList(maxVs);
+    Pstream::gatherList(maxCells);
+    Pstream::scatterList(maxCells);
+    Pstream::gatherList(maxCs);
+    Pstream::scatterList(maxCs);
+
+    label mini = findMin(minVs);
+    const Type& minValue = minVs[mini];
+    const label minCell = minCells[mini];
+    const vector& minC = minCs[mini];
+
+    label maxi = findMax(maxVs);
+    const Type& maxValue = maxVs[maxi];
+    const label maxCell = maxCells[maxi];
+    const vector& maxC = maxCs[maxi];
+
+    output
+    (
+        field.name(),
+        outputFieldName,
+        minCell,
+        maxCell,
+        minC,
+        maxC,
+        mini,
+        maxi,
+        minValue,
+        maxValue
+    );
+}
+
+
 template<class Type>
 void Foam::functionObjects::fieldMinMax::calcMinMaxFields
 (
@@ -121,191 +241,22 @@ void Foam::functionObjects::fieldMinMax::calcMinMaxFields
 
     if (obr_.foundObject<fieldType>(fieldName))
     {
-        const label proci = Pstream::myProcNo();
-
         const fieldType& field = lookupObject<fieldType>(fieldName);
 
-        const volVectorField::Boundary& CfBoundary =
-            mesh_.C().boundaryField();
-
         switch (mode)
         {
             case mdMag:
             {
-                const volScalarField magField(mag(field));
-                const volScalarField::Boundary& magFieldBoundary =
-                    magField.boundaryField();
-
-                scalarList minVs(Pstream::nProcs());
-                labelList minCells(Pstream::nProcs());
-                List<vector> minCs(Pstream::nProcs());
-                label minProci = findMin(magField);
-                minVs[proci] = magField[minProci];
-                minCells[proci] = minProci;
-                minCs[proci] = mesh_.C()[minProci];
-
-                scalarList maxVs(Pstream::nProcs());
-                labelList maxCells(Pstream::nProcs());
-                List<vector> maxCs(Pstream::nProcs());
-                label maxProci = findMax(magField);
-                maxVs[proci] = magField[maxProci];
-                maxCells[proci] = maxProci;
-                maxCs[proci] = mesh_.C()[maxProci];
-
-                forAll(magFieldBoundary, patchi)
-                {
-                    const scalarField& mfp = magFieldBoundary[patchi];
-                    if (mfp.size())
-                    {
-                        const vectorField& Cfp = CfBoundary[patchi];
-
-                        const labelList& faceCells =
-                            magFieldBoundary[patchi].patch().faceCells();
-
-                        label minPi = findMin(mfp);
-                        if (mfp[minPi] < minVs[proci])
-                        {
-                            minVs[proci] = mfp[minPi];
-                            minCells[proci] = faceCells[minPi];
-                            minCs[proci] = Cfp[minPi];
-                        }
-
-                        label maxPi = findMax(mfp);
-                        if (mfp[maxPi] > maxVs[proci])
-                        {
-                            maxVs[proci] = mfp[maxPi];
-                            maxCells[proci] = faceCells[maxPi];
-                            maxCs[proci] = Cfp[maxPi];
-                        }
-                    }
-                }
-
-                Pstream::gatherList(minVs);
-                Pstream::scatterList(minVs);
-                Pstream::gatherList(minCells);
-                Pstream::scatterList(minCells);
-                Pstream::gatherList(minCs);
-                Pstream::scatterList(minCs);
-
-                Pstream::gatherList(maxVs);
-                Pstream::scatterList(maxVs);
-                Pstream::gatherList(maxCells);
-                Pstream::scatterList(maxCells);
-                Pstream::gatherList(maxCs);
-                Pstream::scatterList(maxCs);
-
-                label mini = findMin(minVs);
-                scalar minValue = minVs[mini];
-                const label minCell = minCells[mini];
-                const vector& minC = minCs[mini];
-
-                label maxi = findMax(maxVs);
-                scalar maxValue = maxVs[maxi];
-                const label maxCell = maxCells[maxi];
-                const vector& maxC = maxCs[maxi];
-
-                output
+                calcMinMaxFieldType<scalar>
                 (
-                    fieldName,
-                    word("mag(" + fieldName + ")"),
-                    minCell,
-                    maxCell,
-                    minC,
-                    maxC,
-                    mini,
-                    maxi,
-                    minValue,
-                    maxValue
+                    mag(field),
+                    word("mag(" + fieldName + ")")
                 );
                 break;
             }
             case mdCmpt:
             {
-                const typename fieldType::Boundary&
-                    fieldBoundary = field.boundaryField();
-
-                List<Type> minVs(Pstream::nProcs());
-                labelList minCells(Pstream::nProcs());
-                List<vector> minCs(Pstream::nProcs());
-                label minProci = findMin(field);
-                minVs[proci] = field[minProci];
-                minCells[proci] = minProci;
-                minCs[proci] = mesh_.C()[minProci];
-
-                List<Type> maxVs(Pstream::nProcs());
-                labelList maxCells(Pstream::nProcs());
-                List<vector> maxCs(Pstream::nProcs());
-                label maxProci = findMax(field);
-                maxVs[proci] = field[maxProci];
-                maxCells[proci] = maxProci;
-                maxCs[proci] = mesh_.C()[maxProci];
-
-                forAll(fieldBoundary, patchi)
-                {
-                    const Field<Type>& fp = fieldBoundary[patchi];
-
-                    if (fp.size())
-                    {
-                        const vectorField& Cfp = CfBoundary[patchi];
-
-                        const labelList& faceCells =
-                            fieldBoundary[patchi].patch().faceCells();
-
-                        label minPi = findMin(fp);
-                        if (fp[minPi] < minVs[proci])
-                        {
-                            minVs[proci] = fp[minPi];
-                            minCells[proci] = faceCells[minPi];
-                            minCs[proci] = Cfp[minPi];
-                        }
-
-                        label maxPi = findMax(fp);
-                        if (fp[maxPi] > maxVs[proci])
-                        {
-                            maxVs[proci] = fp[maxPi];
-                            maxCells[proci] = faceCells[maxPi];
-                            maxCs[proci] = Cfp[maxPi];
-                        }
-                    }
-                }
-
-                Pstream::gatherList(minVs);
-                Pstream::scatterList(minVs);
-                Pstream::gatherList(minCells);
-                Pstream::scatterList(minCells);
-                Pstream::gatherList(minCs);
-                Pstream::scatterList(minCs);
-
-                Pstream::gatherList(maxVs);
-                Pstream::scatterList(maxVs);
-                Pstream::gatherList(maxCells);
-                Pstream::scatterList(maxCells);
-                Pstream::gatherList(maxCs);
-                Pstream::scatterList(maxCs);
-
-                label mini = findMin(minVs);
-                Type minValue = minVs[mini];
-                const label minCell = minCells[mini];
-                const vector& minC = minCs[mini];
-
-                label maxi = findMax(maxVs);
-                Type maxValue = maxVs[maxi];
-                const label maxCell = maxCells[maxi];
-                const vector& maxC = maxCs[maxi];
-
-                output
-                (
-                    fieldName,
-                    fieldName,
-                    minCell,
-                    maxCell,
-                    minC,
-                    maxC,
-                    mini,
-                    maxi,
-                    minValue,
-                    maxValue
-                );
+                calcMinMaxFieldType(field, fieldName);
                 break;
             }
             default: