使用findAt在ABAQUS中选择多个分区区域以设置网格控件
我必须选择通过分区方法创建的多个区域,以分配网格控件并播种边缘,最后分别对区域进行网格化。
问题在于,由于对分区的区域进行了参数化处理,并且数量如此之多,因此,为此目的定义功能并以循环方式运行它是唯一适合我的方法。因此,我试图用两种不同的方式定义一个函数,如下所示:
定义了一个功能来选择区域并在整个身体长度内循环运行。在此,每个小区域被拾取一次,并且重复应用相同的网格控件,导致生成网格的时间较长。
def set_mesh_control_structured(x_left, x_right, y_top, y_bottom,
element_type, mesh_technique, minimize_transition):
p = mdb.models['Model-1'].parts['Part']
f = p.faces
pickedRegions = f.findAt(((x_left + (x_right - x_left)/2, y_bottom
(y_top - y_bottom)/2, 0.0), ))
return p.setMeshControls(regions=pickedRegions,
elemShape=element_type, technique=mesh_technique,
minTransition=minimize_transition)
Executed within a ‘for’ loop like e.g.:
for i in range((8 * total_blocks) + 6):
set_mesh_control_structured(x_left, x_right + (i *
block_length), y_coord[0], 0.0, QUAD, STRUCTURED, OFF)
第二个功能试图一一选择所有区域,然后在最后只应用一次网格控制。这是问题蔓延的地方。有人认为findAt()的参数是一个元组的元组,但它不起作用,并且ABAQUS给出了一个错误警告,指出“ … in set_mesh_control_structured; pickedRegions = f.findAt(regions_tuple); TypeError:arg1(coordinates) [0] [0];找到了期望为float的元组 。
def set_mesh_control_structured(range_arg, x_left, x_right, y_top,
y_bottom, element_type, mesh_technique, minimize_transition):
p = mdb.models['TDCB'].parts['Part_TDCB']
f = p.faces
regions_tuple = ()
for i in range(range_arg):
# Put x,y,z coords in one value
incremental_picked_regions = (x_left + (i * (x_right -
x_left)/2), y_bottom + (i * (y_top - y_bottom)/2), 0.0)
# Abaqus wants each repeating unit as ((x,y,z),)
incremental_picked_regions = ((incremental_picked_regions),)
# Adding all the coordinates into 1 tuple
regions_tuple += (incremental_picked_regions,)
pickedRegions = f.findAt(regions_tuple)
return p.setMeshControls(regions=pickedRegions,
elemShape=element_type, technique=mesh_technique,
minTransition=minimize_transition)
谁能告诉我第二个函数定义中我做错了什么,还是有一种更好的方法来选择多个区域以设置网格控件和除findAt()外的种子?我知道getBoundingBox和faces.index
[#]等,但是我不知道如何使用它们。因此,MWE也将受到高度赞赏。
非常感谢。
回答:
首先,想要寻求对该问题更好理解的任何人,建议您查看我的另一个链接问题。
我通过使用getByBoundingBox
以下语法解决了我的这个问题: getByBoundingBox(xmin, ymin, zmin,
xmax, ymax, zmax)
因此,可以方便地使用它代替findAt()来选择大量的分区面或边缘。
因此,以一个平面矩形为例,它的四个角分别为(0.0,0.0,0.0),(2.0,0.0,0.0),(2.0,2.0,0.0)和(0.0,2.0,0.0),并假设存在是此矩形内的多个分区面,都需要像在GUI中一样一次选择所有这些面。首先,的六个论点getByBoundingBox
是:
xmin = 0.0, ymin = 0.0,
zmin = 0.0,
xmax = 2.0,
ymax = 2.0,
zmax = 0.0
然后,只需选择所需区域即可,如下所示:
pickedRegions = f.getByBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax)
以上是 使用findAt在ABAQUS中选择多个分区区域以设置网格控件 的全部内容, 来源链接: utcz.com/qa/423492.html