mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
surfMesh code refactoring
This commit is contained in:
@ -6,6 +6,7 @@ MeshedSurface/MeshedSurfaces.C
|
||||
UnsortedMeshedSurface/UnsortedMeshedSurfaces.C
|
||||
|
||||
surfaceFormats = surfaceFormats
|
||||
$(surfaceFormats)/surfaceFormatsCore.C
|
||||
$(surfaceFormats)/ac3d/AC3DsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/ftr/FTRsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/gts/GTSsurfaceFormatRunTime.C
|
||||
|
||||
@ -41,122 +41,28 @@ License
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
// File extension for 'native' raw format
|
||||
#undef nativeSurfaceExt
|
||||
#define nativeSurfaceExt "ofs"
|
||||
|
||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
Foam::fileName Foam::MeshedSurface<Face>::triSurfInstance(const Time& d)
|
||||
{
|
||||
fileName foamName(d.caseName() + "." + nativeSurfaceExt);
|
||||
|
||||
// Search back through the time directories list to find the time
|
||||
// closest to and lower than current time
|
||||
|
||||
instantList ts = d.times();
|
||||
label i;
|
||||
|
||||
for (i=ts.size()-1; i>=0; i--)
|
||||
{
|
||||
if (ts[i].value() <= d.timeOutputValue())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Noting that the current directory has already been searched
|
||||
// for mesh data, start searching from the previously stored time directory
|
||||
|
||||
if (i>=0)
|
||||
{
|
||||
for (label j=i; j>=0; j--)
|
||||
{
|
||||
if (file(d.path()/ts[j].name()/typeName/foamName))
|
||||
{
|
||||
if (debug)
|
||||
{
|
||||
Pout<< " MeshedSurface::triSurfInstance(const Time& d)"
|
||||
<< "reading " << foamName
|
||||
<< " from " << ts[j].name()/typeName
|
||||
<< endl;
|
||||
}
|
||||
|
||||
return ts[j].name();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Pout<< " MeshedSurface::triSurfInstance(const Time& d)"
|
||||
<< "reading " << foamName
|
||||
<< " from constant/" << endl;
|
||||
}
|
||||
|
||||
return "constant";
|
||||
return triSurfInstance(d, typeName);
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
Foam::fileName Foam::MeshedSurface<Face>::triSurfName(const Time& d)
|
||||
{
|
||||
fileName foamName(d.caseName() + "." + nativeSurfaceExt);
|
||||
|
||||
// Search back through the time directories list to find the time
|
||||
// closest to and lower than current time
|
||||
|
||||
instantList ts = d.times();
|
||||
label i;
|
||||
|
||||
for (i=ts.size()-1; i>=0; i--)
|
||||
{
|
||||
if (ts[i].value() <= d.timeOutputValue())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Noting that the current directory has already been searched
|
||||
// for mesh data, start searching from the previously stored time directory
|
||||
|
||||
if (i>=0)
|
||||
{
|
||||
for (label j=i; j>=0; j--)
|
||||
{
|
||||
fileName testName(d.path()/ts[j].name()/typeName/foamName);
|
||||
|
||||
if (file(testName))
|
||||
{
|
||||
if (debug)
|
||||
{
|
||||
Pout<< " MeshedSurface::triSurfName(const Time& d)"
|
||||
<< "reading " << foamName
|
||||
<< " from " << ts[j].name()/typeName
|
||||
<< endl;
|
||||
}
|
||||
|
||||
return testName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Pout<< " MeshedSurface::triSurfName(const Time& d)"
|
||||
<< "reading " << foamName
|
||||
<< " from constant/" << endl;
|
||||
}
|
||||
|
||||
return d.path()/"constant"/typeName/foamName;
|
||||
return triSurfName(d, typeName);
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
bool Foam::MeshedSurface<Face>::canRead(const word& ext, const bool verbose)
|
||||
{
|
||||
// handle 'native' format directly
|
||||
if (ext == nativeSurfaceExt)
|
||||
if (isNative(ext))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -178,7 +84,7 @@ bool Foam::MeshedSurface<Face>::canWrite(const word& ext, const bool verbose)
|
||||
}
|
||||
|
||||
// handle 'native' format directly
|
||||
if (fExt == nativeSurfaceExt)
|
||||
if (isNative(fExt))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -197,7 +103,7 @@ bool Foam::MeshedSurface<Face>::canWrite(const word& ext, const bool verbose)
|
||||
|
||||
Info<<"Unknown file extension for writing: " << fExt << nl;
|
||||
// compact output:
|
||||
Info<<"Valid types: ( " << nativeSurfaceExt;
|
||||
Info<<"Valid types: ( " << nativeExt;
|
||||
forAll(known, i)
|
||||
{
|
||||
Info<<" " << known[i];
|
||||
@ -229,7 +135,7 @@ void Foam::MeshedSurface<Face>::write
|
||||
const word ext = fName.ext();
|
||||
|
||||
// handle 'native' format directly
|
||||
if (ext == nativeSurfaceExt)
|
||||
if (isNative(ext))
|
||||
{
|
||||
surf.write(OFstream(fName)());
|
||||
return;
|
||||
@ -899,7 +805,7 @@ bool Foam::MeshedSurface<Face>::read
|
||||
const word ext = fName.ext();
|
||||
|
||||
// handle 'native' format directly
|
||||
if (ext == nativeSurfaceExt)
|
||||
if (isNative(ext))
|
||||
{
|
||||
return read(IFstream(fName)());
|
||||
}
|
||||
@ -923,7 +829,7 @@ bool Foam::MeshedSurface<Face>::read
|
||||
clear();
|
||||
|
||||
// handle 'native' format directly
|
||||
if (ext == nativeSurfaceExt)
|
||||
if (isNative(ext))
|
||||
{
|
||||
return read(IFstream(fName)());
|
||||
}
|
||||
@ -975,6 +881,4 @@ void Foam::MeshedSurface<Face>::operator=(const MeshedSurface& surf)
|
||||
#include "MeshedSurfaceIO.C"
|
||||
#include "MeshedSurfaceNew.C"
|
||||
|
||||
#undef nativeSurfaceExt
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -48,6 +48,7 @@ SourceFiles
|
||||
#include "PrimitivePatchExtra.H"
|
||||
#include "boolList.H"
|
||||
#include "surfGroupList.H"
|
||||
#include "surfaceFormatsCore.H"
|
||||
#include "xfer.H"
|
||||
#include "face.H"
|
||||
#include "triFace.H"
|
||||
@ -78,7 +79,8 @@ template<class Face>
|
||||
template<class Face>
|
||||
class MeshedSurface
|
||||
:
|
||||
public PrimitivePatchExtra<Face, ::Foam::List, pointField, point>
|
||||
public PrimitivePatchExtra<Face, ::Foam::List, pointField, point>,
|
||||
public fileFormats::surfaceFormatsCore
|
||||
{
|
||||
friend class UnsortedMeshedSurface<Face>;
|
||||
|
||||
|
||||
@ -37,128 +37,19 @@ License
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
// File extension for 'native' raw format
|
||||
#undef nativeSurfaceExt
|
||||
#define nativeSurfaceExt "ofs"
|
||||
|
||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
Foam::string Foam::UnsortedMeshedSurface<Face>::getLineNoComment(IFstream& is)
|
||||
{
|
||||
string line;
|
||||
do
|
||||
{
|
||||
is.getLine(line);
|
||||
}
|
||||
while ((line.size() == 0 || line[0] == '#') && is.good());
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
template<class Face>
|
||||
Foam::fileName Foam::UnsortedMeshedSurface<Face>::triSurfInstance(const Time& d)
|
||||
{
|
||||
fileName foamName(d.caseName() + "." + nativeSurfaceExt);
|
||||
|
||||
// Search back through the time directories list to find the time
|
||||
// closest to and lower than current time
|
||||
|
||||
instantList ts = d.times();
|
||||
label i;
|
||||
|
||||
for (i=ts.size()-1; i>=0; i--)
|
||||
{
|
||||
if (ts[i].value() <= d.timeOutputValue())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Noting that the current directory has already been searched
|
||||
// for mesh data, start searching from the previously stored time directory
|
||||
|
||||
if (i>=0)
|
||||
{
|
||||
for (label j=i; j>=0; j--)
|
||||
{
|
||||
if (file(d.path()/ts[j].name()/typeName/foamName))
|
||||
{
|
||||
if (debug)
|
||||
{
|
||||
Pout<< " UnsortedMeshedSurface::triSurfInstance(const Time& d)"
|
||||
<< "reading " << foamName
|
||||
<< " from " << ts[j].name()/typeName
|
||||
<< endl;
|
||||
}
|
||||
|
||||
return ts[j].name();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Pout<< " UnsortedMeshedSurface::triSurfInstance(const Time& d)"
|
||||
<< "reading " << foamName
|
||||
<< " from constant/" << endl;
|
||||
}
|
||||
|
||||
return "constant";
|
||||
return triSurfInstance(d, typeName);
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
Foam::fileName Foam::UnsortedMeshedSurface<Face>::triSurfName(const Time& d)
|
||||
{
|
||||
fileName foamName(d.caseName() + "." + nativeSurfaceExt);
|
||||
|
||||
// Search back through the time directories list to find the time
|
||||
// closest to and lower than current time
|
||||
|
||||
instantList ts = d.times();
|
||||
label i;
|
||||
|
||||
for (i=ts.size()-1; i>=0; i--)
|
||||
{
|
||||
if (ts[i].value() <= d.timeOutputValue())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Noting that the current directory has already been searched
|
||||
// for mesh data, start searching from the previously stored time directory
|
||||
|
||||
if (i>=0)
|
||||
{
|
||||
for (label j=i; j>=0; j--)
|
||||
{
|
||||
fileName testName(d.path()/ts[j].name()/typeName/foamName);
|
||||
|
||||
if (file(testName))
|
||||
{
|
||||
if (debug)
|
||||
{
|
||||
Pout<< " UnsortedMeshedSurface::triSurfName(const Time& d)"
|
||||
<< "reading " << foamName
|
||||
<< " from " << ts[j].name()/typeName
|
||||
<< endl;
|
||||
}
|
||||
|
||||
return testName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Pout<< " UnsortedMeshedSurface::triSurfName(const Time& d)"
|
||||
<< "reading " << foamName
|
||||
<< " from constant/" << endl;
|
||||
}
|
||||
|
||||
return d.path()/"constant"/typeName/foamName;
|
||||
return triSurfName(d, typeName);
|
||||
}
|
||||
|
||||
|
||||
@ -179,7 +70,7 @@ bool Foam::UnsortedMeshedSurface<Face>::canRead
|
||||
}
|
||||
|
||||
// handle 'native' format directly
|
||||
if (fExt == nativeSurfaceExt)
|
||||
if (isNative(fExt))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -199,7 +90,7 @@ bool Foam::UnsortedMeshedSurface<Face>::canRead
|
||||
|
||||
Info<<"Unknown file extension for reading: " << fExt << nl;
|
||||
// compact output:
|
||||
Info<<"Valid types: ( " << nativeSurfaceExt;
|
||||
Info<<"Valid types: ( " << nativeExt;
|
||||
forAll(known, i)
|
||||
{
|
||||
Info<<" " << known[i];
|
||||
@ -230,7 +121,7 @@ bool Foam::UnsortedMeshedSurface<Face>::canWrite
|
||||
}
|
||||
|
||||
// handle 'native' format directly
|
||||
if (fExt == nativeSurfaceExt)
|
||||
if (isNative(fExt))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -249,7 +140,7 @@ bool Foam::UnsortedMeshedSurface<Face>::canWrite
|
||||
|
||||
Info<<"Unknown file extension for writing: " << fExt << nl;
|
||||
// compact output:
|
||||
Info<<"Valid types: ( " << nativeSurfaceExt;
|
||||
Info<<"Valid types: ( " << nativeExt;
|
||||
forAll(known, i)
|
||||
{
|
||||
Info<<" " << known[i];
|
||||
@ -281,7 +172,7 @@ void Foam::UnsortedMeshedSurface<Face>::write
|
||||
const word ext = fName.ext();
|
||||
|
||||
// handle 'native' format directly
|
||||
if (ext == nativeSurfaceExt)
|
||||
if (isNative(ext))
|
||||
{
|
||||
surf.write(OFstream(fName)());
|
||||
return;
|
||||
@ -306,92 +197,6 @@ void Foam::UnsortedMeshedSurface<Face>::write
|
||||
}
|
||||
|
||||
|
||||
// Returns patch info.
|
||||
// Sets faceMap to the indexing according to patch numbers.
|
||||
// Patch numbers start at 0.
|
||||
template<class Face>
|
||||
Foam::surfGroupList Foam::UnsortedMeshedSurface<Face>::sortedRegions
|
||||
(
|
||||
const UList<label>& regionLst,
|
||||
const Map<word>& patchNames,
|
||||
labelList& faceMap
|
||||
)
|
||||
{
|
||||
// determine sort order according to region numbers
|
||||
|
||||
// std::sort() really seems to mix up the order.
|
||||
// and std::stable_sort() might take too long / too much memory
|
||||
|
||||
// Assuming that we have relatively fewer regions compared to the
|
||||
// number of items, just do it ourselves
|
||||
|
||||
// step 1: get region sizes and store (regionId => patchI)
|
||||
Map<label> regionLookup;
|
||||
forAll(regionLst, faceI)
|
||||
{
|
||||
const label regId = regionLst[faceI];
|
||||
|
||||
Map<label>::iterator iter = regionLookup.find(regId);
|
||||
if (iter == regionLookup.end())
|
||||
{
|
||||
regionLookup.insert(regId, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
iter()++;
|
||||
}
|
||||
}
|
||||
|
||||
// step 2: assign start/size (and name) to the newPatches
|
||||
// re-use the lookup to map (regionId => patchI)
|
||||
surfGroupList patchLst(regionLookup.size());
|
||||
label patchStart = 0;
|
||||
label patchI = 0;
|
||||
forAllIter(Map<label>, regionLookup, iter)
|
||||
{
|
||||
label regId = iter.key();
|
||||
|
||||
word patchName;
|
||||
Map<word>::const_iterator iter2 = patchNames.find(regId);
|
||||
if (iter2 == patchNames.end())
|
||||
{
|
||||
patchName = word("patch") + ::Foam::name(patchI);
|
||||
}
|
||||
else
|
||||
{
|
||||
patchName = iter2();
|
||||
}
|
||||
|
||||
patchLst[patchI] = surfGroup
|
||||
(
|
||||
patchName,
|
||||
0, // initialize with zero size
|
||||
patchStart,
|
||||
patchI
|
||||
);
|
||||
|
||||
// increment the start for the next patch
|
||||
// and save the (regionId => patchI) mapping
|
||||
patchStart += iter();
|
||||
iter() = patchI++;
|
||||
}
|
||||
|
||||
|
||||
// step 3: build the re-ordering
|
||||
faceMap.setSize(regionLst.size());
|
||||
|
||||
forAll(regionLst, faceI)
|
||||
{
|
||||
label patchI = regionLookup[regionLst[faceI]];
|
||||
|
||||
faceMap[faceI] = patchLst[patchI].start() + patchLst[patchI].size()++;
|
||||
}
|
||||
|
||||
// with reordered faces registered in faceMap
|
||||
return patchLst;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
@ -835,7 +640,7 @@ Foam::surfGroupList Foam::UnsortedMeshedSurface<Face>::sortedRegions
|
||||
patchNames.insert(patchI, patches_[patchI].name());
|
||||
}
|
||||
|
||||
return sortedRegions(regions_, patchNames, faceMap);
|
||||
return sortedPatchRegions(regions_, patchNames, faceMap);
|
||||
}
|
||||
|
||||
|
||||
@ -985,7 +790,7 @@ bool Foam::UnsortedMeshedSurface<Face>::read
|
||||
const word ext = fName.ext();
|
||||
|
||||
// handle 'native' format directly
|
||||
if (ext == nativeSurfaceExt)
|
||||
if (isNative(ext))
|
||||
{
|
||||
return read(IFstream(fName)());
|
||||
}
|
||||
@ -1009,7 +814,7 @@ bool Foam::UnsortedMeshedSurface<Face>::read
|
||||
clear();
|
||||
|
||||
// handle 'native' format directly
|
||||
if (ext == nativeSurfaceExt)
|
||||
if (isNative(ext))
|
||||
{
|
||||
return read(IFstream(fName)());
|
||||
}
|
||||
@ -1065,6 +870,4 @@ void Foam::UnsortedMeshedSurface<Face>::operator=
|
||||
#include "UnsortedMeshedSurfaceIO.C"
|
||||
#include "UnsortedMeshedSurfaceNew.C"
|
||||
|
||||
#undef nativeSurfaceExt
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -52,6 +52,7 @@ SourceFiles
|
||||
#include "boolList.H"
|
||||
#include "surfPatchIdentifierList.H"
|
||||
#include "surfGroupList.H"
|
||||
#include "surfaceFormatsCore.H"
|
||||
#include "xfer.H"
|
||||
#include "face.H"
|
||||
#include "triFace.H"
|
||||
@ -83,7 +84,8 @@ template<class Face>
|
||||
template<class Face>
|
||||
class UnsortedMeshedSurface
|
||||
:
|
||||
public PrimitivePatchExtra<Face, ::Foam::List, pointField, point>
|
||||
public PrimitivePatchExtra<Face, ::Foam::List, pointField, point>,
|
||||
public fileFormats::surfaceFormatsCore
|
||||
{
|
||||
friend class MeshedSurface<Face>;
|
||||
|
||||
@ -128,10 +130,6 @@ protected:
|
||||
|
||||
// Static protected functions
|
||||
|
||||
//- Read non-comment line
|
||||
static string getLineNoComment(IFstream&);
|
||||
|
||||
|
||||
// Protected Member functions
|
||||
|
||||
//- Sets default patch names based on the maximum patch number
|
||||
@ -187,15 +185,6 @@ public:
|
||||
//- Can we write this file format?
|
||||
static bool canWrite(const word& ext, const bool verbose=false);
|
||||
|
||||
//- Determine the sort order from the region list.
|
||||
// Returns patch list and sets faceMap to indices within faceLst
|
||||
static surfGroupList sortedRegions
|
||||
(
|
||||
const UList<label>& regionLst,
|
||||
const Map<word>& patchNames,
|
||||
labelList& faceMap
|
||||
);
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
|
||||
@ -35,147 +35,6 @@ License
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
template<class Type>
|
||||
Type Foam::fileFormats::AC3DsurfaceFormat<Face>::parse(const string& str)
|
||||
{
|
||||
IStringStream ss(str);
|
||||
|
||||
Type t;
|
||||
ss >> t;
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
bool Foam::fileFormats::AC3DsurfaceFormat<Face>::readCmd
|
||||
(
|
||||
IFstream& is,
|
||||
string& cmd,
|
||||
string& args
|
||||
)
|
||||
{
|
||||
if (is.good())
|
||||
{
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
string::size_type space = line.find(' ');
|
||||
|
||||
if (space != string::npos)
|
||||
{
|
||||
cmd = line.substr(0, space);
|
||||
args = line.substr(space+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Read up to line starting with cmd. Sets args to rest of line.
|
||||
// Returns true if found, false if stream is not good anymore.
|
||||
template<class Face>
|
||||
bool Foam::fileFormats::AC3DsurfaceFormat<Face>::cueTo
|
||||
(
|
||||
IFstream& is,
|
||||
const string& cmd,
|
||||
string& args
|
||||
)
|
||||
{
|
||||
while (is.good())
|
||||
{
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
string::size_type space = line.find(' ');
|
||||
|
||||
if (space != string::npos)
|
||||
{
|
||||
if (line.substr(0, space) == cmd)
|
||||
{
|
||||
args = line.substr(space+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Similar to cueTo(), but throws error if cmd not found
|
||||
template<class Face>
|
||||
Foam::string Foam::fileFormats::AC3DsurfaceFormat<Face>::cueToOrDie
|
||||
(
|
||||
IFstream& is,
|
||||
const string& cmd,
|
||||
const string& errorMsg
|
||||
)
|
||||
{
|
||||
string args;
|
||||
if (!cueTo(is, cmd, args))
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"fileFormats::AC3DsurfaceFormat::read(const fileName&)"
|
||||
)
|
||||
<< "Cannot find command " << cmd
|
||||
<< " " << errorMsg
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
void Foam::fileFormats::AC3DsurfaceFormat<Face>::writeHeader
|
||||
(
|
||||
Ostream& os,
|
||||
const List<surfGroup>& patchLst
|
||||
)
|
||||
{
|
||||
// Write with patches as separate objects under "world" object.
|
||||
// Header is taken over from sample file.
|
||||
// Defines separate materials for all patches. Recycle colours.
|
||||
|
||||
// Define 8 standard colours as r,g,b components
|
||||
static scalar colourMap[] =
|
||||
{
|
||||
1, 1, 1,
|
||||
1, 0, 0,
|
||||
0, 1, 0,
|
||||
0, 0, 1,
|
||||
1, 1, 0,
|
||||
0, 1, 1,
|
||||
1, 0, 1,
|
||||
0.5, 0.5, 1
|
||||
};
|
||||
|
||||
// Write header. Define materials.
|
||||
os << "AC3Db" << nl;
|
||||
|
||||
forAll(patchLst, patchI)
|
||||
{
|
||||
const word& pName = patchLst[patchI].name();
|
||||
|
||||
label colourI = patchI % 8;
|
||||
label colourCompI = 3 * colourI;
|
||||
|
||||
os << "MATERIAL \"" << pName << "Mat\" rgb "
|
||||
<< colourMap[colourCompI] << ' ' << colourMap[colourCompI+1]
|
||||
<< ' ' << colourMap[colourCompI+2]
|
||||
<< " amb 0.2 0.2 0.2 emis 0 0 0 spec 0.5 0.5 0.5 shi 10"
|
||||
<< " trans 0"
|
||||
<< nl;
|
||||
}
|
||||
|
||||
os << "OBJECT world" << nl
|
||||
<< "kids " << patchLst.size() << endl;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@ Note
|
||||
optimized for this, but at expense of losing a common reading approach.
|
||||
|
||||
SourceFiles
|
||||
AC3DfileFormat.C
|
||||
AC3DsurfaceFormat.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
@ -46,6 +46,7 @@ SourceFiles
|
||||
#include "OFstream.H"
|
||||
#include "MeshedSurface.H"
|
||||
#include "UnsortedMeshedSurface.H"
|
||||
#include "AC3DsurfaceFormatCore.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -61,7 +62,8 @@ namespace fileFormats
|
||||
template<class Face>
|
||||
class AC3DsurfaceFormat
|
||||
:
|
||||
public UnsortedMeshedSurface<Face>
|
||||
public UnsortedMeshedSurface<Face>,
|
||||
public AC3DsurfaceFormatCore
|
||||
{
|
||||
//- Private typedefs for convenience
|
||||
typedef AC3DsurfaceFormat<Face> ThisType;
|
||||
@ -69,28 +71,6 @@ class AC3DsurfaceFormat
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Read a type via IStringStream
|
||||
template<class Type>
|
||||
static Type parse(const string&);
|
||||
|
||||
//- Read cmd, args from IFstream
|
||||
static bool readCmd(IFstream&, string& cmd, string& args);
|
||||
|
||||
//- Cue up to cmd, reading args
|
||||
static bool cueTo(IFstream&, const string& cmd, string& args);
|
||||
|
||||
//- Cue up to cmd, reading args or exit with a FatalError
|
||||
// returns the command args
|
||||
static string cueToOrDie
|
||||
(
|
||||
IFstream&,
|
||||
const string& cmd,
|
||||
const string& errorMsg=string::null
|
||||
);
|
||||
|
||||
//- Write header with materials
|
||||
static void writeHeader(Ostream&, const List<surfGroup>&);
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
AC3DsurfaceFormat(const AC3DsurfaceFormat<Face>&);
|
||||
|
||||
|
||||
174
src/surfMesh/surfaceFormats/ac3d/AC3DsurfaceFormatCore.C
Normal file
174
src/surfMesh/surfaceFormats/ac3d/AC3DsurfaceFormatCore.C
Normal file
@ -0,0 +1,174 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "AC3DsurfaceFormatCore.H"
|
||||
#include "clock.H"
|
||||
#include "IFstream.H"
|
||||
#include "IStringStream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
template<class Type>
|
||||
Type Foam::fileFormats::AC3DsurfaceFormatCore::parse(const string& str)
|
||||
{
|
||||
IStringStream ss(str);
|
||||
|
||||
Type t;
|
||||
ss >> t;
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
bool Foam::fileFormats::AC3DsurfaceFormatCore::readCmd
|
||||
(
|
||||
IFstream& is,
|
||||
string& cmd,
|
||||
string& args
|
||||
)
|
||||
{
|
||||
if (is.good())
|
||||
{
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
string::size_type space = line.find(' ');
|
||||
|
||||
if (space != string::npos)
|
||||
{
|
||||
cmd = line.substr(0, space);
|
||||
args = line.substr(space+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Read up to line starting with cmd. Sets args to rest of line.
|
||||
// Returns true if found, false if stream is not good anymore.
|
||||
bool Foam::fileFormats::AC3DsurfaceFormatCore::cueTo
|
||||
(
|
||||
IFstream& is,
|
||||
const string& cmd,
|
||||
string& args
|
||||
)
|
||||
{
|
||||
while (is.good())
|
||||
{
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
string::size_type space = line.find(' ');
|
||||
|
||||
if (space != string::npos)
|
||||
{
|
||||
if (line.substr(0, space) == cmd)
|
||||
{
|
||||
args = line.substr(space+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Similar to cueTo(), but throws error if cmd not found
|
||||
Foam::string Foam::fileFormats::AC3DsurfaceFormatCore::cueToOrDie
|
||||
(
|
||||
IFstream& is,
|
||||
const string& cmd,
|
||||
const string& errorMsg
|
||||
)
|
||||
{
|
||||
string args;
|
||||
if (!cueTo(is, cmd, args))
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"fileFormats::AC3DsurfaceFormat::read(const fileName&)"
|
||||
)
|
||||
<< "Cannot find command " << cmd
|
||||
<< " " << errorMsg
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
|
||||
void Foam::fileFormats::AC3DsurfaceFormatCore::writeHeader
|
||||
(
|
||||
Ostream& os,
|
||||
const List<surfGroup>& patchLst
|
||||
)
|
||||
{
|
||||
// Write with patches as separate objects under "world" object.
|
||||
// Header is taken over from sample file.
|
||||
// Defines separate materials for all patches. Recycle colours.
|
||||
|
||||
// Define 8 standard colours as r,g,b components
|
||||
static scalar colourMap[] =
|
||||
{
|
||||
1, 1, 1,
|
||||
1, 0, 0,
|
||||
0, 1, 0,
|
||||
0, 0, 1,
|
||||
1, 1, 0,
|
||||
0, 1, 1,
|
||||
1, 0, 1,
|
||||
0.5, 0.5, 1
|
||||
};
|
||||
|
||||
// Write header. Define materials.
|
||||
os << "AC3Db" << nl;
|
||||
|
||||
forAll(patchLst, patchI)
|
||||
{
|
||||
const word& pName = patchLst[patchI].name();
|
||||
|
||||
label colourI = patchI % 8;
|
||||
label colourCompI = 3 * colourI;
|
||||
|
||||
os << "MATERIAL \"" << pName << "Mat\" rgb "
|
||||
<< colourMap[colourCompI] << ' ' << colourMap[colourCompI+1]
|
||||
<< ' ' << colourMap[colourCompI+2]
|
||||
<< " amb 0.2 0.2 0.2 emis 0 0 0 spec 0.5 0.5 0.5 shi 10"
|
||||
<< " trans 0"
|
||||
<< nl;
|
||||
}
|
||||
|
||||
os << "OBJECT world" << nl
|
||||
<< "kids " << patchLst.size() << endl;
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
// ************************************************************************* //
|
||||
111
src/surfMesh/surfaceFormats/ac3d/AC3DsurfaceFormatCore.H
Normal file
111
src/surfMesh/surfaceFormats/ac3d/AC3DsurfaceFormatCore.H
Normal file
@ -0,0 +1,111 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Class
|
||||
Foam::fileFormats::AC3DsurfaceFormatCore
|
||||
|
||||
Description
|
||||
Internal class used by the AC3DsurfaceFormat
|
||||
|
||||
SourceFiles
|
||||
AC3DsurfaceFormatCore.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef AC3DsurfaceFormatCore_H
|
||||
#define AC3DsurfaceFormatCore_H
|
||||
|
||||
#include "Ostream.H"
|
||||
#include "OFstream.H"
|
||||
#include "MeshedSurface.H"
|
||||
#include "UnsortedMeshedSurface.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class AC3DfileFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class AC3DsurfaceFormatCore
|
||||
{
|
||||
protected:
|
||||
// Protected Member Functions
|
||||
|
||||
//- Read a type via IStringStream
|
||||
template<class Type>
|
||||
static Type parse(const string&);
|
||||
|
||||
//- Read cmd, args from IFstream
|
||||
static bool readCmd(IFstream&, string& cmd, string& args);
|
||||
|
||||
//- Cue up to cmd, reading args
|
||||
static bool cueTo(IFstream&, const string& cmd, string& args);
|
||||
|
||||
//- Cue up to cmd, reading args or exit with a FatalError
|
||||
// returns the command args
|
||||
static string cueToOrDie
|
||||
(
|
||||
IFstream&,
|
||||
const string& cmd,
|
||||
const string& errorMsg=string::null
|
||||
);
|
||||
|
||||
//- Write header with materials
|
||||
static void writeHeader(Ostream&, const List<surfGroup>&);
|
||||
|
||||
public:
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
AC3DsurfaceFormatCore()
|
||||
{}
|
||||
|
||||
// Destructor
|
||||
|
||||
~AC3DsurfaceFormatCore()
|
||||
{}
|
||||
|
||||
// Member Functions
|
||||
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace fileFormats
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -49,7 +49,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class GTSsurfaceFormat Declaration
|
||||
Class GTSsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
|
||||
@ -33,32 +33,6 @@ License
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
|
||||
// Do weird things to extract number
|
||||
template<class Face>
|
||||
Foam::scalar Foam::fileFormats::NASsurfaceFormat<Face>::parseNASCoord
|
||||
(
|
||||
const string& s
|
||||
)
|
||||
{
|
||||
size_t expSign = s.find_last_of("+-");
|
||||
|
||||
if (expSign != string::npos && expSign > 0 && !isspace(s[expSign-1]))
|
||||
{
|
||||
scalar mantissa = readScalar(IStringStream(s.substr(0, expSign))());
|
||||
scalar exponent = readScalar(IStringStream(s.substr(expSign+1))());
|
||||
|
||||
if (s[expSign] == '-')
|
||||
{
|
||||
exponent = -exponent;
|
||||
}
|
||||
return mantissa*pow(10, exponent);
|
||||
}
|
||||
else
|
||||
{
|
||||
return readScalar(IStringStream(s)());
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
|
||||
@ -48,6 +48,7 @@ SourceFiles
|
||||
#include "OFstream.H"
|
||||
#include "MeshedSurface.H"
|
||||
#include "UnsortedMeshedSurface.H"
|
||||
#include "NASsurfaceFormatCore.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -63,7 +64,8 @@ namespace fileFormats
|
||||
template<class Face>
|
||||
class NASsurfaceFormat
|
||||
:
|
||||
public UnsortedMeshedSurface<Face>
|
||||
public UnsortedMeshedSurface<Face>,
|
||||
public NASsurfaceFormatCore
|
||||
{
|
||||
//- Private typedefs for convenience
|
||||
typedef NASsurfaceFormat<Face> ThisType;
|
||||
@ -71,9 +73,6 @@ class NASsurfaceFormat
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Do weird things to extract number
|
||||
static scalar parseNASCoord(const string&);
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
NASsurfaceFormat(const NASsurfaceFormat<Face>&);
|
||||
|
||||
|
||||
63
src/surfMesh/surfaceFormats/nas/NASsurfaceFormatCore.C
Normal file
63
src/surfMesh/surfaceFormats/nas/NASsurfaceFormatCore.C
Normal file
@ -0,0 +1,63 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "NASsurfaceFormatCore.H"
|
||||
#include "IFstream.H"
|
||||
#include "IStringStream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
// Do weird things to extract number
|
||||
Foam::scalar Foam::fileFormats::NASsurfaceFormatCore::parseNASCoord
|
||||
(
|
||||
const string& s
|
||||
)
|
||||
{
|
||||
size_t expSign = s.find_last_of("+-");
|
||||
|
||||
if (expSign != string::npos && expSign > 0 && !isspace(s[expSign-1]))
|
||||
{
|
||||
scalar mantissa = readScalar(IStringStream(s.substr(0, expSign))());
|
||||
scalar exponent = readScalar(IStringStream(s.substr(expSign+1))());
|
||||
|
||||
if (s[expSign] == '-')
|
||||
{
|
||||
exponent = -exponent;
|
||||
}
|
||||
return mantissa*pow(10, exponent);
|
||||
}
|
||||
else
|
||||
{
|
||||
return readScalar(IStringStream(s)());
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
89
src/surfMesh/surfaceFormats/nas/NASsurfaceFormatCore.H
Normal file
89
src/surfMesh/surfaceFormats/nas/NASsurfaceFormatCore.H
Normal file
@ -0,0 +1,89 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Class
|
||||
Foam::fileFormats::NASsurfaceFormatCore
|
||||
|
||||
Description
|
||||
Internal class used by the NASsurfaceFormat
|
||||
|
||||
SourceFiles
|
||||
NASsurfaceFormatCore.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef NASsurfaceFormatCore_H
|
||||
#define NASsurfaceFormatCore_H
|
||||
|
||||
#include "Ostream.H"
|
||||
#include "OFstream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class NASsurfaceFormatCore Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class NASsurfaceFormatCore
|
||||
{
|
||||
protected:
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Do weird things to extract number
|
||||
static scalar parseNASCoord(const string&);
|
||||
|
||||
public:
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
NASsurfaceFormatCore()
|
||||
{}
|
||||
|
||||
// Destructor
|
||||
|
||||
~NASsurfaceFormatCore()
|
||||
{}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace fileFormats
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -39,7 +39,7 @@ Note
|
||||
When writing, it is set to the region number (integer).
|
||||
|
||||
SourceFiles
|
||||
OFFfileFormat.C
|
||||
OFFsurfaceFormat.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
@ -108,6 +108,7 @@ public:
|
||||
);
|
||||
|
||||
// Destructor
|
||||
|
||||
~STLsurfaceFormatCore();
|
||||
|
||||
// Member Functions
|
||||
|
||||
260
src/surfMesh/surfaceFormats/surfaceFormatsCore.C
Normal file
260
src/surfMesh/surfaceFormats/surfaceFormatsCore.C
Normal file
@ -0,0 +1,260 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "surfaceFormatsCore.H"
|
||||
#include "IFstream.H"
|
||||
#include "OFstream.H"
|
||||
#include "Time.H"
|
||||
#include "SortableList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
// File extension for 'native' raw format
|
||||
Foam::word Foam::fileFormats::surfaceFormatsCore::nativeExt("ofs");
|
||||
|
||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||
|
||||
//- Check if file extension corresponds to 'native' surface format
|
||||
bool
|
||||
Foam::fileFormats::surfaceFormatsCore::isNative(const word& ext)
|
||||
{
|
||||
return (ext == nativeExt);
|
||||
}
|
||||
|
||||
|
||||
Foam::string
|
||||
Foam::fileFormats::surfaceFormatsCore::getLineNoComment
|
||||
(
|
||||
IFstream& is
|
||||
)
|
||||
{
|
||||
string line;
|
||||
do
|
||||
{
|
||||
is.getLine(line);
|
||||
}
|
||||
while ((line.size() == 0 || line[0] == '#') && is.good());
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
|
||||
Foam::fileName
|
||||
Foam::fileFormats::surfaceFormatsCore::triSurfInstance
|
||||
(
|
||||
const Time& d,
|
||||
const word& subdirName
|
||||
)
|
||||
{
|
||||
fileName foamName(d.caseName() + ".ofs");
|
||||
|
||||
// Search back through the time directories list to find the time
|
||||
// closest to and lower than current time
|
||||
|
||||
instantList ts = d.times();
|
||||
label i;
|
||||
|
||||
for (i=ts.size()-1; i>=0; i--)
|
||||
{
|
||||
if (ts[i].value() <= d.timeOutputValue())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Noting that the current directory has already been searched
|
||||
// for mesh data, start searching from the previously stored time directory
|
||||
|
||||
if (i>=0)
|
||||
{
|
||||
for (label j=i; j>=0; j--)
|
||||
{
|
||||
if (file(d.path()/ts[j].name()/subdirName/foamName))
|
||||
{
|
||||
return ts[j].name();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return "constant";
|
||||
}
|
||||
|
||||
|
||||
Foam::fileName
|
||||
Foam::fileFormats::surfaceFormatsCore::triSurfName
|
||||
(
|
||||
const Time& d,
|
||||
const word& subdirName
|
||||
)
|
||||
{
|
||||
fileName foamName(d.caseName() + ".ofs");
|
||||
|
||||
// Search back through the time directories list to find the time
|
||||
// closest to and lower than current time
|
||||
|
||||
instantList ts = d.times();
|
||||
label i;
|
||||
|
||||
for (i=ts.size()-1; i>=0; i--)
|
||||
{
|
||||
if (ts[i].value() <= d.timeOutputValue())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Noting that the current directory has already been searched
|
||||
// for mesh data, start searching from the previously stored time directory
|
||||
|
||||
if (i>=0)
|
||||
{
|
||||
for (label j=i; j>=0; j--)
|
||||
{
|
||||
fileName testName(d.path()/ts[j].name()/subdirName/foamName);
|
||||
|
||||
if (file(testName))
|
||||
{
|
||||
return testName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return d.path()/"constant"/subdirName/foamName;
|
||||
}
|
||||
|
||||
|
||||
// Returns patch info.
|
||||
// Sets faceMap to the indexing according to patch numbers.
|
||||
// Patch numbers start at 0.
|
||||
Foam::surfGroupList
|
||||
Foam::fileFormats::surfaceFormatsCore::sortedPatchRegions
|
||||
(
|
||||
const UList<label>& regionLst,
|
||||
const Map<word>& patchNames,
|
||||
labelList& faceMap
|
||||
)
|
||||
{
|
||||
// determine sort order according to region numbers
|
||||
|
||||
// std::sort() really seems to mix up the order.
|
||||
// and std::stable_sort() might take too long / too much memory
|
||||
|
||||
// Assuming that we have relatively fewer regions compared to the
|
||||
// number of items, just do it ourselves
|
||||
|
||||
// step 1: get region sizes and store (regionId => patchI)
|
||||
Map<label> regionLookup;
|
||||
forAll(regionLst, faceI)
|
||||
{
|
||||
const label regId = regionLst[faceI];
|
||||
|
||||
Map<label>::iterator iter = regionLookup.find(regId);
|
||||
if (iter == regionLookup.end())
|
||||
{
|
||||
regionLookup.insert(regId, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
iter()++;
|
||||
}
|
||||
}
|
||||
|
||||
// step 2: assign start/size (and name) to the newPatches
|
||||
// re-use the lookup to map (regionId => patchI)
|
||||
surfGroupList patchLst(regionLookup.size());
|
||||
label patchStart = 0;
|
||||
label patchI = 0;
|
||||
forAllIter(Map<label>, regionLookup, iter)
|
||||
{
|
||||
label regId = iter.key();
|
||||
|
||||
word patchName;
|
||||
Map<word>::const_iterator iter2 = patchNames.find(regId);
|
||||
if (iter2 == patchNames.end())
|
||||
{
|
||||
patchName = word("patch") + ::Foam::name(patchI);
|
||||
}
|
||||
else
|
||||
{
|
||||
patchName = iter2();
|
||||
}
|
||||
|
||||
patchLst[patchI] = surfGroup
|
||||
(
|
||||
patchName,
|
||||
0, // initialize with zero size
|
||||
patchStart,
|
||||
patchI
|
||||
);
|
||||
|
||||
// increment the start for the next patch
|
||||
// and save the (regionId => patchI) mapping
|
||||
patchStart += iter();
|
||||
iter() = patchI++;
|
||||
}
|
||||
|
||||
|
||||
// step 3: build the re-ordering
|
||||
faceMap.setSize(regionLst.size());
|
||||
|
||||
forAll(regionLst, faceI)
|
||||
{
|
||||
label patchI = regionLookup[regionLst[faceI]];
|
||||
|
||||
faceMap[faceI] = patchLst[patchI].start() + patchLst[patchI].size()++;
|
||||
}
|
||||
|
||||
// with reordered faces registered in faceMap
|
||||
return patchLst;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::surfaceFormatsCore::surfaceFormatsCore()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::surfaceFormatsCore::~surfaceFormatsCore()
|
||||
{}
|
||||
|
||||
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
// ************************************************************************* //
|
||||
127
src/surfMesh/surfaceFormats/surfaceFormatsCore.H
Normal file
127
src/surfMesh/surfaceFormats/surfaceFormatsCore.H
Normal file
@ -0,0 +1,127 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Class
|
||||
Foam::fileFormats::surfaceFormatsCore
|
||||
|
||||
Description
|
||||
A collection of helper functions for reading/writing surface formats.
|
||||
|
||||
SourceFiles
|
||||
surfaceFormatsCore.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef surfaceFormatsCore_H
|
||||
#define surfaceFormatsCore_H
|
||||
|
||||
#include "surfPatchIdentifierList.H"
|
||||
#include "surfGroupList.H"
|
||||
#include "labelList.H"
|
||||
#include "Map.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// Forward declaration of friend functions and operators
|
||||
|
||||
class IFstream;
|
||||
class Time;
|
||||
|
||||
namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class surfaceFormatsCore Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class surfaceFormatsCore
|
||||
{
|
||||
public:
|
||||
|
||||
// Static Data
|
||||
|
||||
//- The file extension corresponding to 'native' surface format
|
||||
static word nativeExt;
|
||||
|
||||
// Static Member Functions
|
||||
|
||||
//- Check if file extension corresponds to 'native' surface format
|
||||
static bool isNative(const word&);
|
||||
|
||||
//- Read non-comment line
|
||||
static string getLineNoComment(IFstream&);
|
||||
|
||||
//- Name of UnsortedMeshedSurface directory to use.
|
||||
static fileName triSurfInstance(const Time&, const word& subdirName);
|
||||
|
||||
//- Name of UnsortedMeshedSurface directory to use.
|
||||
static fileName triSurfName(const Time&, const word& subdirName);
|
||||
|
||||
//- Determine the sort order from the region list.
|
||||
// Returns patch list and sets faceMap to indices within faceLst
|
||||
static surfGroupList sortedPatchRegions
|
||||
(
|
||||
const UList<label>& regionLst,
|
||||
const Map<word>& patchNames,
|
||||
labelList& faceMap
|
||||
);
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
surfaceFormatsCore();
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~surfaceFormatsCore();
|
||||
|
||||
// Member Functions
|
||||
|
||||
// Access
|
||||
|
||||
// Edit
|
||||
|
||||
// Read
|
||||
|
||||
// Write
|
||||
|
||||
// Member operators
|
||||
|
||||
// Ostream Operator
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace fileFormats
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user