Перейти к содержанию

Расширение пользовательскими подпрограммами

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.

Подробности, включая смысл аргументов подпрограмм, работу с массивами переменных состояния и предосторожности при пересборке, приведены на соответствующих страницах руководства по программированию.

Связанные темы