! simeqC1.f90 1 based subscript, required dimension subroutine simeqC1(n, B, X) implicit none integer, intent(in) :: n double complex, dimension(n,n+1), intent(inout) :: B double complex, dimension(n), intent(out) :: X integer, dimension(n) :: ROW ! ROW INTERCHANGE INDICES integer :: HOLD , I_PIVOT ! PIVOT INDICES double complex :: PIVOT ! PIVOT ELEMENT VALUE double precision :: ABS_PIVOT integer :: i, j, k, m m = n+1 ! SET UP ROW INTERCHANGE VECTORS do k=1,n ROW(k) = k end do ! k ! BEGIN MAIN REDUCTION LOOP do k=1,n ! FIND LARGEST ELEMENT FOR PIVOT PIVOT = B(ROW(k),k) ABS_PIVOT = abs(PIVOT) I_PIVOT = k do i=k,n if( abs(B(ROW(i),k)) > ABS_PIVOT) then I_PIVOT = i PIVOT = B(ROW(i),k) ABS_PIVOT = abs ( PIVOT ) end if end do ! i ! HAVE PIVOT, INTERCHANGE ROW POINTERS HOLD = ROW(k) ROW(k) = ROW(I_PIVOT) ROW(I_PIVOT) = HOLD ! CHECK FOR NEAR SINGULAR if( ABS_PIVOT < 1.0E-10 ) then do j=k+1,n+1 B(ROW(k),j) = 0.0 end do ! j print *, 'redundant row (singular) ', ROW(k) else ! REDUCE ABOUT PIVOT do j=k+1,n+1 B(ROW(k),j) = B(ROW(k),j) / B(ROW(k),k) end do ! j ! INNER REDUCTION LOOP do i=1,n if( i .ne. k) then do j=k+1,n+1 B(ROW(i),j) = B(ROW(i),j) - B(ROW(i),k) * B(ROW(k),j) end do ! j end if end do ! i end if ! FINISHED INNER REDUCTION end do ! k ! END OF MAIN REDUCTION LOOP ! BUILD X FOR RETURN, UNSCRAMBLING ROWS do i=1,n X(i) = B(ROW(i),n+1) end do ! i end subroutine simeqC1