я получаю следующее предупреждение во время выполнения:forrtl: предупреждение (402): форт: (1)
...
forrtl: warning (402): fort: (1): In call to I/O Write routine, an array temporary was created for argument #2
forrtl: warning (402): fort: (1): In call to I/O Write routine, an array temporary was created for argument #3
forrtl: warning (402): fort: (1): In call to GERADHEIT_LINIAL, an array temporary was created for argument #2
forrtl: warning (402): fort: (1): In call to GERADHEIT_LINIAL, an array temporary was created for argument #3
...
для каждого вызова заявления подпрограммы/записи.
Вызов подпрограммы:
integer :: l,kreise
character(*)::setname
real(8),diemnsion(:,:,:),allocatable::stripe
integer,dimension(:)s(j)
...code and allocation of arrays...
do j=n(1)
call geradheit_linial (s(j),stripe(j,1:s(j),1),
& stripe(j,1:s(j),2),setname)
end do
...
subroutine geradheit_linial (ndaten,x,r,setname)
implicit none
integer,intent(in) :: ndaten
real(8),dimension(ndaten),intent(in) :: x,r
character(*),intent(in) :: setname
и утверждение записи:
write(91,*)'Gerade: ',gerade(maxloc(reslt(1:i)),minsumloc,1),
& gerade(maxloc(reslt(1:i)),minsumloc,2)
Массив stripe
выделяется с максимальным значением, ожидаемым для каждого измерения, так что большую часть времени лишь подмножество передается по вызову.
Насколько я понимаю, это не проблема с точки зрения точности, но может замедлить работу программы, поэтому большая часть записи в ОЗУ выполняется. Итак, сколько это замедляет мои вычисления (stripe
может иметь размер около stripe(100,300,3)
и может стать больше когда-нибудь позже)? И как я могу избежать таких дополнительных массивов ?.
Я замечаю, что когда я использую дефисный размер, например. real (8), dimension (:), intent (in) :: x, r, я не вижу этого предупреждения .. – Charlie