diff --git a/applications/utilities/finiteArea/makeFaMesh/Make/options b/applications/utilities/finiteArea/makeFaMesh/Make/options index 3300bd23e787d63674acdb5b57a76b2779588a46..7a28b2c4b67d5b655edcd69b39ea0baae8c47e33 100644 --- a/applications/utilities/finiteArea/makeFaMesh/Make/options +++ b/applications/utilities/finiteArea/makeFaMesh/Make/options @@ -1,12 +1,13 @@ EXE_INC = \ -I$(LIB_SRC)/finiteArea/lnInclude \ - -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/fileFormats/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude \ - -I$(LIB_SRC)/cfdTools/general/lnInclude + -I$(LIB_SRC)/parallel/decompose/faDecompose/lnInclude \ + -I$(LIB_SRC)/parallel/reconstruct/faReconstruct/lnInclude EXE_LIBS = \ -lfiniteArea \ - -lfiniteVolume \ -lfileFormats \ - -lmeshTools + -lmeshTools \ + -lfaDecompose \ + -lfaReconstruct diff --git a/applications/utilities/finiteArea/makeFaMesh/decomposeFaFields.H b/applications/utilities/finiteArea/makeFaMesh/decomposeFaFields.H index 23b0c2c1e6f0588e197b774573dd5f0dd94ce4dd..5c38c9b4f13471be875283634693cbfcf3c72fc7 100644 --- a/applications/utilities/finiteArea/makeFaMesh/decomposeFaFields.H +++ b/applications/utilities/finiteArea/makeFaMesh/decomposeFaFields.H @@ -11,13 +11,84 @@ License This file is part of OpenFOAM, distributed under GPL-3.0-or-later. Description - placeholder for decomposing fields + Decompose area fields, when mesh was generated in parallel \*---------------------------------------------------------------------------*/ if (Pstream::parRun()) { -} + faMeshReconstructor reconstructor(areaMesh); + reconstructor.writeAddressing(); + + // Handle area fields + // ------------------ + + PtrList<areaScalarField> areaScalarFields; + PtrList<areaVectorField> areaVectorFields; + PtrList<areaSphericalTensorField> areaSphTensorFields; + PtrList<areaSymmTensorField> areaSymmTensorFields; + PtrList<areaTensorField> areaTensorFields; + + const faMesh& fullMesh = reconstructor.mesh(); + + { + // Use uncollated (or master uncollated) file handler here. + // - each processor is reading in the identical serial fields. + // - nothing should be parallel-coordinated. + + // Similarly, if we write the serial finite-area mesh, this is only + // done from one processor! + + reconstructor.writeMesh(); + + const bool oldDistributed = fileHandler().distributed(); + auto oldHandler = fileHandler(fileOperation::NewUncollated()); + fileHandler().distributed(true); + IOobjectList objects(fullMesh.time(), runTime.timeName()); + + faFieldDecomposer::readFields(fullMesh, objects, areaScalarFields); + faFieldDecomposer::readFields(fullMesh, objects, areaVectorFields); + faFieldDecomposer::readFields(fullMesh, objects, areaSphTensorFields); + faFieldDecomposer::readFields(fullMesh, objects, areaSymmTensorFields); + faFieldDecomposer::readFields(fullMesh, objects, areaTensorFields); + + // Restore old settings + if (oldHandler) + { + fileHandler(std::move(oldHandler)); + } + fileHandler().distributed(oldDistributed); + } + + const label nAreaFields = + ( + areaScalarFields.size() + + areaVectorFields.size() + + areaSphTensorFields.size() + + areaSymmTensorFields.size() + + areaTensorFields.size() + ); + + if (nAreaFields) + { + Info<< "Decomposing " << nAreaFields << " area fields" << nl << endl; + + faFieldDecomposer fieldDecomposer + ( + fullMesh, + areaMesh, + reconstructor.edgeProcAddressing(), + reconstructor.faceProcAddressing(), + reconstructor.boundaryProcAddressing() + ); + + fieldDecomposer.decomposeFields(areaScalarFields); + fieldDecomposer.decomposeFields(areaVectorFields); + fieldDecomposer.decomposeFields(areaSphTensorFields); + fieldDecomposer.decomposeFields(areaSymmTensorFields); + fieldDecomposer.decomposeFields(areaTensorFields); + } +} // ************************************************************************* // diff --git a/applications/utilities/finiteArea/makeFaMesh/faMeshWriteEdgesOBJ.H b/applications/utilities/finiteArea/makeFaMesh/faMeshWriteEdgesOBJ.H new file mode 100644 index 0000000000000000000000000000000000000000..a50d18df3c3e492fe2809b0116b8a3ae77bf83d3 --- /dev/null +++ b/applications/utilities/finiteArea/makeFaMesh/faMeshWriteEdgesOBJ.H @@ -0,0 +1,43 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM, distributed under GPL-3.0-or-later. + +Description + OBJ output of faMesh edges + +\*---------------------------------------------------------------------------*/ + +{ + Info<< "Writing edges in obj format" << endl; + + word outputName("faMesh-edges.obj"); + + if (Pstream::parRun()) + { + outputName = word + ( + "faMesh-edges-" + Foam::name(Pstream::myProcNo()) + ".obj" + ); + } + + OBJstream os(runTime.globalPath()/outputName); + + os.writeQuoted + ( + ("# " + outputName + "\n"), + false + ); + + os.write(areaMesh.patch().edges(), areaMesh.patch().localPoints()); +} + + +// ************************************************************************* // diff --git a/applications/utilities/finiteArea/makeFaMesh/makeFaMesh.C b/applications/utilities/finiteArea/makeFaMesh/makeFaMesh.C index 2751ca31546bc4d52cc2e3dcfcaad5efb208b770..e80ed303d9f65195f5d0e59b1a3b1eff77d0c1e8 100644 --- a/applications/utilities/finiteArea/makeFaMesh/makeFaMesh.C +++ b/applications/utilities/finiteArea/makeFaMesh/makeFaMesh.C @@ -29,6 +29,8 @@ Application Description A mesh generator for finiteArea mesh. + When called in parallel, it will also try to act like decomposePar, + create procAddressing and decompose serial finite-area fields. Author Zeljko Tukovic, FAMENA @@ -36,15 +38,17 @@ Author \*---------------------------------------------------------------------------*/ -#include "objectRegistry.H" #include "Time.H" #include "argList.H" #include "OSspecific.H" #include "faMesh.H" -#include "fvMesh.H" #include "IOdictionary.H" -#include "globalIndex.H" -#include "globalMeshData.H" +#include "IOobjectList.H" + +#include "areaFields.H" +#include "faFieldDecomposer.H" +#include "faMeshReconstructor.H" +#include "OBJstream.H" using namespace Foam; @@ -65,10 +69,17 @@ int main(int argc, char *argv[]) ); argList::addOption("dict", "file", "Alternative faMeshDefinition"); + argList::addBoolOption + ( + "write-edges-obj", + "Write mesh edges as obj files and exit", + false // could make an advanced option + ); + #include "addRegionOption.H" #include "setRootCase.H" #include "createTime.H" - #include "createNamedMesh.H" + #include "createNamedPolyMesh.H" // Reading faMeshDefinition dictionary #include "findMeshDefinitionDict.H" @@ -80,12 +91,29 @@ int main(int argc, char *argv[]) meshDefDict.add("emptyPatch", patchName, true); } - // Creation + // Create faMesh areaMesh(mesh, meshDefDict); - // Writing faMesh - Info << "Write finite area mesh ... "; + bool quickExit = false; + + if (args.found("write-edges-obj")) + { + quickExit = true; + #include "faMeshWriteEdgesOBJ.H" + } + + if (quickExit) + { + Info<< "\nEnd\n" << endl; + return 0; + } + + // Set the precision of the points data to 10 + IOstream::defaultPrecision(10); + + Info<< nl << "Write finite area mesh." << nl; areaMesh.write(); + Info<< endl; #include "decomposeFaFields.H"