Каков наилучший способ организовать в программе 11 одинаковых, но различающихся по размеру массивов без выделяемого свойства?
Я представляю что-то вроде этого:
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.
В настоящее время AB и 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 имеет определенный максимум, но кажется, что много потраченной памяти, когда я знаю, что не будуиспользовать массивы.