Actual source code: freespace.c

petsc-3.3-p7 2013-05-11
  2: #include <../src/mat/utils/freespace.h>

  6: PetscErrorCode PetscFreeSpaceGet(PetscInt n,PetscFreeSpaceList *list)
  7: {
  8:   PetscFreeSpaceList a;
  9:   PetscErrorCode     ierr;

 12:   PetscMalloc(sizeof(struct _Space),&a);
 13:   PetscMalloc(n*sizeof(PetscInt),&(a->array_head));
 14:   a->array            = a->array_head;
 15:   a->local_remaining  = n;
 16:   a->local_used       = 0;
 17:   a->total_array_size = 0;
 18:   a->more_space       = PETSC_NULL;

 20:   if (*list) {
 21:     (*list)->more_space = a;
 22:     a->total_array_size = (*list)->total_array_size;
 23:   }

 25:   a->total_array_size += n;
 26:   *list               =  a;
 27:   return(0);
 28: }

 32: PetscErrorCode PetscFreeSpaceContiguous(PetscFreeSpaceList *head,PetscInt *space)
 33: {
 34:   PetscFreeSpaceList a;
 35:   PetscErrorCode     ierr;

 38:   while ((*head)) {
 39:     a     =  (*head)->more_space;
 40:      PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(PetscInt));
 41:     space += (*head)->local_used;
 42:      PetscFree((*head)->array_head);
 43:      PetscFree(*head);
 44:     *head =  a;
 45:   }
 46:   return(0);
 47: }

 49: /*
 50:   PetscFreeSpaceContiguous_LU -
 51:     Copy a linket list obtained from matrix symbolic ILU or LU factorization into a contiguous array 
 52:   that enables an efficient matrix triangular solve.

 54:    Input Parameters:
 55: +  head - linked list of column indices obtained from matrix symbolic ILU or LU factorization
 56: .  space - an allocated int array with length nnz of factored matrix. 
 57: .  n - order of the matrix
 58: .  bi - row pointer of factored matrix L with length n+1.
 59: -  bdiag - int array of length n+1. bdiag[i] points to diagonal of U(i,:), and bdiag[n] points to entry of U(n-1,0)-1.

 61:    Output Parameter:
 62: .  space - column indices are copied into this int array with contiguous layout of L and U

 64:    See MatILUFactorSymbolic_SeqAIJ_ilu0() for detailed data structure of L and U
 65: */
 68: PetscErrorCode PetscFreeSpaceContiguous_LU(PetscFreeSpaceList *head,PetscInt *space,PetscInt n,PetscInt *bi,PetscInt *bdiag)
 69: {
 70:   PetscFreeSpaceList a;
 71:   PetscErrorCode     ierr;
 72:   PetscInt           row,nnz,*bj,*array,total,bi_temp;
 73:   PetscInt           nnzL,nnzU;

 76:   bi_temp = bi[n];
 77:   row       = 0;
 78:   total     = 0;
 79:   nnzL  = bdiag[0];
 80:   while ((*head)) {
 81:     total += (*head)->local_used;
 82:     array  = (*head)->array_head;
 83: 
 84:     while (row < n) {
 85:       if (bi[row+1] > total) break;
 86:       /* copy array entries into bj for this row */
 87:       nnz  = bi[row+1] - bi[row];
 88:       /* set bi[row] for new datastruct */
 89:       if (row == 0 ){
 90:         bi[row] = 0;
 91:       } else {
 92:         bi[row] = bi[row-1] + nnzL; /* nnzL of previous row */
 93:       }

 95:       /* L part */
 96:       nnzL = bdiag[row];
 97:       bj   = space+bi[row];
 98:       PetscMemcpy(bj,array,nnzL*sizeof(PetscInt));
 99: 
100:       /* diagonal entry */
101:       bdiag[row] = bi_temp - 1;
102:       space[bdiag[row]] = row;

104:       /* U part */
105:       nnzU        = nnz - nnzL;
106:       bi_temp = bi_temp - nnzU;
107:       nnzU --;      /* exclude diagonal */
108:       bj = space + bi_temp;
109:       PetscMemcpy(bj,array+nnzL+1,nnzU*sizeof(PetscInt));
110:       array += nnz;
111:       row++;
112:     }

114:     a     = (*head)->more_space;
115:     PetscFree((*head)->array_head);
116:     PetscFree(*head);
117:     *head = a;
118:   }
119:   if (n) {
120:     bi[n] = bi[n-1] + nnzL;
121:     bdiag[n] = bdiag[n-1]-1;
122:   }
123:   return(0);
124: }

126: /*
127:   PetscFreeSpaceContiguous_Cholesky -
128:     Copy a linket list obtained from matrix symbolic ICC or Cholesky factorization into a contiguous array 
129:   that enables an efficient matrix triangular solve.

131:    Input Parameters:
132: +  head - linked list of column indices obtained from matrix symbolic ICC or Cholesky factorization
133: .  space - an allocated int array with length nnz of factored matrix. 
134: .  n - order of the matrix
135: .  ui - row pointer of factored matrix with length n+1. All entries are set based on the traditional layout U matrix.
136: -  udiag - int array of length n.

138:    Output Parameter:
139: +  space - column indices are copied into this int array with contiguous layout of U, with diagonal located as the last entry in each row
140: -  udiag - indices of diagonal entries

142:    See MatICCFactorSymbolic_SeqAIJ_newdatastruct() for detailed description.
143: */

147: PetscErrorCode PetscFreeSpaceContiguous_Cholesky(PetscFreeSpaceList *head,PetscInt *space,PetscInt n,PetscInt *ui,PetscInt *udiag)
148: {
149:   PetscFreeSpaceList a;
150:   PetscErrorCode     ierr;
151:   PetscInt           row,nnz,*uj,*array,total;

154:   row   = 0;
155:   total = 0;
156:   while (*head) {
157:     total += (*head)->local_used;
158:     array  = (*head)->array_head;
159: 
160:     while (row < n){
161:       if (ui[row+1] > total) break;
162:       udiag[row] = ui[row+1] - 1;     /* points to the last entry of U(row,:) */
163:       nnz  = ui[row+1] - ui[row] - 1; /* exclude diagonal */
164:       uj   = space + ui[row];
165:       PetscMemcpy(uj,array+1,nnz*sizeof(PetscInt));
166:       uj[nnz] = array[0]; /* diagonal */
167:       array += nnz + 1;
168:       row++;
169:     }

171:     a     = (*head)->more_space;
172:     PetscFree((*head)->array_head);
173:     PetscFree(*head);
174:     *head = a;
175:   }
176:   return(0);
177: }

181: PetscErrorCode PetscFreeSpaceDestroy(PetscFreeSpaceList head)
182: {
183:   PetscFreeSpaceList a;
184:   PetscErrorCode     ierr;

187:   while ((head)) {
188:     a    = (head)->more_space;
189:     PetscFree((head)->array_head);
190:     PetscFree(head);
191:     head = a;
192:   }
193:   return(0);
194: }