В Abaqus у меня есть собственное описание материала (ВУМАТ). Этот VUMAT генерирует переменные состояния с именами SDV1, SDV2 и т. д. Эти переменные хранятся в двоичном файле .odb с другими выходными данными в abaqus. Поскольку у меня их огромное количество, я хотел бы дать им осмысленные имена, такие как S1, S2, E1, E2 и т. Д., Чтобы при просмотре .odb в программе просмотра Abaqus было ясно, какая переменная какая.
Теперь abaqus предоставляет интерфейс Python для чтения и записи в этот файл .odb. Но насколько я мог искать, я не мог найти способ переименовать эти переменные. Когда я пытаюсь изменить их, я получаю ошибку только для чтения.
Поэтому я попытался открыть .odb с помощью Notepad ++ и обнаружил, что если заменить все записи SDV в этом файле вручную на то, что я хочу, и сохранить его. Имена также изменятся в Abaqus Viewer. Это очень хорошо!
Но хотелось бы автоматизировать этот процесс. Поэтому я написал скрипт на Python для чтения исходного .odb, замены SDV и сохранения измененного .odb в виде другого файла.
import sys
with open('User.odb','rb') as f:
content = f.read()
if b"SDV2" in content:
print('Found')
content = content.replace(b'SDV2',b'works')
with open('User.temp.odb','wb') as fw:
fw.write(content)
Но когда я открываю новый .odb в программе просмотра abaqus, я получаю следующее сообщение:
***ОШИБКА: файл базы данных Abaqus поврежден. Если этот файл был передан с другого компьютера с помощью FTP или аналогичного, убедитесь, что файл был скопирован с использованием двоичного режима, а не режима ASCII.
Более того, в настоящее время этот код также заменяет SDV20, как этого избежать и заменить только SDV2, а не части SDV20, SDV21 и т. д.?
Что мне не хватает? Я использую питон 2.7.
ИЗМЕНИТЬ:
Если ODB открыт в HEX-редакторе, можно увидеть следующий шаблон: Для SDV9 следует SDV10:
04 53 44 56 39 00 00 00 05 53 44 56 31 30 00 00 00 00 00 00
можно заметить, что кодировка начинается с количества символов. 04 для SDV9 и 05 для SDV10, за которыми следуют значения NULL. 3 для SDV1-SDV9 и 6 для остальных. Я попытался изменить часть SDV9 на:
05 53 44 56 39 00 00 00 00 00 00 00
и это дало мне ту же ошибку, изменив часть SDV10 на:
05 53 44 56 39 00 00 00 00 00 00 00
отлично работает. Если кто-то знаком с этим, помощь будет оценена по достоинству.
EDIT2:
Мой код не работает, потому что новая переменная должна быть точно такой же длины, как и старая. Если длина совпадает, то проблем нет. Более короткие переменные могут иметь пробелы после них, чтобы получить требуемую длину символов.
Используя код, предложенный SSchneid, я смог подобрать точные SDV для замены, не включая части более длинных.
Стандартный метод добавления переменных поля с использованием FieldOutput() и addData() не является хорошим решением, поскольку он дублирует уже существующие SDV с другим именем. Это существенно увеличивает размер odb для очень больших анализов. Если нет способа удалить старые.
Конечно, мы могли бы пойти дальше, выводя нужные переменные в отдельный текстовый файл прямо из подпрограммы. Затем, используя этот текстовый файл, создайте новый вывод поля внутри odb. После этого текстовый файл можно было удалить. И все это без запроса вывода SDV.
Или можно запросить вывод SDV в файл .fil, а затем собрать его обратно в odb с помощью FieldOutput() и addData(). Но это очень хакерские решения, которые требуют большого количества операций записи на диск и большого количества строк кода для анализа выходных текстовых файлов.
Я оставляю этот тред без ответа, пока не будет опубликовано полное решение или я не разберусь сам (в этом случае я опубликую ответ заяц)
Спасибо за помощь!
b'SDV2'
иb'works'
имеют разную длину. Я предполагаю, что это не сработает. - person gdlmx   schedule 23.04.2016