У меня есть большой массив целочисленных параметров (6024 триплета, всего около 9000 элементов в массиве 3x6024) для размещения в модуле в качестве данных для других функций. Параметр определяется:
Integer, Parameter :: nj = 6024
Integer, Parameter :: abc(1:3,1:nj) = &
& RESHAPE( (/ a1 , b1 , c1, & !j = 1
& a2 , b2 , c2, & !j = 2
!... like 6000 more lines ...
& aj , bj , cj /), & !j = nj
& SHAPE=(/3,nj/),ORDER=(/2,1/) )
Где aj
, bj
и cj
— произвольные целочисленные константы.
Я предпочитаю такое форматирование (с использованием строк продолжения для объединения триплетов) для удобочитаемости, но для длинного массива оно вводит слишком много строк продолжения, чтобы соответствовать стандарту Фортрана (Fortran 2003 и новее допускают до 255 строк продолжения). Эти параметры не распределяются предсказуемым образом, поэтому неявный цикл для определения невозможен.
Я мог бы поместить больше троек в строку, но 4-байтовые целые числа занимают по 12 символов каждое (10 цифр, знак, запятая), а продолжение &
оставляет место для 10 целых чисел в стандартной строке произвольной формы (132 символа). ). В 255 строках продолжения это устанавливает практический предел в ~2550 элементов (этого типа), которые могут быть перечислены для определения параметра массива.
Есть ли способ сделать определение этого параметра в коде, совместимом со стандартом Fortran 2008? Можно ли определить массив параметров в сегментах? например
Integer, Parameter :: nj = 6024
Integer, Parameter :: abc(1:3,1:nj)
Integer, Parameter :: abc(:,1) = (/ a1 , b1 , c1 /) !j = 1
Integer, Parameter :: abc(:,2) = (/ a2 , b2 , c2 /) !j = 2
!... like 6000 more lines ...
Integer, Parameter :: abc(:,nj) = (/ aj , bj , cj /) !j = nj
arr = [arr1, arr2, arr3]
. Вы связываете массив с каждой строкой измерений. Кроме того, оператор данных может определять массив фрагментами. Вы могли бы даже иметь отдельный файл данных только для этого. - person Rodrigo Rodrigues   schedule 20.07.2018