Как лучше всего организовать в программе 11 одинаковых, но разного размера массивов без свойства allocatable?
Я представляю что-то вроде этого:
TYPE MyType(i)
integer, intent(in) :: i
integer, dimension(i,i) :: A
integer, dimension(2*i,i) :: B
integer, dimension(i,2*i) :: C
end type MyType
Затем в основной программе я могу объявить что-то вроде этого:
type(mytype), dimension(N) :: Array
При этом i-й элемент массива имеет доступ к трем массивам A, B и C, и каждый из этих трех массивов имеет разные размеры.
Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что я решаю проблему QM, и у меня есть 11 различных массивов, которые различаются по размеру, но все они зависят от одного и того же параметра (поскольку размер A, B и C зависит от i). Фактические значения этих массивов также не меняются.
Моя программа рассматривает различные виды систем, каждая из которых имеет свои A, B и C (просто для продолжения аналогии), и в каждой системе A, B и C имеют уникальный размер.
Если бы я знал, что ищу 6 различных типов систем, мне понадобилось бы 6 разных копий A, B и C.
В настоящее время A, B и C не являются частью производного типа, а вместо этого выделяются и пересчитываются на каждой итерации. Этот расчет занимает более одной десятой секунды для больших систем. Но я усредняю свои результаты ~ 100 000 раз, что означает, что это может дать серьезную экономию времени. Кроме того, мне не хватает памяти.
Я пробовал вычислять эти массивы в другой программе, записывать их в файл и читать при необходимости, но, к сожалению, это было не быстрее, чем одновременный пересчет.
Примечание. Вот как выглядят мои фактические массивы:
integer, dimension(:,:), allocatable :: fock_states
integer, dimension(:,:), allocatable :: PES_down, PES_up
integer, dimension(:,:), allocatable :: IPES_down, IPES_up
integer, dimension(:,:), allocatable :: phase_PES_down, phase_PES_up
integer, dimension(:,:), allocatable :: phase_IPES_down, phase_IPES_up
integer, dimension(:,:), allocatable :: msize
integer, dimension(:,:), allocatable :: mblock
Каждый массив имеет разный размер для каждой системы.
Изменить:
Итак, что мне действительно нужно, так это N копий массивов в списке чуть выше этого редактирования. Массивы, принадлежащие i-й копии, имеют размер, который масштабируется с i (например, PES_down имеет размерность (i,4**i)). Насколько я понимаю, это означает, что мне нужно N разных объявлений переменных с типом MyType. Обычно это нормально, но проблема в том, что N определяется во время компиляции, но может меняться между запусками.
N имеет определенный максимум, но кажется, что много памяти потрачено впустую, когда я знаю, что не буду использовать массивы.