diff --git a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracks.C b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracks.C index 5a6fad75a696b5a8554012ace76107dd2f337ec5..4d2ab943acab92eacfedb38d57d1bb1c0e472c28 100644 --- a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracks.C +++ b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracks.C @@ -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); } } diff --git a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.C b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.C index 89e499b17da2a2a4d1d476ca8ee1a1b03fffaa05..3dcc365c1de45bd78df8e5048d76662ff481a938 100644 --- a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.C +++ b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.C @@ -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 // ************************************************************************* // diff --git a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.H b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.H index 973e6da255077ccef389d54a1838ee25d00f1b3d..f3b5d48d2d2437c657534478cb5cf923bb0708fd 100644 --- a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.H +++ b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.H @@ -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,