#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.