diff --git a/test/test_model/test_solid_mechanics_model/test_materials/CMakeLists.txt b/test/test_model/test_solid_mechanics_model/test_materials/CMakeLists.txt index 1441c29b0..5007190cf 100644 --- a/test/test_model/test_solid_mechanics_model/test_materials/CMakeLists.txt +++ b/test/test_model/test_solid_mechanics_model/test_materials/CMakeLists.txt @@ -1,90 +1,101 @@ #=============================================================================== # @file CMakeLists.txt # # @author Guillaume Anciaux # # @date creation: Fri Oct 22 2010 # @date last modification: Wed Jan 20 2016 # # @brief configuration for materials tests # # @section LICENSE # # Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de # Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des # Solides) # # Akantu is free software: you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) any # later version. # # Akantu is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # details. # # You should have received a copy of the GNU Lesser General Public License # along with Akantu. If not, see . # # @section DESCRIPTION # #=============================================================================== #add_mesh(test_local_material_barre_trou_mesh barre_trou.geo 2 2) add_mesh(test_local_material_barre_trou_mesh mesh_section_gap.geo 2 2) register_test(test_local_material SOURCES test_local_material.cc local_material_damage.cc EXTRA_FILES local_material_damage.hh local_material_damage_inline_impl.cc DEPENDS test_local_material_barre_trou_mesh FILES_TO_COPY material.dat DIRECTORIES_TO_CREATE paraview PACKAGE core ) add_mesh(test_material_thermal_mesh square.geo 2 1) register_test(test_material_thermal SOURCES test_material_thermal.cc DEPENDS test_material_thermal_mesh FILES_TO_COPY material_thermal.dat PACKAGE core ) # ============================================================================== add_mesh(test_interpolate_stress_mesh interpolation.geo 3 2) register_test(test_interpolate_stress test_interpolate_stress.cc FILES_TO_COPY material.dat DEPENDS test_interpolate_stress_mesh DIRECTORIES_TO_CREATE paraview PACKAGE lapack core ) #=============================================================================== add_mesh(test_material_orthotropic_square_mesh square.geo 2 1) register_test(test_material_orthotropic SOURCES test_material_orthotropic.cc DEPENDS test_material_orthotropic_square_mesh FILES_TO_COPY orthotropic.dat DIRECTORIES_TO_CREATE paraview PACKAGE core lapack ) #=============================================================================== register_test(test_material_mazars SOURCES test_material_mazars.cc FILES_TO_COPY material_mazars.dat DIRECTORIES_TO_CREATE paraview PACKAGE core lapack ) # ============================================================================== add_akantu_test(test_material_viscoelastic "test the visco elastic materials") add_akantu_test(test_material_non_local "test the non-local materials") add_akantu_test(test_material_elasto_plastic_linear_isotropic_hardening "test the elasto plastic with linear isotropic hardening materials") # ============================================================================== add_mesh(test_multi_material_elastic_mesh test_multi_material_elastic.geo 2 1) register_test(test_multi_material_elastic SOURCES test_multi_material_elastic.cc FILES_TO_COPY test_multi_material_elastic.dat DEPENDS test_multi_material_elastic_mesh PACKAGE implicit) + + +# ============================================================================== +# Material unit tests +# ============================================================================== + +register_test(test_elastic_materials test_elastic_materials.cc PACKAGE core GTEST) +register_test(test_finite_def_materials test_finite_def_materials.cc PACKAGE core GTEST) +register_test(test_damage_materials test_damage_materials.cc PACKAGE core GTEST) +register_test(test_plastic_materials test_plastic_materials.cc PACKAGE core GTEST) + diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_damage_materials.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_damage_materials.cc new file mode 100644 index 000000000..e1dbf4ef3 --- /dev/null +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_damage_materials.cc @@ -0,0 +1,40 @@ +/* -------------------------------------------------------------------------- */ +#include "material_marigo.hh" +#include "material_mazars.hh" +#include "solid_mechanics_model.hh" +#include "test_material_fixtures.hh" +#include +#include +/* -------------------------------------------------------------------------- */ + +using namespace akantu; + +using types = ::testing::Types< + + Traits, Traits, + Traits, + + Traits, Traits, + Traits>; + + +/*****************************************************************/ + +namespace { + +template +class TestDamageMaterialFixture : public ::TestMaterialFixture {}; + +TYPED_TEST_CASE(TestDamageMaterialFixture, types); + +TYPED_TEST(TestDamageMaterialFixture, DamageComputeStress) { + this->material->testComputeStress(); +} +TYPED_TEST(TestDamageMaterialFixture, DamageEnergyDensity) { + this->material->testEnergyDensity(); +} +TYPED_TEST(TestDamageMaterialFixture, DamageComputeTangentModuli) { + this->material->testComputeTangentModuli(); +} +} +/*****************************************************************/ diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_elastic_materials.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_elastic_materials.cc new file mode 100644 index 000000000..731f45527 --- /dev/null +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_elastic_materials.cc @@ -0,0 +1,113 @@ +/* -------------------------------------------------------------------------- */ +#include "material_elastic.hh" +#include "material_elastic_orthotropic.hh" +#include "solid_mechanics_model.hh" +#include "test_material_fixtures.hh" +#include +#include +/* -------------------------------------------------------------------------- */ + +using namespace akantu; + +using types = ::testing::Types< + + Traits, Traits, + Traits, + + Traits, + Traits, + Traits>; + +/*****************************************************************/ + +template <> void FriendMaterial>::testComputeStress() { + + Real E = 1.; + Real nu = .3; + setParam("E", E); + setParam("nu", nu); + setParam("rho", nu); + // std::cout << *this << std::endl; + + Real epsilon = 1.; + const Matrix grad_u = {{0, epsilon, 0}, {epsilon, 0, 0}, {0, 0, 0}}; + Matrix sigma(3, 3); + this->computeStressOnQuad(grad_u, sigma, 0.); + + Matrix sigma_expected = {{0, 1, 0}, {1, 0, 0}, {0, 0, 0}}; + sigma_expected *= E / (1 + nu); + + auto diff = sigma - sigma_expected; + Real stress_error = diff.norm(); + ASSERT_DOUBLE_EQ(stress_error, 0.); +} + +/*****************************************************************/ +template <> +void FriendMaterial>::testComputeTangentModuli() { + TO_IMPLEMENT; +} + +/*****************************************************************/ + +template <> void FriendMaterial>::testEnergyDensity() { + TO_IMPLEMENT; +} + +/*****************************************************************/ + +template <> void FriendMaterial>::testComputeStress() { + TO_IMPLEMENT; +} + +/*****************************************************************/ +template <> +void FriendMaterial>::testComputeTangentModuli() { + TO_IMPLEMENT; +} + +/*****************************************************************/ + +template <> void FriendMaterial>::testEnergyDensity() { + TO_IMPLEMENT; +} + +/*****************************************************************/ + +template <> void FriendMaterial>::testComputeStress() { + TO_IMPLEMENT; +} + +/*****************************************************************/ +template <> +void FriendMaterial>::testComputeTangentModuli() { + TO_IMPLEMENT; +} + +/*****************************************************************/ + +template <> void FriendMaterial>::testEnergyDensity() { + TO_IMPLEMENT; +} + +/*****************************************************************/ + +namespace { + +template +class TestElasticMaterialFixture : public ::TestMaterialFixture {}; + +TYPED_TEST_CASE(TestElasticMaterialFixture, types); + +TYPED_TEST(TestElasticMaterialFixture, ElasticComputeStress) { + this->material->testComputeStress(); +} +TYPED_TEST(TestElasticMaterialFixture, ElasticEnergyDensity) { + this->material->testEnergyDensity(); +} +TYPED_TEST(TestElasticMaterialFixture, ElasticComputeTangentModuli) { + this->material->testComputeTangentModuli(); +} +} + +/*****************************************************************/ diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_finite_def_materials.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_finite_def_materials.cc new file mode 100644 index 000000000..ab7e81a65 --- /dev/null +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_finite_def_materials.cc @@ -0,0 +1,53 @@ +/* -------------------------------------------------------------------------- */ +#include "material_neohookean.hh" +#include "solid_mechanics_model.hh" +#include "test_material_fixtures.hh" +#include +#include +/* -------------------------------------------------------------------------- */ + +using namespace akantu; + +using types = ::testing::Types< + + Traits, Traits, + Traits>; + +/*****************************************************************/ + +template <> void FriendMaterial>::testComputeStress() { + TO_IMPLEMENT; +} + +/*****************************************************************/ +template <> +void FriendMaterial>::testComputeTangentModuli() { + TO_IMPLEMENT; +} + +/*****************************************************************/ + +template <> void FriendMaterial>::testEnergyDensity() { + TO_IMPLEMENT; +} + +/*****************************************************************/ + +namespace { + +template +class TestFiniteDefMaterialFixture : public ::TestMaterialFixture {}; + +TYPED_TEST_CASE(TestFiniteDefMaterialFixture, types); + +TYPED_TEST(TestFiniteDefMaterialFixture, FiniteDefComputeStress) { + this->material->testComputeStress(); +} +TYPED_TEST(TestFiniteDefMaterialFixture, FiniteDefEnergyDensity) { + this->material->testEnergyDensity(); +} +TYPED_TEST(TestFiniteDefMaterialFixture, FiniteDefComputeTangentModuli) { + this->material->testComputeTangentModuli(); +} +} +/*****************************************************************/ diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_material_fixtures.hh b/test/test_model/test_solid_mechanics_model/test_materials/test_material_fixtures.hh new file mode 100644 index 000000000..c5c36ede4 --- /dev/null +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_material_fixtures.hh @@ -0,0 +1,58 @@ +#include "material_elastic.hh" +#include "solid_mechanics_model.hh" +#include +#include +/* -------------------------------------------------------------------------- */ + +#define TO_IMPLEMENT AKANTU_EXCEPTION("TEST TO IMPLEMENT") + +using namespace akantu; + +/*****************************************************************/ + + +template class FriendMaterial : public T { + +public: + virtual void testComputeStress() { TO_IMPLEMENT; }; + virtual void testComputeTangentModuli() { TO_IMPLEMENT; }; + virtual void testEnergyDensity() { TO_IMPLEMENT; }; + + FriendMaterial(SolidMechanicsModel & model, const ID & id = "") + : T(model, id) {} +}; + +/*****************************************************************/ + +template class TestMaterialFixture : public ::testing::Test { + +public: + using mat_class = typename T::mat_class; + + void SetUp() override { + constexpr auto spatial_dimension = T::Dim; + mesh = std::make_unique(spatial_dimension); + model = std::make_unique(*mesh); + material = std::make_unique(*model); + } + + void TearDown() override { + material.reset(nullptr); + model.reset(nullptr); + mesh.reset(nullptr); + } + + using friend_class = FriendMaterial; + +protected: + std::unique_ptr mesh; + std::unique_ptr model; + std::unique_ptr material; +}; + +/*****************************************************************/ +template