def test_cantilever(self, request): fem = dfm2.FEM_ShellPlateBendingMITC3() fem.param_thickness = 0.02 fem.param_lambda = 0.0 fem.param_myu = 1.0e+5 fem.param_rho = 1.0 fem.param_gravity_z = -10.0 fem.updated_topology(self.mesh) fem.ls.niter = 2000 fem.ls.bc[self.mesher.points_on_one_edge(3, True, self.cad), :] = 1 fem.solve() assert len(fem.ls.conv_hist) < fem.ls.niter if request.config.getoption('--is_gl') == "true": pos1 = numpy.zeros((self.mesh.np_pos.shape[0], 3)) pos1[:, :2] = self.mesh.np_pos pos1[:, 2] = fem.disp[:, 0] mesh1 = dfm2.Mesh(pos1, self.mesh.np_elm, dfm2.TRI) dfm2.gl.glfw.winDraw3d([mesh1], camera_rotation=[-1.2, 0, 0], nframe=100) #### EI0 = (math.pow(fem.param_thickness, 3) * self.lz / 12) * (2.0 * fem.param_myu) w0 = (fem.param_thickness * self.lx * self.lz * fem.param_rho * fem.param_gravity_z) / self.lx zmax = w0 * math.pow(self.lx, 4) / (8 * EI0) # deformation at the tip for i in range(fem.disp.shape[0]): z0 = fem.disp[i, 0] x0 = self.mesh.np_pos[i, 0] x1 = self.lx - x0 z1 = w0 / (24.0 * EI0) * (3 * math.pow(self.lx, 4) - 4 * math.pow(self.lx, 3) * x1 + math.pow(x1, 4)) assert math.fabs((z0 - z1) / zmax) < 2.0e-3
def main_CppMeshDynTri2D_0(): cad = dfm2.Cad2D() cad.add_polygon([-1, -1, +1, -1, +1, +1, -1, +1.0]) mesher = dfm2.Mesher_Cad2D(edge_length=0.1) dmesh = mesher.meshing(cad) dmesh.cdmsh.check() dfm2.gl.glfw.winDraw3d([dmesh.cdmsh,dfm2.gl.AxisXYZ()],winsize=(400,300))
def testeigen(self, request): fem = dfm2.FEM_ShellPlateBendingMITC3_Eigen() fem.param_thickness = 0.02 fem.param_lambda = 0.0 fem.param_myu = 68.3 * 1.0e+9 / 2 fem.param_rho = 2700 fem.updated_topology(self.mesh) fem.ls.f[:] = numpy.random.uniform(-1, 1, (self.mesh.np_pos.shape[0], 3)) for itr in range(60): fem.solve() if request.config.getoption('--is_gl') == "true": pos1 = numpy.zeros((self.mesh.np_pos.shape[0], 3)) pos1[:, :2] = self.mesh.np_pos pos1[:, 2] = fem.mode[:, 0] mesh1 = dfm2.Mesh(pos1, self.mesh.np_elm, dfm2.TRI) dfm2.gl.glfw.winDraw3d([mesh1], camera_rotation=[-1.2, 0, 0], nframe=100) EI0 = (fem.param_myu * 2.0) * (math.pow(fem.param_thickness, 3) * self.lz / 12.0) rhoA = fem.param_rho * fem.param_thickness * self.lz # https://www.mapleprimes.com/DocumentFiles/206657_question/Transverse_vibration_of_beams.pdf # https://en.wikipedia.org/wiki/Euler%E2%80%93Bernoulli_beam_theory freq_theo = (22.3733) / (self.lx * self.lx) * math.sqrt( EI0 / rhoA) / (2 * math.pi) assert (math.fabs(freq_theo - fem.freq_eigen) / freq_theo < 0.05)
def test_pbd_hex(self, request): voxelgrid = dfm2.VoxelGrid() voxelgrid.add(0, 0, 0) voxelgrid.add(1, 0, 0) voxelgrid.add(2, 0, 0) voxelgrid.add(1, 1, 0) msh = voxelgrid.mesh_hex() pbd = dfm2.PBD() pbd.updated_topology(msh) npIdP = numpy.array([0, 1, 2, 3], dtype=numpy.int32) pbd.vec_bc[npIdP] = 1 fvs = dfm2.FieldValueSetter("0.4*sin(0.8*t)", pbd.vec_val, 1, mesh=msh, npIdP=npIdP, dt=pbd.dt) ## mesh_def = dfm2.Mesh(np_pos=pbd.vec_val, np_elm=msh.np_elm, elem_type=dfm2.HEX) if request.config.getoption('--is_gl') == "true": dfm2.gl.glfw.winDraw3d([fvs, pbd, mesh_def], nframe=100, camera_rotation=[0.1, 0.2, 0.0])
def setup_method(self): self.cad = dfm2.Cad2D() self.lx = 0.5 self.lz = 0.03 self.cad.add_polygon( list_xy=[0, 0, self.lx, 0, self.lx, self.lz, 0, self.lz]) self.mesher = dfm2.Mesher_Cad2D(edge_length=0.01) self.mesh = self.mesher.meshing(self.cad)
def test0(self): cad = dfm2.Cad2D() cad.add_polygon(list_xy=[-1, -1, +1, -1, +1, +1, -1, +1]) mesher = dfm2.Mesher_Cad2D() mesh = mesher.meshing(cad) cdmsh = dfm2.CppMeshDynTri3D() dfm2.meshdyntri3d_initialize(cdmsh, mesh.np_pos, mesh.np_elm) cdmsh.check()
def example1(): sdf0 = dfm2.CppSDF3_Sphere(0.6,[-0.5,0,0],True) sdf1 = dfm2.CppSDF3_Sphere(0.6,[+0.5,0,0],True) dfm2.gl.glfw.winDraw3d([sdf0,sdf1],winsize=(400,300)) np_xyz,np_tet = dfm2.isosurface([sdf0,sdf1]) print(np_xyz.shape,np_tet.shape) msh = dfm2.Mesh(np_xyz,np_tet,dfm2.TET) dfm2.gl.glfw.winDraw3d([sdf0,sdf1,msh],winsize=(400,300))
def example0(): dmsh = dfm2.MeshDynTri2D() dmsh.meshing_loops([[0, 0, 1, 0, 1, 1, 0, 1]], edge_length=0.05) axis = dfm2.gl.AxisXYZ(1) dfm2.gl.glfw.winDraw3d([dmsh, axis], camera_rotation=[0, 1, 0.5]) ##### msh = dfm2.Mesh() msh.set_extrude(dmsh, 10) msh.np_pos[:, 2] *= 0.1 dfm2.gl.glfw.winDraw3d([msh, axis], camera_rotation=[0, 1, 0.5])
def main_CppMeshDynTri3D(): msh = dfm2.Mesh() msh.read("../test_inputs/bunny_2k.ply") dmesh = dfm2.CppMeshDynTri3D() dfm2.meshdyntri3d_initialize(dmesh, msh.np_pos, msh.np_elm) dmesh.check() for itr in range(500): itri0 = random.randint(0,dmesh.ntri()-1) iedge0 = random.randint(0,2) dmesh.delete_tri_edge(itri0,iedge0) dfm2.gl.glfw.winDraw3d([dmesh],winsize=(400,300))
def femShellPlateBendingMitc3_Eigen(mesh): fem = dfm2.FEM_ShellPlateBendingMITC3_Eigen() fem.updated_topology(mesh) fem.ls.f[:] = numpy.random.uniform(-1, 1, (mesh.np_pos.shape[0], 3)) for itr in range(60): fem.solve() pos1 = numpy.zeros((mesh.np_pos.shape[0], 3)) pos1[:, :2] = mesh.np_pos pos1[:, 2] = fem.mode[:, 0] mesh1 = dfm2.Mesh(pos1, mesh.np_elm, dfm2.TRI) dfm2.gl.glfw.winDraw3d([mesh, mesh1], camera_rotation=[-1.2, 0, 0])
def test3(self): cad = dfm2.Cad2D() cad.add_polygon(list_xy=[-1,-1, +1,-1, +1,+1, -1,+1]) mesher = dfm2.Mesher_Cad2D(edge_length=0.05) dmsh = mesher.meshing(cad) assert dmsh.np_pos.shape[1] == 2 np_xy_bound = numpy.array(cad.ccad.xy_vtxctrl_face(0)).reshape([-1, 2]) W = dfm2.mvc(dmsh.np_pos, np_xy_bound) assert W.ndim == 2 assert W.shape[0] == dmsh.np_pos.shape[0] assert W.shape[1] == len(cad.ccad.xy_vtxctrl_face(0))/2 assert numpy.linalg.norm(W.sum(axis=1)-numpy.ones((W.shape[0])))<1.0e-3
def femShellPlateBendingMitc3_Static(cad: dfm2.Cad2D, mesher, mesh: dfm2.Mesh): fem = dfm2.FEM_ShellPlateBendingMITC3() fem.param_gravity_z = -0.01 fem.updated_topology(mesh) fem.ls.bc[mesher.points_on_one_edge(3, True, cad), :] = 1 fem.solve() print(fem.ls.conv_hist, len(fem.ls.conv_hist)) pos1 = numpy.zeros((mesh.np_pos.shape[0], 3)) pos1[:, :2] = mesh.np_pos pos1[:, 2] = fem.disp[:, 0] mesh1 = dfm2.Mesh(pos1, mesh.np_elm, dfm2.TRI) dfm2.gl.glfw.winDraw3d([mesh1], camera_rotation=[-1.2, 0, 0])
def test2(self, request): print(os.path.abspath(__file__)) msh = dfm2.Mesh() msh.read("../test_inputs/bunny_2k.ply") dmesh = dfm2.CppMeshDynTri3D() dfm2.meshdyntri3d_initialize(dmesh, msh.np_pos, msh.np_elm) dmesh.check() for itr in range(100): itri0 = random.randint(0, dmesh.ntri() - 1) iedge0 = random.randint(0, 2) dmesh.delete_tri_edge(itri0, iedge0) if request.config.getoption('--is_gl') == "true": dfm2.gl.glfw.winDraw3d([dmesh], winsize=(400, 300), nframe=10)
def test1(self, request): cad = dfm2.Cad2D() cad.add_polygon(list_xy=[-1, -1, +1, -1, +1, +1, -1, +1]) mesher = dfm2.Mesher_Cad2D(edge_length=0.05) msh = mesher.meshing(cad) fem = dfm2.FEM_ScalarPoisson(source=1.0) fem.updated_topology(msh) npIdP = cad.points_edge([0, 1, 2, 3], msh.np_pos) fem.ls.bc[npIdP] = 1 fem.solve() ## field = dfm2.gl.VisFEM_ColorContour(fem, "value") if request.config.getoption('--is_gl') == "true": dfm2.gl.glfw.winDraw3d([field], nframe=10)
def test1(self, request): cad = dfm2.Cad2D() cad.add_polygon(list_xy=[-1, -1, +1, -1, +1, +1, -1, +1]) mesher = dfm2.Mesher_Cad2D(edge_length=0.05) msh = mesher.meshing(cad) fem = dfm2.FEM_SolidLinearDynamic() fem.param_gravity_y = -0.1 fem.updated_topology(msh) npIdP = cad.points_edge([3], msh.np_pos) fem.ls.bc[npIdP, :] = 1 ## field = dfm2.gl.VisFEM_ColorContour(fem, name_disp="vec_val") if request.config.getoption('--is_gl') == "true": dfm2.gl.glfw.winDraw3d([fem, field], nframe=100)
def pbd1(cad, mesh): pbd = dfm2.PBD() pbd.updated_topology(mesh) npIdP = cad.points_edge([0], mesh.np_pos) pbd.vec_bc[npIdP] = 1 fvs = dfm2.FieldValueSetter("0.3*sin(2*t)", pbd.vec_val, 0, mesh=mesh, npIdP=npIdP, dt=pbd.dt) #### mesh2 = dfm2.Mesh(np_pos=pbd.vec_val, np_elm=mesh.np_elm) dfm2.gl.glfw.winDraw3d([fvs, pbd, mesh2])
def test1(self, request): cad = dfm2.Cad2D() cad.add_polygon(list_xy=[-1, -1, +1, -1, +1, +1, -1, +1]) #### mesher = dfm2.Mesher_Cad2D(edge_length=0.05) msh = mesher.meshing(cad) fem = dfm2.FEM_ShellCloth() fem.updated_topology(msh) npIdP = cad.points_edge([2], msh.np_pos) fem.ls.bc[npIdP, 0:3] = 1 #### mesh2 = dfm2.Mesh(np_pos=fem.vec_val, np_elm=msh.np_elm) axis = dfm2.gl.AxisXYZ(1.0) if request.config.getoption('--is_gl') == "true": dfm2.gl.glfw.winDraw3d([fem, mesh2, axis], nframe=100)
def example1(): cad = dfm2.Cad2D() cad.add_polygon([-1, -1, +1, -1, +1, +1, -1, +1.0]) mesher = dfm2.Mesher_Cad2D(edge_length=0.05) mesh = mesher.meshing(cad) fem = dfm2.FEM_ShellCloth() fem.updated_topology(mesh) npIdP = cad.points_edge([2], mesh.np_pos) fem.ls.bc[npIdP, 0:3] = 1 fem.sdf = dfm2.CppSDF3_Sphere(0.55, [0, +0.5, -1.0], True) mesh2 = dfm2.Mesh(np_pos=fem.vec_val, np_elm=mesh.np_elm) axis = dfm2.gl.AxisXYZ(1.0) dfm2.gl.glfw.winDraw3d([fem, mesh2, axis, fem.sdf])
def main_CppMeshDynTri2D_1(): cad = dfm2.Cad2D() cad.add_polygon([-1, -1, +1, -1, +1, +1, -1, +1.0]) mesher = dfm2.Mesher_Cad2D(edge_length=0.1) dmesh = mesher.meshing(cad) cdmesh = dmesh.cdmsh cdmesh.check() for itr in range(100): itri0 = random.randint(0,cdmesh.ntri()-1) r0 = random.uniform(0.02, 0.98) r1 = random.uniform(0.01, 0.99-r0) ipo= cdmesh.insert_point_elem(itri0,r0,r1) cdmesh.delaunay_around_point(ipo) cdmesh.check() dfm2.gl.glfw.winDraw3d([cdmesh],winsize=(400,300))
def main(): global msh, nav msh = dfm2.Mesh() msh.read("../test_inputs/bunny_2k.ply") msh.scale_xyz(0.02) nav = dfm2.gl.glfw.NavigationGLFW(1.0) glfw.init() win_glfw = glfw.create_window(640, 480, 'Hello World', None, None) glfw.make_context_current(win_glfw) dfm2.gl.setSomeLighting() gl.glEnable(gl.GL_DEPTH_TEST) glfw.set_mouse_button_callback(win_glfw, mouseButtonCB) glfw.set_cursor_pos_callback(win_glfw, mouseMoveCB) glfw.set_key_callback(win_glfw, keyFunCB) while not glfw.window_should_close(win_glfw): gl.glClearColor(1, 1, 1, 1) gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) gl.glEnable(gl.GL_POLYGON_OFFSET_FILL) gl.glPolygonOffset(1.1, 4.0) nav.camera.set_gl_camera() render() glfw.swap_buffers(win_glfw) glfw.poll_events() if nav.isClose: break glfw.destroy_window(win_glfw) glfw.terminate() print("closed")
def main(): # initialize bpy.data.objects.remove(bpy.data.objects["Cube"]) dfm2_msh = dfm2.Mesh() dfm2_msh.read("../test_inputs/bunny_2k.ply") dfm2_msh.normalize(3.0) bpy_msh = bpy.data.meshes.new(name="cubemesh") bpy_msh.from_pydata(dfm2_msh.np_pos.tolist(), [], dfm2_msh.np_elm.tolist()) bpy_msh.update() bpyobj_msh = bpy.data.objects.new(name="cube", object_data=bpy_msh) bpy.context.scene.collection.objects.link(bpyobj_msh) myutil.set_tex_environment( bpy.context.scene.world, '../test_inputs/epping_forest_01_1k.hdr') myutil.set_camera_ydirection() # render bpy.context.scene.render.resolution_percentage = 50 bpy.context.scene.cycles.samples = 60 bpy.context.scene.render.engine = 'CYCLES' bpy.ops.render.render() bpy.data.images['Render Result'].save_render(filepath = os.path.dirname(__file__)+'/out/10_out.png')
def main(): parser = argparse.ArgumentParser() parser.add_argument("--render", action='store_true') if '--' in sys.argv: args = parser.parse_args(sys.argv[sys.argv.index('--') + 1:]) else: args = parser.parse_args('') # remove initial cube bpy.data.objects.remove(bpy.data.objects["Cube"]) dfm2_msh = dfm2.Mesh() dfm2_msh.read(os.path.dirname(os.path.abspath(__file__))+"/../test_inputs/bunny_2k.ply") dfm2_msh.normalize(3.0) bpy_msh = bpy.data.meshes.new(name="cubemesh") bpy_msh.from_pydata(dfm2_msh.np_pos.tolist(), [], dfm2_msh.np_elm.tolist()) bpy_msh.update() bpyobj_msh = bpy.data.objects.new(name="cube", object_data=bpy_msh) bpy.context.scene.collection.objects.link(bpyobj_msh) myutil.set_tex_environment( bpy.context.scene.world, os.path.dirname(os.path.abspath(__file__))+'/../test_inputs/epping_forest_01_1k.hdr') myutil.set_camera_ydirection() # render bpy.context.scene.render.resolution_percentage = 50 bpy.context.scene.cycles.samples = 60 bpy.context.scene.render.engine = 'CYCLES' if args.render: bpy.ops.render.render() bpy.data.images['Render Result'].save_render(filepath = os.path.dirname(__file__)+'/out/10_out.png')
def main(): cad = dfm2.Cad2D() cad.add_polygon(list_xy=[-1, -1, +1, -1, +1, +1, -1, +1]) dfm2.gl.glfw.winDraw3d([cad]) cad.add_vtx_face(0, [0.0, 0.0]) dfm2.gl.glfw.winDraw3d([cad]) cad.add_vtx_edge(2, [0.0, 0.8]) dfm2.gl.glfw.winDraw3d([cad]) cad.set_edge_type(0, dfm2.CAD_EDGE_GEOM_BEZIER_CUBIC, [0.2, 0.3, 0.8, 0.3]) dfm2.gl.glfw.winDraw3d([cad]) cad.set_edge_type(0, dfm2.CAD_EDGE_GEOM_LINE, []) dfm2.gl.glfw.winDraw3d([cad]) cad.clear() cad.add_polygon( list_xy=[-1000, -1000, +1000, -1000, +1000, +1000, -1000, +1000]) dfm2.gl.glfw.winDraw3d([cad]) for itr in range(3): cad.clear() cad.import_svg("../test_inputs/shape" + str(itr) + ".svg") dfm2.gl.glfw.winDraw3d([cad])
def test1(self,request): is_gl = request.config.getoption('--is_gl') == "true" ccad = dfm2.CppCad2D() ccad.add_polygon([-1,-1, +1,-1, +1,+1, -1,+1]) assert ccad.check() if is_gl: dfm2.gl.glfw.winDraw3d([ccad],nframe=20) ccad.add_vtx_face(0.0, 0.0, 0) assert ccad.check() if is_gl: dfm2.gl.glfw.winDraw3d([ccad], nframe=20) ccad.add_vtx_edge(0.0,0.8, 2) assert ccad.check() if is_gl: dfm2.gl.glfw.winDraw3d([ccad],nframe=20) ccad.set_edge_type(0, dfm2.CAD_EDGE_GEOM_BEZIER_CUBIC, [0.2, 0.3, -0.2, 0.3]) assert ccad.check() if is_gl: dfm2.gl.glfw.winDraw3d([ccad], nframe=20) ccad.set_edge_type(0, dfm2.CAD_EDGE_GEOM_LINE, []) assert ccad.check() if is_gl: dfm2.gl.glfw.winDraw3d([ccad], nframe=20)
def main_MeshDynTri2D_1(): dmsh = dfm2.MeshDynTri2D() dmsh.meshing_loops([[-1,-1, +1,-1, +1,+1, -1,+1]], edge_length=0.2) dfm2.gl.glfw.winDraw3d([dmsh]) res = dmsh.refine_EdgeLongerThan_InsideCircle(0.05, 0.0,0.0, 0.5) dfm2.gl.glfw.winDraw3d([dmsh])
def test1(self, request): cad = dfm2.Cad2D() cad.add_polygon(list_xy=[-1, -1, +1, -1, +1, +1, -1, +1]) mesher = dfm2.Mesher_Cad2D(edge_length=0.08) mesh = mesher.meshing(cad) dmesh = dfm2.CppMeshDynTri3D() dfm2.meshdyntri3d_initialize(dmesh, mesh.np_pos, mesh.np_elm) dmesh.check() for itr in range(100): itri0 = random.randint(0, dmesh.ntri() - 1) r0 = random.uniform(0.02, 0.98) r1 = random.uniform(0.01, 0.99 - r0) ipo = dmesh.insert_point_elem(itri0, r0, r1) dmesh.delaunay_around_point(ipo) dmesh.check() if request.config.getoption('--is_gl') == "true": dfm2.gl.glfw.winDraw3d([dmesh], winsize=(400, 300), nframe=10)
def __init__(self): super(QWindow_CadMshFem, self).__init__() self.setWindowTitle("CAD_Mesh") self.cadmsh = dfm2.CadMesh2D(edge_length=0.05) self.cadmsh.add_polygon([-1, -1, +1, -1, +1, +1, -1, +1]) super().init_UI()
def test_smpl1(): import numpy as np smpl = np.load("../test_inputs/smpl_model_f.npz") npV = smpl["vertices_template"] npT = smpl["face_indices"] npT[:, :] -= 1 # index should be minus 1 npIdBoneParent = smpl["kinematic_tree"] npJntRgrs = smpl["joint_regressor"] print(npJntRgrs.shape) npSparseRigW, npSparseRigI = dfm2.cppSparsifyMatrixRow(smpl["weights"]) npSparseJntW, npSparseJntI = dfm2.cppSparsifyMatrixRow( smpl["joint_regressor"]) print("npSparseRig", npSparseRigW.shape, npSparseRigI.shape) print("npSparseJnt", npSparseJntW.shape, npSparseJntI.shape) npBlendShape = smpl["shape_blend_shapes"] npBlendPose = smpl["pose_blend_shapes"]
def test_svg(self,request): is_gl = request.config.getoption('--is_gl') == "true" cad = dfm2.Cad2D() for itr in range(3): cad.clear() cad.import_svg("../test_inputs/shape" + str(itr) + ".svg") if is_gl: dfm2.gl.glfw.winDraw3d([cad],nframe=20)
def test0(self, request): path_img = "../test_inputs/lenna.png" np_img = dfm2.imread(path_img) tex = dfm2.gl.get_texture(np_img, "rgb") print(tex.minmax_xyz()) axis = dfm2.gl.AxisXYZ(100) if request.config.getoption('--is_gl') == "true": dfm2.gl.glfw.winDraw3d([tex, axis], winsize=(400, 300), nframe=10)