From 42e2f3cf16ba76c42b8a1a2faaa9cf73b42ef4ec Mon Sep 17 00:00:00 2001 From: Lucas Burel Date: Wed, 27 May 2026 10:27:33 +0200 Subject: [PATCH 1/2] fix Output stream and Input stream for TetrahedronInformation --- .../TetrahedralCorotationalFEMForceField.h | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h index d5116e2f8ea..0752fd57b6f 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/src/sofa/component/solidmechanics/fem/elastic/TetrahedralCorotationalFEMForceField.h @@ -113,14 +113,32 @@ class TetrahedralCorotationalFEMForceField : public BaseLinearElasticityFEMForce } /// Output stream - inline friend std::ostream& operator<< ( std::ostream& os, const TetrahedronInformation& /*tri*/ ) + inline friend std::ostream& operator<< ( std::ostream& os, const TetrahedronInformation& tri ) { + os << tri.materialMatrix << " "; + os << tri.strainDisplacementTransposedMatrix << " "; + + for (int i = 0; i < 4; ++i) + os << tri.rotatedInitialElements[i] << " "; + + os << tri.elemShapeFun << " "; + os << tri.rotation << " "; + os << tri.initialTransformation << " "; return os; } /// Input stream - inline friend std::istream& operator>> ( std::istream& in, TetrahedronInformation& /*tri*/ ) + inline friend std::istream& operator>> ( std::istream& in, TetrahedronInformation& tri ) { + in >> tri.materialMatrix; + in >> tri.strainDisplacementTransposedMatrix; + + for (int i = 0; i < 4; ++i) + in >> tri.rotatedInitialElements[i]; + + in >> tri.elemShapeFun; + in >> tri.rotation; + in >> tri.initialTransformation; return in; } }; From 7dfac776c1207d82f659bd95c5b13cc9c154aafb Mon Sep 17 00:00:00 2001 From: Lucas Burel Date: Tue, 9 Jun 2026 16:22:30 +0200 Subject: [PATCH 2/2] add unit test --- ...rahedralCorotationalFEMForceField_test.cpp | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/Sofa/Component/SolidMechanics/FEM/Elastic/tests/TetrahedralCorotationalFEMForceField_test.cpp b/Sofa/Component/SolidMechanics/FEM/Elastic/tests/TetrahedralCorotationalFEMForceField_test.cpp index f83b8ee6b73..5c676089288 100644 --- a/Sofa/Component/SolidMechanics/FEM/Elastic/tests/TetrahedralCorotationalFEMForceField_test.cpp +++ b/Sofa/Component/SolidMechanics/FEM/Elastic/tests/TetrahedralCorotationalFEMForceField_test.cpp @@ -85,4 +85,61 @@ TEST_F(TetrahedralCorotationalFEMForceField_test, emptyTology) this->checkEmptyTopology(); } +TEST_F(TetrahedralCorotationalFEMForceField_test, TetrahedronInformationStreamOperators) +{ + TetraCorotationalFEM::TetrahedronInformation initialInfo; + + for (int i = 0; i < 6; ++i) + for (int j = 0; j < 6; ++j) + initialInfo.materialMatrix[i][j] = 1; + + for (int i = 0; i < 12; ++i) + for (int j = 0; j < 6; ++j) + initialInfo.strainDisplacementTransposedMatrix[i][j] = 1; + + for (int i = 0; i < 4; ++i) + initialInfo.rotatedInitialElements[i] = Coord(1, 2, 3); + + for (int i = 0; i < 4; ++i) + for (int j = 0; j < 4; ++j) + initialInfo.elemShapeFun[i][j] = 1; + + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + initialInfo.rotation[i][j] = 1; + + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + initialInfo.initialTransformation[i][j] = 1; + + std::stringstream buffer; + buffer << initialInfo; + + TetraCorotationalFEM::TetrahedronInformation loadedInfo; + buffer >> loadedInfo; + + for (int i = 0; i < 6; ++i) + for (int j = 0; j < 6; ++j) + EXPECT_EQ(initialInfo.materialMatrix[i][j], loadedInfo.materialMatrix[i][j]); + + for (int i = 0; i < 12; ++i) + for (int j = 0; j < 6; ++j) + EXPECT_EQ(initialInfo.strainDisplacementTransposedMatrix[i][j], + loadedInfo.strainDisplacementTransposedMatrix[i][j]); + + for (int i = 0; i < 4; ++i) + EXPECT_EQ(initialInfo.rotatedInitialElements[i], loadedInfo.rotatedInitialElements[i]); + + for (int i = 0; i < 4; ++i) + for (int j = 0; j < 4; ++j) + EXPECT_EQ(initialInfo.elemShapeFun[i][j], loadedInfo.elemShapeFun[i][j]); + + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + { + EXPECT_EQ(initialInfo.rotation[i][j], loadedInfo.rotation[i][j]); + EXPECT_EQ(initialInfo.initialTransformation[i][j], loadedInfo.initialTransformation[i][j]); + } +} + }