FEM: examples and unit tests calculix solver, add ccx cantilever with quad8 elements

This commit is contained in:
Bernd Hahnebach
2021-07-29 07:58:18 +02:00
parent 1ea0d9a9e0
commit d6568c8303
6 changed files with 309 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
# ***************************************************************************
# * Copyright (c) 2021 Bernd Hahnebach <bernd@bimstatik.org> *
# * *
# * This file is part of the FreeCAD CAx development system. *
# * *
# * 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 *
# * *
# ***************************************************************************
import FreeCAD
import Fem
from . import manager
from .ccx_cantilever_base_face import setup_cantilever_base_face
from .manager import get_meshname
from .manager import init_doc
def get_information():
return {
"name": "CCX cantilever quad8 face elements",
"meshtype": "face",
"meshelement": "Quad8",
"constraints": ["fixed", "force"],
"solvers": ["calculix"],
"material": "solid",
"equation": "mechanical"
}
def get_explanation(header=""):
return header + """
To run the example from Python console use:
from femexamples.ccx_cantilever_ele_quad8 import setup
setup()
See forum topic post:
CalculiX cantilever modeled with quad8 face elements
"""
def setup(doc=None, solvertype="ccxtools"):
# init FreeCAD document
if doc is None:
doc = init_doc()
# explanation object
# just keep the following line and change text string in get_explanation method
manager.add_explanation_obj(doc, get_explanation(manager.get_header(get_information())))
# setup CalculiX cantilever
doc = setup_cantilever_base_face(doc, solvertype)
femmesh_obj = doc.getObject(get_meshname())
# load the quad8 mesh
from .meshes.mesh_canticcx_quad8 import create_nodes, create_elements
new_fem_mesh = Fem.FemMesh()
control = create_nodes(new_fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating nodes.\n")
control = create_elements(new_fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating elements.\n")
# overwrite mesh with the quad8 mesh
femmesh_obj.FemMesh = new_fem_mesh
# set mesh obj parameter
femmesh_obj.SecondOrderLinear = False
femmesh_obj.ElementDimension = "2D"
femmesh_obj.ElementOrder = "1st"
femmesh_obj.CharacteristicLengthMax = "4000.0 mm"
femmesh_obj.CharacteristicLengthMin = "4000.0 mm"
femmesh_obj.RecombinationAlgorithm = "Blossom full-quad"
femmesh_obj.RecombineAll = True
doc.recompute()
return doc

View File

@@ -0,0 +1,37 @@
def create_nodes(femmesh):
# nodes
femmesh.addNode(0.0, 500.0, 0.0, 1)
femmesh.addNode(0.0, 500.00000000000324, 1000.0, 2)
femmesh.addNode(8000.0, 500.0, 0.0, 3)
femmesh.addNode(8000.0, 500.00000000000324, 1000.0, 4)
femmesh.addNode(0.0, 500.0000000000001, 500.0, 5)
femmesh.addNode(0.0, 500.00000000000006, 250.0, 6)
femmesh.addNode(0.0, 500.00000000000017, 750.0, 7)
femmesh.addNode(4000.0, 500.0, 0.0, 8)
femmesh.addNode(2000.0, 500.0, 0.0, 9)
femmesh.addNode(6000.0, 500.0, 0.0, 10)
femmesh.addNode(8000.0, 500.0000000000001, 500.0, 11)
femmesh.addNode(8000.0, 500.00000000000006, 250.0, 12)
femmesh.addNode(8000.0, 500.00000000000017, 750.0, 13)
femmesh.addNode(4000.0, 500.0000000000002, 1000.0, 14)
femmesh.addNode(2000.0, 500.0000000000002, 1000.0, 15)
femmesh.addNode(6000.0, 500.0000000000002, 1000.0, 16)
femmesh.addNode(4000.0, 500.0000000000001, 500.0, 17)
femmesh.addNode(2000.0, 500.0000000000001, 500.0, 18)
femmesh.addNode(4000.0, 500.00000000000017, 750.0, 19)
femmesh.addNode(2000.0, 500.00000000000017, 750.0, 20)
femmesh.addNode(6000.0, 500.0000000000001, 500.0, 21)
femmesh.addNode(6000.0, 500.00000000000017, 750.0, 22)
femmesh.addNode(4000.0, 500.00000000000006, 250.0, 23)
femmesh.addNode(6000.0, 500.00000000000006, 250.0, 24)
femmesh.addNode(2000.0, 500.00000000000006, 250.0, 25)
return True
def create_elements(femmesh):
# elements
femmesh.addFace([1, 5, 17, 8, 6, 18, 23, 9], 1)
femmesh.addFace([5, 2, 14, 17, 7, 15, 19, 18], 2)
femmesh.addFace([17, 14, 4, 11, 19, 16, 13, 21], 3)
femmesh.addFace([8, 17, 11, 3, 23, 21, 12, 10], 4)
return True