background: Abaqus предоставляет несколько «шаблонов» подпрограмм Fortran (в стиле фиксированного формата / F77), которые позволяют пользователям получать конкретную информацию или влиять на определенные аспекты решения во время анализа, или пользователь-subroutines.Abaqus контролирует, когда вызываются пользовательские подпрограммы, какая информация передается в / из и т. Д. Пользователи не могут ничего менять и не имеют доступа к основной программе или ее собственному исходному коду.Однако в пользовательской подпрограмме пользователь может свободно написать любой допустимый код, который он считает необходимым.
В этом вопросе OP хочет сохранять информацию от каждого вызова к пользовательской подпрограмме dflux
, чтобы она была доступна другим подпрограммам или другим вызовам подпрограммы dflux
.Примечание: эта возможность не предоставляется dflux
, поэтому OP требует обходного пути.
возможные обходные пути: К счастью, пользовательская подпрограмма dflux
предоставляет номер элемента, номер точки интеграции и пространственные координаты для текущего вызова.Эта информация, вероятно, может быть использована для хранения (и доступа) любых данных, которые вам нужны.Способ хранения / передачи данных может быть реализован через блок COMMON, модуль Fortran или даже текстовый файл или некоторую другую внешнюю «базу данных».
> Я рекомендую модульный подход.Однако, смотрите этот ответ для хорошего объяснения того, как использовать ОБЩИЕ блоки и модули.
(РЕДАКТИРОВАТЬ) Для полноты, очень простой пример с модулем и подпрограммой abaqus можно структурировать примерно так:
module data_mod
! Any routine may access this module with the statement: "USE data_mod".
! Any variable within the module is then shared by those routines.
implicit none
! You can use an allocatable array, but for this example I will assume
! there are 1000 or fewer points, and up to 10 values for each.
real, dimension(1000,10) :: point_data
end module data_mod
subroutine dflux(....all the args...)
! Note: you must "USE" modules before any other statements in the routine.
use data_mod
! Now you may carry on with the rest of your code.
! Be sure to have the required "INCLUDE 'ABA_PARAM.INC" statement,
! which defines how abaqus implements "IMPLICIT REAL" for your machine,
! and all of the boilerplate variable declarations included with the
! DFLUX subroutine template.
include 'aba_param.inc'
(...etc...)
! For simplicity, I am assuming you have a unique ID for each point, and
! each ID is numerically equal to one of the row indices in 'point_data'.
! When ready to read/write data in the 'point_data' array:
! Read data:
neighbor_vals(:) = point_data(NEIGHBOR_ID, 2:)
old_data_at_current_point(:) = point_data(ID, 2:)
(...etc...)
! Write data:
point_data(ID,2:4) = coords(:)
point_data(ID,5) = result1
point_data(ID,6) = result2
end subroutine dflux
> Вам нужно будет выбрать тип контейнера данных и некоторую умную организационную концепцию - возможно, используя номер элемента, номер точки интеграции или координаты (x, y, z), чтобы однозначно идентифицировать данные, которые вы хотите сохранить.Например, может быть достаточно простого 2-мерного массива (MxN): каждая строка представляет точку интеграции M th , первый столбец содержит уникальный идентификатор (идентификаторы) точки, а остальные столбцы содержат любые значенияВы хотите хранить из каждой точки.Примечание: определение того, какие точки являются «соседями», является еще одной темой, для которой вам потребуется умное решение.После того, как вы это сделаете, возможно, соседние точки также могут быть сохранены в массиве для более быстрого доступа.
> Вы можете безопасно читать данные из других точек интеграции, хранящихся в контейнере данных., но не записывайте / не изменяйте значения, хранящиеся в контейнере данных (независимо от того, находится ли он в блоке COMMON или в модуле), если только он не предназначен для текущей точки интеграции, где в данный момент вызывается dflux
.
примечания:
- Новые пользователи часто думают, что застряли, написав FORTRAN 77 в своих подпрограммах Abaqus. Они не .
- Самый простой способ использовать модули вместе с пользовательскими подпрограммами abaqus - это разместить их в верхней части вашего файла.Abaqus будет автоматически компилировать и связывать их при запуске анализа.