Команда Abaqus Python для вставки ключевого слова в файл .inp

Вся цель, стоящая за этим вопросом, связана с попыткой создать несколько процессов для создания уравнений линейных ограничений (http://abaqus.software.polimi.it/v6.14/books/usb/default.htm?startat=pt08ch35s02aus129.html#usb-cni-pequation) в Abaqus/CAE для применения периодических граничных условий к сетчатой ​​модели. Поскольку моя модель содержит более миллиона элементов и мне нужно выполнить моделирование Монте-Карло для 1000 таких моделей, я хотел бы распараллелить процедуру, для которой я не нашел решения из-за ограничений лицензирования и многопоточности, связанных с Abaqus. /КАЕ. Некоторые обсуждения этого здесь: многопроцессорная обработка Python от Abaqus/CAE

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

** Constraint: <name>
*Equation
<dof>
<set1>, <dof>, <coefficient1>.
<set2>, <dof>, <coefficient2>.
<set3>, <dof>, <coefficient3>.

e.g.
** Constraint: Corner_c1_Constraint-1-pair1
*Equation
3
All-1.c1_Node-1, 1, 1.
All-1.c5_Node-1, 1, -1.
RefPoint-3.SetRefPoint3, 1, -1.

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

*EQUATION, INPUT=file_name

Я ищу команду Abaqus Python для записи ключевого слова, такого как выше, в файл .inp вместо указания самих ограничений Equation. В приведенном выше руководстве пользователя указано указать это через графический интерфейс, но я не смог сделать это в своей версии Abaqus CAE 2018.

Использование Abaqus/CAE:
Интерактивный модуль: Создать ограничение: Уравнение: нажмите кнопку мыши 3, удерживая курсор над таблицей данных, и выберите «Чтение из файла».

Поэтому я ищу команду из справочного руководства по сценариям, чтобы сделать это вместо этого. Существуют команды для анализа входных файлов (http://abaqus.software.polimi.it/v6.14/books/ker/pt01ch24.html), но не что-то, что можно напрямую записать во входной файл, а не выполнять это с помощью сценариев. Я знаю, что могу жестко запрограммировать это во входном файле, но огромное количество симуляций, которые я хотел бы выполнить, требует каждой возможной части автоматизации. Я уже пытался оптимизировать код, используя соответствующие алгоритмы и массивы numpy, но сама предварительная обработка занимает несколько часов для одной модели.

p.s. Это мой первый пост на SO, поэтому я не уверен, что этот вопрос сформулирован в соответствующем формате. Буду признателен за любые ответы на фактический вопрос или любые другие решения предполагаемого результата распараллеливания шагов предварительной обработки в Abaqus/CAE.


person Nimal Kumar    schedule 24.07.2019    source источник
comment
Мой ответ ниже позволит вам записать свои ключевые слова во входные файлы задания. Я постоянно делаю что-то подобное в своей работе. В: Какая часть вашего процесса является узким местом, которое вы хотите выполнять параллельно? Определение узлов для уравнений или запуск анализа?   -  person Matt P    schedule 24.07.2019
comment
Спасибо @MattP. Это сработало. Моими узкими местами являются: (1) сортировка узлов на противоположных гранях прямоугольной модели в соответствии с их координатами и (2) создание уравнений ограничений для каждого набора соответствующих узлов, чтобы применять периодические граничные условия. В настоящее время я использую нативную функцию sorted(), и я думаю, что могу еще больше ускорить ее с помощью реализации сортировки ведра. Хотя еще не пробовал. Что касается создания уравнений ограничений, это делается последовательно, проходя по массиву наборов узлов, и я пытаюсь написать уравнения самостоятельно вне CAE, распараллелив процесс.   -  person Nimal Kumar    schedule 26.07.2019
comment
Большой! Не могли бы вы тогда отметить / принять ответ?   -  person Matt P    schedule 26.07.2019
comment
Сделанный. Удалось ли вам найти решение для ваших многопроцессорных задач, предпринятых в другом сообщении (stackoverflow.com/questions/44146116/)? Просто любопытно!   -  person Nimal Kumar    schedule 26.07.2019
comment
(Спасибо!) Я решил оптимизировать скорость последовательного кода за счет дополнительного хранилища и с очень хорошо организованной структурой данных. После этого вычисления были довольно быстрыми. Я пришел к выводу, что распараллеливание возможно, но не без выполнения операций вне ядра Abaqus Python. В конце концов, у меня была последовательная реализация на чистом Python, которой я был доволен.   -  person Matt P    schedule 26.07.2019
comment
Мне кажется, что вы могли бы использовать аналогичный подход (сохранять данные, а не пересчитывать). Главное, не повторять вычисления/поиск или создавать новые объекты, когда они не нужны. В Python это дорого обходится, но поиск и сортировка выполняются быстро. Используйте профилировщик, такой как Python cProfile, чтобы найти фактические узкие места. Кроме того, запись уравнений ограничений в файл не должна занимать много времени. Попробуйте сохранить необходимые данные, а затем записать их все в файл одновременно?   -  person Matt P    schedule 26.07.2019


Ответы (1)


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

Объект KeywordBlock создается при создании экземпляра детали на уровне сборки. Он хранит все, что вы делаете в CAE, с соответствующими ключевыми словами.

Обратите внимание, что любые изменения, которые вы вносите в объект KeywordBlock, будут синхронизированы с входным файлом задания при его записи, но не будут обновлять базу данных модели CAE. Так, например, если вы используете KeywordBlock для хранения ключевых слов для уравнений ограничений, определения ограничений не будут отображаться в дереве модели CAE. Остальная часть Mdb не знает, что они существуют.

Как вы знаете, ключевые слова должны быть записаны в соответствующий раздел входного файла. Например, ключевое слово *equation может быть определено на уровне детали, экземпляра детали или сборки (см. Справочное руководство по ключевым словам). Это также необходимо учитывать, когда вы сохраняете ключевые слова в объекте KeywordBlock (к сожалению, он не будет автоматически волшебным образом помещать ваши ключевые слова в нужное место!). Побочным эффектом является то, что не всегда безопасно записывать в KeywordBlock, то есть всякий раз, когда это может конфликтовать с последующими изменениями, сделанными через графический интерфейс CAE. Я считаю, что документы Abaqus рекомендуют добавлять ключевые слова в качестве последнего шага.

В общем, прочитайте объект KeywordBlock, найдите нужное место и insert новое ключевое слово. Вот пример фрагмента для начала:

partname = "Part-1"
model = mdb.models["Model-1"]
modelkwb = model.keywordBlock
assembly = model.rootAssembly

if assembly.isOutOfDate:
    assembly.regenerate()

# Synch edits to modelkwb with those made in the model. We don't need
# access to *nodes and *elements as they would appear in the inp file,
# so set the storeNodesAndElements arg to False.
modelkwb.synchVersions(storeNodesAndElements=False)

# Search the modelkwb for the desired insertion point. In this example, 
# we are looking for a line that indicates we are beginning the Part-Level 
# block for the specific Part we are interested in. If it is found, we 
# break the loop, storing the line number, and then write our keywords
# using the insert method (which actually inserts just below the specified
# line number, fyi). 
line_num = 0
for n, line in enumerate(modelkwb.sieBlocks):
    if line.replace(" ","").lower() == "*part,name={0}".format(partname.lower()):
        line_num = n
        break
if line_num:
    kwds = "your keyword as a string here (may be multiple lines)..."
    modelkwb.insert(position=line_num, text=kwds)
else:
    e = ("Error: Part '{}' was not found".format(partname),
         "in the Model KeywordBlock.")
    raise Exception(" ".join(e))
person Matt P    schedule 24.07.2019