75 ok[i] = ok[i] || fieldOk<label>(cloudObjs,
userFields[i]);
76 ok[i] = ok[i] || fieldOk<scalar>(cloudObjs,
userFields[i]);
77 ok[i] = ok[i] || fieldOk<vector>(cloudObjs,
userFields[i]);
78 ok[i] = ok[i] || fieldOk<sphericalTensor>(cloudObjs,
userFields[i]);
79 ok[i] = ok[i] || fieldOk<symmTensor>(cloudObjs,
userFields[i]);
80 ok[i] = ok[i] || fieldOk<tensor>(cloudObjs,
userFields[i]);
93 <<
"' unavailable" <<
endl;
118 int main(
int argc,
char *argv[])
122 "Generate a legacy VTK file of particle tracks for cases that were"
123 " computed using a steady-state cloud"
136 #include "createFields.H"
151 Info<<
" Reading particle positions" <<
endl;
159 <<
" particles" <<
endl;
161 particles.setSize(ppc.size());
166 particles.set(i++, ppc.remove(&iter()));
180 const label origProc = particles[i].origProc();
181 const label origId = particles[i].origId();
185 const auto iter = trackTable.
cfind(
key);
189 particleToTrack[i] = *iter;
193 particleToTrack[i] = nTracks;
207 Info<<
"\n Generating " << nTracks <<
" tracks" <<
endl;
211 for (
const label tracki : particleToTrack)
213 ++trackLengths[tracki];
222 const label length = trackLengths[i];
223 agePerTrack[i].setSize(length);
224 particleMap[i].setSize(length);
238 readParticleField<scalar>(
"age", cloudObjs);
244 forAll(particleToTrack, i)
246 const label trackI = particleToTrack[i];
247 const label sampleI = trackSamples[trackI];
248 agePerTrack[trackI][sampleI] = age[i];
249 particleMap[trackI][sampleI] = i;
250 trackSamples[trackI]++;
258 OFstream os(vtkTimePath/
"particleTracks.vtk");
264 os <<
"# vtk DataFile Version 2.0" <<
nl
265 <<
"particleTracks" <<
nl
267 <<
"DATASET POLYDATA" <<
nl
268 <<
"POINTS " <<
nPoints <<
" float" <<
nl;
275 agePerTrack[i].sort();
277 const labelList& ids = agePerTrack[i].indices();
285 sortedIds[j] = particleIds[ids[j]];
287 particleIds = sortedIds;
292 const label localId = particleIds[j];
293 const vector pos(particles[localId].position());
303 Info<<
"\n Writing track lines" <<
endl;
304 os <<
"\nLINES " << nTracks <<
' ' <<
nPoints + nTracks <<
nl;
311 os << particleMap[i].size() <<
nl;
315 os <<
' ' << globalPtI++;
317 if (((j + 1) % 10 == 0) && (j != 0))
328 const label nFields = validateFields(
userFields, cloudObjs);
331 <<
"FIELD attributes " << nFields <<
nl;
335 processFields<label>(
os, particleMap,
userFields, cloudObjs);
336 processFields<scalar>(
os, particleMap,
userFields, cloudObjs);
337 processFields<vector>(
os, particleMap,
userFields, cloudObjs);
338 processFields<sphericalTensor>
340 processFields<symmTensor>
342 processFields<tensor>(
os, particleMap,
userFields, cloudObjs);