Выбор нескольких разделенных областей в ABAQUS с помощью findAt для настройки элементов управления сеткой

Со ссылкой на мой предыдущий вопрос,

Более быстрый способ разделения лица с помощью Sketch в 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; pickRegions = f.findAt(regions_tuple); TypeError: arg1 (координаты)[0][0];найден кортеж с плавающей запятой".

    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 также будет высоко оценен.

Заранее большое спасибо.


person Parvez Ahmed    schedule 09.08.2016    source источник
comment
getBoundingBox is for seeing the size of a box containing your face(s). getByBoundingBox предназначен для выбора лиц внутри рамки. `getByBoundingBox принимает xMax=20, xMin=1, yMax=88 и т. д. в качестве входных данных - я действительно думаю, что это был бы лучший способ сделать это, но не уверен, не видя, что вы хотите.   -  person will    schedule 09.08.2016
comment
если вам нужна помощь по ошибке - 1) пожалуйста, укажите точную ошибку 2) вы проверили это с простейшим возможным случаем или вручную использовали f.findAt - вы уверены, что у вас нет кортежа кортежа кортежей.   -  person will    schedule 09.08.2016
comment
@ will: по этой ссылке вы увидите, что я пытаюсь сделать. Я разделил все тело на небольшие блоки, и теперь я пытаюсь установить элементы управления сеткой в ​​каждой разделенной ячейке. stackoverflow.com/questions/38625874/ . Я попытался реализовать обе функции в простом прямоугольном блоке, и вторая функция не работает. Проблема, похоже, заключается в настройке кортежа.   -  person Parvez Ahmed    schedule 10.08.2016
comment
Вот уведомление об ошибке от ABAQUS: ...in set_mesh_control_structured; выбранные регионы = f.findAt (regions_tuple); TypeError: arg1(координаты)[0][0];найден кортеж, ожидающий число с плавающей запятой   -  person Parvez Ahmed    schedule 10.08.2016
comment
Похоже, вы создали много граней и хотите, чтобы каждая грань имела только один элемент — почему бы вам просто не установить начальный размер детали/экземпляра на большое число, и таким образом каждая грань получит 1 элемент?   -  person will    schedule 10.08.2016
comment
То, как я разделил, это был единственный способ, который я видел, который подходил для достижения вида четырехугольной сетки с отображением переходов, как показано на изображении. Я пробовал другие способы без какого-либо успеха. В любом случае, я попробовал getByBoundingBox, и это сработало отлично.. Спасибо за указатель..   -  person Parvez Ahmed    schedule 10.08.2016
comment
вы должны написать это как ответ.   -  person agentp    schedule 10.08.2016
comment
хорошо, что вы нашли решение. Мне все еще интересно, если после всего вашего разделения на аккуратные шаги переходов - если вы назначите очень большой размер начального числа, то вы получите 1 элемент на грань?   -  person will    schedule 11.08.2016
comment
Извините за задержку ответа. Я всегда получаю один элемент на лицо. Не могли бы вы уточнить, что, по вашему мнению, я делаю неправильно? Несмотря на то, что я получаю требуемые результаты, я тоже не совсем уверен в своем методе. Итак, было бы действительно здорово, если бы вы могли указать мне лучший и более простой метод получения требуемой сетки перехода, который не требует, чтобы я разбивал все тело так, как я это делал до сих пор. Ваше здоровье..   -  person Parvez Ahmed    schedule 13.08.2016


Ответы (2)


попробуйте это, используйте 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,),)
person agentp    schedule 09.08.2016
comment
@agentp: Это очень разумное и разумное решение. Большое спасибо еще раз. Кстати, как вы думаете, что лучше в этом случае: использовать findAt или getByBoundingBox? - person Parvez Ahmed; 10.08.2016
comment
Я никогда не использовал getByBoundingBox. Было бы интересно посмотреть, будет ли это быстрее, поскольку, очевидно, это могло бы быть удобнее. - person agentp; 10.08.2016
comment
Я только что попробовал подход getByBoundingBox, и он сработал как шарм. Это намного проще, быстрее и всесторонне, чем использование findAt().. - person Parvez Ahmed; 10.08.2016

Всем, кто хочет лучше понять этот вопрос, я бы, прежде всего, посоветовал посмотреть мой другой связанный вопрос.

Я решил эту свою проблему, используя 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) соответственно, и предположим, что существует представляют собой несколько разделенных граней внутри этого прямоугольника, которые все должны быть выбраны сразу, как это делается в графическом интерфейсе. Во-первых, шесть аргументов 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) 
person Parvez Ahmed    schedule 10.08.2016