!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! example matrix ! 2.000 1.000 1.000 0.000 0.000 ! 1.000 3.000 0.000 1.000 1.000 ! 1.000 0.000 3.000 0.000 1.000 ! 0.000 1.000 0.000 1.000 1.000 ! 0.000 1.000 1.000 1.000 2.000 ! exact inverse ! 1.000 -0.500 -0.500 0.000 0.500 ! -0.500 0.750 0.250 -0.500 -0.250 ! -0.500 0.250 0.750 0.500 -0.750 ! 0.000 -0.500 0.500 3.000 -1.500 ! 0.500 -0.250 -0.750 -1.500 1.750 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ====================== program test_harville ! ====================== use inv_harville implicit none integer, parameter :: maxneq = 10, maxzhz = 40 integer :: ii, i, neqns, is1, is2 ! set 'seeds' for random no. generator is1 = 123456; is2 = 987650 maxrec = maxzhz; neqns = 5 ! allocate vectors required allocate(ifirst(neqns+1), inext(maxzhz), ivcol(maxzhz), dia(neqns), & & zhz(maxzhz), xvec(neqns), ivec(neqns), stat=ii) if( ii /= 0) stop 'alloc lnklst' ! initialize nrczhz = 0; ifirst = 0 ! store example matrix (lower triangle) in linked list format dia(:neqns) = (/ 2.d0, 3.d0, 3.d0, 1.d0, 2.d0 /) xvec = 1.d0; ivec(1) = 1 call lnkrow( 2, 1 ) ! row 2 call lnkrow( 3, 1 ) ! row 3 ivec(1) = 2; call lnkrow( 4, 1 ) ! row 4 ivec(:3)= (/ 2, 3, 4 /); call lnkrow( 5, 3 ) ! row 5 write(*,*)'no. of non-zero elements: nrczhz=', nrczhz ! sort matrix call lnksrt( neqns ) ! don't need 'next' element any longer after sorting deallocate(inext, stat=ii ); if( ii /= 0 ) stop 'deall inext' ! obtain approximate inverse call harville( neqns, 55000, 5000, is1, is2 ) ! write out diagonal elements of inverse det = 0.d0 do i = 1, neqns write(*,*) i, dia(i) end do end program test_harville