def create_rbe3s_between_close_nodes(bdf_filename, bdf_filename_out, tol: float, renumber_nodes=False, neq_max=4, xref=True, node_set=None, size=8, is_double=False, debug=True): """ Creates semi-rigid RBE3 elements between two nodes within tolerance. Parameters ---------- bdf_filename : str / BDF str : bdf file path BDF : a BDF model that is fully valid (see xref) bdf_filename_out : str a bdf_filename to write tol : float the spherical tolerance renumber_nodes : bool should the nodes be renumbered (default=False) neq_max : int the number of "close" points (default=4) xref bool: bool does the model need to be cross_referenced (default=True; only applies to model option) node_set : List[int] / (n, ) ndarray the list/array of nodes to consider (not supported with renumber_nodes=True) size : int; {8, 16}; default=8 the bdf write precision is_double : bool; default=False the field precision to write Returns ------- model : BDF() The BDF model corresponding to bdf_filename_out .. warning:: I doubt SPOINTs/EPOINTs work correctly .. warning:: xref not fully implemented (assumes cid=0) .. todo:: node_set stil does work on the all the nodes in the big kdtree loop, which is very inefficient """ nodes_xyz, model, nids, inew = _eq_nodes_setup( bdf_filename, renumber_nodes=renumber_nodes, xref=xref, node_set=node_set, debug=debug) eid = 1 if len(model.rigid_elements): eid = max(model.rigid_elements) + 1 nid_pairs = _nodes_xyz_nids_to_nid_pairs(nodes_xyz, nids, tol, model.log, inew, node_set=node_set, neq_max=neq_max) for (nid1, nid2) in nid_pairs: node1 = model.nodes[nid1] node2 = model.nodes[nid2] # TODO: doesn't use get position... distance = norm(node1.xyz - node2.xyz) if distance > tol: continue refgrid = nid1 refc = '123456' weights = [1.0] comps = ['123456'] gijs = [[nid2]] rbe3 = RBE3(eid, refgrid, refc, weights, comps, gijs, comment='') model.rigid_elements[eid] = rbe3 eid += 1 #_eq_nodes_final(nid_pairs, model, tol, node_set=node_set) if bdf_filename_out is not None: model.write_bdf(bdf_filename_out, size=size, is_double=is_double) return model
def create_rbe3s_between_close_nodes(bdf_filename, bdf_filename_out, tol, renumber_nodes=False, neq_max=4, xref=True, node_set=None, size=8, is_double=False, debug=True): """ Creates semi-rigid RBE3 elements between two nodes within tolerance. Parameters ---------- bdf_filename : str / BDF str : bdf file path BDF : a BDF model that is fully valid (see xref) bdf_filename_out : str a bdf_filename to write tol : float the spherical tolerance renumber_nodes : bool should the nodes be renumbered (default=False) neq_max : int the number of "close" points (default=4) xref bool: bool does the model need to be cross_referenced (default=True; only applies to model option) node_set : List[int] / (n, ) ndarray the list/array of nodes to consider (not supported with renumber_nodes=True) size : int; {8, 16}; default=8 the bdf write precision is_double : bool; default=False the field precision to write Returns ------- model : BDF() The BDF model corresponding to bdf_filename_out .. warning:: I doubt SPOINTs/EPOINTs work correctly .. warning:: xref not fully implemented (assumes cid=0) .. todo:: node_set stil does work on the all the nodes in the big kdtree loop, which is very inefficient """ nodes_xyz, model, nids, inew = _eq_nodes_setup( bdf_filename, tol, renumber_nodes=renumber_nodes, xref=xref, node_set=node_set, debug=debug) eid = 1 if len(model.rigid_elements): eid = max(model.rigid_elements) + 1 ieq, slots = _eq_nodes_build_tree(nodes_xyz, nids, tol, inew=inew, node_set=node_set, neq_max=neq_max)[1:] nid_pairs = _eq_nodes_find_pairs(nids, slots, ieq, node_set=node_set) for (nid1, nid2) in nid_pairs: node1 = model.nodes[nid1] node2 = model.nodes[nid2] # TODO: doesn't use get position... distance = norm(node1.xyz - node2.xyz) if distance > tol: continue refgrid = nid1 refc = '123456' weights = [1.0] comps = ['123456'] gijs = [[nid2]] rbe3 = RBE3(eid, refgrid, refc, weights, comps, gijs, comment='') model.rigid_elements[eid] = rbe3 eid += 1 #_eq_nodes_final(nid_pairs, model, tol, node_set=node_set) if bdf_filename_out is not None: model.write_bdf(bdf_filename_out, size=size, is_double=is_double) return model