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; } }; 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]); + } +} + }