diff --git a/applications/utilities/mesh/generation/blockMesh/blockMesh.C b/applications/utilities/mesh/generation/blockMesh/blockMesh.C index cdea2a93ba1ccd0438824574372d06fdae1c921e..4441f15e4934c61cf8135312682ea1e59c98c292 100644 --- a/applications/utilities/mesh/generation/blockMesh/blockMesh.C +++ b/applications/utilities/mesh/generation/blockMesh/blockMesh.C @@ -128,16 +128,12 @@ int main(int argc, char *argv[]) fileName dictPath; // Check if the dictionary is specified on the command-line - if (args.optionFound("dict")) + if (args.optionReadIfPresent("dict", dictPath)) { - dictPath = args["dict"]; - - dictPath = - ( - isDir(dictPath) - ? dictPath/dictName - : dictPath - ); + if (isDir(dictPath)) + { + dictPath = dictPath / dictName; + } } // Check if dictionary is present in the constant directory else if diff --git a/applications/utilities/mesh/generation/foamyMesh/foamyHexMesh/foamyHexMesh.C b/applications/utilities/mesh/generation/foamyMesh/foamyHexMesh/foamyHexMesh.C index 3588a9878f634f72758a6f2a98a4fe1565517a86..88c9c82e01da03283d0bc30fbe25983f61999c71 100644 --- a/applications/utilities/mesh/generation/foamyMesh/foamyHexMesh/foamyHexMesh.C +++ b/applications/utilities/mesh/generation/foamyMesh/foamyHexMesh/foamyHexMesh.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -67,14 +67,7 @@ int main(int argc, char *argv[]) // Allow override of decomposeParDict location fileName decompDictFile; - if (args.optionReadIfPresent("decomposeParDict", decompDictFile)) - { - if (isDir(decompDictFile)) - { - decompDictFile = decompDictFile / "decomposeParDict"; - } - } - + args.optionReadIfPresent("decomposeParDict", decompDictFile); IOdictionary foamyHexMeshDict ( diff --git a/applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh/foamyHexMeshBackgroundMesh.C b/applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh/foamyHexMeshBackgroundMesh.C index 5e009ea114a1aec38da3d7737daddc555f376d96..410182e01c2a68cda0484476d507ed1731a60bfb 100644 --- a/applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh/foamyHexMeshBackgroundMesh.C +++ b/applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh/foamyHexMeshBackgroundMesh.C @@ -524,13 +524,7 @@ int main(int argc, char *argv[]) // Allow override of decomposeParDict location fileName decompDictFile; - if (args.optionReadIfPresent("decomposeParDict", decompDictFile)) - { - if (isDir(decompDictFile)) - { - decompDictFile = decompDictFile / "decomposeParDict"; - } - } + args.optionReadIfPresent("decomposeParDict", decompDictFile); labelList decomp = decompositionModel::New ( diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C index 1f4414fcbdd0e5d16ef92bc0e6d21081f8c66fe2..7b998241d65bb686f7e2f22cfc751aca95b86587 100644 --- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C +++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright 2015-2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -905,13 +905,7 @@ int main(int argc, char *argv[]) if (Pstream::parRun()) { fileName decompDictFile; - if (args.optionReadIfPresent("decomposeParDict", decompDictFile)) - { - if (isDir(decompDictFile)) - { - decompDictFile = decompDictFile/"decomposeParDict"; - } - } + args.optionReadIfPresent("decomposeParDict", decompDictFile); decomposeDict = IOdictionary ( diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C index 62723280b3b2777cda3672ff2911727ddde7ee5c..4eea56f1c0fa6290bfeffe8adbee281307b3353a 100644 --- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C +++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C @@ -270,14 +270,7 @@ int main(int argc, char *argv[]) // Allow override of decomposeParDict location fileName decompDictFile; - if (args.optionReadIfPresent("decomposeParDict", decompDictFile)) - { - if (isDir(decompDictFile)) - { - decompDictFile = decompDictFile/"decomposeParDict"; - } - } - + args.optionReadIfPresent("decomposeParDict", decompDictFile); wordList regionNames; wordList regionDirs; @@ -360,7 +353,6 @@ int main(int argc, char *argv[]) ), decompDictFile ) - ).lookup("numberOfSubdomains") ); diff --git a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C index 65ebbc1c6f3c862f2877599f09716cde4acd4dba..c21d94b3dddcff4b7ef8e45b2d9f8ee1ef3c8a9a 100644 --- a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C +++ b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C @@ -64,6 +64,7 @@ Usage #include "fvMeshTools.H" #include "fvMeshDistribute.H" #include "decompositionMethod.H" +#include "decompositionModel.H" #include "timeSelector.H" #include "PstreamReduceOps.H" #include "volFields.H" @@ -74,7 +75,6 @@ Usage #include "loadOrCreateMesh.H" #include "processorFvPatchField.H" #include "zeroGradientFvPatchFields.H" -#include "decompositionModel.H" #include "parFvFieldReconstructor.H" #include "parLagrangianRedistributor.H" @@ -2152,7 +2152,6 @@ int main(int argc, char *argv[]) bool newTimes = args.optionFound("newTimes"); - if (env("FOAM_SIGFPE")) { WarningInFunction @@ -2245,8 +2244,6 @@ int main(int argc, char *argv[]) Pstream::scatter(decompose); - - // If running distributed we have problem of new processors not finding // a system/controlDict. However if we switch on the master-only reading // the problem becomes that the time directories are differing sizes and @@ -2330,7 +2327,6 @@ int main(int argc, char *argv[]) // Determine any region word regionName = polyMesh::defaultRegion; fileName meshSubDir; - if (args.optionReadIfPresent("region", regionName)) { meshSubDir = regionName/polyMesh::meshSubDir; @@ -2774,13 +2770,7 @@ int main(int argc, char *argv[]) // Allow override of decomposeParDict location fileName decompDictFile; - if (args.optionReadIfPresent("decomposeParDict", decompDictFile)) - { - if (isDir(decompDictFile)) - { - decompDictFile = decompDictFile / "decomposeParDict"; - } - } + args.optionReadIfPresent("decomposeParDict", decompDictFile); // Determine decomposition diff --git a/applications/utilities/preProcessing/mapFields/mapFields.C b/applications/utilities/preProcessing/mapFields/mapFields.C index 106f1b2bc2ee3e6952a249be1886412252e4c2ca..35d4faccc6072e7ccd93e5ae55ec8f59a2587ebc 100644 --- a/applications/utilities/preProcessing/mapFields/mapFields.C +++ b/applications/utilities/preProcessing/mapFields/mapFields.C @@ -51,13 +51,11 @@ int readNumProcs const Time& runTime ) { + const word dictName = "decomposeParDict"; fileName dictFile; - if (args.optionReadIfPresent(optionName, dictFile)) + if (args.optionReadIfPresent(optionName, dictFile) && isDir(dictFile)) { - if (isDir(dictFile)) - { - dictFile = dictFile/"decomposeParDict"; - } + dictFile = dictFile / dictName; } return readInt @@ -68,7 +66,7 @@ int readNumProcs ( IOobject ( - "decomposeParDict", + dictName, runTime.system(), runTime, IOobject::MUST_READ_IF_MODIFIED, @@ -376,7 +374,7 @@ int main(int argc, char *argv[]) if (parallelSource && !parallelTarget) { - int nProcs = readNumProcs + const int nProcs = readNumProcs ( args, "sourceDecomposeParDict", @@ -448,7 +446,7 @@ int main(int argc, char *argv[]) } else if (!parallelSource && parallelTarget) { - int nProcs = readNumProcs + const int nProcs = readNumProcs ( args, "targetDecomposeParDict", @@ -521,13 +519,13 @@ int main(int argc, char *argv[]) } else if (parallelSource && parallelTarget) { - int nProcsSource = readNumProcs + const int nProcsSource = readNumProcs ( args, "sourceDecomposeParDict", runTimeSource ); - int nProcsTarget = readNumProcs + const int nProcsTarget = readNumProcs ( args, "targetDecomposeParDict", diff --git a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C index d61fbc67cd0f92302e705367946b8f3b51c9a626..d79323b718e1362d35676b0f344fba82250abec3 100644 --- a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C +++ b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C @@ -157,14 +157,10 @@ int main(int argc, char *argv[]) // Note: cannot use setSystemRunTimeDictionaryIO.H since dictionary // is in constant - fileName dictPath = ""; - if (args.optionFound("dict")) + fileName dictPath; + if (args.optionReadIfPresent("dict", dictPath) && isDir(dictPath)) { - dictPath = args["dict"]; - if (isDir(dictPath)) - { - dictPath = dictPath / dictName; - } + dictPath = dictPath / dictName; } if (dictPath.size()) diff --git a/applications/utilities/surface/surfaceRedistributePar/Make/options b/applications/utilities/surface/surfaceRedistributePar/Make/options index c46a4c3f38edbafb8de987a029e545d61e8ac793..d836881301c692a5747929349d88ed55c2c79c5d 100644 --- a/applications/utilities/surface/surfaceRedistributePar/Make/options +++ b/applications/utilities/surface/surfaceRedistributePar/Make/options @@ -1,9 +1,12 @@ EXE_INC = \ -I$(LIB_SRC)/triSurface/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude \ + -I$(LIB_SRC)/parallel/decompose/decompose/lnInclude \ -I$(LIB_SRC)/parallel/distributed/lnInclude EXE_LIBS = \ -ldistributed \ -lmeshTools \ - -ltriSurface + -ltriSurface \ + -ldecompose diff --git a/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C b/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C index f5e113f845efa8d6ed75392a6432ed9d44fe3387..d478f8ab4071577eec16612442e90937e956eca9 100644 --- a/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C +++ b/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -46,6 +46,7 @@ Note #include "distributedTriSurfaceMesh.H" #include "mapDistribute.H" #include "localIOdictionary.H" +#include "decompositionModel.H" using namespace Foam; @@ -103,7 +104,8 @@ int main(int argc, char *argv[]) { argList::addNote ( - "redistribute a triSurface" + "Redistribute a triSurface. " + "The specified surface must be located in the constant/triSurface directory" ); argList::validArgs.append("triSurfaceMesh"); @@ -127,7 +129,7 @@ int main(int argc, char *argv[]) << "Using distribution method " << distTypeName << nl << endl; - const bool keepNonMapped = args.options().found("keepNonMapped"); + const bool keepNonMapped = args.optionFound("keepNonMapped"); if (keepNonMapped) { @@ -151,6 +153,37 @@ int main(int argc, char *argv[]) Random rndGen(653213); + // For independent decomposition, ensure that distributedTriSurfaceMesh + // can find the alternative decomposeParDict specified via the + // -decomposeParDict option. + if (distType == distributedTriSurfaceMesh::INDEPENDENT) + { + fileName decompDictFile; + args.optionReadIfPresent("decomposeParDict", decompDictFile); + + IOdictionary* dict = new IOdictionary + ( + decompositionModel::selectIO + ( + IOobject + ( + "decomposeParDict", + runTime.system(), + runTime, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ), + decompDictFile + ) + ); + + // The object must have the expected "decomposeParDict" name. + // This also implies that it cannot be changed during the run. + dict->rename("decomposeParDict"); + + runTime.store(dict); + } + // Determine mesh bounding boxes: List<List<treeBoundBox>> meshBb(Pstream::nProcs()); if (distType == distributedTriSurfaceMesh::FOLLOW) diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C index 77ee53eec3faca5161479f055f6b7e55882b3634..5ab933097287d48961903fff47257b4d2290cac8 100644 --- a/src/OpenFOAM/global/argList/argList.C +++ b/src/OpenFOAM/global/argList/argList.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -614,10 +614,29 @@ void Foam::argList::parse // Establish rootPath_/globalCase_/case_ for master getRootCase(); - // See if running distributed (different roots for different procs) - label dictNProcs = -1; - fileName source; + // Establish location of decomposeParDict, allow override with + // the -decomposeParDict option. + fileName source = rootPath_/globalCase_/"system"/"decomposeParDict"; + if (options_.found("decomposeParDict")) + { + bool adjustOpt = false; + source = options_["decomposeParDict"]; + if (isDir(source)) + { + adjustOpt = true; + source = source/"decomposeParDict"; + } + // Could also check for absolute path, but shouldn't be needed + if (adjustOpt) + { + source.clean(); + options_.set("decomposeParDict", source); + } + } + + // If running distributed (different roots for different procs) + label dictNProcs = -1; if (options_.found("roots")) { source = "-roots"; @@ -631,16 +650,8 @@ void Foam::argList::parse } else { - source = rootPath_/globalCase_/"system"/"decomposeParDict"; - // Override with -decomposeParDict - if (options_.found("decomposeParDict")) - { - source = options_["decomposeParDict"]; - if (isDir(source)) - { - source = source/"decomposeParDict"; - } - } + // Use values from decomposeParDict, the location was already + // established above. IFstream decompDictStream(source); diff --git a/src/OpenFOAM/include/setConstantMeshDictionaryIO.H b/src/OpenFOAM/include/setConstantMeshDictionaryIO.H index aa5a68004c27c5e72b6e9d69fd8b795543e273fc..503dff369aa992a8efbfd0821d2965f3435b6fb3 100644 --- a/src/OpenFOAM/include/setConstantMeshDictionaryIO.H +++ b/src/OpenFOAM/include/setConstantMeshDictionaryIO.H @@ -1,7 +1,6 @@ -fileName dictPath = ""; -if (args.optionFound("dict")) +fileName dictPath; +if (args.optionReadIfPresent("dict", dictPath)) { - dictPath = args["dict"]; if (isDir(dictPath)) { dictPath = dictPath / dictName; diff --git a/src/OpenFOAM/include/setSystemMeshDictionaryIO.H b/src/OpenFOAM/include/setSystemMeshDictionaryIO.H index 4d5f2e68ec900c92f33af06385173fc1e487b35b..c4e5a27ae9d3c7df29908720377a40a9683a1713 100644 --- a/src/OpenFOAM/include/setSystemMeshDictionaryIO.H +++ b/src/OpenFOAM/include/setSystemMeshDictionaryIO.H @@ -1,7 +1,6 @@ -fileName dictPath = ""; -if (args.optionFound("dict")) +fileName dictPath; +if (args.optionReadIfPresent("dict", dictPath)) { - dictPath = args["dict"]; if (isDir(dictPath)) { dictPath = dictPath / dictName; diff --git a/src/OpenFOAM/include/setSystemRunTimeDictionaryIO.H b/src/OpenFOAM/include/setSystemRunTimeDictionaryIO.H index ceebb43815ad0d230e221a5b858f74506fa51141..510f278c6087258bb0174da8f7a7a4ab7b42726a 100644 --- a/src/OpenFOAM/include/setSystemRunTimeDictionaryIO.H +++ b/src/OpenFOAM/include/setSystemRunTimeDictionaryIO.H @@ -1,7 +1,6 @@ -fileName dictPath = ""; -if (args.optionFound("dict")) +fileName dictPath; +if (args.optionReadIfPresent("dict", dictPath)) { - dictPath = args["dict"]; if (isDir(dictPath)) { dictPath = dictPath / dictName; diff --git a/tutorials/incompressible/simpleFoam/motorBike/Allrun b/tutorials/incompressible/simpleFoam/motorBike/Allrun index b2bee4f0109859c2569a5ecfa17beacae8045042..f2d7ed6bb0f4d12f52191115084a78f20adc688b 100755 --- a/tutorials/incompressible/simpleFoam/motorBike/Allrun +++ b/tutorials/incompressible/simpleFoam/motorBike/Allrun @@ -4,14 +4,16 @@ cd ${0%/*} || exit 1 # Run from this directory # Source tutorial run functions . $WM_PROJECT_DIR/bin/tools/RunFunctions +decompDict="-decomposeParDict system/decomposeParDict.6" + # copy motorbike surface from resources directory \cp $FOAM_TUTORIALS/resources/geometry/motorBike.obj.gz constant/triSurface/ runApplication surfaceFeatureExtract runApplication blockMesh -runApplication decomposePar -runParallel snappyHexMesh -overwrite +runApplication decomposePar $decompDict +runParallel $decompDict snappyHexMesh -overwrite #- For non-parallel running: - set the initial fields # restore0Dir @@ -19,9 +21,9 @@ runParallel snappyHexMesh -overwrite #- For parallel running: set the initial fields restore0Dir -processor -runParallel patchSummary -runParallel potentialFoam -runParallel $(getApplication) +runParallel $decompDict patchSummary +runParallel $decompDict potentialFoam +runParallel $decompDict $(getApplication) runApplication reconstructParMesh -constant runApplication reconstructPar -latestTime diff --git a/tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict b/tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict.6 similarity index 97% rename from tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict rename to tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict.6 index eb9bb3ad5e9eb308ebcceb21be97e305af2ea724..1f9924aa37b073084371f32b3edbe75f0f0cb1aa 100644 --- a/tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict +++ b/tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict.6 @@ -28,7 +28,7 @@ simpleCoeffs hierarchicalCoeffs { - n (3 2 1); + n (2 2 1); delta 0.001; order xyz; }