3

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

Sops
  • 33
  • 3

1 Answers1

2

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
Dan Sp.
  • 1,419
  • 1
  • 14
  • 21