使用 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分区方法创建的多个区域来分配网格控制和边缘种子,最后分别对区域进行网格化。

问题是,由于分区区域是参数化的并且数量如此之多,因此为此目的定义一个函数并将其 运行 循环是唯一适合我的方法。因此,我尝试以两种不同的方式定义函数,如下所示:

  1. 函数被定义为 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)  
    
  2. 第二个函数尝试 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)