From e21c34a562786bc5db5efde82e02ce8932bb585a Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 19 Mar 2018 21:14:36 +0100 Subject: [PATCH] FEM: unit tests, add various tetra10 mesh element tests --- src/Mod/Fem/CMakeLists.txt | 8 ++ src/Mod/Fem/femtest/testcommon.py | 2 +- .../Fem/femtest/testfiles/mesh/__init__.py | 29 +++++++ .../femtest/testfiles/mesh/tetra10_mesh.inp | 24 ++++++ .../femtest/testfiles/mesh/tetra10_mesh.unv | 46 +++++++++++ src/Mod/Fem/femtest/testmesh.py | 80 +++++++++++++++++++ 6 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 src/Mod/Fem/femtest/testfiles/mesh/__init__.py create mode 100644 src/Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.inp create mode 100644 src/Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.unv diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 7a2967bb59..8470a8b3b8 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -162,6 +162,12 @@ SET(FemTestsElmer_SRCS femtest/testfiles/elmer/ELMERSOLVER_STARTINFO ) +SET(FemTestsMesh_SRCS + femtest/testfiles/mesh/__init__.py + femtest/testfiles/mesh/tetra10_mesh.inp + femtest/testfiles/mesh/tetra10_mesh.unv +) + SET(FemTools_SRCS femtools/__init__.py femtools/ccxtools.py @@ -207,6 +213,7 @@ SET(FemAllScripts ${FemTestsFiles_SRCS} ${FemTestsCcx_SRCS} ${FemTestsElmer_SRCS} + ${FemTestsMesh_SRCS} ${FemTools_SRCS} ${FemObjectsScripts_SRCS} ) @@ -235,6 +242,7 @@ INSTALL(FILES ${FemTests_SRCS} DESTINATION Mod/Fem/femtest) INSTALL(FILES ${FemTestsFiles_SRCS} DESTINATION Mod/Fem/femtest/testfiles) INSTALL(FILES ${FemTestsCcx_SRCS} DESTINATION Mod/Fem/femtest/testfiles/ccx) INSTALL(FILES ${FemTestsElmer_SRCS} DESTINATION Mod/Fem/femtest/testfiles/elmer) +INSTALL(FILES ${FemTestsMesh_SRCS} DESTINATION Mod/Fem/femtest/testfiles/mesh) INSTALL(FILES ${FemTools_SRCS} DESTINATION Mod/Fem/femtools) INSTALL(FILES ${FemObjectsScripts_SRCS} DESTINATION Mod/Fem/femobjects) diff --git a/src/Mod/Fem/femtest/testcommon.py b/src/Mod/Fem/femtest/testcommon.py index dfdc330219..f4117b9575 100644 --- a/src/Mod/Fem/femtest/testcommon.py +++ b/src/Mod/Fem/femtest/testcommon.py @@ -22,7 +22,7 @@ # * * # ***************************************************************************/ -import Fem + import FreeCAD import ObjectsFem import unittest diff --git a/src/Mod/Fem/femtest/testfiles/mesh/__init__.py b/src/Mod/Fem/femtest/testfiles/mesh/__init__.py new file mode 100644 index 0000000000..e6b1283a31 --- /dev/null +++ b/src/Mod/Fem/femtest/testfiles/mesh/__init__.py @@ -0,0 +1,29 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2017 - Bernd Hahnebach * +# * * +# * 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 * +# * * +# *************************************************************************** + +__title__ = "Fem test cases" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package test_files +# \ingroup Fem +# \brief Fem test cases diff --git a/src/Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.inp b/src/Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.inp new file mode 100644 index 0000000000..cb87874605 --- /dev/null +++ b/src/Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.inp @@ -0,0 +1,24 @@ +** written by FreeCAD inp file writer for CalculiX,Abaqus meshes +** highest dimension mesh elements only. + +** Nodes +*Node, NSET=Nall +1, 6, 12, 18 +2, 0, 0, 18 +3, 12, 0, 18 +4, 6, 6, 0 +5, 3, 6, 18 +6, 6, 0, 18 +7, 9, 6, 18 +8, 6, 9, 9 +9, 3, 3, 9 +10, 9, 3, 9 + + +** Volume elements +*Element, TYPE=C3D10, ELSET=Evolumes +1, 2, 1, 3, 4, 5, 7, 6, 9, 8, 10 + +** Define element set Eall +*ELSET, ELSET=Eall +Evolumes diff --git a/src/Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.unv b/src/Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.unv new file mode 100644 index 0000000000..9fa64a21ed --- /dev/null +++ b/src/Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.unv @@ -0,0 +1,46 @@ + -1 + 164 + 1 SI: Meter (newton) 2 + 1.0000000000000000E+0 1.0000000000000000E+0 1.0000000000000000E+0 + 2.7314999999999998E+2 + -1 + -1 + 2420 + 1 +SMESH_Mesh + 1 0 0 +Global Cartesian Coordinate System + 1.0000000000000000E+0 0.0000000000000000E+0 0.0000000000000000E+0 + 0.0000000000000000E+0 1.0000000000000000E+0 0.0000000000000000E+0 + 0.0000000000000000E+0 0.0000000000000000E+0 1.0000000000000000E+0 + 0.0000000000000000E+0 0.0000000000000000E+0 0.0000000000000000E+0 + -1 + -1 + 2411 + 1 1 1 11 + 6.0000000000000000E+00 1.2000000000000000E+01 1.8000000000000000E+01 + 2 1 1 11 + 0.0000000000000000E+00 0.0000000000000000E+00 1.8000000000000000E+01 + 3 1 1 11 + 1.2000000000000000E+01 0.0000000000000000E+00 1.8000000000000000E+01 + 4 1 1 11 + 6.0000000000000000E+00 6.0000000000000000E+00 0.0000000000000000E+00 + 5 1 1 11 + 3.0000000000000000E+00 6.0000000000000000E+00 1.8000000000000000E+01 + 6 1 1 11 + 6.0000000000000000E+00 0.0000000000000000E+00 1.8000000000000000E+01 + 7 1 1 11 + 9.0000000000000000E+00 6.0000000000000000E+00 1.8000000000000000E+01 + 8 1 1 11 + 6.0000000000000000E+00 9.0000000000000000E+00 9.0000000000000000E+00 + 9 1 1 11 + 3.0000000000000000E+00 3.0000000000000000E+00 9.0000000000000000E+00 + 10 1 1 11 + 9.0000000000000000E+00 3.0000000000000000E+00 9.0000000000000000E+00 + -1 + -1 + 2412 + 1 118 2 1 7 10 + 1 7 3 6 2 5 8 10 + 9 4 + -1 diff --git a/src/Mod/Fem/femtest/testmesh.py b/src/Mod/Fem/femtest/testmesh.py index ab3322522b..0837ead7bd 100644 --- a/src/Mod/Fem/femtest/testmesh.py +++ b/src/Mod/Fem/femtest/testmesh.py @@ -22,6 +22,7 @@ # * * # ***************************************************************************/ + import Fem import FreeCAD import unittest @@ -72,6 +73,85 @@ class FemMeshTest(unittest.TestCase): self.assertEqual(node_data, expected_nodes, "Nodes of Python created seg3 element are unexpected") self.assertEqual(edge_data, expected_edges, "Edges of Python created seg3 element are unexpected") + def test_mesh_tetra10(self): + # 10 node tetrahedron --> tetra10 + elem = 'tetra10' + femmesh = Fem.FemMesh() + femmesh.addNode(6, 12, 18, 1) + femmesh.addNode(0, 0, 18, 2) + femmesh.addNode(12, 0, 18, 3) + femmesh.addNode(6, 6, 0, 4) + + femmesh.addNode(3, 6, 18, 5) + femmesh.addNode(6, 0, 18, 6) + femmesh.addNode(9, 6, 18, 7) + + femmesh.addNode(6, 9, 9, 8) + femmesh.addNode(3, 3, 9, 9) + femmesh.addNode(9, 3, 9, 10) + femmesh.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) + + node_data = { + 'count': femmesh.NodeCount, + 'nodes': femmesh.Nodes + } + elem_data = {'volcount': femmesh.VolumeCount, 'tetcount': femmesh.TetraCount, 'volumes': { + femmesh.Volumes[0], femmesh.getElementNodes(femmesh.Volumes[0]), + }} + expected_nodes = {'count': 10, 'nodes': { + 1: FreeCAD.Vector(6.0, 12.0, 18.0), + 2: FreeCAD.Vector(0.0, 0.0, 18.0), + 3: FreeCAD.Vector(12.0, 0.0, 18.0), + 4: FreeCAD.Vector(6.0, 6.0, 0.0), + 5: FreeCAD.Vector(3.0, 6.0, 18.0), + 6: FreeCAD.Vector(6.0, 0.0, 18.0), + 7: FreeCAD.Vector(9.0, 6.0, 18.0), + 8: FreeCAD.Vector(6.0, 9.0, 9.0), + 9: FreeCAD.Vector(3.0, 3.0, 9.0), + 10: FreeCAD.Vector(9.0, 3.0, 9.0), + }} + expected_elem = {'volcount': 1, 'tetcount': 1, 'volumes': { + 1, (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + }} + ''' + fcc_print('\n') + fcc_print(elem_data) + fcc_print(expected_elem) + fcc_print('\n') + ''' + self.assertEqual(node_data, expected_nodes, "Nodes of Python created " + elem + "mesh element are unexpected") + self.assertEqual(elem_data, expected_elem, "Elements of Python created " + elem + "mesh element are unexpected") + ''' + obj = doc.addObject("Fem::FemMeshObject" , elem) + obj.FemMesh = femmesh + obj.Placement.Base = (30,50,0) + obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" + ''' + + fcc_print(elem + 'export tests.\n') + base_outfile = testtools.get_fem_test_tmp_dir() + '/' + elem + '_mesh.' + base_testfile = testtools.get_fem_test_home_dir() + 'mesh/' + elem + '_mesh.' + + filetyp = 'inp' + outfile = base_outfile + filetyp + testfile = base_testfile + filetyp + femmesh.writeABAQUS(outfile, 1, False) + import feminout.importToolsFem + import feminout.importInpMesh + femmesh_outfile = feminout.importToolsFem.make_femmesh(feminout.importInpMesh.read_inp(outfile)) + femmesh_testfile = feminout.importToolsFem.make_femmesh(feminout.importInpMesh.read_inp(testfile)) + self.assertEqual(femmesh_outfile.Nodes, femmesh_testfile.Nodes, "Test writing " + elem + " mesh to " + filetyp + " file failed. Nodes are different.\n") + self.assertEqual(femmesh_outfile.Volumes, femmesh_testfile.Volumes, "Test writing " + elem + " mesh to " + filetyp + " file failed. Volumes are different.\n") + + filetyp = 'unv' + outfile = base_outfile + filetyp + testfile = base_testfile + filetyp + femmesh.write(outfile) + femmesh_outfile = Fem.read(outfile) + femmesh_testfile = Fem.read(testfile) + self.assertEqual(femmesh_outfile.Nodes, femmesh_testfile.Nodes, "Test writing " + elem + " mesh to " + filetyp + " file failed. Nodes are different.\n") + self.assertEqual(femmesh_outfile.Volumes, femmesh_testfile.Volumes, "Test writing " + elem + " mesh to " + filetyp + " file failed. Volumes are different.\n") + def test_unv_save_load(self): tetra10 = Fem.FemMesh() tetra10.addNode(6, 12, 18, 1)