Как массив PROP связан с массивом PROPS в коде Abaqus FORTRAN UMAT?

#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. «В общем, передача по ссылке» далека от «работы по принципу передачи по ссылке». Во многих случаях предпочтение отдается копиям, а во многих случаях копии практически обязательны. Важным понятием здесь является ассоциация последовательностей, а то, как этот эффект демонстрируется, не так уж и много.