Каковы рекомендации или рекомендации относительно того, где мы должны выделить массив?
Например, если у меня есть (упрощенная версия моей) программы, как показано, я выделяю выходную переменную (переменнуюинтереса) в основной программе.Эта основная программа вызывает подпрограмму foo
, которая, в свою очередь, вызывает подпрограмму foo2
, которая выполняет фактические вычисления.Мой вопрос заключается в том, какова наилучшая / рекомендуемая практика для того, где должно быть сделано распределение.
- Если
foo2
выполняет фактические вычисления, должен ли он выделять массивы? - Если
foo
вызывает foo2
, foo
должен выделять массив и foo2
делать только вычисления? - Должен ли я написать новую функцию / подпрограмму, чтобы просто распределить массивы?
- Или лучше распределить в основной программе и передать массивы в виде предполагаемой формы?
Если это важно, у меня есть модуль с именем global, который содержит производные типы в основной программе и основные параметры кода, такие как размер каждого массива (Ni
,Nj
, допуски и т. Д.)
program main
use global
implicit none
type(myVar_) :: ans
Ni = 10
Nj = 20
if (allocated(ans%P)) deallocate(ans%P)
allocate(ans%P(1:Ni, 1:Nj))
call foo(ans)
print *, P
end program main
module global
integer, parameter :: dp=kind(0.d0)
integer :: Ni, Nj
type myVar_
real(dp), allocatable :: P(:,:)
end type myVar_
end module global
subroutine foo(myVar)
use global
implicit none
type(myVar_) :: myVar
call foo2(myVar%P)
end subroutine
subroutine foo2(P)
use global
implicit none
real(dp), intent(inout) :: P(:,:)
! do calculations for P
end subroutine foo2
что такое