mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
BUG: corrected steadyParticleTracks utility
This commit is contained in:
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -184,6 +184,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (nTracks == 0)
|
||||
{
|
||||
Info<< "\n No track data" << endl;
|
||||
@ -202,11 +203,13 @@ int main(int argc, char *argv[])
|
||||
|
||||
// particle "age" property used to sort the tracks
|
||||
List<SortableList<scalar> > agePerTrack(nTracks);
|
||||
List<List<label> > particleMap(nTracks);
|
||||
|
||||
forAll(trackLengths, i)
|
||||
{
|
||||
const label length = trackLengths[i];
|
||||
agePerTrack[i].setSize(length);
|
||||
particleMap[i].setSize(length);
|
||||
}
|
||||
|
||||
// store the particle age per track
|
||||
@ -228,6 +231,7 @@ int main(int argc, char *argv[])
|
||||
const label trackI = particleToTrack[i];
|
||||
const label sampleI = trackSamples[trackI];
|
||||
agePerTrack[trackI][sampleI] = age[i];
|
||||
particleMap[trackI][sampleI] = i;
|
||||
trackSamples[trackI]++;
|
||||
}
|
||||
tage.clear();
|
||||
@ -251,21 +255,30 @@ int main(int argc, char *argv[])
|
||||
Info<< "\n Writing points" << endl;
|
||||
|
||||
{
|
||||
label offset = 0;
|
||||
forAll(agePerTrack, i)
|
||||
{
|
||||
agePerTrack[i].sort();
|
||||
|
||||
const labelList& ids = agePerTrack[i].indices();
|
||||
labelList& particleIds = particleMap[i];
|
||||
|
||||
{
|
||||
// update addressing
|
||||
List<label> sortedIds(ids);
|
||||
forAll(sortedIds, j)
|
||||
{
|
||||
sortedIds[j] = particleIds[ids[j]];
|
||||
}
|
||||
particleIds = sortedIds;
|
||||
}
|
||||
|
||||
forAll(ids, j)
|
||||
{
|
||||
const label localId = offset + ids[j];
|
||||
const label localId = particleIds[j];
|
||||
const vector& pos = particles[localId].position();
|
||||
os << pos.x() << ' ' << pos.y() << ' ' << pos.z()
|
||||
<< nl;
|
||||
}
|
||||
|
||||
offset += trackLengths[i];
|
||||
}
|
||||
}
|
||||
|
||||
@ -278,13 +291,14 @@ int main(int argc, char *argv[])
|
||||
// Write ids of track points to file
|
||||
{
|
||||
label globalPtI = 0;
|
||||
forAll(agePerTrack, i)
|
||||
forAll(particleMap, i)
|
||||
{
|
||||
os << agePerTrack[i].size() << nl;
|
||||
os << particleMap[i].size() << nl;
|
||||
|
||||
forAll(agePerTrack[i], j)
|
||||
forAll(particleMap[i], j)
|
||||
{
|
||||
os << ' ' << globalPtI++;
|
||||
|
||||
if (((j + 1) % 10 == 0) && (j != 0))
|
||||
{
|
||||
os << nl;
|
||||
@ -303,14 +317,14 @@ int main(int argc, char *argv[])
|
||||
|
||||
Info<< "\n Processing fields" << nl << endl;
|
||||
|
||||
processFields<label>(os, agePerTrack, userFields, cloudObjs);
|
||||
processFields<scalar>(os, agePerTrack, userFields, cloudObjs);
|
||||
processFields<vector>(os, agePerTrack, userFields, cloudObjs);
|
||||
processFields<label>(os, particleMap, userFields, cloudObjs);
|
||||
processFields<scalar>(os, particleMap, userFields, cloudObjs);
|
||||
processFields<vector>(os, particleMap, userFields, cloudObjs);
|
||||
processFields<sphericalTensor>
|
||||
(os, agePerTrack, userFields, cloudObjs);
|
||||
(os, particleMap, userFields, cloudObjs);
|
||||
processFields<symmTensor>
|
||||
(os, agePerTrack, userFields, cloudObjs);
|
||||
processFields<tensor>(os, agePerTrack, userFields, cloudObjs);
|
||||
(os, particleMap, userFields, cloudObjs);
|
||||
processFields<tensor>(os, particleMap, userFields, cloudObjs);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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-2013 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -57,39 +57,57 @@ tmp<Field<Type> > readParticleField
|
||||
return tmp<Field<Type> >(new Field<Type>(newField.xfer()));
|
||||
}
|
||||
|
||||
Info<< "error: cloud field name " << name << " not found" << endl;
|
||||
FatalErrorIn
|
||||
(
|
||||
"template<class Type>"
|
||||
"void readParticleField"
|
||||
"("
|
||||
"const word&, "
|
||||
"const IOobjectList"
|
||||
")"
|
||||
)
|
||||
<< "error: cloud field name " << name << " not found"
|
||||
<< abort(FatalError);
|
||||
|
||||
return Field<Type>::null();
|
||||
}
|
||||
|
||||
|
||||
template<class Type>
|
||||
PtrList<List<Type> > readFields
|
||||
void readFields
|
||||
(
|
||||
PtrList<List<Type> >& values,
|
||||
const List<word>& fields,
|
||||
const List<word>& fieldNames,
|
||||
const IOobjectList& cloudObjs
|
||||
)
|
||||
{
|
||||
IOobjectList objects(cloudObjs.lookupClass(IOField<Type>::typeName));
|
||||
|
||||
label fieldI = 0;
|
||||
forAllConstIter(IOobjectList, objects, iter)
|
||||
forAll(fieldNames, j)
|
||||
{
|
||||
const IOobject& obj = *iter();
|
||||
forAll(fields, j)
|
||||
const IOobject* obj = objects.lookup(fieldNames[j]);
|
||||
if (obj != NULL)
|
||||
{
|
||||
if (obj.name() == fields[j])
|
||||
{
|
||||
Info<< " reading field " << obj.name() << endl;
|
||||
IOField<Type> newField(obj);
|
||||
values.set(fieldI++, new List<Type>(newField.xfer()));
|
||||
break;
|
||||
}
|
||||
Info<< " reading field " << fieldNames[j] << endl;
|
||||
IOField<Type> newField(*obj);
|
||||
values.set(j, new List<Type>(newField.xfer()));
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"template<class Type>"
|
||||
"void readFields"
|
||||
"("
|
||||
"PtrList<List<Type> >&, "
|
||||
"const List<word>&, "
|
||||
"const IOobjectList&"
|
||||
")"
|
||||
)
|
||||
<< "Unable to read field " << fieldNames[j]
|
||||
<< abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
|
||||
@ -109,7 +127,7 @@ void writeVTKFields
|
||||
(
|
||||
OFstream& os,
|
||||
const PtrList<List<Type> >& values,
|
||||
const List<SortableList<scalar> >& agePerTrack,
|
||||
const List<List<label> >& addr,
|
||||
const List<word>& fieldNames
|
||||
)
|
||||
{
|
||||
@ -121,9 +139,9 @@ void writeVTKFields
|
||||
os << nl << fieldNames[fieldI] << ' ' << pTraits<Type>::nComponents
|
||||
<< ' ' << values[fieldI].size() << " float" << nl;
|
||||
label offset = 0;
|
||||
forAll(agePerTrack, trackI)
|
||||
forAll(addr, trackI)
|
||||
{
|
||||
const List<label> ids = agePerTrack[trackI].indices() + offset;
|
||||
const List<label> ids(addr[trackI]);
|
||||
|
||||
List<Type> data(UIndirectList<Type>(values[fieldI], ids));
|
||||
label nData = data.size() - 1;
|
||||
@ -149,7 +167,7 @@ template<class Type>
|
||||
void processFields
|
||||
(
|
||||
OFstream& os,
|
||||
const List<SortableList<scalar> >& agePerTrack,
|
||||
const List<List<label> >& addr,
|
||||
const List<word>& userFieldNames,
|
||||
const IOobjectList& cloudObjs
|
||||
)
|
||||
@ -176,12 +194,14 @@ void processFields
|
||||
(
|
||||
os,
|
||||
values,
|
||||
agePerTrack,
|
||||
fieldNames.xfer()
|
||||
addr,
|
||||
fieldNames
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -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-2013 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -49,7 +49,7 @@ namespace Foam
|
||||
);
|
||||
|
||||
template<class Type>
|
||||
PtrList<List<Type> > readFields
|
||||
void readFields
|
||||
(
|
||||
PtrList<List<Type> >& values,
|
||||
const List<word>& fields,
|
||||
|
||||
Reference in New Issue
Block a user