Расширение пользовательскими подпрограммами¶
FrontISTR предоставляет набор пользовательских подпрограмм для расширения функциональности без изменения основного исходного кода. Они охватывают пользовательские реализации определяющих законов и подключение пользовательских внешних нагрузок. В этой главе перечислены доступные точки расширения и ключевые слова управляющего файла анализа, используемые для вызова каждой из них. Подробные спецификации аргументов подпрограмм и порядок пересборки см. в разделе Пользовательские подпрограммы (руководство по программированию).
Общая структура функций¶
Точки расширения пользовательскими подпрограммами делятся на две категории: определяющие законы материала и внешние нагрузки. Для определяющих законов предусмотрены четыре пути вызова — линейная упругость, гиперупругость, упругопластичность и универсальный определяющий закон — каждый из которых активируется отдельным ключевым словом. Для внешних нагрузок предусмотрен путь, который считывает информацию о нагрузке из внешнего файла, подготовленного пользователем, и добавляет её в глобальный вектор нагрузки и вектор невязки. Каждое расширение становится доступным после редактирования файла-шаблона из поставки FrontISTR и пересборки основной программы.
| Категория расширения | Ключевое слово управления анализом | Основные пользовательские подпрограммы | Редактируемый шаблон |
|---|---|---|---|
| Пользовательская линейная упругость | !ELASTIC, TYPE=USER |
uElasticMatrix, uElasticUpdate |
fistr1/src/lib/user/uelastic.f90 |
| Пользовательская гиперупругость | !HYPERELASTIC, TYPE=USER |
uElasticMatrix, uElasticUpdate |
fistr1/src/lib/user/uelastic.f90 |
| Пользовательская упругопластичность (функция текучести и обратное отображение (return mapping)) | !PLASTIC, YIELD=USER |
uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus |
fistr1/src/lib/user/uyield.f90 |
| Универсальный пользовательский определяющий закон | !USER_MATERIAL |
uMatlMatrix, uUpdate |
fistr1/src/lib/user/umat.f90 |
| Пользовательская внешняя нагрузка | !ULOAD, FILE=<fname> |
ureadload, uloading, uResidual |
fistr1/src/lib/user/uload.f90 |
Пользовательские законы упрочнения (путь, при котором встроенная функция текучести сохраняется, а пользовательской реализацией заменяется только кривая упрочнения) не поддерживаются. Если требуется пользовательская кривая упрочнения, выберите !PLASTIC, YIELD=USER и замените пользовательской реализацией весь упругопластический определяющий закон. Пользовательские граничные условия и точки расширения для пользовательской обработки при перезапуске не поддерживаются.
В !CREEP значение TYPE=USER не поддерживается. Для реализации зависящего от времени определяющего закона в пользовательском расширении используйте !USER_MATERIAL.
Пользовательские определяющие законы¶
Пользовательские определяющие законы служат точкой входа для реализации во внешней подпрограмме соотношений напряжение–деформация, которые нельзя представить встроенными моделями материала. Доступны четыре пути в соответствии с рамками соответствующего встроенного определяющего закона: пользовательская линейная упругость, пользовательская гиперупругость, пользовательская упругопластичность и универсальный пользовательский определяющий закон. В каждом случае в блоке !MATERIAL управляющих данных анализа для соответствующего ключевого слова задаётся TYPE=USER или YIELD=USER. Можно задать до 100 пользовательских констант, которые передаются в подпрограмму.
Пользовательская линейная упругость¶
Пользовательская линейная упругость — путь, в котором пользователь вычисляет упругую матрицу в рамках малых деформаций. Если в управляющих данных анализа задано !ELASTIC, TYPE=USER, FrontISTR обрабатывает его как определяющий закон малых деформаций и вызывает uElasticMatrix (возвращает упругую матрицу \(D\)) при вычислении жёсткости элемента и uElasticUpdate (возвращает напряжение) при обновлении напряжений. Не используйте его совместно со встроенной гиперупругой или упругопластической моделью.
Пользовательская гиперупругость¶
Пользовательская гиперупругость — путь для вычисления напряжения и касательной жёсткости по производным функции энергии деформации в рамках больших деформаций (Total Lagrange). В управляющих данных анализа задаётся !HYPERELASTIC, TYPE=USER. Вызываются те же подпрограммы uElasticMatrix и uElasticUpdate, что и для пользовательской линейной упругости, и используется тот же шаблон fistr1/src/lib/user/uelastic.f90. Поскольку ключевое слово переключает трактовку FrontISTR между малыми деформациями и Total Lagrange, один и тот же шаблон нельзя одновременно использовать и для реализации малых, и для реализации больших деформаций. Реализуйте его как один из этих двух определяющих законов.
Пользовательская упругопластичность¶
Пользовательская упругопластичность — путь, в котором пользователь реализует функцию текучести и процедуру обратного отображения (return-mapping). В управляющих данных анализа задаётся !PLASTIC, YIELD=USER. При этом используется ветвь, независимая от встроенных функций текучести Mises, Mohr-Coulomb и Drucker-Prager. При вычислении жёсткости элемента вызывается uElastoPlasticMatrix (возвращает упругопластическую касательную жёсткость \(D\)), при обновлении напряжений — uBackwardEuler (отображает пробное напряжение в истинное и обновляет переменные состояния), а при инициализации точек Гаусса — uElastoPlasticNumStatus (возвращает число сохраняемых вещественных переменных состояния). Путь, заменяющий пользовательской реализацией только кривую упрочнения, не поддерживается. Даже если требуется только пользовательская кривая упрочнения, используйте этот путь и замените пользовательской реализацией весь упругопластический определяющий закон.
Универсальный пользовательский определяющий закон¶
Универсальный пользовательский определяющий закон — путь для реализации определяющих законов, не укладывающихся в рамки упругости, гиперупругости или упругопластичности. В управляющих данных анализа задаётся !USER_MATERIAL. По умолчанию он обрабатывается в рамках Updated Lagrange; если задан KIRCHHOFF, он обрабатывается как Total Lagrange. Число переменных состояния задаётся через NSTATUS. При вычислении жёсткости элемента вызывается uMatlMatrix (возвращает касательную жёсткость \(D\)), а при обновлении напряжений — uUpdate (обновляет напряжение и переменные состояния).
Передача пользовательских констант и переменных состояния¶
Для путей !ELASTIC, TYPE=USER, !HYPERELASTIC, TYPE=USER и !USER_MATERIAL пользовательские константы, записанные в строках данных управляющих данных анализа (до 100), передаются непосредственно в подпрограмму через аргумент matl. Для !PLASTIC, YIELD=USER передаются упругие константы, заданные в !ELASTIC, и пользовательские константы, заданные через строки данных !PLASTIC.
Для универсального пользовательского определяющего закона и !PLASTIC, YIELD=USER информация истории с предыдущего шага (например, пластическая деформация, обратное напряжение и повреждение) может передаваться пользовательской реализации через переменную состояния fstat и записываться обратно в конце шага. Число переменных состояния определяется: для универсального пользовательского определяющего закона — в !USER_MATERIAL параметром NSTATUS, для !PLASTIC, YIELD=USER — возвращаемым значением uElastoPlasticNumStatus.
Пользовательские внешние нагрузки¶
Пользовательские внешние нагрузки предоставляют путь для задания внешних сил, которые нельзя представить встроенными сосредоточенными нагрузками, распределёнными нагрузками или объёмными силами. Если в управляющих данных анализа записано !ULOAD, FILE=<fname>, FrontISTR передаёт указанное имя файла в ureadload, а информация, прочитанная пользовательской реализацией, сохраняется как данные модуля.
Вызову !ULOAD соответствуют следующие три подпрограммы.
ureadload: в начале анализа считывает пользовательские нагрузки из внешнего файла, указанного в управляющем файле. Пользовательская реализация открывает файл и сохраняет необходимые данные в переменных модуля.uloading: вызывается при сборке вектора внешних нагрузок на каждом шаге и добавляет пользовательскую нагрузку в глобальный вектор нагрузки. В аргументах передаются номер текущего шага и коэффициент нагрузки.uResidual: вызывается при сборке вектора невязки на каждой итерации и добавляет вклад пользовательской нагрузки в глобальный вектор невязки. Вызывается как из нелинейных итераций, так и из расчётов равновесия.
Точка расширения для пользовательских граничных условий (пользовательского расширения заданных перемещений или контактных условий) не предусмотрена. Если требуется пользовательское расширение, не относящееся к внешней силе, используйте соответствующее встроенное ключевое слово или путь пользовательского определяющего закона.
Порядок реализации пользовательских подпрограмм¶
Чтобы использовать пользовательскую подпрограмму, отредактируйте файл-шаблон, включённый в исходную поставку FrontISTR, и затем пересоберите FrontISTR. В поставляемых бинарных файлах пользовательские подпрограммы заменить нельзя, поэтому для пользовательского расширения требуется среда, позволяющая собирать FrontISTR из исходного кода.
Шаблоны пользовательских подпрограмм расположены в fistr1/src/lib/user/, и для каждой категории расширения определён свой редактируемый файл (имена файлов см. в таблице Общая структура функций). В исходном состоянии файлы содержат либо пустые тела подпрограмм, либо пример линейно-упругой реализации; пользователь добавляет туда собственный определяющий закон или определение нагрузки. После редактирования шаблона пересоберите FrontISTR обычным способом с помощью CMake и выполняйте анализ полученным исполняемым файлом fistr1.
Подробности, включая смысл аргументов подпрограмм, работу с массивами переменных состояния и предосторожности при пересборке, приведены на соответствующих страницах руководства по программированию.
- Пользовательские подпрограммы (обзор)
- Универсальный пользовательский определяющий закон
umat.f - Пользовательская упругопластичность
uyield.f - Пользовательская внешняя нагрузка
uload.f - Пользовательская линейная упругость и пользовательская гиперупругость
uelastic.f
Связанные темы¶
- Данные материала — варианты определяющих законов и список встроенных моделей
- Граничные условия и нагрузки — встроенные граничные условия и нагрузки
- Пользовательские подпрограммы (руководство по программированию) — спецификация аргументов подпрограмм и правила реализации
- !USER_MATERIAL — синтаксис ключевого слова универсального пользовательского определяющего закона
- !ELASTIC — ключевое слово линейной упругости, включая
TYPE=USER - !HYPERELASTIC — ключевое слово гиперупругости, включая
TYPE=USER - !PLASTIC — ключевое слово упругопластичности, включая
YIELD=USER