From e3d5532a6e3b972649500ccf79359999415fa190 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Thu, 21 Mar 2019 09:24:03 +0100 Subject: [PATCH] FEM: examples, add this new package and the module for ccx cantilever --- src/Mod/Fem/CMakeLists.txt | 9 + src/Mod/Fem/femexamples/__init__.py | 0 src/Mod/Fem/femexamples/ccx_cantilever_std.py | 162 +++++++++ src/Mod/Fem/femexamples/manager.py | 135 ++++++++ .../Fem/femexamples/mesh_canticcx_tetra10.py | 315 ++++++++++++++++++ 5 files changed, 621 insertions(+) create mode 100644 src/Mod/Fem/femexamples/__init__.py create mode 100644 src/Mod/Fem/femexamples/ccx_cantilever_std.py create mode 100644 src/Mod/Fem/femexamples/manager.py create mode 100644 src/Mod/Fem/femexamples/mesh_canticcx_tetra10.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index d34ba5d4ef..8b08e978ad 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -32,6 +32,13 @@ SET(FemCommands_SRCS femcommands/manager.py ) +SET(FemExamples_SRCS + femexamples/__init__.py + femexamples/ccx_cantilever_std.py + femexamples/manager.py + femexamples/mesh_canticcx_tetra10.py +) + SET(FemInOut_SRCS feminout/__init__.py feminout/convert2TetGen.py @@ -206,6 +213,7 @@ SET(FemObjectsScripts_SRCS SET(FemAllScripts ${FemScripts_SRCS} ${FemCommands_SRCS} + ${FemExamples_SRCS} ${FemInOut_SRCS} ${FemMesh_SRCS} ${FemResult_SRCS} @@ -235,6 +243,7 @@ fc_copy_sources(FemScriptsTarget "${CMAKE_BINARY_DIR}/Mod/Fem" ${FemAllScripts}) # install Python packages (for make install) INSTALL(FILES ${FemScripts_SRCS} DESTINATION Mod/Fem) INSTALL(FILES ${FemCommands_SRCS} DESTINATION Mod/Fem/femcommands) +INSTALL(FILES ${FemExamples_SRCS} DESTINATION Mod/Fem/femexamples) INSTALL(FILES ${FemInOut_SRCS} DESTINATION Mod/Fem/feminout) INSTALL(FILES ${FemMesh_SRCS} DESTINATION Mod/Fem/femmesh) INSTALL(FILES ${FemResult_SRCS} DESTINATION Mod/Fem/femresult) diff --git a/src/Mod/Fem/femexamples/__init__.py b/src/Mod/Fem/femexamples/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Mod/Fem/femexamples/ccx_cantilever_std.py b/src/Mod/Fem/femexamples/ccx_cantilever_std.py new file mode 100644 index 0000000000..7f3cfb3250 --- /dev/null +++ b/src/Mod/Fem/femexamples/ccx_cantilever_std.py @@ -0,0 +1,162 @@ +# *************************************************************************** +# * Copyright (c) 2019 Bernd Hahnebach * +# * * +# * 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. * +# * * +# * FreeCAD 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 FreeCAD; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + + +import FreeCAD +import ObjectsFem +import Fem + +mesh_name = 'Mesh' # needs to be Mesh to work with unit tests + + +def init_doc(doc=None): + if doc is None: + doc = FreeCAD.newDocument() + return doc + + +def setup_cantileverbase(doc=None, solver='ccxtools'): + # setup CalculiX cantilever base model + + if doc is None: + doc = init_doc() + + # part + box_obj = doc.addObject('Part::Box', 'Box') + box_obj.Height = box_obj.Width = 1000 + box_obj.Length = 8000 + + # analysis + analysis = ObjectsFem.makeAnalysis(doc, 'Analysis') + + solver + # TODO How to pass multiple solver for one analysis in one doc + if solver is None: + pass # no solver is added + elif solver is 'calculix': + solver_object = analysis.addObject(ObjectsFem.makeSolverCalculix(doc, 'SolverCalculiX'))[0] + solver_object.AnalysisType = 'static' + solver_object.GeometricalNonlinearity = 'linear' + solver_object.ThermoMechSteadyState = False + solver_object.MatrixSolverType = 'default' + solver_object.IterationsControlParameterTimeUse = False + elif solver is 'ccxtools': + solver_object = analysis.addObject(ObjectsFem.makeSolverCalculixCcxTools(doc, 'CalculiXccxTools'))[0] + solver_object.AnalysisType = 'static' + solver_object.GeometricalNonlinearity = 'linear' + solver_object.ThermoMechSteadyState = False + solver_object.MatrixSolverType = 'default' + solver_object.IterationsControlParameterTimeUse = False + solver_object.WorkingDir = u'' + elif solver is 'elmer': + analysis.addObject(ObjectsFem.makeSolverElmer(doc, 'SolverElmer')) + elif solver is 'z88': + analysis.addObject(ObjectsFem.makeSolverZ88(doc, 'SolverZ88')) + + # material + material_object = analysis.addObject(ObjectsFem.makeMaterialSolid(doc, 'FemMaterial'))[0] + mat = material_object.Material + mat['Name'] = "CalculiX-Steel" + mat['YoungsModulus'] = "210000 MPa" + mat['PoissonRatio'] = "0.30" + mat['Density'] = "7900 kg/m^3" + mat['ThermalExpansionCoefficient'] = "0.012 mm/m/K" + material_object.Material = mat + + # fixed_constraint + fixed_constraint = analysis.addObject(ObjectsFem.makeConstraintFixed(doc, name="ConstraintFixed"))[0] + fixed_constraint.References = [(doc.Box, "Face1")] + + # mesh + from femexamples.mesh_canticcx_tetra10 import create_nodes, create_elements + fem_mesh = Fem.FemMesh() + control = create_nodes(fem_mesh) + if not control: + print('ERROR on creating nodes') + control = create_elements(fem_mesh) + if not control: + print('ERROR on creating elements') + femmesh_obj = analysis.addObject(doc.addObject('Fem::FemMeshObject', mesh_name))[0] + femmesh_obj.FemMesh = fem_mesh + + doc.recompute() + return doc + + +def setup_cantileverfaceload(doc=None, solver='ccxtools'): + # setup CalculiX cantilever, apply 9 MN on surface of front end face + + doc = setup_cantileverbase(doc, solver) + + # force_constraint + force_constraint = doc.Analysis.addObject(ObjectsFem.makeConstraintForce(doc, name="ConstraintForce"))[0] + force_constraint.References = [(doc.Box, "Face2")] + force_constraint.Force = 9000000.0 + force_constraint.Direction = (doc.Box, ["Edge5"]) + force_constraint.Reversed = True + + doc.recompute() + return doc + + +def setup_cantilevernodeload(doc=None, solver='ccxtools'): + # setup CalculiX cantilever, apply 9 MN on the 4 nodes of the front end face + + doc = setup_cantileverbase(doc, solver) + + # force_constraint + force_constraint = doc.Analysis.addObject(ObjectsFem.makeConstraintForce(doc, name="ConstraintForce"))[0] + force_constraint.References = [(doc.Box, "Vertex5"), (doc.Box, "Vertex6"), (doc.Box, "Vertex7"), (doc.Box, "Vertex8")] # should be possible in one tuple too + force_constraint.Force = 9000000.0 + force_constraint.Direction = (doc.Box, ["Edge5"]) + force_constraint.Reversed = True + + doc.recompute() + return doc + + +def setup_cantileverprescribeddisplacement(doc=None, solver='ccxtools'): + # setup CalculiX cantilever, apply a prescribed displacement of 250 mm in -z on the front end face + + doc = setup_cantileverbase(doc, solver) + + # displacement_constraint + displacement_constraint = doc.Analysis.addObject(ObjectsFem.makeConstraintDisplacement(doc, name="ConstraintDisplacmentPrescribed"))[0] + displacement_constraint.References = [(doc.Box, "Face2")] + displacement_constraint.zFix = False + displacement_constraint.zFree = False + displacement_constraint.zDisplacement = -250.0 + + doc.recompute() + return doc + + +''' +from femexamples import ccx_cantilever_std as canti + +canti.setup_cantileverbase() +canti.setup_cantileverfaceload() +canti.setup_cantilevernodeload() +canti.setup_cantileverprescribeddisplacement() + +''' diff --git a/src/Mod/Fem/femexamples/manager.py b/src/Mod/Fem/femexamples/manager.py new file mode 100644 index 0000000000..8ca223dd7f --- /dev/null +++ b/src/Mod/Fem/femexamples/manager.py @@ -0,0 +1,135 @@ +# *************************************************************************** +# * Copyright (c) 2019 Bernd Hahnebach * +# * * +# * 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. * +# * * +# * FreeCAD 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 FreeCAD; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + + +import FreeCAD + + +def run_analysis(doc, base_name, filepath=''): + + from os.path import join, exists + from os import makedirs + from tempfile import gettempdir as gettmp + + # recompute + doc.recompute() + + # print(doc.Objects) + # print([obj.Name for obj in doc.Objects]) + + # filepath + if filepath is '': + filepath = join(gettmp(), 'FEM_examples') + if not exists(filepath): + makedirs(filepath) + + # find solver + # ATM we only support one solver, search for a frame work solver and run it + for m in doc.Analysis.Group: + from femtools.femutils import is_derived_from + if is_derived_from(m, "Fem::FemSolverObjectPython") and m.Proxy.Type is not 'Fem::FemSolverCalculixCcxTools': + solver = m + break + + # we need a file name for the besides dir to work + save_fc_file = join(filepath, (base_name + '.FCStd')) + FreeCAD.Console.PrintMessage('Save FreeCAD file for {} analysis to {}\n.'.format(base_name, save_fc_file)) + doc.saveAs(save_fc_file) + + # get analysis workig dir + from femsolver.run import _getBesideDir as getpath + working_dir = getpath(solver) + + # run analysis + from femsolver.run import RESULTS + machine = solver.Proxy.createMachine(solver, working_dir) + machine.target = RESULTS + machine.start() + machine.join() # wait for the machine to finish. + + # save doc once again with results + doc.save() + + +def run_all(): + run_ccx_cantileverfaceload() + run_ccx_cantilevernodeload() + run_ccx_cantileverprescribeddisplacement() + + +def run_ccx_cantileverfaceload(solver=None, base_name=None): + + from femexamples.ccx_cantilever_std import setup_cantileverfaceload as setup + doc = setup() + + if base_name is None: + base_name = 'CantilverFaceLoad' + if solver is not None: + base_name += ('_' + solver) + run_analysis(doc, base_name) + + return doc + + +def run_ccx_cantilevernodeload(solver=None, base_name=None): + + from femexamples.ccx_cantilever_std import setup_cantilevernodeload as setup + doc = setup() + + if base_name is None: + base_name = 'CantileverNodeLoad' + if solver is not None: + base_name += ('_' + solver) + run_analysis(doc, base_name) + + return doc + + +def run_ccx_cantileverprescribeddisplacement(solver=None, base_name=None): + + from femexamples.ccx_cantilever_std import setup_cantileverprescribeddisplacement as setup + doc = setup() + + if base_name is None: + base_name = 'CantileverPrescribedDisplacement' + if solver is not None: + base_name += ('_' + solver) + run_analysis(doc, base_name) + + return doc + + +''' +from femexamples.manager import * + +run_all() + +doc = run_ccx_cantileverfaceload() +doc = run_ccx_cantilevernodeload() +doc = run_ccx_cantileverprescribeddisplacement() + +doc = run_ccx_cantilevernodeload('calculix') +doc = run_ccx_cantilevernodeload('ccxtools') +doc = run_ccx_cantilevernodeload('z88') + +''' diff --git a/src/Mod/Fem/femexamples/mesh_canticcx_tetra10.py b/src/Mod/Fem/femexamples/mesh_canticcx_tetra10.py new file mode 100644 index 0000000000..96fcf1497a --- /dev/null +++ b/src/Mod/Fem/femexamples/mesh_canticcx_tetra10.py @@ -0,0 +1,315 @@ +def create_nodes(femmesh): + # nodes + femmesh.addNode(8000.0, 1000.0, 0.0, 1) + femmesh.addNode(8000.0, 1000.0, 1000.0, 2) + femmesh.addNode(8000.0, 0.0, 0.0, 3) + femmesh.addNode(8000.0, 0.0, 1000.0, 4) + femmesh.addNode(0.0, 1000.0, 0.0, 5) + femmesh.addNode(0.0, 1000.0, 1000.0, 6) + femmesh.addNode(0.0, 0.0, 0.0, 7) + femmesh.addNode(0.0, 0.0, 1000.0, 8) + femmesh.addNode(728.0, 1000.0, 1000.0, 9) + femmesh.addNode(1456.0, 1000.0, 1000.0, 10) + femmesh.addNode(2184.0, 1000.0, 1000.0, 11) + femmesh.addNode(2912.0, 1000.0, 1000.0, 12) + femmesh.addNode(3640.0, 1000.0, 1000.0, 13) + femmesh.addNode(4368.0, 1000.0, 1000.0, 14) + femmesh.addNode(5096.0, 1000.0, 1000.0, 15) + femmesh.addNode(5824.0, 1000.0, 1000.0, 16) + femmesh.addNode(6552.0, 1000.0, 1000.0, 17) + femmesh.addNode(7280.0, 1000.0, 1000.0, 18) + femmesh.addNode(728.0, 0.0, 1000.0, 19) + femmesh.addNode(1456.0, 0.0, 1000.0, 20) + femmesh.addNode(2184.0, 0.0, 1000.0, 21) + femmesh.addNode(2912.0, 0.0, 1000.0, 22) + femmesh.addNode(3640.0, 0.0, 1000.0, 23) + femmesh.addNode(4368.0, 0.0, 1000.0, 24) + femmesh.addNode(5096.0, 0.0, 1000.0, 25) + femmesh.addNode(5824.0, 0.0, 1000.0, 26) + femmesh.addNode(6552.0, 0.0, 1000.0, 27) + femmesh.addNode(7280.0, 0.0, 1000.0, 28) + femmesh.addNode(728.0, 1000.0, 0.0, 29) + femmesh.addNode(1456.0, 1000.0, 0.0, 30) + femmesh.addNode(2184.0, 1000.0, 0.0, 31) + femmesh.addNode(2912.0, 1000.0, 0.0, 32) + femmesh.addNode(3640.0, 1000.0, 0.0, 33) + femmesh.addNode(4368.0, 1000.0, 0.0, 34) + femmesh.addNode(5096.0, 1000.0, 0.0, 35) + femmesh.addNode(5824.0, 1000.0, 0.0, 36) + femmesh.addNode(6552.0, 1000.0, 0.0, 37) + femmesh.addNode(7280.0, 1000.0, 0.0, 38) + femmesh.addNode(728.0, 0.0, 0.0, 39) + femmesh.addNode(1456.0, 0.0, 0.0, 40) + femmesh.addNode(2184.0, 0.0, 0.0, 41) + femmesh.addNode(2912.0, 0.0, 0.0, 42) + femmesh.addNode(3640.0, 0.0, 0.0, 43) + femmesh.addNode(4368.0, 0.0, 0.0, 44) + femmesh.addNode(5096.0, 0.0, 0.0, 45) + femmesh.addNode(5824.0, 0.0, 0.0, 46) + femmesh.addNode(6552.0, 0.0, 0.0, 47) + femmesh.addNode(7280.0, 0.0, 0.0, 48) + femmesh.addNode(8000.0, 500.0, 500.0, 49) + femmesh.addNode(0.0, 500.0, 500.0, 50) + femmesh.addNode(4731.99999977, 500.000001086, 499.999998599, 51) + femmesh.addNode(0.0, 500.0, 1000.0, 52) + femmesh.addNode(364.0, 1000.0, 1000.0, 53) + femmesh.addNode(1092.0, 1000.0, 1000.0, 54) + femmesh.addNode(1820.0, 1000.0, 1000.0, 55) + femmesh.addNode(2548.0, 1000.0, 1000.0, 56) + femmesh.addNode(3276.0, 1000.0, 1000.0, 57) + femmesh.addNode(4004.0, 1000.0, 1000.0, 58) + femmesh.addNode(4732.0, 1000.0, 1000.0, 59) + femmesh.addNode(5460.0, 1000.0, 1000.0, 60) + femmesh.addNode(6188.0, 1000.0, 1000.0, 61) + femmesh.addNode(6916.0, 1000.0, 1000.0, 62) + femmesh.addNode(7640.0, 1000.0, 1000.0, 63) + femmesh.addNode(8000.0, 500.0, 1000.0, 64) + femmesh.addNode(364.0, 0.0, 1000.0, 65) + femmesh.addNode(1092.0, 0.0, 1000.0, 66) + femmesh.addNode(1820.0, 0.0, 1000.0, 67) + femmesh.addNode(2548.0, 0.0, 1000.0, 68) + femmesh.addNode(3276.0, 0.0, 1000.0, 69) + femmesh.addNode(4004.0, 0.0, 1000.0, 70) + femmesh.addNode(4732.0, 0.0, 1000.0, 71) + femmesh.addNode(5460.0, 0.0, 1000.0, 72) + femmesh.addNode(6188.0, 0.0, 1000.0, 73) + femmesh.addNode(6916.0, 0.0, 1000.0, 74) + femmesh.addNode(7640.0, 0.0, 1000.0, 75) + femmesh.addNode(0.0, 500.0, 0.0, 76) + femmesh.addNode(364.0, 1000.0, 0.0, 77) + femmesh.addNode(1092.0, 1000.0, 0.0, 78) + femmesh.addNode(1820.0, 1000.0, 0.0, 79) + femmesh.addNode(2548.0, 1000.0, 0.0, 80) + femmesh.addNode(3276.0, 1000.0, 0.0, 81) + femmesh.addNode(4004.0, 1000.0, 0.0, 82) + femmesh.addNode(4732.0, 1000.0, 0.0, 83) + femmesh.addNode(5460.0, 1000.0, 0.0, 84) + femmesh.addNode(6188.0, 1000.0, 0.0, 85) + femmesh.addNode(6916.0, 1000.0, 0.0, 86) + femmesh.addNode(7640.0, 1000.0, 0.0, 87) + femmesh.addNode(8000.0, 500.0, 0.0, 88) + femmesh.addNode(364.0, 0.0, 0.0, 89) + femmesh.addNode(1092.0, 0.0, 0.0, 90) + femmesh.addNode(1820.0, 0.0, 0.0, 91) + femmesh.addNode(2548.0, 0.0, 0.0, 92) + femmesh.addNode(3276.0, 0.0, 0.0, 93) + femmesh.addNode(4004.0, 0.0, 0.0, 94) + femmesh.addNode(4732.0, 0.0, 0.0, 95) + femmesh.addNode(5460.0, 0.0, 0.0, 96) + femmesh.addNode(6188.0, 0.0, 0.0, 97) + femmesh.addNode(6916.0, 0.0, 0.0, 98) + femmesh.addNode(7640.0, 0.0, 0.0, 99) + femmesh.addNode(8000.0, 1000.0, 500.0, 100) + femmesh.addNode(0.0, 1000.0, 500.0, 101) + femmesh.addNode(8000.0, 0.0, 500.0, 102) + femmesh.addNode(0.0, 0.0, 500.0, 103) + femmesh.addNode(364.0, 500.0, 1000.0, 104) + femmesh.addNode(728.0, 500.0, 1000.0, 105) + femmesh.addNode(1092.0, 500.0, 1000.0, 106) + femmesh.addNode(1456.0, 500.0, 1000.0, 107) + femmesh.addNode(1820.0, 500.0, 1000.0, 108) + femmesh.addNode(2184.0, 500.0, 1000.0, 109) + femmesh.addNode(2548.0, 500.0, 1000.0, 110) + femmesh.addNode(3276.0, 500.0, 1000.0, 111) + femmesh.addNode(3640.0, 500.0, 1000.0, 112) + femmesh.addNode(4004.0, 500.0, 1000.0, 113) + femmesh.addNode(4368.0, 500.0, 1000.0, 114) + femmesh.addNode(4732.0, 500.0, 1000.0, 115) + femmesh.addNode(5096.0, 500.0, 1000.0, 116) + femmesh.addNode(5460.0, 500.0, 1000.0, 117) + femmesh.addNode(5824.0, 500.0, 1000.0, 118) + femmesh.addNode(6188.0, 500.0, 1000.0, 119) + femmesh.addNode(6552.0, 500.0, 1000.0, 120) + femmesh.addNode(6916.0, 500.0, 1000.0, 121) + femmesh.addNode(7640.0, 500.0, 1000.0, 122) + femmesh.addNode(2912.0, 500.0, 1000.0, 123) + femmesh.addNode(7280.0, 500.0, 1000.0, 124) + femmesh.addNode(364.0, 500.0, 0.0, 125) + femmesh.addNode(1092.0, 500.0, 0.0, 126) + femmesh.addNode(728.0, 500.0, 0.0, 127) + femmesh.addNode(1820.0, 500.0, 0.0, 128) + femmesh.addNode(1456.0, 500.0, 0.0, 129) + femmesh.addNode(2548.0, 500.0, 0.0, 130) + femmesh.addNode(2184.0, 500.0, 0.0, 131) + femmesh.addNode(3640.0, 500.0, 0.0, 132) + femmesh.addNode(3276.0, 500.0, 0.0, 133) + femmesh.addNode(4004.0, 500.0, 0.0, 134) + femmesh.addNode(5096.0, 500.0, 0.0, 135) + femmesh.addNode(4732.0, 500.0, 0.0, 136) + femmesh.addNode(5460.0, 500.0, 0.0, 137) + femmesh.addNode(6188.0, 500.0, 0.0, 138) + femmesh.addNode(5824.0, 500.0, 0.0, 139) + femmesh.addNode(6916.0, 500.0, 0.0, 140) + femmesh.addNode(6552.0, 500.0, 0.0, 141) + femmesh.addNode(7640.0, 500.0, 0.0, 142) + femmesh.addNode(2912.0, 500.0, 0.0, 143) + femmesh.addNode(4368.0, 500.0, 0.0, 144) + femmesh.addNode(7280.0, 500.0, 0.0, 145) + femmesh.addNode(364.0, 1000.0, 500.0, 146) + femmesh.addNode(728.0, 1000.0, 500.0, 147) + femmesh.addNode(1092.0, 1000.0, 500.0, 148) + femmesh.addNode(1456.0, 1000.0, 500.0, 149) + femmesh.addNode(1820.0, 1000.0, 500.0, 150) + femmesh.addNode(2184.0, 1000.0, 500.0, 151) + femmesh.addNode(2548.0, 1000.0, 500.0, 152) + femmesh.addNode(3276.0, 1000.0, 500.0, 153) + femmesh.addNode(3640.0, 1000.0, 500.0, 154) + femmesh.addNode(4004.0, 1000.0, 500.0, 155) + femmesh.addNode(4368.0, 1000.0, 500.0, 156) + femmesh.addNode(4732.0, 1000.0, 500.0, 157) + femmesh.addNode(5096.0, 1000.0, 500.0, 158) + femmesh.addNode(5460.0, 1000.0, 500.0, 159) + femmesh.addNode(5824.0, 1000.0, 500.0, 160) + femmesh.addNode(6188.0, 1000.0, 500.0, 161) + femmesh.addNode(6552.0, 1000.0, 500.0, 162) + femmesh.addNode(6916.0, 1000.0, 500.0, 163) + femmesh.addNode(7640.0, 1000.0, 500.0, 164) + femmesh.addNode(2912.0, 1000.0, 500.0, 165) + femmesh.addNode(7280.0, 1000.0, 500.0, 166) + femmesh.addNode(364.0, 0.0, 500.0, 167) + femmesh.addNode(1092.0, 0.0, 500.0, 168) + femmesh.addNode(728.0, 0.0, 500.0, 169) + femmesh.addNode(1820.0, 0.0, 500.0, 170) + femmesh.addNode(1456.0, 0.0, 500.0, 171) + femmesh.addNode(2548.0, 0.0, 500.0, 172) + femmesh.addNode(2184.0, 0.0, 500.0, 173) + femmesh.addNode(3640.0, 0.0, 500.0, 174) + femmesh.addNode(3276.0, 0.0, 500.0, 175) + femmesh.addNode(4004.0, 0.0, 500.0, 176) + femmesh.addNode(5096.0, 0.0, 500.0, 177) + femmesh.addNode(4732.0, 0.0, 500.0, 178) + femmesh.addNode(5460.0, 0.0, 500.0, 179) + femmesh.addNode(6188.0, 0.0, 500.0, 180) + femmesh.addNode(5824.0, 0.0, 500.0, 181) + femmesh.addNode(6916.0, 0.0, 500.0, 182) + femmesh.addNode(6552.0, 0.0, 500.0, 183) + femmesh.addNode(7640.0, 0.0, 500.0, 184) + femmesh.addNode(2912.0, 0.0, 500.0, 185) + femmesh.addNode(4368.0, 0.0, 500.0, 186) + femmesh.addNode(7280.0, 0.0, 500.0, 187) + femmesh.addNode(8000.0, 250.0, 250.0, 188) + femmesh.addNode(8000.0, 250.0, 750.0, 189) + femmesh.addNode(8000.0, 750.0, 750.0, 190) + femmesh.addNode(8000.0, 750.0, 250.0, 191) + femmesh.addNode(0.0, 250.0, 750.0, 192) + femmesh.addNode(0.0, 250.0, 250.0, 193) + femmesh.addNode(0.0, 750.0, 250.0, 194) + femmesh.addNode(0.0, 750.0, 750.0, 195) + femmesh.addNode(1456.0, 500.0, 500.0, 196) + femmesh.addNode(6552.0, 500.0, 500.0, 197) + femmesh.addNode(6916.0, 500.0, 500.0, 198) + femmesh.addNode(2184.0, 500.0, 500.0, 199) + femmesh.addNode(2548.0, 500.0, 500.0, 200) + femmesh.addNode(2912.0, 500.0, 500.0, 201) + femmesh.addNode(1820.0, 500.0, 500.0, 202) + femmesh.addNode(7640.0, 750.0, 250.0, 203) + femmesh.addNode(7640.0, 750.0, 750.0, 204) + femmesh.addNode(7280.0, 500.0, 500.0, 205) + femmesh.addNode(7640.0, 250.0, 250.0, 206) + femmesh.addNode(5460.0, 500.0, 500.0, 207) + femmesh.addNode(5096.0, 500.0, 500.0, 208) + femmesh.addNode(6188.0, 500.0, 500.0, 209) + femmesh.addNode(5824.0, 500.0, 500.0, 210) + femmesh.addNode(364.0, 750.0, 250.0, 211) + femmesh.addNode(364.0, 750.0, 750.0, 212) + femmesh.addNode(364.0, 250.0, 250.0, 213) + femmesh.addNode(1092.0, 500.0, 500.0, 214) + femmesh.addNode(728.0, 500.0, 500.0, 215) + femmesh.addNode(364.0, 250.0, 750.0, 216) + femmesh.addNode(4549.99999989, 250.000000543, 249.9999993, 217) + femmesh.addNode(4549.99999989, 750.000000543, 249.9999993, 218) + femmesh.addNode(4549.99999989, 750.000000543, 749.9999993, 219) + femmesh.addNode(4368.0, 500.0, 500.0, 220) + femmesh.addNode(4549.99999989, 250.000000543, 749.9999993, 221) + femmesh.addNode(4913.99999989, 250.000000543, 749.9999993, 222) + femmesh.addNode(4913.99999989, 750.000000543, 749.9999993, 223) + femmesh.addNode(3276.0, 500.0, 500.0, 224) + femmesh.addNode(3640.0, 500.0, 500.0, 225) + femmesh.addNode(4004.0, 500.0, 500.0, 226) + femmesh.addNode(4913.99999989, 750.000000543, 249.9999993, 227) + femmesh.addNode(4913.99999989, 250.000000543, 249.9999993, 228) + return True + + +def create_elements(femmesh): + # elements + femmesh.addVolume([40, 19, 10, 20, 168, 106, 196, 171, 66, 107], 149) + femmesh.addVolume([10, 31, 30, 40, 150, 79, 149, 196, 128, 129], 150) + femmesh.addVolume([38, 17, 18, 47, 163, 62, 166, 140, 197, 198], 151) + femmesh.addVolume([32, 41, 11, 12, 130, 199, 152, 165, 200, 56], 152) + femmesh.addVolume([12, 32, 41, 42, 165, 130, 200, 201, 143, 92], 153) + femmesh.addVolume([42, 21, 12, 22, 172, 110, 201, 185, 68, 123], 154) + femmesh.addVolume([10, 31, 40, 11, 150, 128, 196, 55, 151, 202], 155) + femmesh.addVolume([11, 12, 41, 21, 56, 200, 199, 109, 110, 173], 156) + femmesh.addVolume([20, 41, 11, 40, 170, 199, 108, 171, 91, 202], 157) + femmesh.addVolume([20, 41, 21, 11, 170, 173, 67, 108, 199, 109], 158) + femmesh.addVolume([32, 11, 41, 31, 152, 199, 130, 80, 151, 131], 159) + femmesh.addVolume([11, 10, 20, 40, 55, 107, 108, 202, 196, 171], 160) + femmesh.addVolume([38, 17, 47, 37, 163, 197, 140, 86, 162, 141], 161) + femmesh.addVolume([38, 18, 49, 48, 166, 204, 203, 145, 205, 206], 162) + femmesh.addVolume([46, 15, 45, 36, 207, 208, 96, 139, 159, 137], 163) + femmesh.addVolume([47, 16, 46, 37, 209, 210, 97, 141, 161, 138], 164) + femmesh.addVolume([18, 4, 2, 49, 122, 64, 63, 204, 189, 190], 165) + femmesh.addVolume([18, 17, 27, 47, 62, 120, 121, 198, 197, 183], 166) + femmesh.addVolume([38, 18, 48, 47, 166, 205, 145, 140, 198, 98], 167) + femmesh.addVolume([12, 23, 42, 22, 111, 175, 201, 123, 69, 185], 168) + femmesh.addVolume([26, 47, 27, 17, 180, 183, 73, 119, 197, 120], 169) + femmesh.addVolume([50, 29, 9, 6, 211, 147, 212, 195, 146, 53], 170) + femmesh.addVolume([27, 48, 18, 47, 182, 205, 121, 183, 98, 198], 171) + femmesh.addVolume([8, 7, 39, 50, 103, 89, 167, 192, 193, 213], 172) + femmesh.addVolume([40, 9, 39, 30, 214, 215, 90, 129, 148, 126], 173) + femmesh.addVolume([42, 21, 41, 12, 172, 173, 92, 201, 110, 200], 174) + femmesh.addVolume([50, 9, 29, 39, 212, 147, 211, 213, 215, 127], 175) + femmesh.addVolume([29, 7, 50, 39, 125, 193, 211, 127, 89, 213], 176) + femmesh.addVolume([31, 11, 41, 40, 151, 199, 131, 128, 202, 91], 177) + femmesh.addVolume([47, 16, 37, 17, 209, 161, 141, 197, 61, 162], 178) + femmesh.addVolume([40, 9, 30, 10, 214, 148, 129, 196, 54, 149], 179) + femmesh.addVolume([2, 38, 49, 1, 164, 203, 190, 100, 87, 191], 180) + femmesh.addVolume([2, 38, 18, 49, 164, 166, 63, 190, 203, 204], 181) + femmesh.addVolume([48, 49, 38, 3, 206, 203, 145, 99, 188, 142], 182) + femmesh.addVolume([38, 49, 1, 3, 203, 191, 87, 142, 188, 88], 183) + femmesh.addVolume([49, 4, 3, 48, 189, 102, 188, 206, 184, 99], 184) + femmesh.addVolume([28, 48, 4, 18, 187, 184, 75, 124, 205, 122], 185) + femmesh.addVolume([49, 18, 4, 48, 204, 122, 189, 206, 205, 184], 186) + femmesh.addVolume([7, 50, 5, 29, 193, 194, 76, 125, 211, 77], 187) + femmesh.addVolume([50, 6, 5, 29, 195, 101, 194, 211, 146, 77], 188) + femmesh.addVolume([50, 9, 19, 6, 212, 105, 216, 195, 53, 104], 189) + femmesh.addVolume([50, 19, 9, 39, 216, 105, 212, 213, 169, 215], 190) + femmesh.addVolume([50, 19, 8, 6, 216, 65, 192, 195, 104, 52], 191) + femmesh.addVolume([40, 9, 10, 19, 214, 54, 196, 168, 105, 106], 192) + femmesh.addVolume([51, 44, 34, 14, 217, 144, 218, 219, 220, 156], 193) + femmesh.addVolume([51, 24, 44, 14, 221, 186, 217, 219, 114, 220], 194) + femmesh.addVolume([25, 15, 24, 51, 116, 115, 71, 222, 223, 221], 195) + femmesh.addVolume([43, 12, 32, 13, 224, 165, 133, 225, 57, 153], 196) + femmesh.addVolume([43, 12, 23, 42, 224, 111, 174, 93, 201, 175], 197) + femmesh.addVolume([43, 12, 13, 23, 224, 57, 225, 174, 111, 112], 198) + femmesh.addVolume([43, 12, 42, 32, 224, 201, 93, 133, 165, 143], 199) + femmesh.addVolume([34, 13, 14, 44, 155, 58, 156, 144, 226, 220], 200) + femmesh.addVolume([14, 24, 15, 51, 114, 115, 59, 219, 221, 223], 201) + femmesh.addVolume([23, 24, 14, 44, 70, 114, 113, 176, 186, 220], 202) + femmesh.addVolume([33, 32, 13, 43, 81, 153, 154, 132, 133, 225], 203) + femmesh.addVolume([34, 33, 13, 43, 82, 154, 155, 134, 132, 225], 204) + femmesh.addVolume([35, 14, 15, 51, 157, 59, 158, 227, 219, 223], 205) + femmesh.addVolume([25, 45, 15, 51, 177, 208, 116, 222, 228, 223], 206) + femmesh.addVolume([44, 43, 13, 23, 94, 225, 226, 176, 174, 112], 207) + femmesh.addVolume([35, 34, 14, 51, 83, 156, 157, 227, 218, 219], 208) + femmesh.addVolume([46, 15, 36, 16, 207, 159, 139, 210, 60, 160], 209) + femmesh.addVolume([36, 35, 15, 45, 84, 158, 159, 137, 135, 208], 210) + femmesh.addVolume([37, 36, 16, 46, 85, 160, 161, 138, 139, 210], 211) + femmesh.addVolume([25, 26, 16, 46, 72, 118, 117, 179, 181, 210], 212) + femmesh.addVolume([47, 16, 17, 26, 209, 61, 197, 180, 118, 119], 213) + femmesh.addVolume([47, 16, 26, 46, 209, 118, 180, 97, 210, 181], 214) + femmesh.addVolume([27, 28, 18, 48, 74, 124, 121, 182, 187, 205], 215) + femmesh.addVolume([35, 34, 51, 45, 83, 218, 227, 135, 136, 228], 216) + femmesh.addVolume([13, 14, 44, 23, 58, 220, 226, 112, 113, 176], 217) + femmesh.addVolume([44, 25, 24, 51, 178, 71, 186, 217, 222, 221], 218) + femmesh.addVolume([44, 45, 25, 51, 95, 177, 178, 217, 228, 222], 219) + femmesh.addVolume([46, 15, 16, 25, 207, 60, 210, 179, 116, 117], 220) + femmesh.addVolume([46, 15, 25, 45, 207, 116, 179, 96, 208, 177], 221) + femmesh.addVolume([50, 8, 19, 39, 192, 65, 216, 213, 167, 169], 222) + femmesh.addVolume([35, 51, 15, 45, 227, 223, 158, 135, 228, 208], 223) + femmesh.addVolume([34, 44, 43, 13, 144, 94, 134, 155, 226, 225], 224) + femmesh.addVolume([51, 44, 45, 34, 217, 95, 228, 218, 144, 136], 225) + femmesh.addVolume([9, 29, 39, 30, 147, 127, 215, 148, 78, 126], 226) + femmesh.addVolume([40, 9, 19, 39, 214, 105, 168, 90, 215, 169], 227) + return True