program main implicit none integer :: n,mm,i,j real*8, allocatable :: a(:,:),b(:,:),c(:,:) real*8 :: na,nb logical :: lnorm !1) do write(*,*) 'Dimension n>1' read(*,*) n if (n.gt.1) exit enddo allocate(a(n,n),b(n,n),c(n,n)) do i=1,n do j=1,n read(*,*) a(i,j),b(i,j) enddo enddo !2) call norm(a,b,n,na,nb) if (na.eq.nb) then write(*,*) "A and B get the same norm" lnorm=.true. else write(*,*) "A and B do not get the same norm" lnorm=.false. endif !3) call define_c(lnorm,a,b,n,na,nb,c) !4) open(10,file='norm.dat') write(10,'("Norm of A is", F10.3,", norm of B is", F10.3)') na, nb close(10) open(10,file='c.dat') do i=1,n do j=1,n write(10,95) i,j,c(i,j) enddo enddo close(10) deallocate(a,b,c) 95 format(I5,I5,F10.3) stop end program main subroutine norm(a,b,n,na,nb) implicit none integer, intent(in) :: n real*8, intent(in) :: a(n,n),b(n,n) real*8, intent(out) :: na, nb integer :: i,j na=0.d0 nb=0.d0 do i=1,n do j=1,n na=na+abs(a(i,j))**2 nb=nb+abs(b(i,j))**2 enddo enddo na=dsqrt(na) nb=dsqrt(nb) return end subroutine norm subroutine define_c(lnorm,a,b,n,na,nb,c) implicit none integer, intent(in) :: n real*8, intent(in) :: a(n,n),b(n,n) real*8, intent(in) :: na, nb logical, intent(in) :: lnorm real*8, intent(out) :: c(n,n) integer :: i,j real*8 :: diff_norm c=0.d0 if (lnorm) then do i=1,n do j=1,n c(i,j) = a(i,j) + b(i,j) + na enddo enddo else diff_norm=abs(na-nb) c=0.d0 do i=1,n c(i,i) = diff_norm enddo do i=2,n c(i,i-1) = 2.d0*diff_norm enddo do i=1,n-1 c(i,i+1) = 0.5d0*diff_norm enddo endif return end subroutine define_c