#arrays #fortran #abaqus
#массивы #fortran #abaqus
Вопрос:
Я просматривал общедоступную подпрограмму crystal plasticity FORTRAN, однако я не мог понять, как входные материалы передавались через подпрограммы и функции.
Итак, в главном UMAT переменная PROPS указывает на материальные константы, введенные в параметре * USER MATERIAL во входном файле. Для подпрограммы это значение равно 125.
Теперь подпрограммы, вызываемые UMAT, определили другую переменную PROP, которая принимает разные значения, такие как
В строке 1430;
C PROP(1) - PROP(3) -- direction of the first vector in
C local cubic crystal system
Находясь в строке 2167, (для i = 1)
C PROP -- material constants characterizing the self- and latent-
C hardening law (INPUT)
C
C For the HYPER SECANT hardening law
C PROP(1,i) -- initial hardening modulus H0 in the ith
C set of slip systems
C PROP(2,i) -- saturation stress TAUs in the ith set of
C slip systems
C PROP(3,i) -- initial critical resolved shear stress
C TAU0 in the ith set of slip systems
Хотя я не мог найти никакой связи между PROPS и PROP в коде, я мог видеть, что соответствующие материальные константы были реализованы PROP.
Я не могу понять, как PROP может получать константы свойств из входного файла? Кто-нибудь может объяснить, как это работает?
Код fortran.
Ответ №1:
ROTATION
Подпрограмма определена в L.1404 (комментарии удалены для ясности):
SUBROUTINE ROTATION (PROP, ROTATE)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION PROP(16), ROTATE(3,3), TERM1(3,3), TERM2(3,3), INDX(3)
[...]
Fortran работает по принципу «передачи по ссылке», то есть аргументы функции фактически получают указатели на то, где переменная «живет» в памяти. Таким образом, подпрограмма ROTATION
интерпретирует свой первый аргумент как адрес (начало) 16-элементного массива двойной точности, в то время как второй аргумент является адресом массива двойной точности 3×3.
На L.569 вы видите вызываемую функцию:
CALL ROTATION (PROPS(57), ROTATE)
Таким образом, адрес, который ему присваивается, соответствует адресу 57-го элемента PROPS
. Это означает, что подпрограмма эффективно имеет доступ к содержимому PROPS(57)
— PROPS(72)
. Согласно комментарию в начале (L.385),
PROPS(57) - PROPS(72) -- parameters characterizing the initial
C orientation of a single crystal in
C global system
Когда подпрограмма завершается, ее результат находится в массиве, который ROTATE
она получила на L.569.
Комментарии:
1. Fortran не работает «по принципу «передачи по ссылке»», но концепция здесь называется ассоциацией последовательностей . Здесь можно найти много других вопросов и ответов, используя этот поисковый запрос.
2. @francescalus «В общем, подпрограммы Fortran передают аргументы по ссылке». docs.oracle.com/cd/E19205-01/819-5262/auto42/index.html
3. Это может быть верно для этой конкретной реализации. Стандарт этого не требует. Могут использоваться и используются другие методы.
4. «В общем, передача по ссылке» далека от «работы по принципу передачи по ссылке». Во многих случаях предпочтение отдается копиям, а во многих случаях копии практически обязательны. Важным понятием здесь является ассоциация последовательностей, а то, как этот эффект демонстрируется, не так уж и много.