35 template<
class LabelType>
36 void Foam::vtk::vtuSizing::adjustOffsets
38 UList<LabelType>& vertOffset,
39 UList<LabelType>& faceOffset,
40 const enum contentType
output,
41 const bool hasFaceStream
57 case contentType::LEGACY:
60 case contentType::XML:
65 for (label i = 1; i < vertOffset.size(); ++i)
67 vertOffset[i] += vertOffset[i-1];
75 for (LabelType& off : faceOffset)
77 const LabelType sz(off);
88 case contentType::INTERNAL1:
94 for (LabelType& off : vertOffset)
96 const LabelType sz(off);
107 for (LabelType& off : faceOffset)
109 const LabelType sz(off);
120 case contentType::INTERNAL2:
131 for (LabelType& off : vertOffset)
133 const LabelType sz(off);
144 for (LabelType& off : faceOffset)
146 const LabelType sz(off);
160 template<
class LabelType>
161 void Foam::vtk::vtuSizing::populateArrays
163 const polyMesh&
mesh,
164 const vtk::vtuSizing& sizing,
167 UList<LabelType>& vertLabels,
168 UList<LabelType>& vertOffset,
169 UList<LabelType>& faceLabels,
170 UList<LabelType>& faceOffset,
171 const enum contentType
output,
176 if (sizing.selectionMode() == selectionModeType::SHAPE_MESH)
179 <<
"Programming error ... attempting to populate a VTU mesh"
180 <<
" but it was originally sized using independent cell shapes"
190 vertLabels.size(), vertOffset.size(),
191 faceLabels.size(), faceOffset.size(),
205 output == contentType::LEGACY
206 ||
output == contentType::INTERNAL1
217 if (vertOffset.size())
219 vertOffset.first() = 0;
220 vertOffset.last() = 0;
240 label nVertLabels = 0;
241 label nFaceLabels = 0;
244 label nVertDecomp = sizing.nVertLabels() + prefix*sizing.nCells();
247 label nCellDecomp =
mesh.nCells();
250 label nPointDecomp =
mesh.nPoints();
256 UList<LabelType>& faceOutput =
258 output == contentType::LEGACY
265 output == contentType::LEGACY
280 const bool isSubsetMesh
282 sizing.selectionMode() == selectionModeType::SUBSET_MESH
285 const label nInputCells =
295 label inputi = 0, cellIndex = 0;
296 inputi < nInputCells;
297 ++inputi, ++cellIndex
300 const label celli(isSubsetMesh ? cellMap[inputi] : inputi);
302 const cellShape& shape = shapes[celli];
303 const cellModel& model = shape.model();
307 cellMap[cellIndex] = celli;
313 constexpr label nShapePoints = 4;
315 if (vertOffset.size())
317 vertOffset[cellIndex] = nShapePoints;
321 vertLabels[nVertLabels++] = nShapePoints;
324 for (
const label cpi : shape)
326 vertLabels[nVertLabels++] = cpi;
329 else if (model == pyr)
332 constexpr label nShapePoints = 5;
334 if (vertOffset.size())
336 vertOffset[cellIndex] = nShapePoints;
340 vertLabels[nVertLabels++] = nShapePoints;
343 for (
const label cpi : shape)
345 vertLabels[nVertLabels++] = cpi;
348 else if (model ==
hex)
351 constexpr label nShapePoints = 8;
353 if (vertOffset.size())
355 vertOffset[cellIndex] = nShapePoints;
359 vertLabels[nVertLabels++] = nShapePoints;
362 for (
const label cpi : shape)
364 vertLabels[nVertLabels++] = cpi;
367 else if (model == prism)
370 constexpr label nShapePoints = 6;
372 if (vertOffset.size())
374 vertOffset[cellIndex] = nShapePoints;
378 vertLabels[nVertLabels++] = nShapePoints;
382 vertLabels[nVertLabels++] = shape[0];
383 vertLabels[nVertLabels++] = shape[2];
384 vertLabels[nVertLabels++] = shape[1];
385 vertLabels[nVertLabels++] = shape[3];
386 vertLabels[nVertLabels++] = shape[5];
387 vertLabels[nVertLabels++] = shape[4];
389 else if (model == tetWedge && sizing.decompose())
393 constexpr label nShapePoints = 6;
395 if (vertOffset.size())
397 vertOffset[cellIndex] = nShapePoints;
401 vertLabels[nVertLabels++] = nShapePoints;
404 vertLabels[nVertLabels++] = shape[0];
405 vertLabels[nVertLabels++] = shape[2];
406 vertLabels[nVertLabels++] = shape[1];
407 vertLabels[nVertLabels++] = shape[3];
408 vertLabels[nVertLabels++] = shape[4];
409 vertLabels[nVertLabels++] = shape[3];
411 else if (model == wedge && sizing.decompose())
415 constexpr label nShapePoints = 8;
417 if (vertOffset.size())
419 vertOffset[cellIndex] = nShapePoints;
423 vertLabels[nVertLabels++] = nShapePoints;
426 vertLabels[nVertLabels++] = shape[0];
427 vertLabels[nVertLabels++] = shape[1];
428 vertLabels[nVertLabels++] = shape[2];
429 vertLabels[nVertLabels++] = shape[2];
430 vertLabels[nVertLabels++] = shape[3];
431 vertLabels[nVertLabels++] = shape[4];
432 vertLabels[nVertLabels++] = shape[5];
433 vertLabels[nVertLabels++] = shape[6];
435 else if (sizing.decompose())
447 const label newVertexLabel = nPointDecomp;
449 addPointsIds[nPointDecomp++] = celli;
452 bool firstCell =
true;
456 for (
const label facei : cFaces)
458 const face&
f =
mesh.faces()[facei];
459 const bool isOwner = (owner[facei] == celli);
462 label nTria = 0, nQuad = 0;
463 f.nTrianglesQuads(
mesh.points(), nTria, nQuad);
468 nTria = 0, nQuad = 0;
469 f.trianglesQuads(
mesh.points(), nTria, nQuad, faces3, faces4);
471 for (
const face& quad : faces4)
475 constexpr label nShapePoints = 5;
477 label celLoc, vrtLoc;
482 vrtLoc = nVertLabels;
483 nVertLabels += prefix + nShapePoints;
487 celLoc = nCellDecomp++;
488 vrtLoc = nVertDecomp;
489 nVertDecomp += prefix + nShapePoints;
491 cellMap[celLoc] = celli;
494 if (vertOffset.size())
496 vertOffset[celLoc] = nShapePoints;
500 vertLabels[vrtLoc++] = nShapePoints;
506 vertLabels[vrtLoc++] = quad[0];
507 vertLabels[vrtLoc++] = quad[3];
508 vertLabels[vrtLoc++] = quad[2];
509 vertLabels[vrtLoc++] = quad[1];
513 vertLabels[vrtLoc++] = quad[0];
514 vertLabels[vrtLoc++] = quad[1];
515 vertLabels[vrtLoc++] = quad[2];
516 vertLabels[vrtLoc++] = quad[3];
520 vertLabels[vrtLoc++] = newVertexLabel;
523 for (
const face& tria : faces3)
527 constexpr label nShapePoints = 4;
529 label celLoc, vrtLoc;
534 vrtLoc = nVertLabels;
535 nVertLabels += prefix + nShapePoints;
539 celLoc = nCellDecomp++;
540 vrtLoc = nVertDecomp;
541 nVertDecomp += prefix + nShapePoints;
543 cellMap[celLoc] = celli;
546 if (vertOffset.size())
548 vertOffset[celLoc] = nShapePoints;
552 vertLabels[vrtLoc++] = nShapePoints;
558 vertLabels[vrtLoc++] = tria[0];
559 vertLabels[vrtLoc++] = tria[2];
560 vertLabels[vrtLoc++] = tria[1];
564 vertLabels[vrtLoc++] = tria[0];
565 vertLabels[vrtLoc++] = tria[1];
566 vertLabels[vrtLoc++] = tria[2];
570 vertLabels[vrtLoc++] = newVertexLabel;
584 const label startLabel = faceIndexer;
586 if (
output == contentType::LEGACY)
588 faceOutput[startLabel] = 0;
592 faceOutput[faceIndexer++] = cFaces.size();
594 for (
const label facei : cFaces)
596 const face&
f =
mesh.faces()[facei];
597 const bool isOwner = (owner[facei] == celli);
598 const label nFacePoints =
f.size();
600 hashUniqId.insert(
f);
603 faceOutput[faceIndexer++] = nFacePoints;
605 faceOutput[faceIndexer++] =
f[0];
608 for (label fp = 1; fp < nFacePoints; ++fp)
610 faceOutput[faceIndexer++] =
f[fp];
615 for (label fp = nFacePoints - 1; fp > 0; --fp)
617 faceOutput[faceIndexer++] =
f[fp];
622 if (
output == contentType::LEGACY)
626 faceOutput[startLabel] = (faceIndexer - 1 - startLabel);
631 faceOffset[cellIndex] = (faceIndexer - startLabel);
633 vertOffset[cellIndex] = hashUniqId.size();
636 vertLabels[nVertLabels++] = hashUniqId.size();
639 for (
const label pointi : hashUniqId.sortedToc())
641 vertLabels[nVertLabels++] = pointi;
658 adjustOffsets<LabelType>
673 template<
class LabelType>
674 void Foam::vtk::vtuSizing::populateArrays
676 const UList<cellShape>& shapes,
677 const vtk::vtuSizing& sizing,
680 UList<LabelType>& vertLabels,
681 UList<LabelType>& vertOffset,
682 UList<LabelType>& faceLabels,
683 UList<LabelType>& faceOffset,
684 const enum contentType
output,
689 if (sizing.selectionMode() != selectionModeType::SHAPE_MESH)
692 <<
"Programming error ... attempting to populate a VTU mesh"
693 <<
" from cell shapes, but sizing originated from a different"
694 <<
" representation" <<
nl
704 vertLabels.size(), vertOffset.size(),
705 faceLabels.size(), faceOffset.size(),
719 output == contentType::LEGACY
720 ||
output == contentType::INTERNAL1
731 if (vertOffset.size())
733 vertOffset.first() = 0;
734 vertOffset.last() = 0;
744 label nVertLabels = 0;
752 const label nInputCells = shapes.size();
758 label inputi = 0, cellIndex = 0;
759 inputi < nInputCells;
760 ++inputi, ++cellIndex
763 const cellShape& shape = shapes[inputi];
764 const cellModel& model = shape.model();
769 constexpr label nShapePoints = 4;
771 if (vertOffset.size())
773 vertOffset[cellIndex] = nShapePoints;
777 vertLabels[nVertLabels++] = nShapePoints;
780 for (
const label cpi : shape)
782 vertLabels[nVertLabels++] = cpi;
785 else if (model == pyr)
788 constexpr label nShapePoints = 5;
790 if (vertOffset.size())
792 vertOffset[cellIndex] = nShapePoints;
796 vertLabels[nVertLabels++] = nShapePoints;
799 for (
const label cpi : shape)
801 vertLabels[nVertLabels++] = cpi;
804 else if (model ==
hex)
807 constexpr label nShapePoints = 8;
809 if (vertOffset.size())
811 vertOffset[cellIndex] = nShapePoints;
815 vertLabels[nVertLabels++] = nShapePoints;
818 for (
const label cpi : shape)
820 vertLabels[nVertLabels++] = cpi;
823 else if (model == prism)
826 constexpr label nShapePoints = 6;
828 if (vertOffset.size())
830 vertOffset[cellIndex] = nShapePoints;
834 vertLabels[nVertLabels++] = nShapePoints;
838 vertLabels[nVertLabels++] = shape[0];
839 vertLabels[nVertLabels++] = shape[2];
840 vertLabels[nVertLabels++] = shape[1];
841 vertLabels[nVertLabels++] = shape[3];
842 vertLabels[nVertLabels++] = shape[5];
843 vertLabels[nVertLabels++] = shape[4];
869 adjustOffsets<LabelType>