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