Skip to content

Commit d303889

Browse files
authored
[FEM] TetrahedralCorotationalFEMForceField fix stream functions (sofa-framework#6128)
* fix Output stream and Input stream for TetrahedronInformation * add unit test
1 parent 8064720 commit d303889

2 files changed

Lines changed: 77 additions & 2 deletions

File tree

Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,32 @@ class TetrahedralCorotationalFEMForceField : public BaseLinearElasticityFEMForce
113113
}
114114

115115
/// Output stream
116-
inline friend std::ostream& operator<< ( std::ostream& os, const TetrahedronInformation& /*tri*/ )
116+
inline friend std::ostream& operator<< ( std::ostream& os, const TetrahedronInformation& tri )
117117
{
118+
os << tri.materialMatrix << " ";
119+
os << tri.strainDisplacementTransposedMatrix << " ";
120+
121+
for (int i = 0; i < 4; ++i)
122+
os << tri.rotatedInitialElements[i] << " ";
123+
124+
os << tri.elemShapeFun << " ";
125+
os << tri.rotation << " ";
126+
os << tri.initialTransformation << " ";
118127
return os;
119128
}
120129

121130
/// Input stream
122-
inline friend std::istream& operator>> ( std::istream& in, TetrahedronInformation& /*tri*/ )
131+
inline friend std::istream& operator>> ( std::istream& in, TetrahedronInformation& tri )
123132
{
133+
in >> tri.materialMatrix;
134+
in >> tri.strainDisplacementTransposedMatrix;
135+
136+
for (int i = 0; i < 4; ++i)
137+
in >> tri.rotatedInitialElements[i];
138+
139+
in >> tri.elemShapeFun;
140+
in >> tri.rotation;
141+
in >> tri.initialTransformation;
124142
return in;
125143
}
126144
};

Sofa/Component/SolidMechanics/FEM/Elastic/tests/TetrahedralCorotationalFEMForceField_test.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,61 @@ TEST_F(TetrahedralCorotationalFEMForceField_test, emptyTology)
8585
this->checkEmptyTopology();
8686
}
8787

88+
TEST_F(TetrahedralCorotationalFEMForceField_test, TetrahedronInformationStreamOperators)
89+
{
90+
TetraCorotationalFEM::TetrahedronInformation initialInfo;
91+
92+
for (int i = 0; i < 6; ++i)
93+
for (int j = 0; j < 6; ++j)
94+
initialInfo.materialMatrix[i][j] = 1;
95+
96+
for (int i = 0; i < 12; ++i)
97+
for (int j = 0; j < 6; ++j)
98+
initialInfo.strainDisplacementTransposedMatrix[i][j] = 1;
99+
100+
for (int i = 0; i < 4; ++i)
101+
initialInfo.rotatedInitialElements[i] = Coord(1, 2, 3);
102+
103+
for (int i = 0; i < 4; ++i)
104+
for (int j = 0; j < 4; ++j)
105+
initialInfo.elemShapeFun[i][j] = 1;
106+
107+
for (int i = 0; i < 3; ++i)
108+
for (int j = 0; j < 3; ++j)
109+
initialInfo.rotation[i][j] = 1;
110+
111+
for (int i = 0; i < 3; ++i)
112+
for (int j = 0; j < 3; ++j)
113+
initialInfo.initialTransformation[i][j] = 1;
114+
115+
std::stringstream buffer;
116+
buffer << initialInfo;
117+
118+
TetraCorotationalFEM::TetrahedronInformation loadedInfo;
119+
buffer >> loadedInfo;
120+
121+
for (int i = 0; i < 6; ++i)
122+
for (int j = 0; j < 6; ++j)
123+
EXPECT_EQ(initialInfo.materialMatrix[i][j], loadedInfo.materialMatrix[i][j]);
124+
125+
for (int i = 0; i < 12; ++i)
126+
for (int j = 0; j < 6; ++j)
127+
EXPECT_EQ(initialInfo.strainDisplacementTransposedMatrix[i][j],
128+
loadedInfo.strainDisplacementTransposedMatrix[i][j]);
129+
130+
for (int i = 0; i < 4; ++i)
131+
EXPECT_EQ(initialInfo.rotatedInitialElements[i], loadedInfo.rotatedInitialElements[i]);
132+
133+
for (int i = 0; i < 4; ++i)
134+
for (int j = 0; j < 4; ++j)
135+
EXPECT_EQ(initialInfo.elemShapeFun[i][j], loadedInfo.elemShapeFun[i][j]);
136+
137+
for (int i = 0; i < 3; ++i)
138+
for (int j = 0; j < 3; ++j)
139+
{
140+
EXPECT_EQ(initialInfo.rotation[i][j], loadedInfo.rotation[i][j]);
141+
EXPECT_EQ(initialInfo.initialTransformation[i][j], loadedInfo.initialTransformation[i][j]);
142+
}
143+
}
144+
88145
}

0 commit comments

Comments
 (0)