From 25dafe92eabc66b731877ba2f13dd28c9fc8fd21 Mon Sep 17 00:00:00 2001 From: mattijs Date: Mon, 16 Apr 2012 11:36:13 +0100 Subject: [PATCH] ENH: decomposePar: add -time option. --- .../decomposePar/decomposePar.C | 1116 ++++++++--------- 1 file changed, 557 insertions(+), 559 deletions(-) diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C index 02acd59236..c7b96b44b3 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,394 @@ int main(int argc, char *argv[]) } - // Search for list of objects for this time - IOobjectList objects(mesh, runTime.timeName()); - - // Construct the vol fields - // ~~~~~~~~~~~~~~~~~~~~~~~~ - PtrList volScalarFields; - readFields(mesh, objects, volScalarFields); - - PtrList volVectorFields; - readFields(mesh, objects, volVectorFields); - - PtrList volSphericalTensorFields; - readFields(mesh, objects, volSphericalTensorFields); - - PtrList volSymmTensorFields; - readFields(mesh, objects, volSymmTensorFields); - - PtrList volTensorFields; - readFields(mesh, objects, volTensorFields); - - - // Construct the dimensioned fields - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - PtrList > dimScalarFields; - readFields(mesh, objects, dimScalarFields); - - PtrList > dimVectorFields; - readFields(mesh, objects, dimVectorFields); - - PtrList > - dimSphericalTensorFields; - readFields(mesh, objects, dimSphericalTensorFields); - - PtrList > dimSymmTensorFields; - readFields(mesh, objects, dimSymmTensorFields); - - PtrList > dimTensorFields; - readFields(mesh, objects, dimTensorFields); - - - // Construct the surface fields - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - PtrList surfaceScalarFields; - readFields(mesh, objects, surfaceScalarFields); - PtrList surfaceVectorFields; - readFields(mesh, objects, surfaceVectorFields); - PtrList surfaceSphericalTensorFields; - readFields(mesh, objects, surfaceSphericalTensorFields); - PtrList surfaceSymmTensorFields; - readFields(mesh, objects, surfaceSymmTensorFields); - PtrList surfaceTensorFields; - readFields(mesh, objects, surfaceTensorFields); - - - // Construct the point fields - // ~~~~~~~~~~~~~~~~~~~~~~~~~~ - pointMesh pMesh(mesh); - - PtrList pointScalarFields; - readFields(pMesh, objects, pointScalarFields); - - PtrList pointVectorFields; - readFields(pMesh, objects, pointVectorFields); - - PtrList pointSphericalTensorFields; - readFields(pMesh, objects, pointSphericalTensorFields); - - PtrList pointSymmTensorFields; - readFields(pMesh, objects, pointSymmTensorFields); - - PtrList pointTensorFields; - readFields(pMesh, objects, pointTensorFields); - - - // Construct the Lagrangian fields - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - fileNameList cloudDirs - ( - readDir(runTime.timePath()/cloud::prefix, fileName::DIRECTORY) - ); - - // Particles - PtrList > lagrangianPositions(cloudDirs.size()); - // Particles per cell - PtrList< List*> > cellParticles(cloudDirs.size()); - - PtrList > lagrangianLabelFields(cloudDirs.size()); - PtrList > lagrangianLabelFieldFields - ( - cloudDirs.size() - ); - PtrList > lagrangianScalarFields(cloudDirs.size()); - PtrList > lagrangianScalarFieldFields - ( - cloudDirs.size() - ); - PtrList > lagrangianVectorFields(cloudDirs.size()); - PtrList > lagrangianVectorFieldFields - ( - cloudDirs.size() - ); - PtrList > lagrangianSphericalTensorFields - ( - cloudDirs.size() - ); - PtrList > - lagrangianSphericalTensorFieldFields(cloudDirs.size()); - PtrList > lagrangianSymmTensorFields - ( - cloudDirs.size() - ); - PtrList > - lagrangianSymmTensorFieldFields - ( - cloudDirs.size() - ); - PtrList > lagrangianTensorFields - ( - cloudDirs.size() - ); - PtrList > 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 volScalarFields; + readFields(mesh, objects, volScalarFields); + PtrList volVectorFields; + readFields(mesh, objects, volVectorFields); + PtrList volSphericalTensorFields; + readFields(mesh, objects, volSphericalTensorFields); + PtrList volSymmTensorFields; + readFields(mesh, objects, volSymmTensorFields); + PtrList volTensorFields; + readFields(mesh, objects, volTensorFields); + + + // Construct the dimensioned fields + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PtrList > dimScalarFields; + readFields(mesh, objects, dimScalarFields); + PtrList > dimVectorFields; + readFields(mesh, objects, dimVectorFields); + PtrList > + dimSphericalTensorFields; + readFields(mesh, objects, dimSphericalTensorFields); + PtrList > dimSymmTensorFields; + readFields(mesh, objects, dimSymmTensorFields); + PtrList > dimTensorFields; + readFields(mesh, objects, dimTensorFields); + + + // Construct the surface fields + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PtrList surfaceScalarFields; + readFields(mesh, objects, surfaceScalarFields); + PtrList surfaceVectorFields; + readFields(mesh, objects, surfaceVectorFields); + PtrList surfaceSphericalTensorFields; + readFields(mesh, objects, surfaceSphericalTensorFields); + PtrList surfaceSymmTensorFields; + readFields(mesh, objects, surfaceSymmTensorFields); + PtrList surfaceTensorFields; + readFields(mesh, objects, surfaceTensorFields); + + + // Construct the point fields + // ~~~~~~~~~~~~~~~~~~~~~~~~~~ + pointMesh pMesh(mesh); + + PtrList pointScalarFields; + readFields(pMesh, objects, pointScalarFields); + PtrList pointVectorFields; + readFields(pMesh, objects, pointVectorFields); + PtrList pointSphericalTensorFields; + readFields(pMesh, objects, pointSphericalTensorFields); + PtrList pointSymmTensorFields; + readFields(pMesh, objects, pointSymmTensorFields); + PtrList 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 > lagrangianPositions(cloudDirs.size()); + // Particles per cell + PtrList< List*> > cellParticles + ( + cloudDirs.size() + ); - if (positionsPtr) + PtrList > lagrangianLabelFields + ( + cloudDirs.size() + ); + PtrList > lagrangianLabelFieldFields + ( + cloudDirs.size() + ); + PtrList > lagrangianScalarFields + ( + cloudDirs.size() + ); + PtrList > lagrangianScalarFieldFields + ( + cloudDirs.size() + ); + PtrList > lagrangianVectorFields + ( + cloudDirs.size() + ); + PtrList > lagrangianVectorFieldFields + ( + cloudDirs.size() + ); + PtrList > + lagrangianSphericalTensorFields + ( + cloudDirs.size() + ); + PtrList > + lagrangianSphericalTensorFieldFields(cloudDirs.size()); + PtrList > lagrangianSymmTensorFields + ( + cloudDirs.size() + ); + PtrList > + lagrangianSymmTensorFieldFields + ( + cloudDirs.size() + ); + PtrList > lagrangianTensorFields + ( + cloudDirs.size() + ); + PtrList > lagrangianTensorFieldFields + ( + cloudDirs.size() + ); + + label cloudI = 0; + + forAll(cloudDirs, i) { - // Read lagrangian particles - // ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Info<< "Identified lagrangian data set: " << cloudDirs[i] << endl; - - lagrangianPositions.set - ( - cloudI, - new Cloud - ( - mesh, - cloudDirs[i], - false - ) - ); - - - // Sort particles per cell - // ~~~~~~~~~~~~~~~~~~~~~~~ - - cellParticles.set - ( - cloudI, - new List*> - ( - mesh.nCells(), - static_cast*>(NULL) - ) - ); - - label i = 0; - - forAllIter - ( - Cloud, - lagrangianPositions[cloudI], - iter - ) - { - 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 - (); - } - - cellParticles[cloudI][celli]->append(&iter()); - } - - // Read fields - // ~~~~~~~~~~~ - - IOobjectList lagrangianObjects + IOobjectList sprayObjs ( mesh, runTime.timeName(), - cloud::prefix/cloudDirs[cloudI] + cloud::prefix/cloudDirs[i] ); - lagrangianFieldDecomposer::readFields - ( - cloudI, - lagrangianObjects, - lagrangianLabelFields - ); + IOobject* positionsPtr = sprayObjs.lookup("positions"); - lagrangianFieldDecomposer::readFieldFields - ( - cloudI, - lagrangianObjects, - lagrangianLabelFieldFields - ); + if (positionsPtr) + { + // Read lagrangian particles + // ~~~~~~~~~~~~~~~~~~~~~~~~~ - lagrangianFieldDecomposer::readFields - ( - cloudI, - lagrangianObjects, - lagrangianScalarFields - ); + Info<< "Identified lagrangian data set: " << cloudDirs[i] + << endl; - lagrangianFieldDecomposer::readFieldFields - ( - cloudI, - lagrangianObjects, - lagrangianScalarFieldFields - ); - - lagrangianFieldDecomposer::readFields - ( - cloudI, - lagrangianObjects, - lagrangianVectorFields - ); - - lagrangianFieldDecomposer::readFieldFields - ( - cloudI, - lagrangianObjects, - lagrangianVectorFieldFields - ); - - lagrangianFieldDecomposer::readFields - ( - cloudI, - lagrangianObjects, - lagrangianSphericalTensorFields - ); - - lagrangianFieldDecomposer::readFieldFields - ( - cloudI, - lagrangianObjects, - lagrangianSphericalTensorFieldFields - ); - - lagrangianFieldDecomposer::readFields - ( - cloudI, - lagrangianObjects, - lagrangianSymmTensorFields - ); - - lagrangianFieldDecomposer::readFieldFields - ( - cloudI, - lagrangianObjects, - lagrangianSymmTensorFieldFields - ); - - lagrangianFieldDecomposer::readFields - ( - cloudI, - lagrangianObjects, - lagrangianTensorFields - ); - - lagrangianFieldDecomposer::readFieldFields - ( - cloudI, - lagrangianObjects, - lagrangianTensorFieldFields - ); - - 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); + lagrangianPositions.set + ( + cloudI, + new Cloud + ( + mesh, + cloudDirs[i], + false + ) + ); - // Any uniform data to copy/link? - fileName uniformDir("uniform"); + // Sort particles per cell + // ~~~~~~~~~~~~~~~~~~~~~~~ - if (isDir(runTime.timePath()/uniformDir)) - { - Info<< "Detected additional non-decomposed files in " - << runTime.timePath()/uniformDir - << endl; - } - else - { - uniformDir.clear(); - } + cellParticles.set + ( + cloudI, + new List*> + ( + mesh.nCells(), + static_cast*>(NULL) + ) + ); - Info<< endl; + label i = 0; - // split the fields over processors - for (label procI = 0; procI < mesh.nProcs(); procI++) - { - Info<< "Processor " << procI << ": field transfer" << endl; + forAllIter + ( + Cloud, + lagrangianPositions[cloudI], + iter + ) + { + iter().index() = i++; - // open the database - Time processorDb - ( - Time::controlDictName, - args.rootPath(), - args.caseName()/fileName(word("processor") + name(procI)) - ); + label celli = iter().cell(); - processorDb.setTime(runTime); + // 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); + } - // 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()); + if (!cellParticles[cloudI][celli]) + { + cellParticles[cloudI][celli] = + new SLList(); + } - rm(timeDir/"mut"); - rm(timeDir/"nut"); + cellParticles[cloudI][celli]->append(&iter()); + } + + // Read fields + // ~~~~~~~~~~~ + + IOobjectList lagrangianObjects + ( + mesh, + runTime.timeName(), + cloud::prefix/cloudDirs[cloudI] + ); + + lagrangianFieldDecomposer::readFields + ( + cloudI, + lagrangianObjects, + lagrangianLabelFields + ); + + lagrangianFieldDecomposer::readFieldFields + ( + cloudI, + lagrangianObjects, + lagrangianLabelFieldFields + ); + + lagrangianFieldDecomposer::readFields + ( + cloudI, + lagrangianObjects, + lagrangianScalarFields + ); + + lagrangianFieldDecomposer::readFieldFields + ( + cloudI, + lagrangianObjects, + lagrangianScalarFieldFields + ); + + lagrangianFieldDecomposer::readFields + ( + cloudI, + lagrangianObjects, + lagrangianVectorFields + ); + + lagrangianFieldDecomposer::readFieldFields + ( + cloudI, + lagrangianObjects, + lagrangianVectorFieldFields + ); + + lagrangianFieldDecomposer::readFields + ( + cloudI, + lagrangianObjects, + lagrangianSphericalTensorFields + ); + + lagrangianFieldDecomposer::readFieldFields + ( + cloudI, + lagrangianObjects, + lagrangianSphericalTensorFieldFields + ); + + lagrangianFieldDecomposer::readFields + ( + cloudI, + lagrangianObjects, + lagrangianSymmTensorFields + ); + + lagrangianFieldDecomposer::readFieldFields + ( + cloudI, + lagrangianObjects, + lagrangianSymmTensorFieldFields + ); + + lagrangianFieldDecomposer::readFields + ( + cloudI, + lagrangianObjects, + lagrangianTensorFields + ); + + lagrangianFieldDecomposer::readFieldFields + ( + cloudI, + lagrangianObjects, + lagrangianTensorFieldFields + ); + + cloudI++; + } } - // read the mesh - fvMesh procMesh - ( - IOobject - ( - regionName, - processorDb.timeName(), - processorDb - ) - ); + 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); - labelIOList faceProcAddressing - ( - IOobject - ( - "faceProcAddressing", - procMesh.facesInstance(), - procMesh.meshSubDir, - procMesh, - IOobject::MUST_READ, - IOobject::NO_WRITE - ) - ); - labelIOList cellProcAddressing - ( - IOobject - ( - "cellProcAddressing", - procMesh.facesInstance(), - procMesh.meshSubDir, - procMesh, - IOobject::MUST_READ, - IOobject::NO_WRITE - ) - ); + // Any uniform data to copy/link? + fileName uniformDir("uniform"); - labelIOList boundaryProcAddressing - ( - IOobject - ( - "boundaryProcAddressing", - procMesh.facesInstance(), - procMesh.meshSubDir, - procMesh, - IOobject::MUST_READ, - IOobject::NO_WRITE - ) - ); - - // FV fields + if (isDir(runTime.timePath()/uniformDir)) { - 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); + Info<< "Detected additional non-decomposed files in " + << runTime.timePath()/uniformDir + << endl; + } + else + { + uniformDir.clear(); } - // Dimensioned fields + Info<< endl; + + // split the fields over processors + for (label procI = 0; procI < mesh.nProcs(); procI++) { - dimFieldDecomposer fieldDecomposer + Info<< "Processor " << procI << ": field transfer" << endl; + + // open the database + Time processorDb ( - mesh, - procMesh, - faceProcAddressing, - cellProcAddressing + Time::controlDictName, + args.rootPath(), + args.caseName()/fileName(word("processor") + name(procI)) ); - fieldDecomposer.decomposeFields(dimScalarFields); - fieldDecomposer.decomposeFields(dimVectorFields); - fieldDecomposer.decomposeFields(dimSphericalTensorFields); - fieldDecomposer.decomposeFields(dimSymmTensorFields); - fieldDecomposer.decomposeFields(dimTensorFields); - } + processorDb.setTime(runTime); + // 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()); - // Point fields - if - ( - pointScalarFields.size() - || pointVectorFields.size() - || pointSphericalTensorFields.size() - || pointSymmTensorFields.size() - || pointTensorFields.size() - ) - { - labelIOList pointProcAddressing + rm(timeDir/"mut"); + rm(timeDir/"nut"); + } + + // read the mesh + fvMesh procMesh ( IOobject ( - "pointProcAddressing", + regionName, + processorDb.timeName(), + processorDb + ) + ); + + labelIOList faceProcAddressing + ( + IOobject + ( + "faceProcAddressing", procMesh.facesInstance(), procMesh.meshSubDir, procMesh, @@ -811,138 +718,229 @@ int main(int argc, char *argv[]) ) ); - pointMesh procPMesh(procMesh); - - pointFieldDecomposer fieldDecomposer + labelIOList cellProcAddressing ( - pMesh, - procPMesh, - pointProcAddressing, - boundaryProcAddressing + IOobject + ( + "cellProcAddressing", + 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); - } + labelIOList boundaryProcAddressing + ( + IOobject + ( + "boundaryProcAddressing", + procMesh.facesInstance(), + procMesh.meshSubDir, + procMesh, + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ); - - // If there is lagrangian data write it out - forAll(lagrangianPositions, cloudI) - { - if (lagrangianPositions[cloudI].size()) + // FV fields { - lagrangianFieldDecomposer fieldDecomposer + fvFieldDecomposer fieldDecomposer ( mesh, procMesh, faceProcAddressing, cellProcAddressing, - cloudDirs[cloudI], - lagrangianPositions[cloudI], - cellParticles[cloudI] + boundaryProcAddressing ); - // Lagrangian fields + 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 + ( + mesh, + procMesh, + faceProcAddressing, + cellProcAddressing + ); + + 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 + ( + "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()) { - fieldDecomposer.decomposeFields + lagrangianFieldDecomposer fieldDecomposer ( + mesh, + procMesh, + faceProcAddressing, + cellProcAddressing, cloudDirs[cloudI], - lagrangianLabelFields[cloudI] + lagrangianPositions[cloudI], + cellParticles[cloudI] ); - fieldDecomposer.decomposeFieldFields + + // 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 ( - cloudDirs[cloudI], - lagrangianLabelFieldFields[cloudI] + runTime.timePath()/uniformDir, + timePath/uniformDir ); - fieldDecomposer.decomposeFields + } + else + { + // link with relative paths + const string parentPath = string("..")/".."; + + fileName currentDir(cwd()); + chDir(timePath); + ln ( - 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] + parentPath/runTime.timeName()/uniformDir, + uniformDir ); + chDir(currentDir); } } } - - - // 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 - { - // 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;