Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assumed Shape arrays require explicit interface in Fortran [duplicate]

Im trying to write the code for a simple program that first asks for a number n, then creates an nxn matrix with 3s on its main diagonal, 1s over it and 0s under it and a vector (n) with 3 in the uneven positions and 2 in the even positions. It must then include a subroutine that multiplies both of them not using matmul()

program P13

implicit none

integer(4) :: n, i, j
integer, dimension(:), allocatable:: v 
integer, dimension(:,:), allocatable :: m
integer, dimension(:), allocatable :: r


write(*,*) "Insert n"
read(*,*) n



allocate (v(1:n))
allocate (m(1:n,1:n))

v(1:n:2) = 3
v(2:n:2) = 2
m = 0

DO i=1,n,1

   m (i,i:n)=1

END DO

Do i=1,n,1
 m (i,i)=3
 End do 

call matrmul(n, m, v)
end program

subroutine matrmul(n, b, o, t)
implicit none

integer(4), intent(in) :: n
integer(4) :: i, j
integer, dimension(:), intent(in) :: b 
integer, dimension(:,:),intent(in) :: o
integer, dimension(:), intent(out) :: t

DO i=1,n,1

t(i) = sum(b*o(:,i))
END DO

write(*,'(I2)') t

end subroutine 

I get the error message Explicit interface required for ‘matrmul’ at (1): assumed-shape argument

How do I fix this?? Thanks

like image 473
Sops Avatar asked Feb 07 '26 12:02

Sops


1 Answers

There are plenty examples here at stack overflow that will show you how to create explicit interfaces. However, since you allocate memory for all your arrays in the main program and you pass the size into the subroutine, just declare all your arrays in the subroutine with n.

subroutine matrmul(n, b, o, t)
  implicit none

  integer(4), intent(in) :: n
  integer(4) :: i, j
  integer, dimension(n), intent(in) :: b 
  integer, dimension(n,n),intent(in) :: o
  integer, dimension(n), intent(out) :: t
like image 54
Dan Sp. Avatar answered Feb 09 '26 08:02

Dan Sp.