--- /usr/local/petsc-3.1-p7/src/mat/impls/aij/seq/aij.c 2010-03-25 22:13:15.000000000 +0800 +++ /usr/local/petsc-3.1-p5/src/mat/impls/aij/seq/aij.c 2011-02-18 22:21:22.000000000 +0800 @@ -688,6 +688,8 @@ PetscInt m = A->rmap->n,*ip,N,*ailen = a->ilen,rmax = 0; MatScalar *aa = a->a,*ap; PetscReal ratio=0.6; + PetscInt *new_i, *new_j; + MatScalar *new_a; PetscFunctionBegin; if (mode == MAT_FLUSH_ASSEMBLY) PetscFunctionReturn(0); @@ -721,6 +723,19 @@ SETERRQ3(PETSC_ERR_PLIB, "Unused space detected in matrix: %D X %D, %D unneeded", m, A->cmap->n, fshift); } + if(a->maxnz > a->nz) + { + ierr = PetscMalloc3(a->nz,MatScalar,&new_a,a->nz,PetscInt,&new_j,A->rmap->n+1,PetscInt,&new_i);CHKERRQ(ierr); + ierr = PetscMemcpy(new_a,a->a,a->nz*sizeof(MatScalar));CHKERRQ(ierr); + ierr = PetscMemcpy(new_i,a->i,(A->rmap->n+1)*sizeof(PetscInt));CHKERRQ(ierr); + ierr = PetscMemcpy(new_j,a->j,a->nz*sizeof(PetscInt));CHKERRQ(ierr); + ierr = MatSeqXAIJFreeAIJ(A,&a->a,&a->j,&a->i);CHKERRQ(ierr); + a->a = new_a; + a->i = new_i; + a->j = new_j; + a->maxnz = a->nz; + } + ierr = MatMarkDiagonal_SeqAIJ(A);CHKERRQ(ierr); ierr = PetscInfo4(A,"Matrix size: %D X %D; storage space: %D unneeded,%D used\n",m,A->cmap->n,fshift,a->nz);CHKERRQ(ierr); ierr = PetscInfo1(A,"Number of mallocs during MatSetValues() is %D\n",a->reallocs);CHKERRQ(ierr);