Skip to content

Commit 26daabc

Browse files
tjcoronakwrobot
authored andcommitted
Merge topic 'FixLagrangePointParametricCoordinates'
26d3405 add multi degree support to vtkUpdateCellsV8toV9 c610e5b fix: overwrite PointParametricCoordinates instead of writting at its tail 1736482 fix PointParametricCoordinates not updated when Lagrange cell degrees change Acked-by: Kitware Robot <[email protected]> Acked-by: T.J. Corona <[email protected]> Merge-request: !6929
2 parents 0c47a03 + 26d3405 commit 26daabc

File tree

6 files changed

+47
-24
lines changed

6 files changed

+47
-24
lines changed

Common/DataModel/vtkHigherOrderHexahedron.cxx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -669,17 +669,21 @@ int vtkHigherOrderHexahedron::PointIndexFromIJK(int i, int j, int k, const int*
669669
}
670670

671671
vtkIdType vtkHigherOrderHexahedron::NodeNumberingMappingFromVTK8To9(
672-
const vtkIdType order, const vtkIdType node_id_vtk8)
672+
const int order[3], const vtkIdType node_id_vtk8)
673673
{
674-
const int numPtsPerEdgeWithoutCorners = static_cast<int>(order) - 1;
675-
676-
int offset = 8 + 10 * numPtsPerEdgeWithoutCorners;
677-
if ((node_id_vtk8 < offset) || (node_id_vtk8 >= offset + 2 * numPtsPerEdgeWithoutCorners))
674+
int numPtsPerEdgeWithoutCorners[3];
675+
numPtsPerEdgeWithoutCorners[0] = order[0] - 1;
676+
numPtsPerEdgeWithoutCorners[1] = order[1] - 1;
677+
numPtsPerEdgeWithoutCorners[2] = order[2] - 1;
678+
679+
int offset = 8 + 4 * (numPtsPerEdgeWithoutCorners[0] + numPtsPerEdgeWithoutCorners[1]) +
680+
2 * numPtsPerEdgeWithoutCorners[2];
681+
if ((node_id_vtk8 < offset) || (node_id_vtk8 >= offset + 2 * numPtsPerEdgeWithoutCorners[2]))
678682
return node_id_vtk8;
679-
else if (node_id_vtk8 < offset + numPtsPerEdgeWithoutCorners)
680-
return node_id_vtk8 + numPtsPerEdgeWithoutCorners;
683+
else if (node_id_vtk8 < offset + numPtsPerEdgeWithoutCorners[2])
684+
return node_id_vtk8 + numPtsPerEdgeWithoutCorners[2];
681685
else
682-
return node_id_vtk8 - numPtsPerEdgeWithoutCorners;
686+
return node_id_vtk8 - numPtsPerEdgeWithoutCorners[2];
683687
}
684688

685689
/**\brief Given the index, \a subCell, of a linear approximating-hex, translate pcoords from that
@@ -764,6 +768,8 @@ void vtkHigherOrderHexahedron::SetUniformOrderFromNumPoints(vtkIdType numPts)
764768

765769
void vtkHigherOrderHexahedron::SetOrder(int s, int t, int u)
766770
{
771+
if (this->PointParametricCoordinates && (Order[0] != s || Order[1] != t || Order[2] != u))
772+
this->PointParametricCoordinates->Reset();
767773
Order[0] = s;
768774
Order[1] = t;
769775
Order[2] = u;

Common/DataModel/vtkHigherOrderHexahedron.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class VTKCOMMONDATAMODEL_EXPORT vtkHigherOrderHexahedron : public vtkNonLinearCe
104104
virtual vtkHigherOrderInterpolation* getInterp() = 0;
105105

106106
static vtkIdType NodeNumberingMappingFromVTK8To9(
107-
const vtkIdType order, const vtkIdType node_id_vtk8);
107+
const int order[3], const vtkIdType node_id_vtk8);
108108

109109
protected:
110110
vtkHigherOrderHexahedron();

Common/DataModel/vtkHigherOrderInterpolation.cxx

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,14 +1044,13 @@ void vtkHigherOrderInterpolation::AppendCurveCollocationPoints(
10441044
pts = vtkSmartPointer<vtkPoints>::New();
10451045
}
10461046

1047-
vtkIdType existing = pts->GetNumberOfPoints();
10481047
vtkIdType np = order[0] + 1;
1049-
pts->SetNumberOfPoints(existing + np);
1048+
pts->SetNumberOfPoints(np);
10501049
vtkVector3d e0(0., 0., 0.);
10511050
vtkVector3d e1(+1., 0., 0.);
10521051

10531052
// Insert corner points
1054-
vtkIdType sn = existing;
1053+
vtkIdType sn = 0;
10551054
pts->SetPoint(sn++, e0.GetData());
10561055
pts->SetPoint(sn++, e1.GetData());
10571056

@@ -1072,11 +1071,10 @@ void vtkHigherOrderInterpolation::AppendQuadrilateralCollocationPoints(
10721071
pts = vtkSmartPointer<vtkPoints>::New();
10731072
}
10741073

1075-
vtkIdType existing = pts->GetNumberOfPoints();
10761074
vtkIdType np = (order[0] + 1) * (order[1] + 1);
1077-
pts->SetNumberOfPoints(existing + np);
1075+
pts->SetNumberOfPoints(np);
10781076
// Insert corner points
1079-
vtkIdType sn = existing;
1077+
vtkIdType sn = 0;
10801078
for (int ii = 0; ii < 4; ++ii)
10811079
{
10821080
vtkVector3d cc(hexCorner[ii]);
@@ -1118,11 +1116,10 @@ void vtkHigherOrderInterpolation::AppendHexahedronCollocationPoints(
11181116
pts = vtkSmartPointer<vtkPoints>::New();
11191117
}
11201118

1121-
vtkIdType existing = pts->GetNumberOfPoints();
11221119
vtkIdType np = (order[0] + 1) * (order[1] + 1) * (order[2] + 1);
1123-
pts->SetNumberOfPoints(existing + np);
1120+
pts->SetNumberOfPoints(np);
11241121
// Insert corner points
1125-
vtkIdType sn = existing;
1122+
vtkIdType sn = 0;
11261123
for (int ii = 0; ii < 8; ++ii)
11271124
{
11281125
pts->SetPoint(sn++, hexCorner[ii]);
@@ -1182,12 +1179,11 @@ void vtkHigherOrderInterpolation::AppendWedgeCollocationPoints(
11821179
pts = vtkSmartPointer<vtkPoints>::New();
11831180
}
11841181

1185-
vtkIdType existing = pts->GetNumberOfPoints();
11861182
vtkIdType np =
11871183
(order[0] + 1) * (order[1] + 2) * (order[2] + 1) / 2; // NB: assert(order[0] == order[1])
1188-
pts->SetNumberOfPoints(existing + np);
1184+
pts->SetNumberOfPoints(np);
11891185
// Insert corner points
1190-
vtkIdType sn = existing;
1186+
vtkIdType sn = 0;
11911187
for (int ii = 0; ii < 6; ++ii)
11921188
{
11931189
pts->SetPoint(sn++, wedgeCorner[ii]);

Common/DataModel/vtkHigherOrderQuadrilateral.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,8 @@ void vtkHigherOrderQuadrilateral::SetUniformOrderFromNumPoints(const vtkIdType n
591591

592592
void vtkHigherOrderQuadrilateral::SetOrder(const int s, const int t)
593593
{
594+
if (this->PointParametricCoordinates && (Order[0] != s || Order[1] != t))
595+
this->PointParametricCoordinates->Reset();
594596
Order[0] = s;
595597
Order[1] = t;
596598
Order[2] = (s + 1) * (t + 1);

Common/DataModel/vtkHigherOrderWedge.cxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,9 @@ void vtkHigherOrderWedge::SetOrder(const int s, const int t, const int u, const
12391239
{
12401240
if (s != t)
12411241
vtkErrorMacro("For wedges, the first two degrees should be equals.");
1242+
1243+
if (this->PointParametricCoordinates && (Order[0] != s || Order[2] != u))
1244+
this->PointParametricCoordinates->Reset();
12421245
Order[0] = s;
12431246
Order[1] = s;
12441247
Order[2] = u;

IO/Core/vtkUpdateCellsV8toV9.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#define vtkUpdateCellsV8toV9_h
2222

2323
#include "vtkCellArray.h"
24+
#include "vtkCellData.h"
2425
#include "vtkCellType.h"
2526
#include "vtkCellTypes.h"
2627
#include "vtkHigherOrderHexahedron.h"
@@ -41,11 +42,26 @@ inline void vtkUpdateCellsV8toV9(vtkUnstructuredGrid* output)
4142
{
4243
output->GetCells()->GetCellAtId(i, oldpts);
4344
newpts->DeepCopy(oldpts);
44-
int order =
45-
static_cast<int>(round(std::cbrt(static_cast<int>(oldpts->GetNumberOfIds())))) - 1;
45+
46+
int degs[3];
47+
if (output->GetCellData()->SetActiveAttribute(
48+
"HigherOrderDegrees", vtkDataSetAttributes::AttributeTypes::HIGHERORDERDEGREES) != -1)
49+
{
50+
vtkDataArray* v = output->GetCellData()->GetHigherOrderDegrees();
51+
double degs_double[3];
52+
v->GetTuple(i, degs_double);
53+
for (int ii = 0; ii < 3; ii++)
54+
degs[ii] = static_cast<int>(degs_double[ii]);
55+
}
56+
else
57+
{
58+
int order =
59+
static_cast<int>(round(std::cbrt(static_cast<int>(oldpts->GetNumberOfIds())))) - 1;
60+
degs[0] = degs[1] = degs[2] = order;
61+
}
4662
for (int j = 0; j < oldpts->GetNumberOfIds(); j++)
4763
{
48-
int newid = vtkHigherOrderHexahedron::NodeNumberingMappingFromVTK8To9(order, j);
64+
int newid = vtkHigherOrderHexahedron::NodeNumberingMappingFromVTK8To9(degs, j);
4965
if (j != newid)
5066
{
5167
newpts->SetId(j, oldpts->GetId(newid));

0 commit comments

Comments
 (0)