Commit 668cd823 authored by andy's avatar andy
Browse files

BUG: corrected steadyParticleTracks utility

parent 73b7f6e6
......@@ -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,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment