Download csort.eso

Back to the list

   1 : C CSORT     SOURCE    CHAT      05/01/12    22:32:01     5004           
   2 :       SUBROUTINE CSORT(N,A,JA,IA,IWORK,VALUES) 
   3 :       IMPLICIT INTEGER(I-N)
   4 :       IMPLICIT REAL*8 (A-H,O-Z)
   5 : C***********************************************************************
   6 : C NOM         : CSORT
   7 : C DESCRIPTION : Ordonnancement du profil ou d'une matrice Morse. 
   8 : C
   9 : C
  10 : C LANGAGE     : FORTRAN 77
  11 : C ADAPTATION  :  Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  12 : C                mél : gounand@semt2.smts.cea.fr
  13 : C AUTEUR      :
  14 : C  Sparskit : a basic tool kit for sparse matrix computations
  15 : C  Version 2 (Youcef Saad)
  16 : C  -> URL : http://www.cs.umn.edu/Research/arpa/SPARSKIT/sparskit.html
  17 : C
  18 : C***********************************************************************
  19 :       LOGICAL VALUES
  20 :       INTEGER N, JA(*), IA(N+1), IWORK(*) 
  21 :       REAL*8 A(*) 
  22 : c-----------------------------------------------------------------------
  23 : c This routine sorts the elements of  a matrix (stored in Compressed
  24 : c Sparse Row Format) in increasing order of their column indices within 
  25 : c each row. It uses a form of bucket sort with a cost of O(nnz) where
  26 : c nnz = number of nonzero elements. 
  27 : c requires an integer work array of length 2*nnz.  
  28 : c-----------------------------------------------------------------------
  29 : c on entry:
  30 : c--------- 
  31 : c n     = the row dimension of the matrix
  32 : c a     = the matrix A in compressed sparse row format.
  33 : c ja    = the array of column indices of the elements in array a.
  34 : c ia    = the array of pointers to the rows. 
  35 : c iwork = integer work array of length max ( n+1, 2*nnz ) 
  36 : c         where nnz = (ia(n+1)-ia(1))  ) .
  37 : c values= logical indicating whether or not the real values a(*) must 
  38 : c         also be permuted. if (.not. values) then the array a is not
  39 : c         touched by csort and can be a dummy array. 
  40 : c 
  41 : c on return:
  42 : c----------
  43 : c the matrix stored in the structure a, ja, ia is permuted in such a
  44 : c way that the column indices are in increasing order within each row.
  45 : c iwork(1:nnz) contains the permutation used  to rearrange the elements.
  46 : c----------------------------------------------------------------------- 
  47 : c Y. Saad - Feb. 1, 1991.
  48 : c-----------------------------------------------------------------------
  49 : c local variables
  50 :       INTEGER I, K, J, IFIRST, NNZ, NEXT
  51 :       INTEGER IROW,KO
  52 : c
  53 : c count the number of elements in each column
  54 : c
  55 : * gounand : déjà fait
  56 : *      DO 1 I=1,N+1
  57 : *         IWORK(I) = 0
  58 : * 1    CONTINUE
  59 :       DO 3 I=1, N
  60 :          DO 2 K=IA(I), IA(I+1)-1 
  61 :             J = JA(K)+1
  62 :             IWORK(J) = IWORK(J)+1
  63 :  2       CONTINUE 
  64 :  3    CONTINUE
  65 : c
  66 : c compute pointers from lengths. 
  67 : c
  68 :       IWORK(1) = 1
  69 :       DO 4 I=1,N
  70 :          IWORK(I+1) = IWORK(I) + IWORK(I+1)
  71 :  4    CONTINUE
  72 : C 
  73 : C get the positions of the nonzero elements in order of columns.
  74 : C
  75 :       IFIRST = IA(1) 
  76 :       NNZ = IA(N+1)-IFIRST
  77 :       DO 5 I=1,N
  78 :          DO 51 K=IA(I),IA(I+1)-1 
  79 :             J = JA(K) 
  80 :             NEXT = IWORK(J) 
  81 :             IWORK(NNZ+NEXT) = K
  82 :             IWORK(J) = NEXT+1
  83 :  51      CONTINUE
  84 :  5    CONTINUE
  85 : c
  86 : c convert to coordinate format
  87 : c 
  88 :       DO 6 I=1, N
  89 :          DO 61 K=IA(I), IA(I+1)-1 
  90 :             IWORK(K) = I
  91 :  61      CONTINUE
  92 :  6    CONTINUE
  93 : c
  94 : c loop to find permutation: for each element find the correct 
  95 : c position in (sorted) arrays a, ja. Record this in iwork. 
  96 : c 
  97 :       DO 7 K=1, NNZ
  98 :          KO = IWORK(NNZ+K) 
  99 :          IROW = IWORK(KO)
 100 :          NEXT = IA(IROW)
 101 : c
 102 : c the current element should go in next position in row. iwork
 103 : c records this position. 
 104 : c 
 105 :          IWORK(KO) = NEXT
 106 :          IA(IROW)  = NEXT+1
 107 :  7       CONTINUE
 108 : c
 109 : c perform an in-place permutation of the  arrays.
 110 : c 
 110 :          CALL IVPERM (NNZ, JA(IFIRST), IWORK) 
 110 :          IF (VALUES) CALL DVPERM (NNZ, A(IFIRST), IWORK) 
 111 : c
 112 : c reshift the pointers of the original matrix back.
 113 : c 
 114 :       DO 8 I=N,1,-1
 115 :          IA(I+1) = IA(I)
 116 :  8    CONTINUE
 117 :       IA(1) = IFIRST 
 118 : c
 119 :       RETURN 
 120 : c---------------end-of-csort-------------------------------------------- 
 121 : c-----------------------------------------------------------------------
 122 :       END
 123 :  
 124 :  

© Cast3M 2003 - All rights reserved.
Disclaimer