diff --git a/applications/utilities/parallelProcessing/redistributePar/Make/files b/applications/utilities/parallelProcessing/redistributePar/Make/files
index 2dacc462a9..73b91011bd 100644
--- a/applications/utilities/parallelProcessing/redistributePar/Make/files
+++ b/applications/utilities/parallelProcessing/redistributePar/Make/files
@@ -1,7 +1,10 @@
passivePositionParticleCloud.C
+
parLagrangianDistributor.C
parLagrangianDistributorFields.C
+
parPointFieldDistributor.C
+parFaFieldDistributorCache.C
parFvFieldDistributor.C
parFvFieldDistributorFields.C
diff --git a/applications/utilities/parallelProcessing/redistributePar/loadOrCreateMesh.C b/applications/utilities/parallelProcessing/redistributePar/loadOrCreateMesh.C
index 7d789e5625..626ac35b83 100644
--- a/applications/utilities/parallelProcessing/redistributePar/loadOrCreateMesh.C
+++ b/applications/utilities/parallelProcessing/redistributePar/loadOrCreateMesh.C
@@ -27,6 +27,7 @@ License
\*---------------------------------------------------------------------------*/
#include "loadOrCreateMesh.H"
+#include "faMesh.H"
#include "Pstream.H"
#include "OSspecific.H"
@@ -66,6 +67,26 @@ Foam::boolList Foam::haveMeshFile
}
+void Foam::removeProcAddressing(const faMesh& mesh)
+{
+ IOobject ioAddr
+ (
+ "procAddressing",
+ mesh.facesInstance(),
+ faMesh::meshSubDir,
+ mesh.thisDb()
+ );
+
+ for (const auto prefix : {"boundary", "edge", "face", "point"})
+ {
+ ioAddr.rename(prefix + word("ProcAddressing"));
+
+ const fileName procFile(ioAddr.objectPath());
+ Foam::rm(procFile);
+ }
+}
+
+
void Foam::removeProcAddressing(const polyMesh& mesh)
{
IOobject ioAddr
diff --git a/applications/utilities/parallelProcessing/redistributePar/loadOrCreateMesh.H b/applications/utilities/parallelProcessing/redistributePar/loadOrCreateMesh.H
index bd468348e3..3481e15744 100644
--- a/applications/utilities/parallelProcessing/redistributePar/loadOrCreateMesh.H
+++ b/applications/utilities/parallelProcessing/redistributePar/loadOrCreateMesh.H
@@ -45,6 +45,9 @@ SourceFiles
namespace Foam
{
+// Forward Declarations
+class faMesh;
+
//- Check for availability of specified mesh file (default: "faces")
boolList haveMeshFile
(
@@ -55,6 +58,9 @@ boolList haveMeshFile
);
+//- Remove procAddressing
+void removeProcAddressing(const faMesh& mesh);
+
//- Remove procAddressing
void removeProcAddressing(const polyMesh& mesh);
diff --git a/applications/utilities/parallelProcessing/redistributePar/parFaFieldDistributorCache.C b/applications/utilities/parallelProcessing/redistributePar/parFaFieldDistributorCache.C
new file mode 100644
index 0000000000..04d3ba8857
--- /dev/null
+++ b/applications/utilities/parallelProcessing/redistributePar/parFaFieldDistributorCache.C
@@ -0,0 +1,164 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | www.openfoam.com
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+ Copyright (C) 2022 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "parFaFieldDistributorCache.H"
+
+#include "areaFields.H"
+#include "edgeFields.H"
+#include "fieldsDistributor.H"
+#include "faMeshDistributor.H"
+#include "faMeshSubset.H"
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+template
+void Foam::parFaFieldDistributorCache::redistributeAndWrite
+(
+ const faMeshDistributor& distributor,
+ PtrList& fields,
+ const bool isWriteProc
+)
+{
+ for (GeoField& fld : fields)
+ {
+ tmp tfld = distributor.distributeField(fld);
+
+ if (isWriteProc)
+ {
+ tfld().write();
+ }
+ }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+void Foam::parFaFieldDistributorCache::read
+(
+ const Time& baseRunTime,
+ const fileName& proc0CaseName,
+ const bool decompose, // i.e. read from undecomposed case
+
+ const boolList& areaMeshOnProc,
+ const fileName& areaMeshInstance,
+ faMesh& mesh
+)
+{
+ Time& runTime = const_cast