Я программирую модуль Fortran, который связан с внешней основной программой. Я могу только изменить подпрограмму. Мне приходится детализировать много данных, но всегда одно и то же. Это занимает слишком много времени при каждом вызове подпрограммы. Как я могу инициализировать данные только при первом вызове? В настоящее время это подпрограмма:
subroutine sdvini(statev,coords,nstatv,ncrds,noel,npt,layer,kspt)
implicit none
integer imdat(100,100,50)
imdat(1,1,1:33)=(/1,8,13,24,48,72,111,148,156,165,182&
&,189,194,207,210,216,236,247,254,270,311,319,339,343,367,376&
&,393,397,421,438,447,473,492/)
.
. lots of data
.
do something
return
end
Подсказки к атрибуту сохранения будет достаточно, это действительно то, что действительно есть. я проверю
Эту установку значений при первом вызове процедуры и сохранение значений можно выполнить с помощью явного инициализация. Мы часто используем термин инициализация, как и в этом вопросе, для обозначения присваивания как части процесса настройки. Однако инициализация означает нечто более точное в терминах Фортрана.
Явная инициализация, подходящая для этого вопроса, будет чем-то вроде очень простого случая
integer, save :: i=1 ! SAVE attribute would be implied, but made explicit
Это похоже на применение присвоения при первом входе в процедуру.
Мы также можем использовать оператор данных:
integer, save :: i
data i /1/
Атрибут SAVE обеспечивает сохранение значения между входами в процедуру.
Для массивов идея такая же, возможно, с использованием конструкторов массивов и reshape
.
Для очень больших массивов нецелесообразно использовать операторы данных или инициализаторы. Кроме того, существуют ограничения на то, что может появиться при инициализации сохраненной локальной переменной. Однако другая идиома была бы похожа на
subroutine sub
logical, save :: firsttime=.TRUE.
integer, save :: obj(100,100,50)
if (firsttime) then
obj = ... ! Setting the value somehow, maybe even with a read
firsttime = .FALSE.
end if
end subroutine
Большое спасибо, я попробую это и отчитаюсь!
Такой объем данных принадлежит внешнему файлу, который может быть прочитан при первом вызове подпрограммы и сохранен для последующих вызовов. Вам нужна помощь в написании кода для реализации этого подхода? У меня нет времени писать это для вас в данный момент, но посмотрите на некоторые вопросы и ответы по теме атрибута Fortran
save
для процедурных переменных.