Создание файла .inp в matlab

#matlab #interface #element #abaqus

Вопрос:

Я относительно новичок в abaqus и в настоящее время работаю над проектом оптимизации для балки с сосредоточенной нагрузкой,где мне нужно запустить несколько файлов с различными параметрами(длина,ширина, нагрузка) в matlab, чтобы создать файл .inp для запуска на abaqus. Мой вопрос заключается в том, как бы я решил эту проблему и есть ли способ автоматического создания узлов и элементов?

Ответ №1:

Вы можете параметризовать свой проект Abaqus с помощью интерфейса Python. К этому требуется некоторое привыкание, но оно может быть довольно мощным в зависимости от того, что вы хотите сделать. Я предполагаю, что ваш оптимизатор запрограммирован в Matlab, но это не должно быть проблемой. Вы можете написать функцию-оболочку в Matlab, которая вызывает Abaqus с помощью нужного вам скрипта. Команда будет состоять abaqus cae noGUI=<script.py> в том, чтобы запустить скрипт, который создает ваш входной файл.

В качестве альтернативы вы можете создать базовый входной файл и создать скрипт, который ищет строки, которые необходимо изменить. Это может быть основано на ключевых словах входного файла, вы можете указать некоторые собственные параметры (фиктивные слова), которые вы заменяете с помощью своего скрипта или комментария, который можно легко распознать.

Лучший подход немного зависит от того, что именно вы хотите изменить.

Abaqus также предлагает некоторую параметризацию, я думаю, что эта ссылка может быть полезной.

Комментарии:

1. Привет, Анри, спасибо за твой ответ. К сожалению, этот проект требует, чтобы я создавал входной файл только с помощью одного сценария в Matlab, модель, созданная на Abaqus, является его продуктом. Так что использование интерфейса python-это не вариант. В качестве альтернативы, как я мог бы создать базовый входной файл с нуля, используя Matlab? Также был бы полезен пример или ссылка на это.

2. В качестве альтернативного варианта вы можете создать базовый входной файл для одного образца в своем пространстве проектирования с помощью Abaqus CEA, а для других образцов используйте Matlab, чтобы прочитать его, проанализировать и заменить параметры, которые вы хотите создать для других образцов, а затем, наконец, сохранить его как новый входной файл. Это не буквально «с нуля». Мне действительно кажется излишним создавать его с нуля, так как большинство строк будут одинаковыми между всеми оценками ваших проектов (и файлы .inp могут быть довольно длинными в зависимости от вашего случая).

3. Да, это может быть долгий процесс. Поэтому я решил создать базовый входной файл простого луча на Abaqus, как вы предложили. Но поскольку сценарий, который я должен создать в Matlab, должен быть независимым, я использовал входные строки в качестве основы, чтобы заставить Matlab печатать и создавать свой собственный входной файл. Использование руководства по ключевым словам Abaqus для изменения определенных команд.

Ответ №2:

Что касается автоматической генерации узлов и элементов, то это очень возможно, но это трудоемкий и довольно сложный процесс.
Узлы могут быть созданы путем определения x , y а z координаты и элементы могут быть созданы путем определения Nodal Connectivity . По мере усложнения модели определение x y z координат и координат Nodal Connectivity также усложняется. Однако для простых моделей вы все равно можете создавать узлы и элементы автоматически.
Если я правильно догадываюсь, ваша модель представляет собой балку прямоугольной формы, поэтому создание сетки может быть несложным. In Abaqus , Nodal Connectivity для каждого элемента указан тип in Analysis Help Manuals . Ниже приведен пример элемента Nodal Connectivity for 4-Noded Quad и. 8-Noded Hex Узловая связь для четырехъядерных и линейных шестигранных элементов

Чтобы вы начали, я предоставляю здесь Python код для создания входного файла сетки Abaqus для 2D и 3D луча (позже вы сможете воспроизвести его в коде MATLAB).:

 fnm = 'shell.inp'
w = 100  # x-direction
h = 10  # y-direction
npx = 30;    npy = 5

fout = open(fnm, 'w')
# Creating node information
fout.write('*Node, Nset=All_Nodesn')
nds = [];   elms = []
for i in range(npy):
    y = (i 1)/npy * h
    for j in range(npx):
        nid = i*npx   j   1
        x = (j 1)/npx * w
        nds.append([nid,x,y,0.0])
        fout.write('d,f,f,fn'%(nid,x,y,0.0))

# Creating Nodal connectivity
fout.write('*Element, Type=S4, Elset=All_Elementsn')
for m in range(npy-1):
    for n in range(npx-1):
        eid = m*(npx-1)   n   1
        e1 = n   2   npx   m*npx
        e2 = e1 - 1
        e3 = n   1   m*npx
        e4 = e3   1
        elms.append([eid,e1,e2,e3,e4])
        fout.write(('d,'*4 'dn')%(eid,e1,e2,e3,e4))

fout.close()

# ====================================================================

fnm = 'rect_beam.inp'
w = 10      # z-direction
h = 10      # y-direction
l = 100     # X-direction
npx = 20;npy = 5;npz = 3

fout = open(fnm, 'w')
# Creating node information
fout.write('*Node, Nset=All_Nodesn')
nds = [];elms = []
for i in range(npz):
    z = (i 1)/npz * w
    for j in range(npy):
        y = (j 1)/npy * h
        for k in range(npx):
            nid = i*(npx*npy)   j*npx   k   1
            x = (k 1)/npx * l
            nds.append([nid,x,y,z])
            fout.write('d,f,f,fn'%(nid,x,y,z))

# Creating Nodal connectivity
fout.write('*Element, Type=C3D8, Elset=All_Elementsn')
for m in range(npz-1):
    for n in range(npy-1):
        for p in range(npx-1):
            eid = m*(npy-1)*(npx-1)   n*(npx-1)   p   1
            e1 = p   2   npx   n*npx   m*npx*npy
            e2 = e1 - 1
            e3 = p   1   n*npx   m*npx*npy
            e4 = e3   1
            e5 = e1   (npx*npy)
            e6 = e5 - 1
            e7 = e3   (npx*npy)
            e8 = e7   1
            elms.append([eid,e1,e2,e3,e4,e5,e6,e7,e8])
            fout.write(('m,'*8 'mn')%(eid,e1,e2,e3,e4,e5,e6,e7,e8))
            print(m,n,p,'|',eid,e1,e2,e3,e4,e5,e6,e7,e8)
fout.close()
 

Комментарии:

1. Сатиш, спасибо тебе за твою помощь! Это именно то, что я пытался выяснить и сделать. Я воспроизвел его в Matlab, но есть несколько вещей, которые я не понимаю. Во-первых, переменные » npx » и «npy» они представляют? Во-вторых, уравнения, используемые для определения узловых координат и узловой связности, не могли бы вы объяснить, как вы это получили? Потому что я просмотрел ключевое слово manaul и не смог найти уравнение, используемое для этой цели.

2. Во-первых, npx и npy -общее количество узлов, которые вы хотите, x и y направление соответственно.. Эти переменные используются только для того, чтобы контролировать плотность сетки (грубую или более тонкую). и, во-вторых , относительно Nodal Connectivity того, что в руководстве нет уравнений Abaqus как таковых, однако Abaqus для определения элемента следует определенная последовательность входного файла узла. Например Как показано на 1-м рисунке, если вы хотите создать элемент из узлов 1,2,3 и 4, то вы должны указать <element number>, 1,2,3,4 во входном файле после *Element, Type=S4 строки (направление по часам).

3.Просто следующий вопрос: я попытался извлечь первое и последнее значения nid, чтобы процесс можно было автоматизировать при выборе другого параметра. Я попытался сделать это, сохранив его в виде массива, а затем извлек его для Nset, прежде чем перейти к выполнению этого для Elset. Но я продолжаю получать ошибки, не могли бы вы взглянуть на сценарий, чтобы определить, где я ошибся? ссылка выделена курсивом полужирным шрифтом code

4. Ладно, я проверил твой код. Вы упустили одно основное различие между Python и MATLAB. У них разная техника индексирования. Индексирование Python начинается с 0, тогда как MATLAB начинается с 1. В вашем коде в цикле for вы начинаете с 0 вместо 1.