使用findAt在ABAQUS中选择多个分区区域以设置网格控件

我必须选择通过分区方法创建的多个区域,以分配网格控件并播种边缘,最后分别对区域进行网格化。

问题在于,由于对分区的区域进行了参数化处理,并且数量如此之多,因此,为此目的定义功能并以循环方式运行它是唯一适合我的方法。因此,我试图用两种不同的方式定义一个函数,如下所示:

  1. 定义了一个功能来选择区域并在整个身体长度内循环运行。在此,每个小区域被拾取一次,并且重复应用相同的网格控件,导致生成网格的时间较长。

    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. 第二个功能试图一一选择所有区域,然后在最后只应用一次网格控制。这是问题蔓延的地方。有人认为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

回到顶部