From 25dafe92eabc66b731877ba2f13dd28c9fc8fd21 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Mon, 16 Apr 2012 11:36:13 +0100
Subject: [PATCH] ENH: decomposePar: add -time option.

---
 .../decomposePar/decomposePar.C               | 1084 ++++++++---------
 1 file changed, 541 insertions(+), 543 deletions(-)

diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
index 02acd592365..c7b96b44b36 100644
--- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
+++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -43,7 +43,10 @@ Usage
     Copy any \a uniform directories too.
 
     \param -constant \n
-    Override controlDict settings and use constant directory.
+    \param -time xxx:yyy \n
+    Override controlDict settings and decompose selected times. Does not
+    re-decompose the mesh i.e. does not handle moving mesh or changing
+    mesh cases.
 
     \param -fields \n
     Use existing geometry decomposition and convert fields only.
@@ -123,11 +126,9 @@ int main(int argc, char *argv[])
         "ifRequired",
         "only decompose geometry if the number of domains has changed"
     );
-    argList::addBoolOption
-    (
-        "constant",
-        "include the 'constant/' dir in the times list"
-    );
+
+    // Include explicit constant options, have zero from time range
+    timeSelector::addOptions(true, false);
 
     #include "setRootCase.H"
 
@@ -146,23 +147,10 @@ int main(int argc, char *argv[])
     bool forceOverwrite          = args.optionFound("force");
     bool ifRequiredDecomposition = args.optionFound("ifRequired");
 
+    // Set time from database
     #include "createTime.H"
-
-    // Allow -constant to override controlDict settings.
-    if (args.optionFound("constant"))
-    {
-        instantList timeDirs = timeSelector::select0(runTime, args);
-        if (runTime.timeName() != runTime.constant())
-        {
-            FatalErrorIn(args.executable())
-                << "No '" << runTime.constant() << "' time present." << endl
-                << "Valid times are " << runTime.times()
-                << exit(FatalError);
-        }
-    }
-
-
-    Info<< "Time = " << runTime.timeName() << endl;
+    // Allow override of time
+    instantList times = timeSelector::selectIfPresent(runTime, args);
 
     // determine the existing processor count directly
     label nProcs = 0;
@@ -334,475 +322,407 @@ int main(int argc, char *argv[])
     }
 
 
-    // Search for list of objects for this time
-    IOobjectList objects(mesh, runTime.timeName());
-
-    // Construct the vol fields
-    // ~~~~~~~~~~~~~~~~~~~~~~~~
-    PtrList<volScalarField> volScalarFields;
-    readFields(mesh, objects, volScalarFields);
-
-    PtrList<volVectorField> volVectorFields;
-    readFields(mesh, objects, volVectorFields);
-
-    PtrList<volSphericalTensorField> volSphericalTensorFields;
-    readFields(mesh, objects, volSphericalTensorFields);
-
-    PtrList<volSymmTensorField> volSymmTensorFields;
-    readFields(mesh, objects, volSymmTensorFields);
-
-    PtrList<volTensorField> volTensorFields;
-    readFields(mesh, objects, volTensorFields);
-
-
-    // Construct the dimensioned fields
-    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-    PtrList<DimensionedField<scalar, volMesh> > dimScalarFields;
-    readFields(mesh, objects, dimScalarFields);
-
-    PtrList<DimensionedField<vector, volMesh> > dimVectorFields;
-    readFields(mesh, objects, dimVectorFields);
-
-    PtrList<DimensionedField<sphericalTensor, volMesh> >
-        dimSphericalTensorFields;
-    readFields(mesh, objects, dimSphericalTensorFields);
-
-    PtrList<DimensionedField<symmTensor, volMesh> > dimSymmTensorFields;
-    readFields(mesh, objects, dimSymmTensorFields);
-
-    PtrList<DimensionedField<tensor, volMesh> > dimTensorFields;
-    readFields(mesh, objects, dimTensorFields);
-
-
-    // Construct the surface fields
-    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-    PtrList<surfaceScalarField> surfaceScalarFields;
-    readFields(mesh, objects, surfaceScalarFields);
-    PtrList<surfaceVectorField> surfaceVectorFields;
-    readFields(mesh, objects, surfaceVectorFields);
-    PtrList<surfaceSphericalTensorField> surfaceSphericalTensorFields;
-    readFields(mesh, objects, surfaceSphericalTensorFields);
-    PtrList<surfaceSymmTensorField> surfaceSymmTensorFields;
-    readFields(mesh, objects, surfaceSymmTensorFields);
-    PtrList<surfaceTensorField> surfaceTensorFields;
-    readFields(mesh, objects, surfaceTensorFields);
-
-
-    // Construct the point fields
-    // ~~~~~~~~~~~~~~~~~~~~~~~~~~
-    pointMesh pMesh(mesh);
-
-    PtrList<pointScalarField> pointScalarFields;
-    readFields(pMesh, objects, pointScalarFields);
-
-    PtrList<pointVectorField> pointVectorFields;
-    readFields(pMesh, objects, pointVectorFields);
-
-    PtrList<pointSphericalTensorField> pointSphericalTensorFields;
-    readFields(pMesh, objects, pointSphericalTensorFields);
-
-    PtrList<pointSymmTensorField> pointSymmTensorFields;
-    readFields(pMesh, objects, pointSymmTensorFields);
-
-    PtrList<pointTensorField> pointTensorFields;
-    readFields(pMesh, objects, pointTensorFields);
-
-
-    // Construct the Lagrangian fields
-    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-    fileNameList cloudDirs
-    (
-        readDir(runTime.timePath()/cloud::prefix, fileName::DIRECTORY)
-    );
-
-    // Particles
-    PtrList<Cloud<indexedParticle> > lagrangianPositions(cloudDirs.size());
-    // Particles per cell
-    PtrList< List<SLList<indexedParticle*>*> > cellParticles(cloudDirs.size());
-
-    PtrList<PtrList<labelIOField> > lagrangianLabelFields(cloudDirs.size());
-    PtrList<PtrList<labelFieldCompactIOField> > lagrangianLabelFieldFields
-    (
-        cloudDirs.size()
-    );
-    PtrList<PtrList<scalarIOField> > lagrangianScalarFields(cloudDirs.size());
-    PtrList<PtrList<scalarFieldCompactIOField> > lagrangianScalarFieldFields
-    (
-        cloudDirs.size()
-    );
-    PtrList<PtrList<vectorIOField> > lagrangianVectorFields(cloudDirs.size());
-    PtrList<PtrList<vectorFieldCompactIOField> > lagrangianVectorFieldFields
-    (
-        cloudDirs.size()
-    );
-    PtrList<PtrList<sphericalTensorIOField> > lagrangianSphericalTensorFields
-    (
-        cloudDirs.size()
-    );
-    PtrList<PtrList<sphericalTensorFieldCompactIOField> >
-        lagrangianSphericalTensorFieldFields(cloudDirs.size());
-    PtrList<PtrList<symmTensorIOField> > lagrangianSymmTensorFields
-    (
-        cloudDirs.size()
-    );
-    PtrList<PtrList<symmTensorFieldCompactIOField> >
-    lagrangianSymmTensorFieldFields
-    (
-        cloudDirs.size()
-    );
-    PtrList<PtrList<tensorIOField> > lagrangianTensorFields
-    (
-        cloudDirs.size()
-    );
-    PtrList<PtrList<tensorFieldCompactIOField> > lagrangianTensorFieldFields
-    (
-        cloudDirs.size()
-    );
-
-    label cloudI = 0;
-
-    forAll(cloudDirs, i)
+    // Loop over all times
+    forAll(times, timeI)
     {
-        IOobjectList sprayObjs
+        runTime.setTime(times[timeI], timeI);
+
+        Info<< "Time = " << runTime.timeName() << endl;
+
+        // Search for list of objects for this time
+        IOobjectList objects(mesh, runTime.timeName());
+
+
+        // Construct the vol fields
+        // ~~~~~~~~~~~~~~~~~~~~~~~~
+        PtrList<volScalarField> volScalarFields;
+        readFields(mesh, objects, volScalarFields);
+        PtrList<volVectorField> volVectorFields;
+        readFields(mesh, objects, volVectorFields);
+        PtrList<volSphericalTensorField> volSphericalTensorFields;
+        readFields(mesh, objects, volSphericalTensorFields);
+        PtrList<volSymmTensorField> volSymmTensorFields;
+        readFields(mesh, objects, volSymmTensorFields);
+        PtrList<volTensorField> volTensorFields;
+        readFields(mesh, objects, volTensorFields);
+
+
+        // Construct the dimensioned fields
+        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+        PtrList<DimensionedField<scalar, volMesh> > dimScalarFields;
+        readFields(mesh, objects, dimScalarFields);
+        PtrList<DimensionedField<vector, volMesh> > dimVectorFields;
+        readFields(mesh, objects, dimVectorFields);
+        PtrList<DimensionedField<sphericalTensor, volMesh> >
+            dimSphericalTensorFields;
+        readFields(mesh, objects, dimSphericalTensorFields);
+        PtrList<DimensionedField<symmTensor, volMesh> > dimSymmTensorFields;
+        readFields(mesh, objects, dimSymmTensorFields);
+        PtrList<DimensionedField<tensor, volMesh> > dimTensorFields;
+        readFields(mesh, objects, dimTensorFields);
+
+
+        // Construct the surface fields
+        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+        PtrList<surfaceScalarField> surfaceScalarFields;
+        readFields(mesh, objects, surfaceScalarFields);
+        PtrList<surfaceVectorField> surfaceVectorFields;
+        readFields(mesh, objects, surfaceVectorFields);
+        PtrList<surfaceSphericalTensorField> surfaceSphericalTensorFields;
+        readFields(mesh, objects, surfaceSphericalTensorFields);
+        PtrList<surfaceSymmTensorField> surfaceSymmTensorFields;
+        readFields(mesh, objects, surfaceSymmTensorFields);
+        PtrList<surfaceTensorField> surfaceTensorFields;
+        readFields(mesh, objects, surfaceTensorFields);
+
+
+        // Construct the point fields
+        // ~~~~~~~~~~~~~~~~~~~~~~~~~~
+        pointMesh pMesh(mesh);
+
+        PtrList<pointScalarField> pointScalarFields;
+        readFields(pMesh, objects, pointScalarFields);
+        PtrList<pointVectorField> pointVectorFields;
+        readFields(pMesh, objects, pointVectorFields);
+        PtrList<pointSphericalTensorField> pointSphericalTensorFields;
+        readFields(pMesh, objects, pointSphericalTensorFields);
+        PtrList<pointSymmTensorField> pointSymmTensorFields;
+        readFields(pMesh, objects, pointSymmTensorFields);
+        PtrList<pointTensorField> pointTensorFields;
+        readFields(pMesh, objects, pointTensorFields);
+
+
+        // Construct the Lagrangian fields
+        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+        fileNameList cloudDirs
         (
-            mesh,
-            runTime.timeName(),
-            cloud::prefix/cloudDirs[i]
+            readDir(runTime.timePath()/cloud::prefix, fileName::DIRECTORY)
         );
 
-        IOobject* positionsPtr = sprayObjs.lookup("positions");
+        // Particles
+        PtrList<Cloud<indexedParticle> > lagrangianPositions(cloudDirs.size());
+        // Particles per cell
+        PtrList< List<SLList<indexedParticle*>*> > cellParticles
+        (
+            cloudDirs.size()
+        );
 
-        if (positionsPtr)
-        {
-            // Read lagrangian particles
-            // ~~~~~~~~~~~~~~~~~~~~~~~~~
+        PtrList<PtrList<labelIOField> > lagrangianLabelFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<labelFieldCompactIOField> > lagrangianLabelFieldFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<scalarIOField> > lagrangianScalarFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<scalarFieldCompactIOField> > lagrangianScalarFieldFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<vectorIOField> > lagrangianVectorFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<vectorFieldCompactIOField> > lagrangianVectorFieldFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<sphericalTensorIOField> >
+        lagrangianSphericalTensorFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<sphericalTensorFieldCompactIOField> >
+            lagrangianSphericalTensorFieldFields(cloudDirs.size());
+        PtrList<PtrList<symmTensorIOField> > lagrangianSymmTensorFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<symmTensorFieldCompactIOField> >
+        lagrangianSymmTensorFieldFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<tensorIOField> > lagrangianTensorFields
+        (
+            cloudDirs.size()
+        );
+        PtrList<PtrList<tensorFieldCompactIOField> > lagrangianTensorFieldFields
+        (
+            cloudDirs.size()
+        );
 
-            Info<< "Identified lagrangian data set: " << cloudDirs[i] << endl;
+        label cloudI = 0;
 
-            lagrangianPositions.set
+        forAll(cloudDirs, i)
+        {
+            IOobjectList sprayObjs
             (
-                cloudI,
-                new Cloud<indexedParticle>
-                (
-                    mesh,
-                    cloudDirs[i],
-                    false
-                )
+                mesh,
+                runTime.timeName(),
+                cloud::prefix/cloudDirs[i]
             );
 
+            IOobject* positionsPtr = sprayObjs.lookup("positions");
 
-            // Sort particles per cell
-            // ~~~~~~~~~~~~~~~~~~~~~~~
+            if (positionsPtr)
+            {
+                // Read lagrangian particles
+                // ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-            cellParticles.set
-            (
-                cloudI,
-                new List<SLList<indexedParticle*>*>
+                Info<< "Identified lagrangian data set: " << cloudDirs[i]
+                    << endl;
+
+                lagrangianPositions.set
                 (
-                    mesh.nCells(),
-                    static_cast<SLList<indexedParticle*>*>(NULL)
-                )
-            );
+                    cloudI,
+                    new Cloud<indexedParticle>
+                    (
+                        mesh,
+                        cloudDirs[i],
+                        false
+                    )
+                );
 
-            label i = 0;
 
-            forAllIter
-            (
-                Cloud<indexedParticle>,
-                lagrangianPositions[cloudI],
-                iter
-            )
-            {
-                iter().index() = i++;
+                // Sort particles per cell
+                // ~~~~~~~~~~~~~~~~~~~~~~~
 
-                label celli = iter().cell();
+                cellParticles.set
+                (
+                    cloudI,
+                    new List<SLList<indexedParticle*>*>
+                    (
+                        mesh.nCells(),
+                        static_cast<SLList<indexedParticle*>*>(NULL)
+                    )
+                );
 
-                // Check
-                if (celli < 0 || celli >= mesh.nCells())
-                {
-                    FatalErrorIn(args.executable())
-                        << "Illegal cell number " << celli
-                        << " for particle with index " << iter().index()
-                        << " at position " << iter().position() << nl
-                        << "Cell number should be between 0 and "
-                        << mesh.nCells()-1 << nl
-                        << "On this mesh the particle should be in cell "
-                        << mesh.findCell(iter().position())
-                        << exit(FatalError);
-                }
+                label i = 0;
 
-                if (!cellParticles[cloudI][celli])
+                forAllIter
+                (
+                    Cloud<indexedParticle>,
+                    lagrangianPositions[cloudI],
+                    iter
+                )
                 {
-                    cellParticles[cloudI][celli] = new SLList<indexedParticle*>
-                    ();
+                    iter().index() = i++;
+
+                    label celli = iter().cell();
+
+                    // Check
+                    if (celli < 0 || celli >= mesh.nCells())
+                    {
+                        FatalErrorIn(args.executable())
+                            << "Illegal cell number " << celli
+                            << " for particle with index " << iter().index()
+                            << " at position " << iter().position() << nl
+                            << "Cell number should be between 0 and "
+                            << mesh.nCells()-1 << nl
+                            << "On this mesh the particle should be in cell "
+                            << mesh.findCell(iter().position())
+                            << exit(FatalError);
+                    }
+
+                    if (!cellParticles[cloudI][celli])
+                    {
+                        cellParticles[cloudI][celli] =
+                            new SLList<indexedParticle*>();
+                    }
+
+                    cellParticles[cloudI][celli]->append(&iter());
                 }
 
-                cellParticles[cloudI][celli]->append(&iter());
-            }
+                // Read fields
+                // ~~~~~~~~~~~
 
-            // Read fields
-            // ~~~~~~~~~~~
-
-            IOobjectList lagrangianObjects
-            (
-                mesh,
-                runTime.timeName(),
-                cloud::prefix/cloudDirs[cloudI]
-            );
+                IOobjectList lagrangianObjects
+                (
+                    mesh,
+                    runTime.timeName(),
+                    cloud::prefix/cloudDirs[cloudI]
+                );
 
-            lagrangianFieldDecomposer::readFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianLabelFields
-            );
+                lagrangianFieldDecomposer::readFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianLabelFields
+                );
 
-            lagrangianFieldDecomposer::readFieldFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianLabelFieldFields
-            );
+                lagrangianFieldDecomposer::readFieldFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianLabelFieldFields
+                );
 
-            lagrangianFieldDecomposer::readFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianScalarFields
-            );
+                lagrangianFieldDecomposer::readFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianScalarFields
+                );
 
-            lagrangianFieldDecomposer::readFieldFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianScalarFieldFields
-            );
+                lagrangianFieldDecomposer::readFieldFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianScalarFieldFields
+                );
 
-            lagrangianFieldDecomposer::readFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianVectorFields
-            );
+                lagrangianFieldDecomposer::readFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianVectorFields
+                );
 
-            lagrangianFieldDecomposer::readFieldFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianVectorFieldFields
-            );
+                lagrangianFieldDecomposer::readFieldFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianVectorFieldFields
+                );
 
-            lagrangianFieldDecomposer::readFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianSphericalTensorFields
-            );
+                lagrangianFieldDecomposer::readFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianSphericalTensorFields
+                );
 
-            lagrangianFieldDecomposer::readFieldFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianSphericalTensorFieldFields
-            );
+                lagrangianFieldDecomposer::readFieldFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianSphericalTensorFieldFields
+                );
 
-            lagrangianFieldDecomposer::readFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianSymmTensorFields
-            );
+                lagrangianFieldDecomposer::readFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianSymmTensorFields
+                );
 
-            lagrangianFieldDecomposer::readFieldFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianSymmTensorFieldFields
-            );
+                lagrangianFieldDecomposer::readFieldFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianSymmTensorFieldFields
+                );
 
-            lagrangianFieldDecomposer::readFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianTensorFields
-            );
+                lagrangianFieldDecomposer::readFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianTensorFields
+                );
 
-            lagrangianFieldDecomposer::readFieldFields
-            (
-                cloudI,
-                lagrangianObjects,
-                lagrangianTensorFieldFields
-            );
+                lagrangianFieldDecomposer::readFieldFields
+                (
+                    cloudI,
+                    lagrangianObjects,
+                    lagrangianTensorFieldFields
+                );
 
-            cloudI++;
+                cloudI++;
+            }
         }
-    }
 
-    lagrangianPositions.setSize(cloudI);
-    cellParticles.setSize(cloudI);
-    lagrangianLabelFields.setSize(cloudI);
-    lagrangianLabelFieldFields.setSize(cloudI);
-    lagrangianScalarFields.setSize(cloudI);
-    lagrangianScalarFieldFields.setSize(cloudI);
-    lagrangianVectorFields.setSize(cloudI);
-    lagrangianVectorFieldFields.setSize(cloudI);
-    lagrangianSphericalTensorFields.setSize(cloudI);
-    lagrangianSphericalTensorFieldFields.setSize(cloudI);
-    lagrangianSymmTensorFields.setSize(cloudI);
-    lagrangianSymmTensorFieldFields.setSize(cloudI);
-    lagrangianTensorFields.setSize(cloudI);
-    lagrangianTensorFieldFields.setSize(cloudI);
-
-
-    // Any uniform data to copy/link?
-    fileName uniformDir("uniform");
-
-    if (isDir(runTime.timePath()/uniformDir))
-    {
-        Info<< "Detected additional non-decomposed files in "
-            << runTime.timePath()/uniformDir
-            << endl;
-    }
-    else
-    {
-        uniformDir.clear();
-    }
-
-    Info<< endl;
-
-    // split the fields over processors
-    for (label procI = 0; procI < mesh.nProcs(); procI++)
-    {
-        Info<< "Processor " << procI << ": field transfer" << endl;
-
-        // open the database
-        Time processorDb
-        (
-            Time::controlDictName,
-            args.rootPath(),
-            args.caseName()/fileName(word("processor") + name(procI))
-        );
+        lagrangianPositions.setSize(cloudI);
+        cellParticles.setSize(cloudI);
+        lagrangianLabelFields.setSize(cloudI);
+        lagrangianLabelFieldFields.setSize(cloudI);
+        lagrangianScalarFields.setSize(cloudI);
+        lagrangianScalarFieldFields.setSize(cloudI);
+        lagrangianVectorFields.setSize(cloudI);
+        lagrangianVectorFieldFields.setSize(cloudI);
+        lagrangianSphericalTensorFields.setSize(cloudI);
+        lagrangianSphericalTensorFieldFields.setSize(cloudI);
+        lagrangianSymmTensorFields.setSize(cloudI);
+        lagrangianSymmTensorFieldFields.setSize(cloudI);
+        lagrangianTensorFields.setSize(cloudI);
+        lagrangianTensorFieldFields.setSize(cloudI);
+
+
+        // Any uniform data to copy/link?
+        fileName uniformDir("uniform");
+
+        if (isDir(runTime.timePath()/uniformDir))
+        {
+            Info<< "Detected additional non-decomposed files in "
+                << runTime.timePath()/uniformDir
+                << endl;
+        }
+        else
+        {
+            uniformDir.clear();
+        }
 
-        processorDb.setTime(runTime);
+        Info<< endl;
 
-        // remove files remnants that can cause horrible problems
-        // - mut and nut are used to mark the new turbulence models,
-        //   their existence prevents old models from being upgraded
+        // split the fields over processors
+        for (label procI = 0; procI < mesh.nProcs(); procI++)
         {
-            fileName timeDir(processorDb.path()/processorDb.timeName());
-
-            rm(timeDir/"mut");
-            rm(timeDir/"nut");
-        }
+            Info<< "Processor " << procI << ": field transfer" << endl;
 
-        // read the mesh
-        fvMesh procMesh
-        (
-            IOobject
+            // open the database
+            Time processorDb
             (
-                regionName,
-                processorDb.timeName(),
-                processorDb
-            )
-        );
+                Time::controlDictName,
+                args.rootPath(),
+                args.caseName()/fileName(word("processor") + name(procI))
+            );
 
-        labelIOList faceProcAddressing
-        (
-            IOobject
-            (
-                "faceProcAddressing",
-                procMesh.facesInstance(),
-                procMesh.meshSubDir,
-                procMesh,
-                IOobject::MUST_READ,
-                IOobject::NO_WRITE
-            )
-        );
+            processorDb.setTime(runTime);
 
-        labelIOList cellProcAddressing
-        (
-            IOobject
-            (
-                "cellProcAddressing",
-                procMesh.facesInstance(),
-                procMesh.meshSubDir,
-                procMesh,
-                IOobject::MUST_READ,
-                IOobject::NO_WRITE
-            )
-        );
+            // remove files remnants that can cause horrible problems
+            // - mut and nut are used to mark the new turbulence models,
+            //   their existence prevents old models from being upgraded
+            {
+                fileName timeDir(processorDb.path()/processorDb.timeName());
 
-        labelIOList boundaryProcAddressing
-        (
-            IOobject
-            (
-                "boundaryProcAddressing",
-                procMesh.facesInstance(),
-                procMesh.meshSubDir,
-                procMesh,
-                IOobject::MUST_READ,
-                IOobject::NO_WRITE
-            )
-        );
+                rm(timeDir/"mut");
+                rm(timeDir/"nut");
+            }
 
-        // FV fields
-        {
-            fvFieldDecomposer fieldDecomposer
+            // read the mesh
+            fvMesh procMesh
             (
-                mesh,
-                procMesh,
-                faceProcAddressing,
-                cellProcAddressing,
-                boundaryProcAddressing
+                IOobject
+                (
+                    regionName,
+                    processorDb.timeName(),
+                    processorDb
+                )
             );
 
-            fieldDecomposer.decomposeFields(volScalarFields);
-            fieldDecomposer.decomposeFields(volVectorFields);
-            fieldDecomposer.decomposeFields(volSphericalTensorFields);
-            fieldDecomposer.decomposeFields(volSymmTensorFields);
-            fieldDecomposer.decomposeFields(volTensorFields);
-
-            fieldDecomposer.decomposeFields(surfaceScalarFields);
-            fieldDecomposer.decomposeFields(surfaceVectorFields);
-            fieldDecomposer.decomposeFields(surfaceSphericalTensorFields);
-            fieldDecomposer.decomposeFields(surfaceSymmTensorFields);
-            fieldDecomposer.decomposeFields(surfaceTensorFields);
-        }
-
-        // Dimensioned fields
-        {
-            dimFieldDecomposer fieldDecomposer
+            labelIOList faceProcAddressing
             (
-                mesh,
-                procMesh,
-                faceProcAddressing,
-                cellProcAddressing
+                IOobject
+                (
+                    "faceProcAddressing",
+                    procMesh.facesInstance(),
+                    procMesh.meshSubDir,
+                    procMesh,
+                    IOobject::MUST_READ,
+                    IOobject::NO_WRITE
+                )
             );
 
-            fieldDecomposer.decomposeFields(dimScalarFields);
-            fieldDecomposer.decomposeFields(dimVectorFields);
-            fieldDecomposer.decomposeFields(dimSphericalTensorFields);
-            fieldDecomposer.decomposeFields(dimSymmTensorFields);
-            fieldDecomposer.decomposeFields(dimTensorFields);
-        }
-
-
-        // Point fields
-        if
-        (
-            pointScalarFields.size()
-         || pointVectorFields.size()
-         || pointSphericalTensorFields.size()
-         || pointSymmTensorFields.size()
-         || pointTensorFields.size()
-        )
-        {
-            labelIOList pointProcAddressing
+            labelIOList cellProcAddressing
             (
                 IOobject
                 (
-                    "pointProcAddressing",
+                    "cellProcAddressing",
                     procMesh.facesInstance(),
                     procMesh.meshSubDir,
                     procMesh,
@@ -811,138 +731,216 @@ int main(int argc, char *argv[])
                 )
             );
 
-            pointMesh procPMesh(procMesh);
-
-            pointFieldDecomposer fieldDecomposer
+            labelIOList boundaryProcAddressing
             (
-                pMesh,
-                procPMesh,
-                pointProcAddressing,
-                boundaryProcAddressing
+                IOobject
+                (
+                    "boundaryProcAddressing",
+                    procMesh.facesInstance(),
+                    procMesh.meshSubDir,
+                    procMesh,
+                    IOobject::MUST_READ,
+                    IOobject::NO_WRITE
+                )
             );
 
-            fieldDecomposer.decomposeFields(pointScalarFields);
-            fieldDecomposer.decomposeFields(pointVectorFields);
-            fieldDecomposer.decomposeFields(pointSphericalTensorFields);
-            fieldDecomposer.decomposeFields(pointSymmTensorFields);
-            fieldDecomposer.decomposeFields(pointTensorFields);
-        }
+            // FV fields
+            {
+                fvFieldDecomposer fieldDecomposer
+                (
+                    mesh,
+                    procMesh,
+                    faceProcAddressing,
+                    cellProcAddressing,
+                    boundaryProcAddressing
+                );
 
+                fieldDecomposer.decomposeFields(volScalarFields);
+                fieldDecomposer.decomposeFields(volVectorFields);
+                fieldDecomposer.decomposeFields(volSphericalTensorFields);
+                fieldDecomposer.decomposeFields(volSymmTensorFields);
+                fieldDecomposer.decomposeFields(volTensorFields);
+
+                fieldDecomposer.decomposeFields(surfaceScalarFields);
+                fieldDecomposer.decomposeFields(surfaceVectorFields);
+                fieldDecomposer.decomposeFields(surfaceSphericalTensorFields);
+                fieldDecomposer.decomposeFields(surfaceSymmTensorFields);
+                fieldDecomposer.decomposeFields(surfaceTensorFields);
+            }
 
-        // If there is lagrangian data write it out
-        forAll(lagrangianPositions, cloudI)
-        {
-            if (lagrangianPositions[cloudI].size())
+            // Dimensioned fields
             {
-                lagrangianFieldDecomposer fieldDecomposer
+                dimFieldDecomposer fieldDecomposer
                 (
                     mesh,
                     procMesh,
                     faceProcAddressing,
-                    cellProcAddressing,
-                    cloudDirs[cloudI],
-                    lagrangianPositions[cloudI],
-                    cellParticles[cloudI]
+                    cellProcAddressing
                 );
 
-                // Lagrangian fields
-                {
-                    fieldDecomposer.decomposeFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianLabelFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFieldFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianLabelFieldFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianScalarFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFieldFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianScalarFieldFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianVectorFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFieldFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianVectorFieldFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianSphericalTensorFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFieldFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianSphericalTensorFieldFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianSymmTensorFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFieldFields
-                    (
-                        cloudDirs[cloudI],
-                        lagrangianSymmTensorFieldFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFields
+                fieldDecomposer.decomposeFields(dimScalarFields);
+                fieldDecomposer.decomposeFields(dimVectorFields);
+                fieldDecomposer.decomposeFields(dimSphericalTensorFields);
+                fieldDecomposer.decomposeFields(dimSymmTensorFields);
+                fieldDecomposer.decomposeFields(dimTensorFields);
+            }
+
+
+            // Point fields
+            if
+            (
+                pointScalarFields.size()
+             || pointVectorFields.size()
+             || pointSphericalTensorFields.size()
+             || pointSymmTensorFields.size()
+             || pointTensorFields.size()
+            )
+            {
+                labelIOList pointProcAddressing
+                (
+                    IOobject
                     (
-                        cloudDirs[cloudI],
-                        lagrangianTensorFields[cloudI]
-                    );
-                    fieldDecomposer.decomposeFieldFields
+                        "pointProcAddressing",
+                        procMesh.facesInstance(),
+                        procMesh.meshSubDir,
+                        procMesh,
+                        IOobject::MUST_READ,
+                        IOobject::NO_WRITE
+                    )
+                );
+
+                pointMesh procPMesh(procMesh);
+
+                pointFieldDecomposer fieldDecomposer
+                (
+                    pMesh,
+                    procPMesh,
+                    pointProcAddressing,
+                    boundaryProcAddressing
+                );
+
+                fieldDecomposer.decomposeFields(pointScalarFields);
+                fieldDecomposer.decomposeFields(pointVectorFields);
+                fieldDecomposer.decomposeFields(pointSphericalTensorFields);
+                fieldDecomposer.decomposeFields(pointSymmTensorFields);
+                fieldDecomposer.decomposeFields(pointTensorFields);
+            }
+
+
+            // If there is lagrangian data write it out
+            forAll(lagrangianPositions, cloudI)
+            {
+                if (lagrangianPositions[cloudI].size())
+                {
+                    lagrangianFieldDecomposer fieldDecomposer
                     (
+                        mesh,
+                        procMesh,
+                        faceProcAddressing,
+                        cellProcAddressing,
                         cloudDirs[cloudI],
-                        lagrangianTensorFieldFields[cloudI]
+                        lagrangianPositions[cloudI],
+                        cellParticles[cloudI]
                     );
+
+                    // Lagrangian fields
+                    {
+                        fieldDecomposer.decomposeFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianLabelFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFieldFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianLabelFieldFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianScalarFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFieldFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianScalarFieldFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianVectorFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFieldFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianVectorFieldFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianSphericalTensorFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFieldFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianSphericalTensorFieldFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianSymmTensorFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFieldFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianSymmTensorFieldFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianTensorFields[cloudI]
+                        );
+                        fieldDecomposer.decomposeFieldFields
+                        (
+                            cloudDirs[cloudI],
+                            lagrangianTensorFieldFields[cloudI]
+                        );
+                    }
                 }
             }
-        }
 
 
-        // Any non-decomposed data to copy?
-        if (uniformDir.size())
-        {
-            const fileName timePath = processorDb.timePath();
-
-            if (copyUniform || mesh.distributed())
-            {
-                cp
-                (
-                    runTime.timePath()/uniformDir,
-                    timePath/uniformDir
-                );
-            }
-            else
+            // Any non-decomposed data to copy?
+            if (uniformDir.size())
             {
-                // link with relative paths
-                const string parentPath = string("..")/"..";
+                const fileName timePath = processorDb.timePath();
 
-                fileName currentDir(cwd());
-                chDir(timePath);
-                ln
-                (
-                    parentPath/runTime.timeName()/uniformDir,
-                    uniformDir
-                );
-                chDir(currentDir);
+                if (copyUniform || mesh.distributed())
+                {
+                    cp
+                    (
+                        runTime.timePath()/uniformDir,
+                        timePath/uniformDir
+                    );
+                }
+                else
+                {
+                    // link with relative paths
+                    const string parentPath = string("..")/"..";
+
+                    fileName currentDir(cwd());
+                    chDir(timePath);
+                    ln
+                    (
+                        parentPath/runTime.timeName()/uniformDir,
+                        uniformDir
+                    );
+                    chDir(currentDir);
+                }
             }
         }
     }
 
-
     Info<< "\nEnd.\n" << endl;
 
     return 0;
-- 
GitLab