使用 findAt 在 ABAQUS 中选择多个分区区域以设置网格控制
Selecting multiple partitioned regions in ABAQUS with findAt for setting mesh controls
参考我之前的问题,
Faster way to partition a Face with Sketch in ABAQUS with scripting,
我必须select分区方法创建的多个区域来分配网格控制和边缘种子,最后分别对区域进行网格化。
问题是,由于分区区域是参数化的并且数量如此之多,因此为此目的定义一个函数并将其 运行 循环是唯一适合我的方法。因此,我尝试以两种不同的方式定义函数,如下所示:
函数被定义为 select 区域和 运行 在整个 body 长度的循环中。在这里,每个小区域被拾取一次并重复应用相同的网格控制,导致生成网格的时间很长。
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)
第二个函数尝试 select 所有区域一个接一个,然后只在最后应用一次网格控制。这就是问题蔓延的地方。假设 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)
任何人都可以告诉我我在第二个函数定义中做错了什么,或者是否有更好的方法来 select 多个区域以设置网格控件并与 findAt() 分开播种?我知道 getBoundingBox 和 faces.index[#] 等,但我不知道如何使用它们。因此,MWE 也将受到高度赞赏。
非常感谢。
试试这个,在每个单独的点上使用 findAt
并添加结果:
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)
if i==0 :
pickedRegions = f.findAt((incremental_picked_regions,),)
else:
pickedRegions += f.findAt((incremental_picked_regions,),)
任何想要更好地理解这个问题的人,我首先建议您查看我的其他相关问题。
我使用 getByBoundingBox
解决了我的这个问题,它具有以下语法:
getByBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax)
因此,可以方便地使用它代替 findAt() select 大量的分割面或边。
所以以一个平面矩形为例,其四个角分别为(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 中一样一次 selected。首先,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)
参考我之前的问题,
Faster way to partition a Face with Sketch in ABAQUS with scripting,
我必须select分区方法创建的多个区域来分配网格控制和边缘种子,最后分别对区域进行网格化。
问题是,由于分区区域是参数化的并且数量如此之多,因此为此目的定义一个函数并将其 运行 循环是唯一适合我的方法。因此,我尝试以两种不同的方式定义函数,如下所示:
函数被定义为 select 区域和 运行 在整个 body 长度的循环中。在这里,每个小区域被拾取一次并重复应用相同的网格控制,导致生成网格的时间很长。
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)
第二个函数尝试 select 所有区域一个接一个,然后只在最后应用一次网格控制。这就是问题蔓延的地方。假设 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)
任何人都可以告诉我我在第二个函数定义中做错了什么,或者是否有更好的方法来 select 多个区域以设置网格控件并与 findAt() 分开播种?我知道 getBoundingBox 和 faces.index[#] 等,但我不知道如何使用它们。因此,MWE 也将受到高度赞赏。
非常感谢。
试试这个,在每个单独的点上使用 findAt
并添加结果:
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)
if i==0 :
pickedRegions = f.findAt((incremental_picked_regions,),)
else:
pickedRegions += f.findAt((incremental_picked_regions,),)
任何想要更好地理解这个问题的人,我首先建议您查看我的其他相关问题。
我使用 getByBoundingBox
解决了我的这个问题,它具有以下语法:
getByBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax)
因此,可以方便地使用它代替 findAt() select 大量的分割面或边。
所以以一个平面矩形为例,其四个角分别为(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 中一样一次 selected。首先,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)