Если вы хотите, чтобы функция am1d возвращала массив, вам нужно объявить его как таковой.Было несколько других синтаксических ошибок.Компилятор запутался ... Вы забыли оператор "Содержит" ... без этого или без модуля, компилятор не будет "знать", что делать с другой процедурой, и может попытаться интерпретировать его как вторую основную программу.
Попробуйте:
program make3d
integer, parameter :: L = 20
real, parameter :: w = 0.5
real :: x
x=rand(1234) ! seed random manually
!x=rand(itime) ! seed random from current local time
write (*, *) am1d()
stop
contains
function am1d ()
real, dimension (L,L) :: am1d
integer i, j
do i=1,L
do j=1,L
if (i.eq.j) then
am1d(i,j)=rand()*w-w/2.
elseif ((i-j.eq.1) .or. (j-i.eq.1)) then
am1d(i,j)=1
else
am1d(i,j)=0
end if
enddo
enddo
end function am1d
end program make3d
или поместите подпрограмму в модуль, который, как мне кажется, обеспечивает более понятный и понятный интерфейс (делает переменную связь явной) - тогда вам нужно будет «использовать»модуль в основной программе и передать w и L в качестве аргументов:
module a_mod
contains
function am1d (w,L)
real, intent (in) :: w
integer, intent (in) :: L
real, dimension (L,L) :: am1d
.....
end function am1d
end module a_mod