ENH: vtkUnstructuredToFoam: construct&write fields. See #3195.
This commit is contained in:
parent
7ec78f6d6d
commit
bb8f7799d9
@ -1,5 +1,7 @@
|
|||||||
EXE_INC = \
|
EXE_INC = \
|
||||||
|
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||||
-I$(LIB_SRC)/fileFormats/lnInclude
|
-I$(LIB_SRC)/fileFormats/lnInclude
|
||||||
|
|
||||||
EXE_LIBS = \
|
EXE_LIBS = \
|
||||||
|
-lfiniteVolume \
|
||||||
-lfileFormats
|
-lfileFormats
|
||||||
|
@ -34,23 +34,84 @@ Description
|
|||||||
Convert legacy VTK file (ascii) containing an unstructured grid
|
Convert legacy VTK file (ascii) containing an unstructured grid
|
||||||
to an OpenFOAM mesh without boundary information.
|
to an OpenFOAM mesh without boundary information.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
\b vtkUnstructuredToFoam \<XXX.vtk\>
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- \par -no-fields
|
||||||
|
Do not attempt to recreate volFields
|
||||||
|
|
||||||
Note
|
Note
|
||||||
The .vtk format does not contain any boundary information.
|
The .vtk format does not contain any boundary information.
|
||||||
It is purely a description of the internal mesh.
|
It is purely a description of the internal mesh. This also limits the
|
||||||
|
usefulness of reconstructing the volFields.
|
||||||
|
|
||||||
Not extensively tested.
|
Not extensively tested.
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "argList.H"
|
#include "argList.H"
|
||||||
#include "Time.H"
|
#include "Time.H"
|
||||||
#include "polyMesh.H"
|
#include "fvMesh.H"
|
||||||
#include "IFstream.H"
|
#include "IFstream.H"
|
||||||
#include "vtkUnstructuredReader.H"
|
#include "vtkUnstructuredReader.H"
|
||||||
|
|
||||||
|
#include "columnFvMesh.H"
|
||||||
|
#include "scalarIOField.H"
|
||||||
|
#include "vectorIOField.H"
|
||||||
|
#include "volFields.H"
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void constructVolFields(fvMesh& mesh, const vtkUnstructuredReader& reader)
|
||||||
|
{
|
||||||
|
const auto fields(reader.cellData().csorted<IOField<Type>>());
|
||||||
|
for (const auto& field : fields)
|
||||||
|
{
|
||||||
|
Info<< "Constructing volField " << field.name() << endl;
|
||||||
|
|
||||||
|
// field is
|
||||||
|
// - cell data followed by
|
||||||
|
// - boundary face data
|
||||||
|
|
||||||
|
|
||||||
|
auto tfld = GeometricField<Type, fvPatchField, volMesh>::New
|
||||||
|
(
|
||||||
|
field.name(),
|
||||||
|
mesh,
|
||||||
|
dimless
|
||||||
|
);
|
||||||
|
auto& fld = tfld.ref();
|
||||||
|
fld.instance() = mesh.time().timeName();
|
||||||
|
fld.writeOpt() = IOobject::AUTO_WRITE;
|
||||||
|
|
||||||
|
// Fill cell values
|
||||||
|
fld.internalFieldRef().field() =
|
||||||
|
UIndirectList<Type>(field, reader.cellMap());
|
||||||
|
|
||||||
|
// Fill boundary values
|
||||||
|
const auto& map = reader.faceMap();
|
||||||
|
if (map.size())
|
||||||
|
{
|
||||||
|
for (auto& pfld : fld.boundaryFieldRef())
|
||||||
|
{
|
||||||
|
const auto& pp = pfld.patch();
|
||||||
|
|
||||||
|
forAll(pfld, i)
|
||||||
|
{
|
||||||
|
const label bFacei = pp.patch().offset()+i;
|
||||||
|
pfld[i] = field[map[bFacei]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
regIOobject::store(std::move(tfld));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@ -61,11 +122,14 @@ int main(int argc, char *argv[])
|
|||||||
);
|
);
|
||||||
|
|
||||||
argList::noParallel();
|
argList::noParallel();
|
||||||
|
argList::addOptionCompat("no-fields", {"noFields", 2106});
|
||||||
argList::addArgument("vtk-file", "The input legacy ascii vtk file");
|
argList::addArgument("vtk-file", "The input legacy ascii vtk file");
|
||||||
|
|
||||||
#include "setRootCase.H"
|
#include "setRootCase.H"
|
||||||
#include "createTime.H"
|
#include "createTime.H"
|
||||||
|
|
||||||
|
const bool doFields = !args.found("no-fields");
|
||||||
|
|
||||||
IFstream mshStream(args.get<fileName>(1));
|
IFstream mshStream(args.get<fileName>(1));
|
||||||
|
|
||||||
vtkUnstructuredReader reader(runTime, mshStream);
|
vtkUnstructuredReader reader(runTime, mshStream);
|
||||||
@ -96,6 +160,24 @@ int main(int argc, char *argv[])
|
|||||||
mesh.removeFiles();
|
mesh.removeFiles();
|
||||||
mesh.write();
|
mesh.write();
|
||||||
|
|
||||||
|
|
||||||
|
if (doFields)
|
||||||
|
{
|
||||||
|
// Re-read mesh as fvMesh so we can have fields
|
||||||
|
Info<< "Re-reading mesh ..." << endl;
|
||||||
|
#include "createMesh.H"
|
||||||
|
|
||||||
|
constructVolFields<scalar>(mesh, reader);
|
||||||
|
constructVolFields<vector>(mesh, reader);
|
||||||
|
constructVolFields<sphericalTensor>(mesh, reader);
|
||||||
|
constructVolFields<symmTensor>(mesh, reader);
|
||||||
|
constructVolFields<tensor>(mesh, reader);
|
||||||
|
|
||||||
|
// No need to write the mesh, only fields
|
||||||
|
mesh.thisDb().write();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Info<< "End\n" << endl;
|
Info<< "End\n" << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user