diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index bad64aa37f..0649bfa59b 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -90,8 +90,11 @@ SET(FemExamples_SRCS femexamples/thermomech_bimetall.py femexamples/thermomech_flow1d.py femexamples/thermomech_spine.py + femexamples/truss_3d_cs_circle_ele_seg2.py + femexamples/truss_3d_cs_circle_ele_seg3.py ) + SET(FemExampleMeshes_SRCS femexamples/meshes/__init__.py femexamples/meshes/mesh_beamsimple_tetra10.py @@ -128,6 +131,8 @@ SET(FemExampleMeshes_SRCS femexamples/meshes/mesh_thermomech_spine_tetra10.py femexamples/meshes/mesh_transform_beam_hinged_tetra10.py femexamples/meshes/mesh_transform_torque_tetra10.py + femexamples/meshes/mesh_truss_crane_seg2.py + femexamples/meshes/mesh_truss_crane_seg3.py ) SET(FemInOut_SRCS @@ -322,7 +327,9 @@ SET(FemTestsCcx_SRCS femtest/data/calculix/box.FCStd femtest/data/calculix/ccx_buckling_flexuralbuckling.dat femtest/data/calculix/ccx_buckling_flexuralbuckling.inp - femtest/data/calculix/ccx_cantilever_faceload.inp + femtest/data/calculix/ccx_cantilever_beam_circle.inp + femtest/data/calculix/ccx_cantilever_beam_pipe.inp + femtest/data/calculix/ccx_cantilever_beam_rect.inp femtest/data/calculix/ccx_cantilever_ele_hexa20.inp femtest/data/calculix/ccx_cantilever_ele_quad4.inp femtest/data/calculix/ccx_cantilever_ele_quad8.inp @@ -330,6 +337,7 @@ SET(FemTestsCcx_SRCS femtest/data/calculix/ccx_cantilever_ele_seg3.inp femtest/data/calculix/ccx_cantilever_ele_tria3.inp femtest/data/calculix/ccx_cantilever_ele_tria6.inp + femtest/data/calculix/ccx_cantilever_faceload.inp femtest/data/calculix/ccx_cantilever_nodeload.inp femtest/data/calculix/ccx_cantilever_prescribeddisplacement.inp femtest/data/calculix/constraint_centrif.inp diff --git a/src/Mod/Fem/femexamples/meshes/mesh_truss_crane_seg2.py b/src/Mod/Fem/femexamples/meshes/mesh_truss_crane_seg2.py new file mode 100644 index 0000000000..3ae392f490 --- /dev/null +++ b/src/Mod/Fem/femexamples/meshes/mesh_truss_crane_seg2.py @@ -0,0 +1,82 @@ +def create_nodes(femmesh): + # nodes + femmesh.addNode(0.0, 2000.0, 0.0, 1) + femmesh.addNode(0.0, 0.0, 0.0, 2) + femmesh.addNode(2000.0, 2000.0, 0.0, 3) + femmesh.addNode(2000.0, 0.0, 0.0, 4) + femmesh.addNode(4000.0, 2000.0, 0.0, 5) + femmesh.addNode(4000.0, 0.0, 0.0, 6) + femmesh.addNode(6000.0, 2000.0, 0.0, 7) + femmesh.addNode(6000.0, 0.0, 0.0, 8) + femmesh.addNode(8000.0, 2000.0, 0.0, 9) + femmesh.addNode(8000.0, 0.0, 0.0, 10) + femmesh.addNode(10000.0, 2000.0, 0.0, 11) + femmesh.addNode(10000.0, 0.0, 0.0, 12) + femmesh.addNode(12000.0, 2000.0, 0.0, 13) + femmesh.addNode(12000.0, 0.0, 0.0, 14) + femmesh.addNode(1000.0, 1000.0, 2000.0, 15) + femmesh.addNode(3000.0, 1000.0, 2000.0, 16) + femmesh.addNode(5000.0, 1000.0, 2000.0, 17) + femmesh.addNode(7000.0, 1000.0, 2000.0, 18) + femmesh.addNode(9000.0, 1000.0, 2000.0, 19) + femmesh.addNode(11000.0, 1000.0, 2000.0, 20) + return True + + +def create_elements(femmesh): + # elements + femmesh.addEdge([1, 2], 1) + femmesh.addEdge([3, 4], 2) + femmesh.addEdge([5, 6], 3) + femmesh.addEdge([7, 8], 4) + femmesh.addEdge([9, 10], 5) + femmesh.addEdge([11, 12], 6) + femmesh.addEdge([13, 14], 7) + femmesh.addEdge([1, 3], 8) + femmesh.addEdge([2, 4], 9) + femmesh.addEdge([3, 5], 10) + femmesh.addEdge([4, 6], 11) + femmesh.addEdge([5, 7], 12) + femmesh.addEdge([6, 8], 13) + femmesh.addEdge([7, 9], 14) + femmesh.addEdge([8, 10], 15) + femmesh.addEdge([9, 11], 16) + femmesh.addEdge([10, 12], 17) + femmesh.addEdge([11, 13], 18) + femmesh.addEdge([12, 14], 19) + femmesh.addEdge([1, 15], 20) + femmesh.addEdge([3, 16], 21) + femmesh.addEdge([5, 17], 22) + femmesh.addEdge([7, 18], 23) + femmesh.addEdge([9, 19], 24) + femmesh.addEdge([11, 20], 25) + femmesh.addEdge([2, 15], 26) + femmesh.addEdge([4, 16], 27) + femmesh.addEdge([6, 17], 28) + femmesh.addEdge([8, 18], 29) + femmesh.addEdge([10, 19], 30) + femmesh.addEdge([12, 20], 31) + femmesh.addEdge([15, 3], 32) + femmesh.addEdge([16, 5], 33) + femmesh.addEdge([17, 7], 34) + femmesh.addEdge([18, 9], 35) + femmesh.addEdge([19, 11], 36) + femmesh.addEdge([20, 13], 37) + femmesh.addEdge([15, 4], 38) + femmesh.addEdge([16, 6], 39) + femmesh.addEdge([17, 8], 40) + femmesh.addEdge([18, 10], 41) + femmesh.addEdge([19, 12], 42) + femmesh.addEdge([20, 14], 43) + femmesh.addEdge([15, 16], 44) + femmesh.addEdge([16, 17], 45) + femmesh.addEdge([17, 18], 46) + femmesh.addEdge([18, 19], 47) + femmesh.addEdge([19, 20], 48) + femmesh.addEdge([2, 3], 49) + femmesh.addEdge([4, 5], 50) + femmesh.addEdge([6, 7], 51) + femmesh.addEdge([8, 9], 52) + femmesh.addEdge([10, 11], 53) + femmesh.addEdge([12, 13], 54) + return True diff --git a/src/Mod/Fem/femexamples/meshes/mesh_truss_crane_seg3.py b/src/Mod/Fem/femexamples/meshes/mesh_truss_crane_seg3.py new file mode 100644 index 0000000000..f8311195b1 --- /dev/null +++ b/src/Mod/Fem/femexamples/meshes/mesh_truss_crane_seg3.py @@ -0,0 +1,298 @@ +def create_nodes(femmesh): + # nodes + femmesh.addNode(0.0, 2000.0, 0.0, 1) + femmesh.addNode(0.0, 0.0, 0.0, 2) + femmesh.addNode(2000.0, 2000.0, 0.0, 3) + femmesh.addNode(2000.0, 0.0, 0.0, 4) + femmesh.addNode(4000.0, 2000.0, 0.0, 5) + femmesh.addNode(4000.0, 0.0, 0.0, 6) + femmesh.addNode(6000.0, 2000.0, 0.0, 7) + femmesh.addNode(6000.0, 0.0, 0.0, 8) + femmesh.addNode(8000.0, 2000.0, 0.0, 9) + femmesh.addNode(8000.0, 0.0, 0.0, 10) + femmesh.addNode(10000.0, 2000.0, 0.0, 11) + femmesh.addNode(10000.0, 0.0, 0.0, 12) + femmesh.addNode(12000.0, 2000.0, 0.0, 13) + femmesh.addNode(12000.0, 0.0, 0.0, 14) + femmesh.addNode(1000.0, 1000.0, 2000.0, 15) + femmesh.addNode(3000.0, 1000.0, 2000.0, 16) + femmesh.addNode(5000.0, 1000.0, 2000.0, 17) + femmesh.addNode(7000.0, 1000.0, 2000.0, 18) + femmesh.addNode(9000.0, 1000.0, 2000.0, 19) + femmesh.addNode(11000.0, 1000.0, 2000.0, 20) + femmesh.addNode(0.0, 999.999999999999, 0.0, 21) + femmesh.addNode(0.0, 1499.9999999999995, 0.0, 22) + femmesh.addNode(0.0, 499.99999999999955, 0.0, 23) + femmesh.addNode(2000.0, 999.999999999999, 0.0, 24) + femmesh.addNode(2000.0, 1499.9999999999995, 0.0, 25) + femmesh.addNode(2000.0, 499.99999999999955, 0.0, 26) + femmesh.addNode(4000.0, 999.999999999999, 0.0, 27) + femmesh.addNode(4000.0, 1499.9999999999995, 0.0, 28) + femmesh.addNode(4000.0, 499.99999999999955, 0.0, 29) + femmesh.addNode(6000.0, 999.999999999999, 0.0, 30) + femmesh.addNode(6000.0, 1499.9999999999995, 0.0, 31) + femmesh.addNode(6000.0, 499.99999999999955, 0.0, 32) + femmesh.addNode(8000.0, 999.999999999999, 0.0, 33) + femmesh.addNode(8000.0, 1499.9999999999995, 0.0, 34) + femmesh.addNode(8000.0, 499.99999999999955, 0.0, 35) + femmesh.addNode(10000.0, 999.999999999999, 0.0, 36) + femmesh.addNode(10000.0, 1499.9999999999995, 0.0, 37) + femmesh.addNode(10000.0, 499.99999999999955, 0.0, 38) + femmesh.addNode(12000.0, 999.999999999999, 0.0, 39) + femmesh.addNode(12000.0, 1499.9999999999995, 0.0, 40) + femmesh.addNode(12000.0, 499.99999999999955, 0.0, 41) + femmesh.addNode(1000.000000000001, 2000.0, 0.0, 42) + femmesh.addNode(500.0000000000005, 2000.0, 0.0, 43) + femmesh.addNode(1500.0000000000005, 2000.0, 0.0, 44) + femmesh.addNode(1000.000000000001, 0.0, 0.0, 45) + femmesh.addNode(500.0000000000005, 0.0, 0.0, 46) + femmesh.addNode(1500.0000000000005, 0.0, 0.0, 47) + femmesh.addNode(3000.000000000001, 2000.0, 0.0, 48) + femmesh.addNode(2500.0000000000005, 2000.0, 0.0, 49) + femmesh.addNode(3500.0000000000005, 2000.0, 0.0, 50) + femmesh.addNode(3000.000000000001, 0.0, 0.0, 51) + femmesh.addNode(2500.0000000000005, 0.0, 0.0, 52) + femmesh.addNode(3500.0000000000005, 0.0, 0.0, 53) + femmesh.addNode(5000.000000000001, 2000.0, 0.0, 54) + femmesh.addNode(4500.000000000001, 2000.0, 0.0, 55) + femmesh.addNode(5500.0, 2000.0, 0.0, 56) + femmesh.addNode(5000.000000000001, 0.0, 0.0, 57) + femmesh.addNode(4500.000000000001, 0.0, 0.0, 58) + femmesh.addNode(5500.0, 0.0, 0.0, 59) + femmesh.addNode(7000.000000000001, 2000.0, 0.0, 60) + femmesh.addNode(6500.000000000001, 2000.0, 0.0, 61) + femmesh.addNode(7500.0, 2000.0, 0.0, 62) + femmesh.addNode(7000.000000000001, 0.0, 0.0, 63) + femmesh.addNode(6500.000000000001, 0.0, 0.0, 64) + femmesh.addNode(7500.0, 0.0, 0.0, 65) + femmesh.addNode(9000.000000000002, 2000.0, 0.0, 66) + femmesh.addNode(8500.0, 2000.0, 0.0, 67) + femmesh.addNode(9500.0, 2000.0, 0.0, 68) + femmesh.addNode(9000.000000000002, 0.0, 0.0, 69) + femmesh.addNode(8500.0, 0.0, 0.0, 70) + femmesh.addNode(9500.0, 0.0, 0.0, 71) + femmesh.addNode(11000.000000000002, 2000.0, 0.0, 72) + femmesh.addNode(10500.0, 2000.0, 0.0, 73) + femmesh.addNode(11500.0, 2000.0, 0.0, 74) + femmesh.addNode(11000.000000000002, 0.0, 0.0, 75) + femmesh.addNode(10500.0, 0.0, 0.0, 76) + femmesh.addNode(11500.0, 0.0, 0.0, 77) + femmesh.addNode(500.00000000000085, 1499.999999999999, 1000.0000000000017, 78) + femmesh.addNode(250.00000000000043, 1749.9999999999995, 500.00000000000085, 79) + femmesh.addNode(750.0000000000009, 1249.999999999999, 1500.0000000000018, 80) + femmesh.addNode(2500.000000000001, 1499.999999999999, 1000.0000000000017, 81) + femmesh.addNode(2250.0000000000005, 1749.9999999999995, 500.00000000000085, 82) + femmesh.addNode(2750.000000000001, 1249.999999999999, 1500.0000000000018, 83) + femmesh.addNode(4500.000000000001, 1499.999999999999, 1000.0000000000017, 84) + femmesh.addNode(4250.0, 1749.9999999999995, 500.00000000000085, 85) + femmesh.addNode(4750.000000000001, 1249.999999999999, 1500.0000000000018, 86) + femmesh.addNode(6500.000000000001, 1499.999999999999, 1000.0000000000017, 87) + femmesh.addNode(6250.0, 1749.9999999999995, 500.00000000000085, 88) + femmesh.addNode(6750.000000000001, 1249.999999999999, 1500.0000000000018, 89) + femmesh.addNode(8500.0, 1499.999999999999, 1000.0000000000017, 90) + femmesh.addNode(8250.0, 1749.9999999999995, 500.00000000000085, 91) + femmesh.addNode(8750.0, 1249.999999999999, 1500.0000000000018, 92) + femmesh.addNode(10500.0, 1499.999999999999, 1000.0000000000017, 93) + femmesh.addNode(10250.0, 1749.9999999999995, 500.00000000000085, 94) + femmesh.addNode(10750.0, 1249.999999999999, 1500.0000000000018, 95) + femmesh.addNode(500.00000000000085, 500.00000000000085, 1000.0000000000017, 96) + femmesh.addNode(250.00000000000043, 250.00000000000043, 500.00000000000085, 97) + femmesh.addNode(750.0000000000009, 750.0000000000009, 1500.0000000000018, 98) + femmesh.addNode(2500.000000000001, 500.00000000000085, 1000.0000000000017, 99) + femmesh.addNode(2250.0000000000005, 250.00000000000043, 500.00000000000085, 100) + femmesh.addNode(2750.000000000001, 750.0000000000009, 1500.0000000000018, 101) + femmesh.addNode(4500.000000000001, 500.00000000000085, 1000.0000000000017, 102) + femmesh.addNode(4250.0, 250.00000000000043, 500.00000000000085, 103) + femmesh.addNode(4750.000000000001, 750.0000000000009, 1500.0000000000018, 104) + femmesh.addNode(6500.000000000001, 500.00000000000085, 1000.0000000000017, 105) + femmesh.addNode(6250.0, 250.00000000000043, 500.00000000000085, 106) + femmesh.addNode(6750.000000000001, 750.0000000000009, 1500.0000000000018, 107) + femmesh.addNode(8500.0, 500.00000000000085, 1000.0000000000017, 108) + femmesh.addNode(8250.0, 250.00000000000043, 500.00000000000085, 109) + femmesh.addNode(8750.0, 750.0000000000009, 1500.0000000000018, 110) + femmesh.addNode(10500.0, 500.00000000000085, 1000.0000000000017, 111) + femmesh.addNode(10250.0, 250.00000000000043, 500.00000000000085, 112) + femmesh.addNode(10750.0, 750.0000000000009, 1500.0000000000018, 113) + femmesh.addNode(1500.000000000001, 1500.000000000001, 999.9999999999983, 114) + femmesh.addNode(1250.0000000000005, 1250.0000000000005, 1499.999999999999, 115) + femmesh.addNode(1750.000000000001, 1750.000000000001, 499.9999999999982, 116) + femmesh.addNode(3500.000000000001, 1500.000000000001, 999.9999999999983, 117) + femmesh.addNode(3250.0000000000005, 1250.0000000000005, 1499.999999999999, 118) + femmesh.addNode(3750.000000000001, 1750.000000000001, 499.9999999999982, 119) + femmesh.addNode(5500.000000000001, 1500.000000000001, 999.9999999999983, 120) + femmesh.addNode(5250.0, 1250.0000000000005, 1499.999999999999, 121) + femmesh.addNode(5750.000000000001, 1750.000000000001, 499.9999999999982, 122) + femmesh.addNode(7500.000000000001, 1500.000000000001, 999.9999999999983, 123) + femmesh.addNode(7250.0, 1250.0000000000005, 1499.999999999999, 124) + femmesh.addNode(7750.000000000001, 1750.000000000001, 499.9999999999982, 125) + femmesh.addNode(9500.0, 1500.000000000001, 999.9999999999983, 126) + femmesh.addNode(9250.0, 1250.0000000000005, 1499.999999999999, 127) + femmesh.addNode(9750.0, 1750.000000000001, 499.9999999999982, 128) + femmesh.addNode(11500.0, 1500.000000000001, 999.9999999999983, 129) + femmesh.addNode(11250.0, 1250.0000000000005, 1499.999999999999, 130) + femmesh.addNode(11750.0, 1750.000000000001, 499.9999999999982, 131) + femmesh.addNode(1500.000000000001, 499.99999999999915, 999.9999999999983, 132) + femmesh.addNode(1250.0000000000005, 749.9999999999995, 1499.999999999999, 133) + femmesh.addNode(1750.000000000001, 249.9999999999991, 499.9999999999982, 134) + femmesh.addNode(3500.000000000001, 499.99999999999915, 999.9999999999983, 135) + femmesh.addNode(3250.0000000000005, 749.9999999999995, 1499.999999999999, 136) + femmesh.addNode(3750.000000000001, 249.9999999999991, 499.9999999999982, 137) + femmesh.addNode(5500.000000000001, 499.99999999999915, 999.9999999999983, 138) + femmesh.addNode(5250.0, 749.9999999999995, 1499.999999999999, 139) + femmesh.addNode(5750.000000000001, 249.9999999999991, 499.9999999999982, 140) + femmesh.addNode(7500.000000000001, 499.99999999999915, 999.9999999999983, 141) + femmesh.addNode(7250.0, 749.9999999999995, 1499.999999999999, 142) + femmesh.addNode(7750.000000000001, 249.9999999999991, 499.9999999999982, 143) + femmesh.addNode(9500.0, 499.99999999999915, 999.9999999999983, 144) + femmesh.addNode(9250.0, 749.9999999999995, 1499.999999999999, 145) + femmesh.addNode(9750.0, 249.9999999999991, 499.9999999999982, 146) + femmesh.addNode(11500.0, 499.99999999999915, 999.9999999999983, 147) + femmesh.addNode(11250.0, 749.9999999999995, 1499.999999999999, 148) + femmesh.addNode(11750.0, 249.9999999999991, 499.9999999999982, 149) + femmesh.addNode(2000.000000000001, 1000.0, 2000.0, 150) + femmesh.addNode(1500.0000000000005, 1000.0, 2000.0, 151) + femmesh.addNode(2500.0000000000005, 1000.0, 2000.0, 152) + femmesh.addNode(4000.000000000001, 1000.0, 2000.0, 153) + femmesh.addNode(3500.0000000000005, 1000.0, 2000.0, 154) + femmesh.addNode(4500.0, 1000.0, 2000.0, 155) + femmesh.addNode(6000.000000000001, 1000.0, 2000.0, 156) + femmesh.addNode(5500.000000000001, 1000.0, 2000.0, 157) + femmesh.addNode(6500.0, 1000.0, 2000.0, 158) + femmesh.addNode(8000.000000000001, 1000.0, 2000.0, 159) + femmesh.addNode(7500.000000000001, 1000.0, 2000.0, 160) + femmesh.addNode(8500.0, 1000.0, 2000.0, 161) + femmesh.addNode(10000.000000000002, 1000.0, 2000.0, 162) + femmesh.addNode(9500.0, 1000.0, 2000.0, 163) + femmesh.addNode(10500.0, 1000.0, 2000.0, 164) + femmesh.addNode(1000.0, 1000.0, 0.0, 165) + femmesh.addNode(500.0, 500.0, 0.0, 166) + femmesh.addNode(1500.0, 1500.0, 0.0, 167) + femmesh.addNode(3000.0, 1000.0, 0.0, 168) + femmesh.addNode(2500.0, 500.0, 0.0, 169) + femmesh.addNode(3500.0, 1500.0, 0.0, 170) + femmesh.addNode(5000.0, 1000.0, 0.0, 171) + femmesh.addNode(4500.0, 500.0, 0.0, 172) + femmesh.addNode(5500.0, 1500.0, 0.0, 173) + femmesh.addNode(7000.0, 1000.0, 0.0, 174) + femmesh.addNode(6500.0, 500.0, 0.0, 175) + femmesh.addNode(7500.0, 1500.0, 0.0, 176) + femmesh.addNode(9000.0, 1000.0, 0.0, 177) + femmesh.addNode(8500.0, 500.0, 0.0, 178) + femmesh.addNode(9500.0, 1500.0, 0.0, 179) + femmesh.addNode(11000.0, 1000.0, 0.0, 180) + femmesh.addNode(10500.0, 500.0, 0.0, 181) + femmesh.addNode(11500.0, 1500.0, 0.0, 182) + return True + + +def create_elements(femmesh): + # elements + femmesh.addEdge([1, 21, 22], 1) + femmesh.addEdge([21, 2, 23], 2) + femmesh.addEdge([3, 24, 25], 3) + femmesh.addEdge([24, 4, 26], 4) + femmesh.addEdge([5, 27, 28], 5) + femmesh.addEdge([27, 6, 29], 6) + femmesh.addEdge([7, 30, 31], 7) + femmesh.addEdge([30, 8, 32], 8) + femmesh.addEdge([9, 33, 34], 9) + femmesh.addEdge([33, 10, 35], 10) + femmesh.addEdge([11, 36, 37], 11) + femmesh.addEdge([36, 12, 38], 12) + femmesh.addEdge([13, 39, 40], 13) + femmesh.addEdge([39, 14, 41], 14) + femmesh.addEdge([1, 42, 43], 15) + femmesh.addEdge([42, 3, 44], 16) + femmesh.addEdge([2, 45, 46], 17) + femmesh.addEdge([45, 4, 47], 18) + femmesh.addEdge([3, 48, 49], 19) + femmesh.addEdge([48, 5, 50], 20) + femmesh.addEdge([4, 51, 52], 21) + femmesh.addEdge([51, 6, 53], 22) + femmesh.addEdge([5, 54, 55], 23) + femmesh.addEdge([54, 7, 56], 24) + femmesh.addEdge([6, 57, 58], 25) + femmesh.addEdge([57, 8, 59], 26) + femmesh.addEdge([7, 60, 61], 27) + femmesh.addEdge([60, 9, 62], 28) + femmesh.addEdge([8, 63, 64], 29) + femmesh.addEdge([63, 10, 65], 30) + femmesh.addEdge([9, 66, 67], 31) + femmesh.addEdge([66, 11, 68], 32) + femmesh.addEdge([10, 69, 70], 33) + femmesh.addEdge([69, 12, 71], 34) + femmesh.addEdge([11, 72, 73], 35) + femmesh.addEdge([72, 13, 74], 36) + femmesh.addEdge([12, 75, 76], 37) + femmesh.addEdge([75, 14, 77], 38) + femmesh.addEdge([1, 78, 79], 39) + femmesh.addEdge([78, 15, 80], 40) + femmesh.addEdge([3, 81, 82], 41) + femmesh.addEdge([81, 16, 83], 42) + femmesh.addEdge([5, 84, 85], 43) + femmesh.addEdge([84, 17, 86], 44) + femmesh.addEdge([7, 87, 88], 45) + femmesh.addEdge([87, 18, 89], 46) + femmesh.addEdge([9, 90, 91], 47) + femmesh.addEdge([90, 19, 92], 48) + femmesh.addEdge([11, 93, 94], 49) + femmesh.addEdge([93, 20, 95], 50) + femmesh.addEdge([2, 96, 97], 51) + femmesh.addEdge([96, 15, 98], 52) + femmesh.addEdge([4, 99, 100], 53) + femmesh.addEdge([99, 16, 101], 54) + femmesh.addEdge([6, 102, 103], 55) + femmesh.addEdge([102, 17, 104], 56) + femmesh.addEdge([8, 105, 106], 57) + femmesh.addEdge([105, 18, 107], 58) + femmesh.addEdge([10, 108, 109], 59) + femmesh.addEdge([108, 19, 110], 60) + femmesh.addEdge([12, 111, 112], 61) + femmesh.addEdge([111, 20, 113], 62) + femmesh.addEdge([15, 114, 115], 63) + femmesh.addEdge([114, 3, 116], 64) + femmesh.addEdge([16, 117, 118], 65) + femmesh.addEdge([117, 5, 119], 66) + femmesh.addEdge([17, 120, 121], 67) + femmesh.addEdge([120, 7, 122], 68) + femmesh.addEdge([18, 123, 124], 69) + femmesh.addEdge([123, 9, 125], 70) + femmesh.addEdge([19, 126, 127], 71) + femmesh.addEdge([126, 11, 128], 72) + femmesh.addEdge([20, 129, 130], 73) + femmesh.addEdge([129, 13, 131], 74) + femmesh.addEdge([15, 132, 133], 75) + femmesh.addEdge([132, 4, 134], 76) + femmesh.addEdge([16, 135, 136], 77) + femmesh.addEdge([135, 6, 137], 78) + femmesh.addEdge([17, 138, 139], 79) + femmesh.addEdge([138, 8, 140], 80) + femmesh.addEdge([18, 141, 142], 81) + femmesh.addEdge([141, 10, 143], 82) + femmesh.addEdge([19, 144, 145], 83) + femmesh.addEdge([144, 12, 146], 84) + femmesh.addEdge([20, 147, 148], 85) + femmesh.addEdge([147, 14, 149], 86) + femmesh.addEdge([15, 150, 151], 87) + femmesh.addEdge([150, 16, 152], 88) + femmesh.addEdge([16, 153, 154], 89) + femmesh.addEdge([153, 17, 155], 90) + femmesh.addEdge([17, 156, 157], 91) + femmesh.addEdge([156, 18, 158], 92) + femmesh.addEdge([18, 159, 160], 93) + femmesh.addEdge([159, 19, 161], 94) + femmesh.addEdge([19, 162, 163], 95) + femmesh.addEdge([162, 20, 164], 96) + femmesh.addEdge([2, 165, 166], 97) + femmesh.addEdge([165, 3, 167], 98) + femmesh.addEdge([4, 168, 169], 99) + femmesh.addEdge([168, 5, 170], 100) + femmesh.addEdge([6, 171, 172], 101) + femmesh.addEdge([171, 7, 173], 102) + femmesh.addEdge([8, 174, 175], 103) + femmesh.addEdge([174, 9, 176], 104) + femmesh.addEdge([10, 177, 178], 105) + femmesh.addEdge([177, 11, 179], 106) + femmesh.addEdge([12, 180, 181], 107) + femmesh.addEdge([180, 13, 182], 108) + return True diff --git a/src/Mod/Fem/femexamples/truss_3d_cs_circle_ele_seg2.py b/src/Mod/Fem/femexamples/truss_3d_cs_circle_ele_seg2.py new file mode 100644 index 0000000000..0b7d953cbd --- /dev/null +++ b/src/Mod/Fem/femexamples/truss_3d_cs_circle_ele_seg2.py @@ -0,0 +1,79 @@ +# *************************************************************************** +# * Copyright (c) 2021 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. * +# * * +# * 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 .truss_3d_cs_circle_ele_seg3 import setup as setup_truss_seg3 +from .manager import get_meshname +from .manager import init_doc + + +def get_information(): + return { + "name": "Truss 3D circle cs, seg2 elements", + "meshtype": "edge", + "meshelement": "Seg3", + "constraints": ["fixed", "force"], + "solvers": ["z88"], + "material": "solid", + "equation": "mechanical" + } + + +def setup(doc=None, solvertype="z88"): + + # init FreeCAD document + if doc is None: + doc = init_doc() + + # explanation object + # see seg3 for the header + # for simplicity reason only one explanation is used for both + + # setup cantilever faceload + doc = setup_truss_seg3(doc, solvertype) + femmesh_obj = doc.getObject(get_meshname()) + + # mesh + from .meshes.mesh_truss_crane_seg2 import create_nodes, create_elements + fem_mesh = Fem.FemMesh() + control = create_nodes(fem_mesh) + if not control: + FreeCAD.Console.PrintError("Error on creating nodes.\n") + control = create_elements(fem_mesh) + if not control: + FreeCAD.Console.PrintError("Error on creating elements.\n") + + # overwrite mesh with the hexa20 mesh + femmesh_obj.FemMesh = fem_mesh + + # set changed properties + femmesh_obj.ElementOrder = "1st" + # one element for each bar + femmesh_obj.CharacteristicLengthMax = "3000.0 mm" + femmesh_obj.CharacteristicLengthMin = "3000.0 mm" + + doc.recompute() + return doc diff --git a/src/Mod/Fem/femexamples/truss_3d_cs_circle_ele_seg3.py b/src/Mod/Fem/femexamples/truss_3d_cs_circle_ele_seg3.py new file mode 100644 index 0000000000..f945655931 --- /dev/null +++ b/src/Mod/Fem/femexamples/truss_3d_cs_circle_ele_seg3.py @@ -0,0 +1,476 @@ +# *************************************************************************** +# * Copyright (c) 2021 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. * +# * * +# * 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 +from FreeCAD import Vector as vec + +from BOPTools import SplitFeatures +from Part import makeLine + +import Fem +import ObjectsFem + +from . import manager +from .manager import get_meshname +from .manager import init_doc + + +def get_information(): + return { + "name": "Truss 3D circle cs, seg3 elements", + "meshtype": "edge", + "meshelement": "Seg3", + "constraints": ["fixed", "force"], + "solvers": ["calculix"], + "material": "solid", + "equation": "mechanical" + } + + +def get_explanation(header=""): + return header + """ + +# To run the example from Python console use, +# (works even after an edit without restart of FreeCAD): +import importlib +import femexamples.truss_3d_cs_circle_ele_seg3 as example +importlib.reload(example) +example.setup() + + +See forum topic post: +https://forum.freecadweb.org/viewtopic.php?f=18&t=23318&start=20#p521050 +https://forum.freecadweb.org/viewtopic.php?f=13&t=59239&start=100#p521220 + +Z88 official example 2, crane beam +- nonsway (on x deformation on both support) +- in pratical engineering one would let the truss breathe on one side +- max deflection CalxuliX: 8.22 mm # but it needs four seg3 elements foreach bar +- max deflection Mystran : x.xx mm +- max deflection Z88 : 8.19 mm # one seg2 truss element foreach bar +""" + + +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()))) + + # geometric object + # load line + load_line = doc.addObject("Part::Line", "LoadLine") + load_line.X1 = 0 + load_line.Y1 = 0 + load_line.Z1 = 1000 + load_line.X2 = 0 + load_line.Y2 = 0 + load_line.Z2 = 0 + if FreeCAD.GuiUp: + load_line.ViewObject.hide() + + # commands where generated by Pyhon out of the original Z88 Mesh obj data + v1 = vec(0.0, 2000.0, 0.0) + v2 = vec(0.0, 0.0, 0.0) + v3 = vec(1000.0, 1000.0, 2000.0) + v4 = vec(2000.0, 2000.0, 0.0) + v5 = vec(2000.0, 0.0, 0.0) + v6 = vec(3000.0, 1000.0, 2000.0) + v7 = vec(4000.0, 2000.0, 0.0) + v8 = vec(4000.0, 0.0, 0.0) + v9 = vec(5000.0, 1000.0, 2000.0) + v10 = vec(6000.0, 2000.0, 0.0) + v11 = vec(6000.0, 0.0, 0.0) + v12 = vec(7000.0, 1000.0, 2000.0) + v13 = vec(8000.0, 2000.0, 0.0) + v14 = vec(8000.0, 0.0, 0.0) + v15 = vec(9000.0, 1000.0, 2000.0) + v16 = vec(10000.0, 2000.0, 0.0) + v17 = vec(10000.0, 0.0, 0.0) + v18 = vec(11000.0, 1000.0, 2000.0) + v19 = vec(12000.0, 2000.0, 0.0) + v20 = vec(12000.0, 0.0, 0.0) + line1 = makeLine(v1, v2) + line2 = makeLine(v4, v5) + line3 = makeLine(v7, v8) + line4 = makeLine(v10, v11) + line5 = makeLine(v13, v14) + line6 = makeLine(v16, v17) + line7 = makeLine(v19, v20) + line8 = makeLine(v1, v4) + line9 = makeLine(v2, v5) + line10 = makeLine(v4, v7) + line11 = makeLine(v5, v8) + line12 = makeLine(v7, v10) + line13 = makeLine(v8, v11) + line14 = makeLine(v10, v13) + line15 = makeLine(v11, v14) + line16 = makeLine(v13, v16) + line17 = makeLine(v14, v17) + line18 = makeLine(v16, v19) + line19 = makeLine(v17, v20) + line20 = makeLine(v1, v3) + line21 = makeLine(v4, v6) + line22 = makeLine(v7, v9) + line23 = makeLine(v10, v12) + line24 = makeLine(v13, v15) + line25 = makeLine(v16, v18) + line26 = makeLine(v2, v3) + line27 = makeLine(v5, v6) + line28 = makeLine(v8, v9) + line29 = makeLine(v11, v12) + line30 = makeLine(v14, v15) + line31 = makeLine(v17, v18) + line32 = makeLine(v3, v4) + line33 = makeLine(v6, v7) + line34 = makeLine(v9, v10) + line35 = makeLine(v12, v13) + line36 = makeLine(v15, v16) + line37 = makeLine(v18, v19) + line38 = makeLine(v3, v5) + line39 = makeLine(v6, v8) + line40 = makeLine(v9, v11) + line41 = makeLine(v12, v14) + line42 = makeLine(v15, v17) + line43 = makeLine(v18, v20) + line44 = makeLine(v3, v6) + line45 = makeLine(v6, v9) + line46 = makeLine(v9, v12) + line47 = makeLine(v12, v15) + line48 = makeLine(v15, v18) + line49 = makeLine(v2, v4) + line50 = makeLine(v5, v7) + line51 = makeLine(v8, v10) + line52 = makeLine(v11, v13) + line53 = makeLine(v14, v16) + line54 = makeLine(v17, v19) + obj_line1 = doc.addObject("Part::Feature", "Line1") + obj_line1.Shape = line1 + obj_line2 = doc.addObject("Part::Feature", "Line2") + obj_line2.Shape = line2 + obj_line3 = doc.addObject("Part::Feature", "Line3") + obj_line3.Shape = line3 + obj_line4 = doc.addObject("Part::Feature", "Line4") + obj_line4.Shape = line4 + obj_line5 = doc.addObject("Part::Feature", "Line5") + obj_line5.Shape = line5 + obj_line6 = doc.addObject("Part::Feature", "Line6") + obj_line6.Shape = line6 + obj_line7 = doc.addObject("Part::Feature", "Line7") + obj_line7.Shape = line7 + obj_line8 = doc.addObject("Part::Feature", "Line8") + obj_line8.Shape = line8 + obj_line9 = doc.addObject("Part::Feature", "Line9") + obj_line9.Shape = line9 + obj_line10 = doc.addObject("Part::Feature", "Line10") + obj_line10.Shape = line10 + obj_line11 = doc.addObject("Part::Feature", "Line11") + obj_line11.Shape = line11 + obj_line12 = doc.addObject("Part::Feature", "Line12") + obj_line12.Shape = line12 + obj_line13 = doc.addObject("Part::Feature", "Line13") + obj_line13.Shape = line13 + obj_line14 = doc.addObject("Part::Feature", "Line14") + obj_line14.Shape = line14 + obj_line15 = doc.addObject("Part::Feature", "Line15") + obj_line15.Shape = line15 + obj_line16 = doc.addObject("Part::Feature", "Line16") + obj_line16.Shape = line16 + obj_line17 = doc.addObject("Part::Feature", "Line17") + obj_line17.Shape = line17 + obj_line18 = doc.addObject("Part::Feature", "Line18") + obj_line18.Shape = line18 + obj_line19 = doc.addObject("Part::Feature", "Line19") + obj_line19.Shape = line19 + obj_line20 = doc.addObject("Part::Feature", "Line20") + obj_line20.Shape = line20 + obj_line21 = doc.addObject("Part::Feature", "Line21") + obj_line21.Shape = line21 + obj_line22 = doc.addObject("Part::Feature", "Line22") + obj_line22.Shape = line22 + obj_line23 = doc.addObject("Part::Feature", "Line23") + obj_line23.Shape = line23 + obj_line24 = doc.addObject("Part::Feature", "Line24") + obj_line24.Shape = line24 + obj_line25 = doc.addObject("Part::Feature", "Line25") + obj_line25.Shape = line25 + obj_line26 = doc.addObject("Part::Feature", "Line26") + obj_line26.Shape = line26 + obj_line27 = doc.addObject("Part::Feature", "Line27") + obj_line27.Shape = line27 + obj_line28 = doc.addObject("Part::Feature", "Line28") + obj_line28.Shape = line28 + obj_line29 = doc.addObject("Part::Feature", "Line29") + obj_line29.Shape = line29 + obj_line30 = doc.addObject("Part::Feature", "Line30") + obj_line30.Shape = line30 + obj_line31 = doc.addObject("Part::Feature", "Line31") + obj_line31.Shape = line31 + obj_line32 = doc.addObject("Part::Feature", "Line32") + obj_line32.Shape = line32 + obj_line33 = doc.addObject("Part::Feature", "Line33") + obj_line33.Shape = line33 + obj_line34 = doc.addObject("Part::Feature", "Line34") + obj_line34.Shape = line34 + obj_line35 = doc.addObject("Part::Feature", "Line35") + obj_line35.Shape = line35 + obj_line36 = doc.addObject("Part::Feature", "Line36") + obj_line36.Shape = line36 + obj_line37 = doc.addObject("Part::Feature", "Line37") + obj_line37.Shape = line37 + obj_line38 = doc.addObject("Part::Feature", "Line38") + obj_line38.Shape = line38 + obj_line39 = doc.addObject("Part::Feature", "Line39") + obj_line39.Shape = line39 + obj_line40 = doc.addObject("Part::Feature", "Line40") + obj_line40.Shape = line40 + obj_line41 = doc.addObject("Part::Feature", "Line41") + obj_line41.Shape = line41 + obj_line42 = doc.addObject("Part::Feature", "Line42") + obj_line42.Shape = line42 + obj_line43 = doc.addObject("Part::Feature", "Line43") + obj_line43.Shape = line43 + obj_line44 = doc.addObject("Part::Feature", "Line44") + obj_line44.Shape = line44 + obj_line45 = doc.addObject("Part::Feature", "Line45") + obj_line45.Shape = line45 + obj_line46 = doc.addObject("Part::Feature", "Line46") + obj_line46.Shape = line46 + obj_line47 = doc.addObject("Part::Feature", "Line47") + obj_line47.Shape = line47 + obj_line48 = doc.addObject("Part::Feature", "Line48") + obj_line48.Shape = line48 + obj_line49 = doc.addObject("Part::Feature", "Line49") + obj_line49.Shape = line49 + obj_line50 = doc.addObject("Part::Feature", "Line50") + obj_line50.Shape = line50 + obj_line51 = doc.addObject("Part::Feature", "Line51") + obj_line51.Shape = line51 + obj_line52 = doc.addObject("Part::Feature", "Line52") + obj_line52.Shape = line52 + obj_line53 = doc.addObject("Part::Feature", "Line53") + obj_line53.Shape = line53 + obj_line54 = doc.addObject("Part::Feature", "Line54") + obj_line54.Shape = line54 + doc.recompute() + geom_obj = SplitFeatures.makeBooleanFragments(name="CraneTruss") + geom_obj.Objects = [ + obj_line1, + obj_line2, + obj_line3, + obj_line4, + obj_line5, + obj_line6, + obj_line7, + obj_line8, + obj_line9, + obj_line10, + obj_line11, + obj_line12, + obj_line13, + obj_line14, + obj_line15, + obj_line16, + obj_line17, + obj_line18, + obj_line19, + obj_line20, + obj_line21, + obj_line22, + obj_line23, + obj_line24, + obj_line25, + obj_line26, + obj_line27, + obj_line28, + obj_line29, + obj_line30, + obj_line31, + obj_line32, + obj_line33, + obj_line34, + obj_line35, + obj_line36, + obj_line37, + obj_line38, + obj_line39, + obj_line40, + obj_line41, + obj_line42, + obj_line43, + obj_line44, + obj_line45, + obj_line46, + obj_line47, + obj_line48, + obj_line49, + obj_line50, + obj_line51, + obj_line52, + obj_line53, + obj_line54, + ] + if FreeCAD.GuiUp: + obj_line1.ViewObject.hide() + obj_line2.ViewObject.hide() + obj_line3.ViewObject.hide() + obj_line4.ViewObject.hide() + obj_line5.ViewObject.hide() + obj_line6.ViewObject.hide() + obj_line7.ViewObject.hide() + obj_line8.ViewObject.hide() + obj_line9.ViewObject.hide() + obj_line10.ViewObject.hide() + obj_line11.ViewObject.hide() + obj_line12.ViewObject.hide() + obj_line13.ViewObject.hide() + obj_line14.ViewObject.hide() + obj_line15.ViewObject.hide() + obj_line16.ViewObject.hide() + obj_line17.ViewObject.hide() + obj_line18.ViewObject.hide() + obj_line19.ViewObject.hide() + obj_line20.ViewObject.hide() + obj_line21.ViewObject.hide() + obj_line22.ViewObject.hide() + obj_line23.ViewObject.hide() + obj_line24.ViewObject.hide() + obj_line25.ViewObject.hide() + obj_line26.ViewObject.hide() + obj_line27.ViewObject.hide() + obj_line28.ViewObject.hide() + obj_line29.ViewObject.hide() + obj_line30.ViewObject.hide() + obj_line31.ViewObject.hide() + obj_line32.ViewObject.hide() + obj_line33.ViewObject.hide() + obj_line34.ViewObject.hide() + obj_line35.ViewObject.hide() + obj_line36.ViewObject.hide() + obj_line37.ViewObject.hide() + obj_line38.ViewObject.hide() + obj_line39.ViewObject.hide() + obj_line40.ViewObject.hide() + obj_line41.ViewObject.hide() + obj_line42.ViewObject.hide() + obj_line43.ViewObject.hide() + obj_line44.ViewObject.hide() + obj_line45.ViewObject.hide() + obj_line46.ViewObject.hide() + obj_line47.ViewObject.hide() + obj_line48.ViewObject.hide() + obj_line49.ViewObject.hide() + obj_line50.ViewObject.hide() + obj_line51.ViewObject.hide() + obj_line52.ViewObject.hide() + obj_line53.ViewObject.hide() + obj_line54.ViewObject.hide() + + doc.recompute() + if FreeCAD.GuiUp: + geom_obj.ViewObject.Document.activeView().viewAxonometric() + geom_obj.ViewObject.Document.activeView().fitAll() + + # analysis + analysis = ObjectsFem.makeAnalysis(doc, "Analysis") + + # solver + if solvertype == "calculix": + solver_obj = ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX") + elif solvertype == "ccxtools": + solver_obj = ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools") + solver_obj.WorkingDir = u"" + elif solvertype == "z88": + solver_obj = ObjectsFem.makeSolverZ88(doc, "SolverZ88") + else: + FreeCAD.Console.PrintWarning( + "Not known or not supported solver type: {}. " + "No solver object was created.\n".format(solvertype) + ) + if solvertype == "calculix" or solvertype == "ccxtools": + solver_obj.SplitInputWriter = False + solver_obj.AnalysisType = "static" + solver_obj.GeometricalNonlinearity = "linear" + solver_obj.ThermoMechSteadyState = False + solver_obj.MatrixSolverType = "default" + solver_obj.IterationsControlParameterTimeUse = False + analysis.addObject(solver_obj) + + # beam section + beamsection_obj = ObjectsFem.makeElementGeometry1D( + doc, + sectiontype="Circular", + height=25.0, + name="CrossSectionCircular" + ) + analysis.addObject(beamsection_obj) + + # material + material_obj = ObjectsFem.makeMaterialSolid(doc, "MechanicalMaterial") + mat = material_obj.Material + mat["Name"] = "Steel" + mat["YoungsModulus"] = "200000 MPa" + mat["PoissonRatio"] = "0.30" + material_obj.Material = mat + analysis.addObject(material_obj) + + # constraint fixed + con_fixed = ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed") + con_fixed.References = [(geom_obj, ("Vertex1", "Vertex2", "Vertex13", "Vertex14"))] + analysis.addObject(con_fixed) + + # constraint force + con_force = ObjectsFem.makeConstraintForce(doc, "ConstraintForce") + con_force.References = [(geom_obj, ("Vertex5", "Vertex6"))] + con_force.Force = 60000.0 # 30 kN on each Node + con_force.Direction = (load_line, ["Edge1"]) + con_force.Reversed = False + analysis.addObject(con_force) + + # mesh + from .meshes.mesh_truss_crane_seg3 import create_nodes, create_elements + fem_mesh = Fem.FemMesh() + control = create_nodes(fem_mesh) + if not control: + FreeCAD.Console.PrintError("Error on creating nodes.\n") + control = create_elements(fem_mesh) + if not control: + FreeCAD.Console.PrintError("Error on creating elements.\n") + femmesh_obj = analysis.addObject(ObjectsFem.makeMeshGmsh(doc, get_meshname()))[0] + femmesh_obj.FemMesh = fem_mesh + femmesh_obj.Part = geom_obj + femmesh_obj.SecondOrderLinear = False + femmesh_obj.ElementDimension = "1D" + # four elements for each bar + femmesh_obj.CharacteristicLengthMax = "1500.0 mm" + femmesh_obj.CharacteristicLengthMin = "1500.0 mm" + if FreeCAD.GuiUp: + femmesh_obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes" + femmesh_obj.ViewObject.PointColor = (1.0, 0.0, 0.5, 0.0) + + doc.recompute() + return doc diff --git a/src/Mod/Fem/femsolver/z88/writer.py b/src/Mod/Fem/femsolver/z88/writer.py index 82bab20394..1c796fe728 100644 --- a/src/Mod/Fem/femsolver/z88/writer.py +++ b/src/Mod/Fem/femsolver/z88/writer.py @@ -215,7 +215,7 @@ class FemInputWriterZ88(writerbase.FemInputWriter): ) # TODO make the check in prechecks and delete it here # no extensive errorhandling in writer - # this way the solver will fail and an exeption is raised somehow + # this way the solver will fail and an exception is raised somehow elements_data.append( "1 {} {} 0 0 0 0 0 0 " .format(self.element_count, area) diff --git a/src/Mod/Fem/femtest/app/test_solver_calculix.py b/src/Mod/Fem/femtest/app/test_solver_calculix.py index 0462c5cb88..0e29487976 100644 --- a/src/Mod/Fem/femtest/app/test_solver_calculix.py +++ b/src/Mod/Fem/femtest/app/test_solver_calculix.py @@ -104,10 +104,26 @@ class TestSolverCalculix(unittest.TestCase): self.input_file_writing_test(get_namefromdef("test_")) # ******************************************************************************************** - def test_ccx_cantilever_faceload( + def test_ccx_cantilever_beam_circle( self ): - from femexamples.ccx_cantilever_faceload import setup + from femexamples.ccx_cantilever_beam_circle import setup + setup(self.document, "calculix") + self.input_file_writing_test(get_namefromdef("test_")) + + # ******************************************************************************************** + def test_ccx_cantilever_beam_pipe( + self + ): + from femexamples.ccx_cantilever_beam_pipe import setup + setup(self.document, "calculix") + self.input_file_writing_test(get_namefromdef("test_")) + + # ******************************************************************************************** + def test_ccx_cantilever_beam_rect( + self + ): + from femexamples.ccx_cantilever_beam_rect import setup setup(self.document, "calculix") self.input_file_writing_test(get_namefromdef("test_")) @@ -167,6 +183,14 @@ class TestSolverCalculix(unittest.TestCase): setup(self.document, "calculix") self.input_file_writing_test(get_namefromdef("test_")) + # ******************************************************************************************** + def test_ccx_cantilever_faceload( + self + ): + from femexamples.ccx_cantilever_faceload import setup + setup(self.document, "calculix") + self.input_file_writing_test(get_namefromdef("test_")) + # ******************************************************************************************** def test_ccx_cantilever_nodeload( self diff --git a/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_circle.inp b/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_circle.inp new file mode 100644 index 0000000000..9c70c8229e --- /dev/null +++ b/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_circle.inp @@ -0,0 +1,135 @@ +** written by FreeCAD inp file writer for CalculiX,Abaqus meshes +** highest dimension mesh elements only. + +** Nodes +*Node, NSET=Nall +1, 0, 500, 500 +2, 8000, 500, 500 +3, 1600, 500, 500 +4, 3200, 500, 500 +5, 4800, 500, 500 +6, 6400, 500, 500 +7, 800, 500, 500 +8, 2400, 500, 500 +9, 4000, 500, 500 +10, 5600, 500, 500 +11, 7200, 500, 500 + + +** Edge elements +*Element, TYPE=B32, ELSET=Eedges +1, 1, 7, 3 +2, 3, 8, 4 +3, 4, 9, 5 +4, 5, 10, 6 +5, 6, 11, 2 + +** Define element set Eall +*ELSET, ELSET=Eall +Eedges + + + +*********************************************************** +** Element sets for materials and FEM element type (solid, shell, beam, fluid) +*ELSET,ELSET=M0B0RstdD0 +1, +2, +3, +4, +5, + +*********************************************************** +** constraints fixed node sets +** ConstraintFixed +*NSET,NSET=ConstraintFixed +1, + +*********************************************************** +** Materials +** see information about units at file end +** FreeCAD material name: Calculix-Steel +** MechanicalMaterial +*MATERIAL, NAME=MechanicalMaterial +*ELASTIC +210000,0.3 + +*********************************************************** +** Sections +*BEAM SECTION, ELSET=M0B0RstdD0, MATERIAL=MechanicalMaterial, SECTION=CIRC +1000 +-0, 1, 0 + +*********************************************************** +** At least one step is needed to run an CalculiX analysis of FreeCAD +*STEP +*STATIC + + +*********************************************************** +** Fixed Constraints +** ConstraintFixed +*BOUNDARY +ConstraintFixed,1 +ConstraintFixed,2 +ConstraintFixed,3 +ConstraintFixed,4 +ConstraintFixed,5 +ConstraintFixed,6 + + +*********************************************************** +** constraints force node loads +*CLOAD +** ConstraintForce +** node load on shape: CantileverLine:Vertex2 +2,3,-9.0000000000000E+06 + + + +*********************************************************** +** Outputs --> frd file +*NODE FILE, OUTPUT=2d +U +*EL FILE +S, E +** outputs --> dat file +** reaction forces for Constraint fixed +*NODE PRINT, NSET=ConstraintFixed, TOTALS=ONLY +RF + + +*********************************************************** +*END STEP + +*********************************************************** +** CalculiX Input file +** written by --> FreeCAD 0.20.25432 (Git) +** written on --> Wed Aug 4 22:12:24 2021 +** file name --> +** analysis name --> Analysis +** +** +*********************************************************** +** About units: +** See ccx manual, ccx does not know about any unit. +** Golden rule: The user must make sure that the numbers he provides have consistent units. +** The user is the FreeCAD calculix writer module ;-) +** +** The unit system which is used at Guido Dhondt's company: mm, N, s, K +** Since Length and Mass are connected by Force, if Length is mm the Mass is in t to get N +** The following units are used to write to inp file: +** +** Length: mm (this includes the mesh geometry) +** Mass: t +** TimeSpan: s +** Temperature: K +** +** This leads to: +** Force: N +** Pressure: N/mm^2 == MPa (Young's Modulus has unit Pressure) +** Density: t/mm^3 +** Gravity: mm/s^2 +** Thermal conductivity: t*mm/K/s^3 == as W/m/K == kW/mm/K +** Specific Heat: mm^2/s^2/K = J/kg/K == kJ/t/K +** diff --git a/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_pipe.inp b/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_pipe.inp new file mode 100644 index 0000000000..4f9f744756 --- /dev/null +++ b/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_pipe.inp @@ -0,0 +1,135 @@ +** written by FreeCAD inp file writer for CalculiX,Abaqus meshes +** highest dimension mesh elements only. + +** Nodes +*Node, NSET=Nall +1, 0, 500, 500 +2, 8000, 500, 500 +3, 1600, 500, 500 +4, 3200, 500, 500 +5, 4800, 500, 500 +6, 6400, 500, 500 +7, 800, 500, 500 +8, 2400, 500, 500 +9, 4000, 500, 500 +10, 5600, 500, 500 +11, 7200, 500, 500 + + +** Edge elements +*Element, TYPE=B32, ELSET=Eedges +1, 1, 7, 3 +2, 3, 8, 4 +3, 4, 9, 5 +4, 5, 10, 6 +5, 6, 11, 2 + +** Define element set Eall +*ELSET, ELSET=Eall +Eedges + + + +*********************************************************** +** Element sets for materials and FEM element type (solid, shell, beam, fluid) +*ELSET,ELSET=M0B0RstdD0 +1, +2, +3, +4, +5, + +*********************************************************** +** constraints fixed node sets +** ConstraintFixed +*NSET,NSET=ConstraintFixed +1, + +*********************************************************** +** Materials +** see information about units at file end +** FreeCAD material name: Calculix-Steel +** MechanicalMaterial +*MATERIAL, NAME=MechanicalMaterial +*ELASTIC +210000,0.3 + +*********************************************************** +** Sections +*BEAM GENERAL SECTION, ELSET=M0B0RstdD0, MATERIAL=MechanicalMaterial, SECTION=PIPE +500,100 +-0, 1, 0 + +*********************************************************** +** At least one step is needed to run an CalculiX analysis of FreeCAD +*STEP +*STATIC + + +*********************************************************** +** Fixed Constraints +** ConstraintFixed +*BOUNDARY +ConstraintFixed,1 +ConstraintFixed,2 +ConstraintFixed,3 +ConstraintFixed,4 +ConstraintFixed,5 +ConstraintFixed,6 + + +*********************************************************** +** constraints force node loads +*CLOAD +** ConstraintForce +** node load on shape: CantileverLine:Vertex2 +2,3,-9.0000000000000E+06 + + + +*********************************************************** +** Outputs --> frd file +*NODE FILE, OUTPUT=2d +U +*EL FILE +S, E +** outputs --> dat file +** reaction forces for Constraint fixed +*NODE PRINT, NSET=ConstraintFixed, TOTALS=ONLY +RF + + +*********************************************************** +*END STEP + +*********************************************************** +** CalculiX Input file +** written by --> FreeCAD 0.20.25432 (Git) +** written on --> Wed Aug 4 22:13:20 2021 +** file name --> +** analysis name --> Analysis +** +** +*********************************************************** +** About units: +** See ccx manual, ccx does not know about any unit. +** Golden rule: The user must make sure that the numbers he provides have consistent units. +** The user is the FreeCAD calculix writer module ;-) +** +** The unit system which is used at Guido Dhondt's company: mm, N, s, K +** Since Length and Mass are connected by Force, if Length is mm the Mass is in t to get N +** The following units are used to write to inp file: +** +** Length: mm (this includes the mesh geometry) +** Mass: t +** TimeSpan: s +** Temperature: K +** +** This leads to: +** Force: N +** Pressure: N/mm^2 == MPa (Young's Modulus has unit Pressure) +** Density: t/mm^3 +** Gravity: mm/s^2 +** Thermal conductivity: t*mm/K/s^3 == as W/m/K == kW/mm/K +** Specific Heat: mm^2/s^2/K = J/kg/K == kJ/t/K +** diff --git a/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_rect.inp b/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_rect.inp new file mode 100644 index 0000000000..65338dbab6 --- /dev/null +++ b/src/Mod/Fem/femtest/data/calculix/ccx_cantilever_beam_rect.inp @@ -0,0 +1,135 @@ +** written by FreeCAD inp file writer for CalculiX,Abaqus meshes +** highest dimension mesh elements only. + +** Nodes +*Node, NSET=Nall +1, 0, 500, 500 +2, 8000, 500, 500 +3, 1600, 500, 500 +4, 3200, 500, 500 +5, 4800, 500, 500 +6, 6400, 500, 500 +7, 800, 500, 500 +8, 2400, 500, 500 +9, 4000, 500, 500 +10, 5600, 500, 500 +11, 7200, 500, 500 + + +** Edge elements +*Element, TYPE=B32, ELSET=Eedges +1, 1, 7, 3 +2, 3, 8, 4 +3, 4, 9, 5 +4, 5, 10, 6 +5, 6, 11, 2 + +** Define element set Eall +*ELSET, ELSET=Eall +Eedges + + + +*********************************************************** +** Element sets for materials and FEM element type (solid, shell, beam, fluid) +*ELSET,ELSET=M0B0RstdD0 +1, +2, +3, +4, +5, + +*********************************************************** +** constraints fixed node sets +** ConstraintFixed +*NSET,NSET=ConstraintFixed +1, + +*********************************************************** +** Materials +** see information about units at file end +** FreeCAD material name: Calculix-Steel +** MechanicalMaterial +*MATERIAL, NAME=MechanicalMaterial +*ELASTIC +210000,0.3 + +*********************************************************** +** Sections +*BEAM SECTION, ELSET=M0B0RstdD0, MATERIAL=MechanicalMaterial, SECTION=RECT +400,1250 +-0, 1, 0 + +*********************************************************** +** At least one step is needed to run an CalculiX analysis of FreeCAD +*STEP +*STATIC + + +*********************************************************** +** Fixed Constraints +** ConstraintFixed +*BOUNDARY +ConstraintFixed,1 +ConstraintFixed,2 +ConstraintFixed,3 +ConstraintFixed,4 +ConstraintFixed,5 +ConstraintFixed,6 + + +*********************************************************** +** constraints force node loads +*CLOAD +** ConstraintForce +** node load on shape: CantileverLine:Vertex2 +2,3,-9.0000000000000E+06 + + + +*********************************************************** +** Outputs --> frd file +*NODE FILE, OUTPUT=2d +U +*EL FILE +S, E +** outputs --> dat file +** reaction forces for Constraint fixed +*NODE PRINT, NSET=ConstraintFixed, TOTALS=ONLY +RF + + +*********************************************************** +*END STEP + +*********************************************************** +** CalculiX Input file +** written by --> FreeCAD 0.20.25432 (Git) +** written on --> Wed Aug 4 22:14:46 2021 +** file name --> +** analysis name --> Analysis +** +** +*********************************************************** +** About units: +** See ccx manual, ccx does not know about any unit. +** Golden rule: The user must make sure that the numbers he provides have consistent units. +** The user is the FreeCAD calculix writer module ;-) +** +** The unit system which is used at Guido Dhondt's company: mm, N, s, K +** Since Length and Mass are connected by Force, if Length is mm the Mass is in t to get N +** The following units are used to write to inp file: +** +** Length: mm (this includes the mesh geometry) +** Mass: t +** TimeSpan: s +** Temperature: K +** +** This leads to: +** Force: N +** Pressure: N/mm^2 == MPa (Young's Modulus has unit Pressure) +** Density: t/mm^3 +** Gravity: mm/s^2 +** Thermal conductivity: t*mm/K/s^3 == as W/m/K == kW/mm/K +** Specific Heat: mm^2/s^2/K = J/kg/K == kJ/t/K +**