70 ok[i] = ok[i] || fieldOk<label>(cloudObjs,
userFields[i]);
71 ok[i] = ok[i] || fieldOk<scalar>(cloudObjs,
userFields[i]);
72 ok[i] = ok[i] || fieldOk<vector>(cloudObjs,
userFields[i]);
73 ok[i] = ok[i] || fieldOk<sphericalTensor>(cloudObjs,
userFields[i]);
74 ok[i] = ok[i] || fieldOk<symmTensor>(cloudObjs,
userFields[i]);
75 ok[i] = ok[i] || fieldOk<tensor>(cloudObjs,
userFields[i]);
88 <<
"' unavailable" <<
endl;
113 int main(
int argc,
char *argv[])
125 #include "createFields.H"
129 fileName vtkPath(runTime.path()/
"VTK");
136 runTime.setTime(
timeDirs[timeI], timeI);
137 Info<<
"Time = " << runTime.timeName() <<
endl;
139 fileName vtkTimePath(runTime.path()/
"VTK"/runTime.timeName());
142 Info<<
" Reading particle positions" <<
endl;
150 <<
" particles" <<
endl;
152 particles.setSize(ppc.size());
157 particles.set(i++, ppc.remove(&iter()));
167 trackTableType trackTable;
170 const label origProc = particles[i].origProc();
171 const label origId = particles[i].origId();
173 const trackTableType::const_iterator& iter =
174 trackTable.find(
labelPair(origProc, origId));
176 if (iter == trackTable.end())
178 particleToTrack[i] = nTracks;
179 trackTable.insert(
labelPair(origProc, origId), nTracks);
184 particleToTrack[i] = iter();
196 Info<<
"\n Generating " << nTracks <<
" tracks" <<
endl;
200 forAll(particleToTrack, i)
202 const label trackI = particleToTrack[i];
203 trackLengths[trackI]++;
212 const label length = trackLengths[i];
213 agePerTrack[i].setSize(length);
214 particleMap[i].setSize(length);
228 readParticleField<scalar>(
"age", cloudObjs);
231 forAll(particleToTrack, i)
233 const label trackI = particleToTrack[i];
234 const label sampleI = trackSamples[trackI];
235 agePerTrack[trackI][sampleI] = age[i];
236 particleMap[trackI][sampleI] = i;
237 trackSamples[trackI]++;
245 OFstream os(vtkTimePath/
"particleTracks.vtk");
247 Info<<
"\n Writing particle tracks to " << os.name() <<
endl;
251 os <<
"# vtk DataFile Version 2.0" <<
nl
252 <<
"particleTracks" <<
nl
254 <<
"DATASET POLYDATA" <<
nl
255 <<
"POINTS " <<
nPoints <<
" float" <<
nl;
262 agePerTrack[i].sort();
264 const labelList& ids = agePerTrack[i].indices();
272 sortedIds[j] = particleIds[ids[j]];
274 particleIds = sortedIds;
279 const label localId = particleIds[j];
280 const vector&
pos = particles[localId].position();
281 os <<
pos.x() <<
' ' <<
pos.y() <<
' ' <<
pos.z()
290 Info<<
"\n Writing track lines" <<
endl;
291 os <<
"\nLINES " << nTracks <<
' ' <<
nPoints + nTracks <<
nl;
298 os << particleMap[i].size() <<
nl;
302 os <<
' ' << globalPtI++;
304 if (((j + 1) % 10 == 0) && (j != 0))
318 <<
"FIELD attributes " << nFields <<
nl;
322 processFields<label>(os, particleMap,
userFields, cloudObjs);
323 processFields<scalar>(os, particleMap,
userFields, cloudObjs);
324 processFields<vector>(os, particleMap,
userFields, cloudObjs);
325 processFields<sphericalTensor>
327 processFields<symmTensor>
329 processFields<tensor>(os, particleMap,
userFields, cloudObjs);