00001 subroutine minv(aa,bb,nn,nnz)
00002 use phys_constant, only : long
00003 implicit none
00004 integer :: nn, nnz
00005 real(long) :: aa(nnz,nnz),bb(nnz)
00006 real(long) :: fmax, aab, sig
00007 integer :: nnp1, nnm1
00008 integer :: i, j, k, kp1, ifmax
00009
00010
00011 nnp1 = nn + 1
00012 aa(1:nn,nnp1) = bb(1:nn)
00013
00014 nnm1 = nn - 1
00015 do k = 1, nnm1
00016 kp1 = k + 1
00017
00018 fmax = 1.e-10
00019 ifmax = 1
00020
00021 do i = k, nn
00022 aab = abs(aa(i,k))
00023 if(aab > fmax) then
00024 fmax = aab
00025 ifmax = i
00026 end if
00027 end do
00028 if(ifmax /= k) then
00029 sig = 1.0d0
00030 if(aa(k,k)*aa(ifmax,k) < 0.) sig = -1.0d0
00031 aa(k,1:nnp1) = aa(k,1:nnp1) + sig*aa(ifmax,1:nnp1)
00032 end if
00033
00034 aa(k,kp1:nnp1) = aa(k,kp1:nnp1)/aa(k,k)
00035
00036 do i = kp1, nnp1
00037 aa(kp1:nn, i) = aa(kp1:nn, i) - aa(kp1:nn, k)*aa(k, i)
00038 end do
00039
00040
00041 end do
00042
00043 aa(nn,nnp1) = aa(nn,nnp1)/aa(nn,nn)
00044 do i = 1, nnm1
00045 k = nn - i
00046 kp1 = k + 1
00047 do j = kp1, nn
00048 aa(k,nnp1) = aa(k,nnp1) - aa(k,j)*aa(j,nnp1)
00049 end do
00050 end do
00051
00052
00053 bb (1:nn) = aa(1:nn,nnp1)
00054
00055 end subroutine minv