diff --git a/tests/unit_tests_src/shared/test_materials/CMakeLists.txt b/tests/unit_tests_src/shared/test_materials/CMakeLists.txt new file mode 100644 index 0000000000..d8c246bc9e --- /dev/null +++ b/tests/unit_tests_src/shared/test_materials/CMakeLists.txt @@ -0,0 +1,16 @@ +STRING( REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} ) +PROJECT("${CURRENT_FOLDER}") + +SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) +SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/bin/") +SET(BUILD_INPUT_PATH "${EXECUTABLE_OUTPUT_PATH}/input") +SET(BUILD_RELOAD_PATH "${EXECUTABLE_OUTPUT_PATH}/reload") + +aux_source_directory(. DIR_SRCS) +ADD_EXECUTABLE(${PROJECT_NAME} ${EXECUTABLE_OUTPUT_PATH} ${DIR_SRCS}) +target_link_libraries(${PROJECT_NAME} sphinxsys_3d GTest::gtest GTest::gtest_main) +set_target_properties(${PROJECT_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${EXECUTABLE_OUTPUT_PATH}") + +add_test(NAME ${PROJECT_NAME} + COMMAND ${PROJECT_NAME} + WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) diff --git a/tests/unit_tests_src/shared/test_materials/test_materials.cpp b/tests/unit_tests_src/shared/test_materials/test_materials.cpp new file mode 100644 index 0000000000..6ae9285e04 --- /dev/null +++ b/tests/unit_tests_src/shared/test_materials/test_materials.cpp @@ -0,0 +1,35 @@ +#include "sphinxsys.h" +#include +using namespace SPH; + +TEST(material_verification, sanity_check) +{ + constexpr double tolerance = std::numeric_limits::epsilon(); + const auto I = SPH::Mat3d::Identity(); + constexpr double E = 1e4; + constexpr double nu = 0.49; + const SPH::Mat3d R = Eigen::AngleAxisd(M_PI / 6, SPH::Vec3d{1, 1, 0}.normalized()).toRotationMatrix(); + constexpr double stretch = 2.0; + const SPH::Mat3d U = SPH::Vec3d{stretch, 1 / sqrt(stretch), 1 / sqrt(stretch)}.asDiagonal(); + double J = U.determinant(); + SPH::Mat3d F = R * U; + SPH::Mat3d B = F * F.transpose(); + SPH::Mat3d e = 0.5 * (I - B.inverse()); + + auto sanity_check = [&](auto &&material) + { + auto S = material.StressPK2(F, 0); + auto s = material.StressCauchy(e, 0); + return (s.isApprox(F * S * F.transpose() / J, tolerance)); + }; + EXPECT_TRUE(sanity_check(SPH::LinearElasticSolid{1, E, nu})); + EXPECT_TRUE(sanity_check(SPH::SaintVenantKirchhoffSolid{1, E, nu})); + EXPECT_TRUE(sanity_check(SPH::NeoHookeanSolidIncompressible{1, E, nu})); + EXPECT_TRUE(sanity_check(SPH::NeoHookeanSolid{1, E, nu})); +} + +int main(int argc, char *argv[]) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}