From 553ba50b6738454c01249449a978ef634f323c72 Mon Sep 17 00:00:00 2001 From: David Carter Date: Thu, 18 Apr 2024 20:18:50 -0400 Subject: [PATCH] Materials: Update Material Models Several minor material updates: - Separate Hardness from LinearElastic model - Add UUID definitions for FEM dependent models - Update unit tests --- src/Mod/Material/App/ModelUuids.cpp | 28 +++++++ src/Mod/Material/App/ModelUuids.h | 14 ++++ src/Mod/Material/App/UUIDsPy.xml | 84 +++++++++++++++++++ src/Mod/Material/App/UUIDsPyImpl.cpp | 70 ++++++++++++++++ src/Mod/Material/CMakeLists.txt | 1 + .../Standard/Metal/Titanium/Ti-6Al-4V.FCMat | 5 +- .../Resources/Models/Mechanical/Hardness.yml | 43 ++++++++++ .../Models/Mechanical/LinearElastic.yml | 5 -- src/Mod/Material/materialtests/TestModels.py | 14 ++++ 9 files changed, 258 insertions(+), 6 deletions(-) create mode 100644 src/Mod/Material/Resources/Models/Mechanical/Hardness.yml diff --git a/src/Mod/Material/App/ModelUuids.cpp b/src/Mod/Material/App/ModelUuids.cpp index 8e40b4428a..ceba5591bd 100644 --- a/src/Mod/Material/App/ModelUuids.cpp +++ b/src/Mod/Material/App/ModelUuids.cpp @@ -34,16 +34,44 @@ const QString ModelUUIDs::ModelUUID_Legacy_Father = const QString ModelUUIDs::ModelUUID_Legacy_MaterialStandard = QString::fromStdString("1e2c0088-904a-4537-925f-64064c07d700"); +const QString ModelUUIDs::ModelUUID_Mechanical_ArrudaBoyce = + QString::fromStdString("e10d00de-c7de-4e59-bcdd-058c2ea19ec6"); const QString ModelUUIDs::ModelUUID_Mechanical_Density = QString::fromStdString("454661e5-265b-4320-8e6f-fcf6223ac3af"); +const QString ModelUUIDs::ModelUUID_Mechanical_Hardness = + QString::fromStdString("3d1a6141-d032-4d82-8bb5-a8f339fff8ad"); const QString ModelUUIDs::ModelUUID_Mechanical_IsotropicLinearElastic = QString::fromStdString("f6f9e48c-b116-4e82-ad7f-3659a9219c50"); const QString ModelUUIDs::ModelUUID_Mechanical_LinearElastic = QString::fromStdString("7b561d1d-fb9b-44f6-9da9-56a4f74d7536"); +const QString ModelUUIDs::ModelUUID_Mechanical_MooneyRivlin = + QString::fromStdString("beeed169-7770-4da0-ab67-c9172cf7d23d"); +const QString ModelUUIDs::ModelUUID_Mechanical_NeoHooke = + QString::fromStdString("569ebc58-ef29-434a-83be-555a0980d505"); +const QString ModelUUIDs::ModelUUID_Mechanical_OgdenN1 = + QString::fromStdString("a2634a2c-412f-468d-9bec-74ae5d87a9c0"); +const QString ModelUUIDs::ModelUUID_Mechanical_OgdenN2 = + QString::fromStdString("233540bb-7b13-4f49-ac12-126a5c82cedf"); +const QString ModelUUIDs::ModelUUID_Mechanical_OgdenN3 = + QString::fromStdString("a917d6b8-209f-429e-9972-fe4bbb97af3f"); const QString ModelUUIDs::ModelUUID_Mechanical_OgdenYld2004p18 = QString::fromStdString("3ef9e427-cc25-43f7-817f-79ff0d49625f"); const QString ModelUUIDs::ModelUUID_Mechanical_OrthotropicLinearElastic = QString::fromStdString("b19ccc6b-a431-418e-91c2-0ac8c649d146"); +const QString ModelUUIDs::ModelUUID_Mechanical_PolynomialN1 = + QString::fromStdString("285a6042-0f0c-4a36-a898-4afadd6408ce"); +const QString ModelUUIDs::ModelUUID_Mechanical_PolynomialN2 = + QString::fromStdString("4c2fb7b2-5121-4d6f-be0d-8c5970c9e682"); +const QString ModelUUIDs::ModelUUID_Mechanical_PolynomialN3 = + QString::fromStdString("e83ada22-947e-4beb-91e7-482a16f5ba77"); +const QString ModelUUIDs::ModelUUID_Mechanical_ReducedPolynomialN1 = + QString::fromStdString("f8052a3c-db17-42ea-b2be-13aa5ef30730"); +const QString ModelUUIDs::ModelUUID_Mechanical_ReducedPolynomialN2 = + QString::fromStdString("c52b5021-4bb8-441c-80d4-855fce9de15e"); +const QString ModelUUIDs::ModelUUID_Mechanical_ReducedPolynomialN3 = + QString::fromStdString("fa4e58b4-74c7-4292-8e79-7d5fd232fb55"); +const QString ModelUUIDs::ModelUUID_Mechanical_Yeoh = + QString::fromStdString("cd13c492-21a9-4578-8191-deec003e4c01"); const QString ModelUUIDs::ModelUUID_Fluid_Default = QString::fromStdString("1ae66d8c-1ba1-4211-ad12-b9917573b202"); diff --git a/src/Mod/Material/App/ModelUuids.h b/src/Mod/Material/App/ModelUuids.h index 70a7ebb8e1..1b79e89ea4 100644 --- a/src/Mod/Material/App/ModelUuids.h +++ b/src/Mod/Material/App/ModelUuids.h @@ -45,11 +45,25 @@ public: static const QString ModelUUID_Legacy_Father; static const QString ModelUUID_Legacy_MaterialStandard; + static const QString ModelUUID_Mechanical_ArrudaBoyce; static const QString ModelUUID_Mechanical_Density; + static const QString ModelUUID_Mechanical_Hardness; static const QString ModelUUID_Mechanical_IsotropicLinearElastic; static const QString ModelUUID_Mechanical_LinearElastic; + static const QString ModelUUID_Mechanical_MooneyRivlin; + static const QString ModelUUID_Mechanical_NeoHooke; + static const QString ModelUUID_Mechanical_OgdenN1; + static const QString ModelUUID_Mechanical_OgdenN2; + static const QString ModelUUID_Mechanical_OgdenN3; static const QString ModelUUID_Mechanical_OgdenYld2004p18; static const QString ModelUUID_Mechanical_OrthotropicLinearElastic; + static const QString ModelUUID_Mechanical_PolynomialN1; + static const QString ModelUUID_Mechanical_PolynomialN2; + static const QString ModelUUID_Mechanical_PolynomialN3; + static const QString ModelUUID_Mechanical_ReducedPolynomialN1; + static const QString ModelUUID_Mechanical_ReducedPolynomialN2; + static const QString ModelUUID_Mechanical_ReducedPolynomialN3; + static const QString ModelUUID_Mechanical_Yeoh; static const QString ModelUUID_Fluid_Default; diff --git a/src/Mod/Material/App/UUIDsPy.xml b/src/Mod/Material/App/UUIDsPy.xml index 7448c032c7..49ee9091fd 100644 --- a/src/Mod/Material/App/UUIDsPy.xml +++ b/src/Mod/Material/App/UUIDsPy.xml @@ -28,12 +28,24 @@ + + + UUID for model System:Mechanical/ArrudaBoyce + + + UUID for model System:Mechanical/Density + + + UUID for model System:Mechanical/Hardness + + + UUID for model System:Mechanical/IsotropicLinearElastic @@ -46,6 +58,36 @@ + + + UUID for model System:Mechanical/MooneyRivlin + + + + + + UUID for model System:Mechanical/NeoHooke + + + + + + UUID for model System:Mechanical/OgdenN1 + + + + + + UUID for model System:Mechanical/OgdenN2 + + + + + + UUID for model System:Mechanical/OgdenN3 + + + UUID for model System:Mechanical/OgdenYld2004p18 @@ -58,6 +100,48 @@ + + + UUID for model System:Mechanical/PolynomialN1 + + + + + + UUID for model System:Mechanical/PolynomialN2 + + + + + + UUID for model System:Mechanical/PolynomialN3 + + + + + + UUID for model System:Mechanical/ReducedPolynomialN1 + + + + + + UUID for model System:Mechanical/ReducedPolynomialN2 + + + + + + UUID for model System:Mechanical/ReducedPolynomialN3 + + + + + + UUID for model System:Mechanical/Yeoh + + + UUID for model System:Fluid/Fluid diff --git a/src/Mod/Material/App/UUIDsPyImpl.cpp b/src/Mod/Material/App/UUIDsPyImpl.cpp index e8d7af27da..94403fcb7f 100644 --- a/src/Mod/Material/App/UUIDsPyImpl.cpp +++ b/src/Mod/Material/App/UUIDsPyImpl.cpp @@ -57,11 +57,21 @@ Py::String UUIDsPy::getMaterialStandard() const return Py::String(ModelUUIDs::ModelUUID_Legacy_MaterialStandard.toStdString()); } +Py::String UUIDsPy::getArrudaBoyce() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_ArrudaBoyce.toStdString()); +} + Py::String UUIDsPy::getDensity() const { return Py::String(ModelUUIDs::ModelUUID_Mechanical_Density.toStdString()); } +Py::String UUIDsPy::getHardness() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_Hardness.toStdString()); +} + Py::String UUIDsPy::getIsotropicLinearElastic() const { return Py::String(ModelUUIDs::ModelUUID_Mechanical_IsotropicLinearElastic.toStdString()); @@ -72,6 +82,31 @@ Py::String UUIDsPy::getLinearElastic() const return Py::String(ModelUUIDs::ModelUUID_Mechanical_LinearElastic.toStdString()); } +Py::String UUIDsPy::getMooneyRivlin() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_MooneyRivlin.toStdString()); +} + +Py::String UUIDsPy::getNeoHooke() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_NeoHooke.toStdString()); +} + +Py::String UUIDsPy::getOgdenN1() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_OgdenN1.toStdString()); +} + +Py::String UUIDsPy::getOgdenN2() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_OgdenN2.toStdString()); +} + +Py::String UUIDsPy::getOgdenN3() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_OgdenN3.toStdString()); +} + Py::String UUIDsPy::getOgdenYld2004p18() const { return Py::String(ModelUUIDs::ModelUUID_Mechanical_OgdenYld2004p18.toStdString()); @@ -82,6 +117,41 @@ Py::String UUIDsPy::getOrthotropicLinearElastic() const return Py::String(ModelUUIDs::ModelUUID_Mechanical_OrthotropicLinearElastic.toStdString()); } +Py::String UUIDsPy::getPolynomialN1() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_PolynomialN1.toStdString()); +} + +Py::String UUIDsPy::getPolynomialN2() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_PolynomialN2.toStdString()); +} + +Py::String UUIDsPy::getPolynomialN3() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_PolynomialN3.toStdString()); +} + +Py::String UUIDsPy::getReducedPolynomialN1() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_ReducedPolynomialN1.toStdString()); +} + +Py::String UUIDsPy::getReducedPolynomialN2() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_ReducedPolynomialN2.toStdString()); +} + +Py::String UUIDsPy::getReducedPolynomialN3() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_ReducedPolynomialN3.toStdString()); +} + +Py::String UUIDsPy::getYeoh() const +{ + return Py::String(ModelUUIDs::ModelUUID_Mechanical_Yeoh.toStdString()); +} + Py::String UUIDsPy::getFluid() const { return Py::String(ModelUUIDs::ModelUUID_Fluid_Default.toStdString()); diff --git a/src/Mod/Material/CMakeLists.txt b/src/Mod/Material/CMakeLists.txt index 794f0f1809..a9ee1296d4 100644 --- a/src/Mod/Material/CMakeLists.txt +++ b/src/Mod/Material/CMakeLists.txt @@ -238,6 +238,7 @@ SET(MaterialModel_Files Resources/Models/Legacy/MaterialStandard.yml Resources/Models/Mechanical/ArrudaBoyce.yml Resources/Models/Mechanical/Density.yml + Resources/Models/Mechanical/Hardness.yml Resources/Models/Mechanical/IsotropicLinearElastic.yml Resources/Models/Mechanical/LinearElastic.yml Resources/Models/Mechanical/MooneyRivlin.yml diff --git a/src/Mod/Material/Resources/Materials/Standard/Metal/Titanium/Ti-6Al-4V.FCMat b/src/Mod/Material/Resources/Materials/Standard/Metal/Titanium/Ti-6Al-4V.FCMat index 3aea34e579..e5e89060ad 100644 --- a/src/Mod/Material/Resources/Materials/Standard/Metal/Titanium/Ti-6Al-4V.FCMat +++ b/src/Mod/Material/Resources/Materials/Standard/Metal/Titanium/Ti-6Al-4V.FCMat @@ -20,7 +20,10 @@ Models: UltimateTensileStrength: "975.5 MPa" YieldStrength: "910 MPa" YoungsModulus: "114 GPa" - Hardness: "35 HRC" + Hardness: + UUID: '3d1a6141-d032-4d82-8bb5-a8f339fff8ad' + Hardness: "35" + HardnessUnits: "HRC" Thermal: UUID: '9959d007-a970-4ea7-bae4-3eb1b8b883c7' SpecificHeat: "553.0 J/kg/K" diff --git a/src/Mod/Material/Resources/Models/Mechanical/Hardness.yml b/src/Mod/Material/Resources/Models/Mechanical/Hardness.yml new file mode 100644 index 0000000000..e587b23033 --- /dev/null +++ b/src/Mod/Material/Resources/Models/Mechanical/Hardness.yml @@ -0,0 +1,43 @@ +--- +# *************************************************************************** +# * * +# * Copyright (c) 2023 David Carter * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program 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 Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +Model: + Name: 'Hardness' + UUID: '3d1a6141-d032-4d82-8bb5-a8f339fff8ad' + URL: 'https://en.wikipedia.org/wiki/Mohs_scale' + Description: > + Measure of the hardness of the material. FreeCAD does not define any + hardness units so it is up to the module to interpret the units as + appropriate. + DOI: '' + Hardness: + Type: 'Float' + Units: '' + URL: 'https://en.wikipedia.org/wiki/Mohs_scale' + Description: "Hardness. FreeCAD does not currently support hardness units" + HardnessUnits: + DisplayName: "Hardness Units" + Type: 'String' + Units: '' + URL: 'https://en.wikipedia.org/wiki/Mohs_scale' + Description: "Hardness units. FreeCAD does not currently support hardness units" diff --git a/src/Mod/Material/Resources/Models/Mechanical/LinearElastic.yml b/src/Mod/Material/Resources/Models/Mechanical/LinearElastic.yml index aabd4ea72b..7063b17aa9 100644 --- a/src/Mod/Material/Resources/Models/Mechanical/LinearElastic.yml +++ b/src/Mod/Material/Resources/Models/Mechanical/LinearElastic.yml @@ -80,8 +80,3 @@ Model: Units: 'N/m' URL: 'https://en.wikipedia.org/wiki/Stiffness' Description: "Stiffness (or Spring Stiffness) in [FreeCAD Stiffness unit]" - Hardness: - Type: 'Quantity' - Units: '' - URL: 'https://en.wikipedia.org/wiki/Mohs_scale' - Description: "Hardness. FreeCAD does not currently support hardness units" diff --git a/src/Mod/Material/materialtests/TestModels.py b/src/Mod/Material/materialtests/TestModels.py index e6c62aa004..1091c9f80e 100644 --- a/src/Mod/Material/materialtests/TestModels.py +++ b/src/Mod/Material/materialtests/TestModels.py @@ -49,11 +49,25 @@ class ModelTestCases(unittest.TestCase): self.assertTrue(self.uuids.Father, "9cdda8b6-b606-4778-8f13-3934d8668e67") self.assertTrue(self.uuids.MaterialStandard, "1e2c0088-904a-4537-925f-64064c07d700") + self.assertTrue(self.uuids.ArrudaBoyce, "e10d00de-c7de-4e59-bcdd-058c2ea19ec6") self.assertTrue(self.uuids.Density, "454661e5-265b-4320-8e6f-fcf6223ac3af") + self.assertTrue(self.uuids.Hardness, "3d1a6141-d032-4d82-8bb5-a8f339fff8ad") self.assertTrue(self.uuids.IsotropicLinearElastic, "f6f9e48c-b116-4e82-ad7f-3659a9219c50") self.assertTrue(self.uuids.LinearElastic,"7b561d1d-fb9b-44f6-9da9-56a4f74d7536") + self.assertTrue(self.uuids.MooneyRivlin, "beeed169-7770-4da0-ab67-c9172cf7d23d") + self.assertTrue(self.uuids.NeoHooke, "569ebc58-ef29-434a-83be-555a0980d505") + self.assertTrue(self.uuids.OgdenN1, "a2634a2c-412f-468d-9bec-74ae5d87a9c0") + self.assertTrue(self.uuids.OgdenN2, "233540bb-7b13-4f49-ac12-126a5c82cedf") + self.assertTrue(self.uuids.OgdenN3, "a917d6b8-209f-429e-9972-fe4bbb97af3f") self.assertTrue(self.uuids.OgdenYld2004p18, "3ef9e427-cc25-43f7-817f-79ff0d49625f") self.assertTrue(self.uuids.OrthotropicLinearElastic, "b19ccc6b-a431-418e-91c2-0ac8c649d146") + self.assertTrue(self.uuids.PolynomialN1, "285a6042-0f0c-4a36-a898-4afadd6408ce") + self.assertTrue(self.uuids.PolynomialN2, "4c2fb7b2-5121-4d6f-be0d-8c5970c9e682") + self.assertTrue(self.uuids.PolynomialN3, "e83ada22-947e-4beb-91e7-482a16f5ba77") + self.assertTrue(self.uuids.ReducedPolynomialN1, "f8052a3c-db17-42ea-b2be-13aa5ef30730") + self.assertTrue(self.uuids.ReducedPolynomialN2, "c52b5021-4bb8-441c-80d4-855fce9de15e") + self.assertTrue(self.uuids.ReducedPolynomialN3, "fa4e58b4-74c7-4292-8e79-7d5fd232fb55") + self.assertTrue(self.uuids.Yeoh, "cd13c492-21a9-4578-8191-deec003e4c01") self.assertTrue(self.uuids.Fluid, "1ae66d8c-1ba1-4211-ad12-b9917573b202")