program main implicit none integer :: n,m,l,nl,i,j,k,ierr real*8 :: diag,up,down,tmp1,tmp2 real*8, allocatable :: a(:,:,:) real*8, allocatable :: b(:,:),c(:,:),d(:,:),e(:,:),f(:,:),h(:,:) integer, allocatable :: g(:) !1) do read(*,*) n,m,l if (n.gt.0.and.m.gt.0.and.l.gt.0.and.n.gt.m.and.m.gt.l) exit enddo allocate(a(n,m,l)) open(10,file='inputA.dat',status='old',iostat=ierr,err=400) do i=1,n do j=1,m do k=1,l read(10,*) a(i,j,k) enddo enddo enddo close(10) !2) allocate(b(n,m)) allocate(c(n,l)) allocate(d(m,l)) allocate(e(n,l)) b(:,:)=a(:,:,1) c(:,:)=a(:,1,:) d(:,:)=a(1,:,:) call matprod(b,d,e,n,m,l) allocate(f(n,l)) do i=1,n do j=1,l f(i,j)=(e(i,j)+c(i,j))/dble(i+j) enddo enddo !3) nl=n*l allocate(g(nl)) call make_g(f,g,n,l) call sort(g,nl) !4) call modify_b(b,g,n,m,l) !5) allocate(h(l,l)) do i=1,l do j=1,l h(i,j)=f(i,j) write(*,*) i,j,h(i,j) enddo enddo call op_on_h(h,l,diag,up,down) tmp1=up-diag tmp2=down+diag if (tmp1.gt.tmp2) then write(*,*) '(q2-q1)>(q3+q1)' write(*,'(F10.3,">",F10.3)') tmp1,tmp2 elseif (tmp1.lt.tmp2) then write(*,*) '(q3+q1)>(q2-q1)' write(*,'(F10.3,">",F10.3)') tmp2,tmp1 elseif (tmp1.eq.tmp2) then write(*,*) '(q2-q1)=(q3+q1)' write(*,'(F10.3,"=",F10.3)') tmp1,tmp2 endif !6) open(50,file='b.dat') open(51,file='e.dat') open(52,file='f.dat') open(53,file='g.dat') do i=1,n do j=1,m write(50,102) i,j,b(i,j) enddo enddo do i=1,n do j=1,l write(51,102) i,j,e(i,j) write(52,102) i,j,f(i,j) enddo enddo do i=1,nl write(53,103) i,g(i) enddo close(50) close(51) close(52) close(53) deallocate(a) deallocate(b) deallocate(c) deallocate(d) deallocate(e) deallocate(f) deallocate(g) deallocate(h) 102 format(I5,I5,E10.3) 103 format(2(I5)) 400 if (ierr.ne.0) then write(*,*) 'Input file missing' stop endif stop end program main subroutine matprod(b,d,e,n,m,l) implicit none integer, intent(in) :: n,m,l real*8, intent(in) :: b(n,m) real*8, intent(in) :: d(m,l) real*8, intent(out) :: e(n,l) integer :: i,j,k e=0.d0 do i=1,n do j=1,l do k=1,m e(i,j)=e(i,j)+b(i,k)*d(k,j) enddo enddo enddo return end subroutine matprod subroutine make_g(f,g,n,l) implicit none integer, intent(in) :: n,l real*8, intent(in) :: f(n,l) integer, intent(out) :: g(n*l) integer :: i,j,k k=0 do i=1,l do j=1,n k=k+1 g(k)=int(f(j,i)) enddo enddo return end subroutine make_g subroutine sort(g,nl) implicit none integer, intent(in) :: nl integer, intent(inout) :: g(nl) integer :: i,j integer :: tmp do i=1,nl-1 do j=2,nl-(i-1) if (g(j-1).lt.g(j)) then tmp=g(j-1) g(j-1)=g(j) g(j)=tmp endif enddo enddo return end subroutine sort subroutine modify_b(b,g,n,m,l) implicit none integer, intent(in) :: n,m,l integer, intent(in) :: g(n*l) real*8, intent(inout) :: b(n,m) integer :: i,j,k k=0 do i=1,n do j=1,m k=k+1 if (k.gt.n*l) return b(i,j)=dble(g(k)) enddo enddo return end subroutine modify_b subroutine op_on_h(h,l,diag,up,down) implicit none integer, intent(in) :: l real*8, intent(in) :: h(l,l) real*8, intent(out) :: diag,up,down integer :: i,j diag=0.d0 do i=1,l diag=diag+h(i,i) enddo up=0.d0 do i=1,l do j=i+1,l up=up+h(i,j) enddo enddo down=0.d0 do i=1,l do j=i+1,l down=down+h(j,i) enddo enddo return end subroutine op_on_h