1992c00aaSSatish Balay #define PETSCMAT_DLL 2b3cc6726SBarry Smith 3b377110cSBarry Smith 4d5d45c9bSBarry Smith /* 53369ce9aSBarry Smith Defines the basic matrix operations for the AIJ (compressed row) 6d5d45c9bSBarry Smith matrix storage format. 7d5d45c9bSBarry Smith */ 83369ce9aSBarry Smith 97c4f633dSBarry Smith 107c4f633dSBarry Smith #include "../src/mat/impls/aij/seq/aij.h" /*I "petscmat.h" I*/ 110a835dfdSSatish Balay #include "petscbt.h" 1217ab2063SBarry Smith 134a2ae208SSatish Balay #undef __FUNCT__ 1479299369SBarry Smith #define __FUNCT__ "MatDiagonalSet_SeqAIJ" 1579299369SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalSet_SeqAIJ(Mat Y,Vec D,InsertMode is) 1679299369SBarry Smith { 1779299369SBarry Smith PetscErrorCode ierr; 1879299369SBarry Smith Mat_SeqAIJ *aij = (Mat_SeqAIJ*) Y->data; 19d0f46423SBarry Smith PetscInt i,*diag, m = Y->rmap->n; 2054f21887SBarry Smith MatScalar *aa = aij->a; 2154f21887SBarry Smith PetscScalar *v; 2209f38230SBarry Smith PetscTruth missing; 2379299369SBarry Smith 2479299369SBarry Smith PetscFunctionBegin; 2509f38230SBarry Smith if (Y->assembled) { 2609f38230SBarry Smith ierr = MatMissingDiagonal_SeqAIJ(Y,&missing,PETSC_NULL);CHKERRQ(ierr); 2709f38230SBarry Smith if (!missing) { 2879299369SBarry Smith diag = aij->diag; 2979299369SBarry Smith ierr = VecGetArray(D,&v);CHKERRQ(ierr); 3079299369SBarry Smith if (is == INSERT_VALUES) { 3179299369SBarry Smith for (i=0; i<m; i++) { 3279299369SBarry Smith aa[diag[i]] = v[i]; 3379299369SBarry Smith } 3479299369SBarry Smith } else { 3579299369SBarry Smith for (i=0; i<m; i++) { 3679299369SBarry Smith aa[diag[i]] += v[i]; 3779299369SBarry Smith } 3879299369SBarry Smith } 3979299369SBarry Smith ierr = VecRestoreArray(D,&v);CHKERRQ(ierr); 4079299369SBarry Smith PetscFunctionReturn(0); 4179299369SBarry Smith } 4209f38230SBarry Smith } 4309f38230SBarry Smith ierr = MatDiagonalSet_Default(Y,D,is);CHKERRQ(ierr); 4409f38230SBarry Smith PetscFunctionReturn(0); 4509f38230SBarry Smith } 4679299369SBarry Smith 4779299369SBarry Smith #undef __FUNCT__ 484a2ae208SSatish Balay #define __FUNCT__ "MatGetRowIJ_SeqAIJ" 49*3acb8795SBarry Smith PetscErrorCode MatGetRowIJ_SeqAIJ(Mat A,PetscInt oshift,PetscTruth symmetric,PetscTruth inodecompressed,PetscInt *m,PetscInt *ia[],PetscInt *ja[],PetscTruth *done) 5017ab2063SBarry Smith { 51416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 52dfbe8321SBarry Smith PetscErrorCode ierr; 5397f1f81fSBarry Smith PetscInt i,ishift; 5417ab2063SBarry Smith 553a40ed3dSBarry Smith PetscFunctionBegin; 56d0f46423SBarry Smith *m = A->rmap->n; 573a40ed3dSBarry Smith if (!ia) PetscFunctionReturn(0); 58bfeeae90SHong Zhang ishift = 0; 5953e63a63SBarry Smith if (symmetric && !A->structurally_symmetric) { 60d0f46423SBarry Smith ierr = MatToSymmetricIJ_SeqAIJ(A->rmap->n,a->i,a->j,ishift,oshift,ia,ja);CHKERRQ(ierr); 61bfeeae90SHong Zhang } else if (oshift == 1) { 62d0f46423SBarry Smith PetscInt nz = a->i[A->rmap->n]; 633b2fbd54SBarry Smith /* malloc space and add 1 to i and j indices */ 64d0f46423SBarry Smith ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscInt),ia);CHKERRQ(ierr); 65d0f46423SBarry Smith for (i=0; i<A->rmap->n+1; i++) (*ia)[i] = a->i[i] + 1; 66ecc77c7aSBarry Smith if (ja) { 6797f1f81fSBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscInt),ja);CHKERRQ(ierr); 683b2fbd54SBarry Smith for (i=0; i<nz; i++) (*ja)[i] = a->j[i] + 1; 69ecc77c7aSBarry Smith } 706945ee14SBarry Smith } else { 71ecc77c7aSBarry Smith *ia = a->i; 72ecc77c7aSBarry Smith if (ja) *ja = a->j; 73a2ce50c7SBarry Smith } 743a40ed3dSBarry Smith PetscFunctionReturn(0); 75a2744918SBarry Smith } 76a2744918SBarry Smith 774a2ae208SSatish Balay #undef __FUNCT__ 784a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRowIJ_SeqAIJ" 79*3acb8795SBarry Smith PetscErrorCode MatRestoreRowIJ_SeqAIJ(Mat A,PetscInt oshift,PetscTruth symmetric,PetscTruth inodecompressed,PetscInt *n,PetscInt *ia[],PetscInt *ja[],PetscTruth *done) 806945ee14SBarry Smith { 81dfbe8321SBarry Smith PetscErrorCode ierr; 826945ee14SBarry Smith 833a40ed3dSBarry Smith PetscFunctionBegin; 843a40ed3dSBarry Smith if (!ia) PetscFunctionReturn(0); 85bfeeae90SHong Zhang if ((symmetric && !A->structurally_symmetric) || oshift == 1) { 86606d414cSSatish Balay ierr = PetscFree(*ia);CHKERRQ(ierr); 87ecc77c7aSBarry Smith if (ja) {ierr = PetscFree(*ja);CHKERRQ(ierr);} 88bcd2baecSBarry Smith } 893a40ed3dSBarry Smith PetscFunctionReturn(0); 9017ab2063SBarry Smith } 9117ab2063SBarry Smith 924a2ae208SSatish Balay #undef __FUNCT__ 934a2ae208SSatish Balay #define __FUNCT__ "MatGetColumnIJ_SeqAIJ" 94*3acb8795SBarry Smith PetscErrorCode MatGetColumnIJ_SeqAIJ(Mat A,PetscInt oshift,PetscTruth symmetric,PetscTruth inodecompressed,PetscInt *nn,PetscInt *ia[],PetscInt *ja[],PetscTruth *done) 953b2fbd54SBarry Smith { 963b2fbd54SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 97dfbe8321SBarry Smith PetscErrorCode ierr; 98d0f46423SBarry Smith PetscInt i,*collengths,*cia,*cja,n = A->cmap->n,m = A->rmap->n; 9997f1f81fSBarry Smith PetscInt nz = a->i[m],row,*jj,mr,col; 1003b2fbd54SBarry Smith 1013a40ed3dSBarry Smith PetscFunctionBegin; 102899cda47SBarry Smith *nn = n; 1033a40ed3dSBarry Smith if (!ia) PetscFunctionReturn(0); 1043b2fbd54SBarry Smith if (symmetric) { 105d0f46423SBarry Smith ierr = MatToSymmetricIJ_SeqAIJ(A->rmap->n,a->i,a->j,0,oshift,ia,ja);CHKERRQ(ierr); 1063b2fbd54SBarry Smith } else { 10797f1f81fSBarry Smith ierr = PetscMalloc((n+1)*sizeof(PetscInt),&collengths);CHKERRQ(ierr); 10897f1f81fSBarry Smith ierr = PetscMemzero(collengths,n*sizeof(PetscInt));CHKERRQ(ierr); 10997f1f81fSBarry Smith ierr = PetscMalloc((n+1)*sizeof(PetscInt),&cia);CHKERRQ(ierr); 11097f1f81fSBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&cja);CHKERRQ(ierr); 1113b2fbd54SBarry Smith jj = a->j; 1123b2fbd54SBarry Smith for (i=0; i<nz; i++) { 113bfeeae90SHong Zhang collengths[jj[i]]++; 1143b2fbd54SBarry Smith } 1153b2fbd54SBarry Smith cia[0] = oshift; 1163b2fbd54SBarry Smith for (i=0; i<n; i++) { 1173b2fbd54SBarry Smith cia[i+1] = cia[i] + collengths[i]; 1183b2fbd54SBarry Smith } 11997f1f81fSBarry Smith ierr = PetscMemzero(collengths,n*sizeof(PetscInt));CHKERRQ(ierr); 1203b2fbd54SBarry Smith jj = a->j; 121a93ec695SBarry Smith for (row=0; row<m; row++) { 122a93ec695SBarry Smith mr = a->i[row+1] - a->i[row]; 123a93ec695SBarry Smith for (i=0; i<mr; i++) { 124bfeeae90SHong Zhang col = *jj++; 1253b2fbd54SBarry Smith cja[cia[col] + collengths[col]++ - oshift] = row + oshift; 1263b2fbd54SBarry Smith } 1273b2fbd54SBarry Smith } 128606d414cSSatish Balay ierr = PetscFree(collengths);CHKERRQ(ierr); 1293b2fbd54SBarry Smith *ia = cia; *ja = cja; 1303b2fbd54SBarry Smith } 1313a40ed3dSBarry Smith PetscFunctionReturn(0); 1323b2fbd54SBarry Smith } 1333b2fbd54SBarry Smith 1344a2ae208SSatish Balay #undef __FUNCT__ 1354a2ae208SSatish Balay #define __FUNCT__ "MatRestoreColumnIJ_SeqAIJ" 136*3acb8795SBarry Smith PetscErrorCode MatRestoreColumnIJ_SeqAIJ(Mat A,PetscInt oshift,PetscTruth symmetric,PetscTruth inodecompressed,PetscInt *n,PetscInt *ia[],PetscInt *ja[],PetscTruth *done) 1373b2fbd54SBarry Smith { 138dfbe8321SBarry Smith PetscErrorCode ierr; 139606d414cSSatish Balay 1403a40ed3dSBarry Smith PetscFunctionBegin; 1413a40ed3dSBarry Smith if (!ia) PetscFunctionReturn(0); 1423b2fbd54SBarry Smith 143606d414cSSatish Balay ierr = PetscFree(*ia);CHKERRQ(ierr); 144606d414cSSatish Balay ierr = PetscFree(*ja);CHKERRQ(ierr); 1453b2fbd54SBarry Smith 1463a40ed3dSBarry Smith PetscFunctionReturn(0); 1473b2fbd54SBarry Smith } 1483b2fbd54SBarry Smith 14987d4246cSBarry Smith #undef __FUNCT__ 15087d4246cSBarry Smith #define __FUNCT__ "MatSetValuesRow_SeqAIJ" 15187d4246cSBarry Smith PetscErrorCode MatSetValuesRow_SeqAIJ(Mat A,PetscInt row,const PetscScalar v[]) 15287d4246cSBarry Smith { 15387d4246cSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 15487d4246cSBarry Smith PetscInt *ai = a->i; 15587d4246cSBarry Smith PetscErrorCode ierr; 15687d4246cSBarry Smith 15787d4246cSBarry Smith PetscFunctionBegin; 15887d4246cSBarry Smith ierr = PetscMemcpy(a->a+ai[row],v,(ai[row+1]-ai[row])*sizeof(PetscScalar));CHKERRQ(ierr); 15987d4246cSBarry Smith PetscFunctionReturn(0); 16087d4246cSBarry Smith } 16187d4246cSBarry Smith 162227d817aSBarry Smith #define CHUNKSIZE 15 16317ab2063SBarry Smith 1644a2ae208SSatish Balay #undef __FUNCT__ 1654a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqAIJ" 16697f1f81fSBarry Smith PetscErrorCode MatSetValues_SeqAIJ(Mat A,PetscInt m,const PetscInt im[],PetscInt n,const PetscInt in[],const PetscScalar v[],InsertMode is) 16717ab2063SBarry Smith { 168416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 169e2ee6c50SBarry Smith PetscInt *rp,k,low,high,t,ii,row,nrow,i,col,l,rmax,N; 17097f1f81fSBarry Smith PetscInt *imax = a->imax,*ai = a->i,*ailen = a->ilen; 1716849ba73SBarry Smith PetscErrorCode ierr; 172e2ee6c50SBarry Smith PetscInt *aj = a->j,nonew = a->nonew,lastcol = -1; 17354f21887SBarry Smith MatScalar *ap,value,*aa = a->a; 174edb03aefSBarry Smith PetscTruth ignorezeroentries = a->ignorezeroentries; 175273d9f13SBarry Smith PetscTruth roworiented = a->roworiented; 17617ab2063SBarry Smith 1773a40ed3dSBarry Smith PetscFunctionBegin; 17817ab2063SBarry Smith for (k=0; k<m; k++) { /* loop over added rows */ 179416022c9SBarry Smith row = im[k]; 1805ef9f2a5SBarry Smith if (row < 0) continue; 1812515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 182d0f46423SBarry Smith if (row >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",row,A->rmap->n-1); 1833b2fbd54SBarry Smith #endif 184bfeeae90SHong Zhang rp = aj + ai[row]; ap = aa + ai[row]; 18517ab2063SBarry Smith rmax = imax[row]; nrow = ailen[row]; 186416022c9SBarry Smith low = 0; 187c71e6ed7SBarry Smith high = nrow; 18817ab2063SBarry Smith for (l=0; l<n; l++) { /* loop over added columns */ 1895ef9f2a5SBarry Smith if (in[l] < 0) continue; 1902515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 191d0f46423SBarry Smith if (in[l] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",in[l],A->cmap->n-1); 1923b2fbd54SBarry Smith #endif 193bfeeae90SHong Zhang col = in[l]; 19416371a99SBarry Smith if (v) { 1954b0e389bSBarry Smith if (roworiented) { 1965ef9f2a5SBarry Smith value = v[l + k*n]; 197bef8e0ddSBarry Smith } else { 1984b0e389bSBarry Smith value = v[k + l*m]; 1994b0e389bSBarry Smith } 20016371a99SBarry Smith } else { 20116371a99SBarry Smith value = 0; 20216371a99SBarry Smith } 203abc0a331SBarry Smith if (value == 0.0 && ignorezeroentries && (is == ADD_VALUES)) continue; 20436db0b34SBarry Smith 2057cd84e04SBarry Smith if (col <= lastcol) low = 0; else high = nrow; 206e2ee6c50SBarry Smith lastcol = col; 207416022c9SBarry Smith while (high-low > 5) { 208416022c9SBarry Smith t = (low+high)/2; 209416022c9SBarry Smith if (rp[t] > col) high = t; 210416022c9SBarry Smith else low = t; 21117ab2063SBarry Smith } 212416022c9SBarry Smith for (i=low; i<high; i++) { 21317ab2063SBarry Smith if (rp[i] > col) break; 21417ab2063SBarry Smith if (rp[i] == col) { 215416022c9SBarry Smith if (is == ADD_VALUES) ap[i] += value; 21617ab2063SBarry Smith else ap[i] = value; 217e44c0bd4SBarry Smith low = i + 1; 21817ab2063SBarry Smith goto noinsert; 21917ab2063SBarry Smith } 22017ab2063SBarry Smith } 221abc0a331SBarry Smith if (value == 0.0 && ignorezeroentries) goto noinsert; 222c2653b3dSLois Curfman McInnes if (nonew == 1) goto noinsert; 223cc72174dSBarry Smith if (nonew == -1) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Inserting a new nonzero at (%D,%D) in the matrix",row,col); 224d0f46423SBarry Smith MatSeqXAIJReallocateAIJ(A,A->rmap->n,1,nrow,row,col,rmax,aa,ai,aj,rp,ap,imax,nonew,MatScalar); 225c03d1d03SSatish Balay N = nrow++ - 1; a->nz++; high++; 226416022c9SBarry Smith /* shift up all the later entries in this row */ 227416022c9SBarry Smith for (ii=N; ii>=i; ii--) { 22817ab2063SBarry Smith rp[ii+1] = rp[ii]; 22917ab2063SBarry Smith ap[ii+1] = ap[ii]; 23017ab2063SBarry Smith } 23117ab2063SBarry Smith rp[i] = col; 23217ab2063SBarry Smith ap[i] = value; 233416022c9SBarry Smith low = i + 1; 234e44c0bd4SBarry Smith noinsert:; 23517ab2063SBarry Smith } 23617ab2063SBarry Smith ailen[row] = nrow; 23717ab2063SBarry Smith } 23888e51ccdSHong Zhang A->same_nonzero = PETSC_FALSE; 2393a40ed3dSBarry Smith PetscFunctionReturn(0); 24017ab2063SBarry Smith } 24117ab2063SBarry Smith 24281824310SBarry Smith 2434a2ae208SSatish Balay #undef __FUNCT__ 2444a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqAIJ" 245a77337e4SBarry Smith PetscErrorCode MatGetValues_SeqAIJ(Mat A,PetscInt m,const PetscInt im[],PetscInt n,const PetscInt in[],PetscScalar v[]) 2467eb43aa7SLois Curfman McInnes { 2477eb43aa7SLois Curfman McInnes Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 24897f1f81fSBarry Smith PetscInt *rp,k,low,high,t,row,nrow,i,col,l,*aj = a->j; 24997f1f81fSBarry Smith PetscInt *ai = a->i,*ailen = a->ilen; 25054f21887SBarry Smith MatScalar *ap,*aa = a->a; 2517eb43aa7SLois Curfman McInnes 2523a40ed3dSBarry Smith PetscFunctionBegin; 2537eb43aa7SLois Curfman McInnes for (k=0; k<m; k++) { /* loop over rows */ 2547eb43aa7SLois Curfman McInnes row = im[k]; 25597e567efSBarry Smith if (row < 0) {v += n; continue;} /* SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Negative row: %D",row); */ 256d0f46423SBarry Smith if (row >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",row,A->rmap->n-1); 257bfeeae90SHong Zhang rp = aj + ai[row]; ap = aa + ai[row]; 2587eb43aa7SLois Curfman McInnes nrow = ailen[row]; 2597eb43aa7SLois Curfman McInnes for (l=0; l<n; l++) { /* loop over columns */ 26097e567efSBarry Smith if (in[l] < 0) {v++; continue;} /* SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Negative column: %D",in[l]); */ 261d0f46423SBarry Smith if (in[l] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",in[l],A->cmap->n-1); 262bfeeae90SHong Zhang col = in[l] ; 2637eb43aa7SLois Curfman McInnes high = nrow; low = 0; /* assume unsorted */ 2647eb43aa7SLois Curfman McInnes while (high-low > 5) { 2657eb43aa7SLois Curfman McInnes t = (low+high)/2; 2667eb43aa7SLois Curfman McInnes if (rp[t] > col) high = t; 2677eb43aa7SLois Curfman McInnes else low = t; 2687eb43aa7SLois Curfman McInnes } 2697eb43aa7SLois Curfman McInnes for (i=low; i<high; i++) { 2707eb43aa7SLois Curfman McInnes if (rp[i] > col) break; 2717eb43aa7SLois Curfman McInnes if (rp[i] == col) { 272b49de8d1SLois Curfman McInnes *v++ = ap[i]; 2737eb43aa7SLois Curfman McInnes goto finished; 2747eb43aa7SLois Curfman McInnes } 2757eb43aa7SLois Curfman McInnes } 27697e567efSBarry Smith *v++ = 0.0; 2777eb43aa7SLois Curfman McInnes finished:; 2787eb43aa7SLois Curfman McInnes } 2797eb43aa7SLois Curfman McInnes } 2803a40ed3dSBarry Smith PetscFunctionReturn(0); 2817eb43aa7SLois Curfman McInnes } 2827eb43aa7SLois Curfman McInnes 28317ab2063SBarry Smith 2844a2ae208SSatish Balay #undef __FUNCT__ 2854a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqAIJ_Binary" 286dfbe8321SBarry Smith PetscErrorCode MatView_SeqAIJ_Binary(Mat A,PetscViewer viewer) 28717ab2063SBarry Smith { 288416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 2896849ba73SBarry Smith PetscErrorCode ierr; 2906f69ff64SBarry Smith PetscInt i,*col_lens; 2916f69ff64SBarry Smith int fd; 29217ab2063SBarry Smith 2933a40ed3dSBarry Smith PetscFunctionBegin; 294b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 295d0f46423SBarry Smith ierr = PetscMalloc((4+A->rmap->n)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 296552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 297d0f46423SBarry Smith col_lens[1] = A->rmap->n; 298d0f46423SBarry Smith col_lens[2] = A->cmap->n; 299416022c9SBarry Smith col_lens[3] = a->nz; 300416022c9SBarry Smith 301416022c9SBarry Smith /* store lengths of each row and write (including header) to file */ 302d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 303416022c9SBarry Smith col_lens[4+i] = a->i[i+1] - a->i[i]; 30417ab2063SBarry Smith } 305d0f46423SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+A->rmap->n,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 306606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 307416022c9SBarry Smith 308416022c9SBarry Smith /* store column indices (zero start index) */ 3096f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,a->j,a->nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 310416022c9SBarry Smith 311416022c9SBarry Smith /* store nonzero values */ 3126f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,a->a,a->nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 3133a40ed3dSBarry Smith PetscFunctionReturn(0); 31417ab2063SBarry Smith } 315416022c9SBarry Smith 316dfbe8321SBarry Smith EXTERN PetscErrorCode MatSeqAIJFactorInfo_Matlab(Mat,PetscViewer); 317cd155464SBarry Smith 3184a2ae208SSatish Balay #undef __FUNCT__ 3194a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqAIJ_ASCII" 320dfbe8321SBarry Smith PetscErrorCode MatView_SeqAIJ_ASCII(Mat A,PetscViewer viewer) 321416022c9SBarry Smith { 322416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 323dfbe8321SBarry Smith PetscErrorCode ierr; 324d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,shift=0; 325e060cb09SBarry Smith const char *name; 326f3ef73ceSBarry Smith PetscViewerFormat format; 32717ab2063SBarry Smith 3283a40ed3dSBarry Smith PetscFunctionBegin; 329435da068SBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 330b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 33171c2f376SKris Buschelman if (format == PETSC_VIEWER_ASCII_MATLAB) { 33297f1f81fSBarry Smith PetscInt nofinalvalue = 0; 333d0f46423SBarry Smith if ((a->i[m] == a->i[m-1]) || (a->j[a->nz-1] != A->cmap->n-!shift)) { 334d00d2cf4SBarry Smith nofinalvalue = 1; 335d00d2cf4SBarry Smith } 336b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 337d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",m,A->cmap->n);CHKERRQ(ierr); 33877431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Nonzeros = %D \n",a->nz);CHKERRQ(ierr); 33977431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"zzz = zeros(%D,3);\n",a->nz+nofinalvalue);CHKERRQ(ierr); 340b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"zzz = [\n");CHKERRQ(ierr); 34117ab2063SBarry Smith 34217ab2063SBarry Smith for (i=0; i<m; i++) { 343416022c9SBarry Smith for (j=a->i[i]+shift; j<a->i[i+1]+shift; j++) { 344aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 34577431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%D %D %18.16e + %18.16ei \n",i+1,a->j[j]+!shift,PetscRealPart(a->a[j]),PetscImaginaryPart(a->a[j]));CHKERRQ(ierr); 34617ab2063SBarry Smith #else 34777431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%D %D %18.16e\n",i+1,a->j[j]+!shift,a->a[j]);CHKERRQ(ierr); 34817ab2063SBarry Smith #endif 34917ab2063SBarry Smith } 35017ab2063SBarry Smith } 351d00d2cf4SBarry Smith if (nofinalvalue) { 352d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%D %D %18.16e\n",m,A->cmap->n,0.0);CHKERRQ(ierr); 353d00d2cf4SBarry Smith } 354fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"];\n %s = spconvert(zzz);\n",name);CHKERRQ(ierr); 355b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 35668369a75SKris Buschelman } else if (format == PETSC_VIEWER_ASCII_FACTOR_INFO || format == PETSC_VIEWER_ASCII_INFO) { 357cd155464SBarry Smith PetscFunctionReturn(0); 358fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 359b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 36044cd7ae7SLois Curfman McInnes for (i=0; i<m; i++) { 36177431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 36244cd7ae7SLois Curfman McInnes for (j=a->i[i]+shift; j<a->i[i+1]+shift; j++) { 363aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 36436db0b34SBarry Smith if (PetscImaginaryPart(a->a[j]) > 0.0 && PetscRealPart(a->a[j]) != 0.0) { 365a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i)",a->j[j]+shift,PetscRealPart(a->a[j]),PetscImaginaryPart(a->a[j]));CHKERRQ(ierr); 36636db0b34SBarry Smith } else if (PetscImaginaryPart(a->a[j]) < 0.0 && PetscRealPart(a->a[j]) != 0.0) { 367a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G - %G i)",a->j[j]+shift,PetscRealPart(a->a[j]),-PetscImaginaryPart(a->a[j]));CHKERRQ(ierr); 36836db0b34SBarry Smith } else if (PetscRealPart(a->a[j]) != 0.0) { 369a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",a->j[j]+shift,PetscRealPart(a->a[j]));CHKERRQ(ierr); 3706831982aSBarry Smith } 37144cd7ae7SLois Curfman McInnes #else 372a83599f4SBarry Smith if (a->a[j] != 0.0) {ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",a->j[j]+shift,a->a[j]);CHKERRQ(ierr);} 37344cd7ae7SLois Curfman McInnes #endif 37444cd7ae7SLois Curfman McInnes } 375b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 37644cd7ae7SLois Curfman McInnes } 377b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 378fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_SYMMODU) { 37997f1f81fSBarry Smith PetscInt nzd=0,fshift=1,*sptr; 380b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 38197f1f81fSBarry Smith ierr = PetscMalloc((m+1)*sizeof(PetscInt),&sptr);CHKERRQ(ierr); 382496be53dSLois Curfman McInnes for (i=0; i<m; i++) { 383496be53dSLois Curfman McInnes sptr[i] = nzd+1; 384496be53dSLois Curfman McInnes for (j=a->i[i]+shift; j<a->i[i+1]+shift; j++) { 385496be53dSLois Curfman McInnes if (a->j[j] >= i) { 386aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 38736db0b34SBarry Smith if (PetscImaginaryPart(a->a[j]) != 0.0 || PetscRealPart(a->a[j]) != 0.0) nzd++; 388496be53dSLois Curfman McInnes #else 389496be53dSLois Curfman McInnes if (a->a[j] != 0.0) nzd++; 390496be53dSLois Curfman McInnes #endif 391496be53dSLois Curfman McInnes } 392496be53dSLois Curfman McInnes } 393496be53dSLois Curfman McInnes } 3942e44a96cSLois Curfman McInnes sptr[m] = nzd+1; 39577431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," %D %D\n\n",m,nzd);CHKERRQ(ierr); 3962e44a96cSLois Curfman McInnes for (i=0; i<m+1; i+=6) { 39777431f27SBarry Smith if (i+4<m) {ierr = PetscViewerASCIIPrintf(viewer," %D %D %D %D %D %D\n",sptr[i],sptr[i+1],sptr[i+2],sptr[i+3],sptr[i+4],sptr[i+5]);CHKERRQ(ierr);} 39877431f27SBarry Smith else if (i+3<m) {ierr = PetscViewerASCIIPrintf(viewer," %D %D %D %D %D\n",sptr[i],sptr[i+1],sptr[i+2],sptr[i+3],sptr[i+4]);CHKERRQ(ierr);} 39977431f27SBarry Smith else if (i+2<m) {ierr = PetscViewerASCIIPrintf(viewer," %D %D %D %D\n",sptr[i],sptr[i+1],sptr[i+2],sptr[i+3]);CHKERRQ(ierr);} 40077431f27SBarry Smith else if (i+1<m) {ierr = PetscViewerASCIIPrintf(viewer," %D %D %D\n",sptr[i],sptr[i+1],sptr[i+2]);CHKERRQ(ierr);} 40177431f27SBarry Smith else if (i<m) {ierr = PetscViewerASCIIPrintf(viewer," %D %D\n",sptr[i],sptr[i+1]);CHKERRQ(ierr);} 40277431f27SBarry Smith else {ierr = PetscViewerASCIIPrintf(viewer," %D\n",sptr[i]);CHKERRQ(ierr);} 403496be53dSLois Curfman McInnes } 404b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 405606d414cSSatish Balay ierr = PetscFree(sptr);CHKERRQ(ierr); 406496be53dSLois Curfman McInnes for (i=0; i<m; i++) { 407496be53dSLois Curfman McInnes for (j=a->i[i]+shift; j<a->i[i+1]+shift; j++) { 40877431f27SBarry Smith if (a->j[j] >= i) {ierr = PetscViewerASCIIPrintf(viewer," %D ",a->j[j]+fshift);CHKERRQ(ierr);} 409496be53dSLois Curfman McInnes } 410b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 411496be53dSLois Curfman McInnes } 412b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 413496be53dSLois Curfman McInnes for (i=0; i<m; i++) { 414496be53dSLois Curfman McInnes for (j=a->i[i]+shift; j<a->i[i+1]+shift; j++) { 415496be53dSLois Curfman McInnes if (a->j[j] >= i) { 416aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 41736db0b34SBarry Smith if (PetscImaginaryPart(a->a[j]) != 0.0 || PetscRealPart(a->a[j]) != 0.0) { 418b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," %18.16e %18.16e ",PetscRealPart(a->a[j]),PetscImaginaryPart(a->a[j]));CHKERRQ(ierr); 4196831982aSBarry Smith } 420496be53dSLois Curfman McInnes #else 421b0a32e0cSBarry Smith if (a->a[j] != 0.0) {ierr = PetscViewerASCIIPrintf(viewer," %18.16e ",a->a[j]);CHKERRQ(ierr);} 422496be53dSLois Curfman McInnes #endif 423496be53dSLois Curfman McInnes } 424496be53dSLois Curfman McInnes } 425b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 426496be53dSLois Curfman McInnes } 427b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 428fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_DENSE) { 42997f1f81fSBarry Smith PetscInt cnt = 0,jcnt; 43087828ca2SBarry Smith PetscScalar value; 43102594712SBarry Smith 432b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 43302594712SBarry Smith for (i=0; i<m; i++) { 43402594712SBarry Smith jcnt = 0; 435d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 436e24b481bSBarry Smith if (jcnt < a->i[i+1]-a->i[i] && j == a->j[cnt]) { 43702594712SBarry Smith value = a->a[cnt++]; 438e24b481bSBarry Smith jcnt++; 43902594712SBarry Smith } else { 44002594712SBarry Smith value = 0.0; 44102594712SBarry Smith } 442aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 443b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," %7.5e+%7.5e i ",PetscRealPart(value),PetscImaginaryPart(value));CHKERRQ(ierr); 44402594712SBarry Smith #else 445b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," %7.5e ",value);CHKERRQ(ierr); 44602594712SBarry Smith #endif 44702594712SBarry Smith } 448b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 44902594712SBarry Smith } 450b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 4513c215bfdSMatthew Knepley } else if (format == PETSC_VIEWER_ASCII_MATRIXMARKET) { 4523c215bfdSMatthew Knepley ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 4533c215bfdSMatthew Knepley #if defined(PETSC_USE_COMPLEX) 4543c215bfdSMatthew Knepley ierr = PetscViewerASCIIPrintf(viewer,"%%matrix complex general\n");CHKERRQ(ierr); 4553c215bfdSMatthew Knepley #else 4563c215bfdSMatthew Knepley ierr = PetscViewerASCIIPrintf(viewer,"%%matrix real general\n");CHKERRQ(ierr); 4573c215bfdSMatthew Knepley #endif 458d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%D %D %D\n", m, A->cmap->n, a->nz);CHKERRQ(ierr); 4593c215bfdSMatthew Knepley for (i=0; i<m; i++) { 4603c215bfdSMatthew Knepley for (j=a->i[i]+shift; j<a->i[i+1]+shift; j++) { 4613c215bfdSMatthew Knepley #if defined(PETSC_USE_COMPLEX) 4623c215bfdSMatthew Knepley if (PetscImaginaryPart(a->a[j]) > 0.0) { 4633c215bfdSMatthew Knepley ierr = PetscViewerASCIIPrintf(viewer,"%D %D, %G %G\n", i+shift,a->j[j]+shift,PetscRealPart(a->a[j]),PetscImaginaryPart(a->a[j]));CHKERRQ(ierr); 4643c215bfdSMatthew Knepley } else if (PetscImaginaryPart(a->a[j]) < 0.0) { 4653c215bfdSMatthew Knepley ierr = PetscViewerASCIIPrintf(viewer,"%D %D, %G -%G\n", i+shift,a->j[j]+shift,PetscRealPart(a->a[j]),-PetscImaginaryPart(a->a[j]));CHKERRQ(ierr); 4663c215bfdSMatthew Knepley } else { 4673c215bfdSMatthew Knepley ierr = PetscViewerASCIIPrintf(viewer,"%D %D, %G\n", i+shift,a->j[j]+shift,PetscRealPart(a->a[j]));CHKERRQ(ierr); 4683c215bfdSMatthew Knepley } 4693c215bfdSMatthew Knepley #else 4703c215bfdSMatthew Knepley ierr = PetscViewerASCIIPrintf(viewer,"%D %D %G\n", i+shift, a->j[j]+shift, a->a[j]);CHKERRQ(ierr); 4713c215bfdSMatthew Knepley #endif 4723c215bfdSMatthew Knepley } 4733c215bfdSMatthew Knepley } 4743c215bfdSMatthew Knepley ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 4753a40ed3dSBarry Smith } else { 476b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 47717ab2063SBarry Smith for (i=0; i<m; i++) { 47877431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 479416022c9SBarry Smith for (j=a->i[i]+shift; j<a->i[i+1]+shift; j++) { 480aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 48136db0b34SBarry Smith if (PetscImaginaryPart(a->a[j]) > 0.0) { 482a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i)",a->j[j]+shift,PetscRealPart(a->a[j]),PetscImaginaryPart(a->a[j]));CHKERRQ(ierr); 48336db0b34SBarry Smith } else if (PetscImaginaryPart(a->a[j]) < 0.0) { 484a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G - %G i)",a->j[j]+shift,PetscRealPart(a->a[j]),-PetscImaginaryPart(a->a[j]));CHKERRQ(ierr); 4853a40ed3dSBarry Smith } else { 486a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",a->j[j]+shift,PetscRealPart(a->a[j]));CHKERRQ(ierr); 48717ab2063SBarry Smith } 48817ab2063SBarry Smith #else 489a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",a->j[j]+shift,a->a[j]);CHKERRQ(ierr); 49017ab2063SBarry Smith #endif 49117ab2063SBarry Smith } 492b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 49317ab2063SBarry Smith } 494b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 49517ab2063SBarry Smith } 496b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 4973a40ed3dSBarry Smith PetscFunctionReturn(0); 498416022c9SBarry Smith } 499416022c9SBarry Smith 5004a2ae208SSatish Balay #undef __FUNCT__ 5014a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqAIJ_Draw_Zoom" 502dfbe8321SBarry Smith PetscErrorCode MatView_SeqAIJ_Draw_Zoom(PetscDraw draw,void *Aa) 503416022c9SBarry Smith { 504480ef9eaSBarry Smith Mat A = (Mat) Aa; 505416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 506dfbe8321SBarry Smith PetscErrorCode ierr; 507d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,color; 50836db0b34SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,maxv = 0.0; 509b0a32e0cSBarry Smith PetscViewer viewer; 510f3ef73ceSBarry Smith PetscViewerFormat format; 511cddf8d76SBarry Smith 5123a40ed3dSBarry Smith PetscFunctionBegin; 513480ef9eaSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 514b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 51519bcc07fSBarry Smith 516b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 517416022c9SBarry Smith /* loop over matrix elements drawing boxes */ 5180513a670SBarry Smith 519fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 5200513a670SBarry Smith /* Blue for negative, Cyan for zero and Red for positive */ 521b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 522416022c9SBarry Smith for (i=0; i<m; i++) { 523cddf8d76SBarry Smith y_l = m - i - 1.0; y_r = y_l + 1.0; 524bfeeae90SHong Zhang for (j=a->i[i]; j<a->i[i+1]; j++) { 525bfeeae90SHong Zhang x_l = a->j[j] ; x_r = x_l + 1.0; 526aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 52736db0b34SBarry Smith if (PetscRealPart(a->a[j]) >= 0.) continue; 528cddf8d76SBarry Smith #else 529cddf8d76SBarry Smith if (a->a[j] >= 0.) continue; 530cddf8d76SBarry Smith #endif 531b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 532cddf8d76SBarry Smith } 533cddf8d76SBarry Smith } 534b0a32e0cSBarry Smith color = PETSC_DRAW_CYAN; 535cddf8d76SBarry Smith for (i=0; i<m; i++) { 536cddf8d76SBarry Smith y_l = m - i - 1.0; y_r = y_l + 1.0; 537bfeeae90SHong Zhang for (j=a->i[i]; j<a->i[i+1]; j++) { 538bfeeae90SHong Zhang x_l = a->j[j]; x_r = x_l + 1.0; 539cddf8d76SBarry Smith if (a->a[j] != 0.) continue; 540b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 541cddf8d76SBarry Smith } 542cddf8d76SBarry Smith } 543b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 544cddf8d76SBarry Smith for (i=0; i<m; i++) { 545cddf8d76SBarry Smith y_l = m - i - 1.0; y_r = y_l + 1.0; 546bfeeae90SHong Zhang for (j=a->i[i]; j<a->i[i+1]; j++) { 547bfeeae90SHong Zhang x_l = a->j[j]; x_r = x_l + 1.0; 548aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 54936db0b34SBarry Smith if (PetscRealPart(a->a[j]) <= 0.) continue; 550cddf8d76SBarry Smith #else 551cddf8d76SBarry Smith if (a->a[j] <= 0.) continue; 552cddf8d76SBarry Smith #endif 553b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 554416022c9SBarry Smith } 555416022c9SBarry Smith } 5560513a670SBarry Smith } else { 5570513a670SBarry Smith /* use contour shading to indicate magnitude of values */ 5580513a670SBarry Smith /* first determine max of all nonzero values */ 55997f1f81fSBarry Smith PetscInt nz = a->nz,count; 560b0a32e0cSBarry Smith PetscDraw popup; 56136db0b34SBarry Smith PetscReal scale; 5620513a670SBarry Smith 5630513a670SBarry Smith for (i=0; i<nz; i++) { 5640513a670SBarry Smith if (PetscAbsScalar(a->a[i]) > maxv) maxv = PetscAbsScalar(a->a[i]); 5650513a670SBarry Smith } 566b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 567b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 568b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 5690513a670SBarry Smith count = 0; 5700513a670SBarry Smith for (i=0; i<m; i++) { 5710513a670SBarry Smith y_l = m - i - 1.0; y_r = y_l + 1.0; 572bfeeae90SHong Zhang for (j=a->i[i]; j<a->i[i+1]; j++) { 573bfeeae90SHong Zhang x_l = a->j[j]; x_r = x_l + 1.0; 57497f1f81fSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (PetscInt)(scale*PetscAbsScalar(a->a[count])); 575b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 5760513a670SBarry Smith count++; 5770513a670SBarry Smith } 5780513a670SBarry Smith } 5790513a670SBarry Smith } 580480ef9eaSBarry Smith PetscFunctionReturn(0); 581480ef9eaSBarry Smith } 582cddf8d76SBarry Smith 5834a2ae208SSatish Balay #undef __FUNCT__ 5844a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqAIJ_Draw" 585dfbe8321SBarry Smith PetscErrorCode MatView_SeqAIJ_Draw(Mat A,PetscViewer viewer) 586480ef9eaSBarry Smith { 587dfbe8321SBarry Smith PetscErrorCode ierr; 588b0a32e0cSBarry Smith PetscDraw draw; 58936db0b34SBarry Smith PetscReal xr,yr,xl,yl,h,w; 590480ef9eaSBarry Smith PetscTruth isnull; 591480ef9eaSBarry Smith 592480ef9eaSBarry Smith PetscFunctionBegin; 593b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 594b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 595480ef9eaSBarry Smith if (isnull) PetscFunctionReturn(0); 596480ef9eaSBarry Smith 597480ef9eaSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 598d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 599480ef9eaSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 600b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 601b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqAIJ_Draw_Zoom,A);CHKERRQ(ierr); 602480ef9eaSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 6033a40ed3dSBarry Smith PetscFunctionReturn(0); 604416022c9SBarry Smith } 605416022c9SBarry Smith 6064a2ae208SSatish Balay #undef __FUNCT__ 6074a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqAIJ" 608dfbe8321SBarry Smith PetscErrorCode MatView_SeqAIJ(Mat A,PetscViewer viewer) 609416022c9SBarry Smith { 610dfbe8321SBarry Smith PetscErrorCode ierr; 6116805f65bSBarry Smith PetscTruth iascii,isbinary,isdraw; 612416022c9SBarry Smith 6133a40ed3dSBarry Smith PetscFunctionBegin; 61432077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 615fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr); 616fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr); 617c45a1595SBarry Smith if (iascii) { 6183a40ed3dSBarry Smith ierr = MatView_SeqAIJ_ASCII(A,viewer);CHKERRQ(ierr); 6190f5bd95cSBarry Smith } else if (isbinary) { 6203a40ed3dSBarry Smith ierr = MatView_SeqAIJ_Binary(A,viewer);CHKERRQ(ierr); 6210f5bd95cSBarry Smith } else if (isdraw) { 6223a40ed3dSBarry Smith ierr = MatView_SeqAIJ_Draw(A,viewer);CHKERRQ(ierr); 6235cd90555SBarry Smith } else { 624958c9bccSBarry Smith SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported by SeqAIJ matrices",((PetscObject)viewer)->type_name); 62517ab2063SBarry Smith } 6264846f1f5SKris Buschelman ierr = MatView_Inode(A,viewer);CHKERRQ(ierr); 6273a40ed3dSBarry Smith PetscFunctionReturn(0); 62817ab2063SBarry Smith } 62919bcc07fSBarry Smith 6304a2ae208SSatish Balay #undef __FUNCT__ 6314a2ae208SSatish Balay #define __FUNCT__ "MatAssemblyEnd_SeqAIJ" 632dfbe8321SBarry Smith PetscErrorCode MatAssemblyEnd_SeqAIJ(Mat A,MatAssemblyType mode) 63317ab2063SBarry Smith { 634416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 6356849ba73SBarry Smith PetscErrorCode ierr; 63697f1f81fSBarry Smith PetscInt fshift = 0,i,j,*ai = a->i,*aj = a->j,*imax = a->imax; 637d0f46423SBarry Smith PetscInt m = A->rmap->n,*ip,N,*ailen = a->ilen,rmax = 0; 63854f21887SBarry Smith MatScalar *aa = a->a,*ap; 6393447b6efSHong Zhang PetscReal ratio=0.6; 64017ab2063SBarry Smith 6413a40ed3dSBarry Smith PetscFunctionBegin; 6423a40ed3dSBarry Smith if (mode == MAT_FLUSH_ASSEMBLY) PetscFunctionReturn(0); 64317ab2063SBarry Smith 64443ee02c3SBarry Smith if (m) rmax = ailen[0]; /* determine row with most nonzeros */ 64517ab2063SBarry Smith for (i=1; i<m; i++) { 646416022c9SBarry Smith /* move each row back by the amount of empty slots (fshift) before it*/ 64717ab2063SBarry Smith fshift += imax[i-1] - ailen[i-1]; 64894a9d846SBarry Smith rmax = PetscMax(rmax,ailen[i]); 64917ab2063SBarry Smith if (fshift) { 650bfeeae90SHong Zhang ip = aj + ai[i] ; 651bfeeae90SHong Zhang ap = aa + ai[i] ; 65217ab2063SBarry Smith N = ailen[i]; 65317ab2063SBarry Smith for (j=0; j<N; j++) { 65417ab2063SBarry Smith ip[j-fshift] = ip[j]; 65517ab2063SBarry Smith ap[j-fshift] = ap[j]; 65617ab2063SBarry Smith } 65717ab2063SBarry Smith } 65817ab2063SBarry Smith ai[i] = ai[i-1] + ailen[i-1]; 65917ab2063SBarry Smith } 66017ab2063SBarry Smith if (m) { 66117ab2063SBarry Smith fshift += imax[m-1] - ailen[m-1]; 66217ab2063SBarry Smith ai[m] = ai[m-1] + ailen[m-1]; 66317ab2063SBarry Smith } 66417ab2063SBarry Smith /* reset ilen and imax for each row */ 66517ab2063SBarry Smith for (i=0; i<m; i++) { 66617ab2063SBarry Smith ailen[i] = imax[i] = ai[i+1] - ai[i]; 66717ab2063SBarry Smith } 668bfeeae90SHong Zhang a->nz = ai[m]; 66928b2fa4aSMatthew Knepley if (fshift && a->nounused == -1) { 67028b2fa4aSMatthew Knepley SETERRQ3(PETSC_ERR_PLIB, "Unused space detected in matrix: %D X %D, %D unneeded", m, A->cmap->n, fshift); 67128b2fa4aSMatthew Knepley } 67217ab2063SBarry Smith 67309f38230SBarry Smith ierr = MatMarkDiagonal_SeqAIJ(A);CHKERRQ(ierr); 674d0f46423SBarry Smith ierr = PetscInfo4(A,"Matrix size: %D X %D; storage space: %D unneeded,%D used\n",m,A->cmap->n,fshift,a->nz);CHKERRQ(ierr); 675ae15b995SBarry Smith ierr = PetscInfo1(A,"Number of mallocs during MatSetValues() is %D\n",a->reallocs);CHKERRQ(ierr); 676ae15b995SBarry Smith ierr = PetscInfo1(A,"Maximum nonzeros in any row is %D\n",rmax);CHKERRQ(ierr); 677a0e1a203SBarry Smith 678dd5f02e7SSatish Balay a->reallocs = 0; 6794e220ebcSLois Curfman McInnes A->info.nz_unneeded = (double)fshift; 68036db0b34SBarry Smith a->rmax = rmax; 6814e220ebcSLois Curfman McInnes 682cb5d8e9eSHong Zhang /* check for zero rows. If found a large number of zero rows, use CompressedRow functions */ 683317fbc4cSHong Zhang ierr = Mat_CheckCompressedRow(A,&a->compressedrow,a->i,m,ratio);CHKERRQ(ierr); 68488e51ccdSHong Zhang A->same_nonzero = PETSC_TRUE; 68571c2f376SKris Buschelman 6864846f1f5SKris Buschelman ierr = MatAssemblyEnd_Inode(A,mode);CHKERRQ(ierr); 68771f1c65dSBarry Smith 68871f1c65dSBarry Smith a->idiagvalid = PETSC_FALSE; 6893a40ed3dSBarry Smith PetscFunctionReturn(0); 69017ab2063SBarry Smith } 69117ab2063SBarry Smith 6924a2ae208SSatish Balay #undef __FUNCT__ 69399cafbc1SBarry Smith #define __FUNCT__ "MatRealPart_SeqAIJ" 69499cafbc1SBarry Smith PetscErrorCode MatRealPart_SeqAIJ(Mat A) 69599cafbc1SBarry Smith { 69699cafbc1SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 69799cafbc1SBarry Smith PetscInt i,nz = a->nz; 69854f21887SBarry Smith MatScalar *aa = a->a; 69999cafbc1SBarry Smith 70099cafbc1SBarry Smith PetscFunctionBegin; 70199cafbc1SBarry Smith for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 70299cafbc1SBarry Smith PetscFunctionReturn(0); 70399cafbc1SBarry Smith } 70499cafbc1SBarry Smith 70599cafbc1SBarry Smith #undef __FUNCT__ 70699cafbc1SBarry Smith #define __FUNCT__ "MatImaginaryPart_SeqAIJ" 70799cafbc1SBarry Smith PetscErrorCode MatImaginaryPart_SeqAIJ(Mat A) 70899cafbc1SBarry Smith { 70999cafbc1SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 71099cafbc1SBarry Smith PetscInt i,nz = a->nz; 71154f21887SBarry Smith MatScalar *aa = a->a; 71299cafbc1SBarry Smith 71399cafbc1SBarry Smith PetscFunctionBegin; 71499cafbc1SBarry Smith for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 71599cafbc1SBarry Smith PetscFunctionReturn(0); 71699cafbc1SBarry Smith } 71799cafbc1SBarry Smith 71899cafbc1SBarry Smith #undef __FUNCT__ 7194a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqAIJ" 720dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqAIJ(Mat A) 72117ab2063SBarry Smith { 722416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 723dfbe8321SBarry Smith PetscErrorCode ierr; 7243a40ed3dSBarry Smith 7253a40ed3dSBarry Smith PetscFunctionBegin; 726d0f46423SBarry Smith ierr = PetscMemzero(a->a,(a->i[A->rmap->n])*sizeof(PetscScalar));CHKERRQ(ierr); 7273a40ed3dSBarry Smith PetscFunctionReturn(0); 72817ab2063SBarry Smith } 729416022c9SBarry Smith 7304a2ae208SSatish Balay #undef __FUNCT__ 7314a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqAIJ" 732dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqAIJ(Mat A) 73317ab2063SBarry Smith { 734416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 735dfbe8321SBarry Smith PetscErrorCode ierr; 736d5d45c9bSBarry Smith 7373a40ed3dSBarry Smith PetscFunctionBegin; 738aa482453SBarry Smith #if defined(PETSC_USE_LOG) 739d0f46423SBarry Smith PetscLogObjectState((PetscObject)A,"Rows=%D, Cols=%D, NZ=%D",A->rmap->n,A->cmap->n,a->nz); 74017ab2063SBarry Smith #endif 741e6b907acSBarry Smith ierr = MatSeqXAIJFreeAIJ(A,&a->a,&a->j,&a->i);CHKERRQ(ierr); 742c38d4ed2SBarry Smith if (a->row) { 743c38d4ed2SBarry Smith ierr = ISDestroy(a->row);CHKERRQ(ierr); 744c38d4ed2SBarry Smith } 745c38d4ed2SBarry Smith if (a->col) { 746c38d4ed2SBarry Smith ierr = ISDestroy(a->col);CHKERRQ(ierr); 747c38d4ed2SBarry Smith } 74805b42c5fSBarry Smith ierr = PetscFree(a->diag);CHKERRQ(ierr); 74905b42c5fSBarry Smith ierr = PetscFree2(a->imax,a->ilen);CHKERRQ(ierr); 75071f1c65dSBarry Smith ierr = PetscFree3(a->idiag,a->mdiag,a->ssor_work);CHKERRQ(ierr); 75105b42c5fSBarry Smith ierr = PetscFree(a->solve_work);CHKERRQ(ierr); 75282bf6240SBarry Smith if (a->icol) {ierr = ISDestroy(a->icol);CHKERRQ(ierr);} 75305b42c5fSBarry Smith ierr = PetscFree(a->saved_values);CHKERRQ(ierr); 754cc8ba8e1SBarry Smith if (a->coloring) {ierr = ISColoringDestroy(a->coloring);CHKERRQ(ierr);} 75505b42c5fSBarry Smith ierr = PetscFree(a->xtoy);CHKERRQ(ierr); 756407f6b05SHong Zhang if (a->XtoY) {ierr = MatDestroy(a->XtoY);CHKERRQ(ierr);} 757d487561eSHong Zhang if (a->compressedrow.use){ierr = PetscFree(a->compressedrow.i);} 758a30b2313SHong Zhang 7594846f1f5SKris Buschelman ierr = MatDestroy_Inode(A);CHKERRQ(ierr); 7604846f1f5SKris Buschelman 761606d414cSSatish Balay ierr = PetscFree(a);CHKERRQ(ierr); 762901853e0SKris Buschelman 763dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)A,0);CHKERRQ(ierr); 764901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatSeqAIJSetColumnIndices_C","",PETSC_NULL);CHKERRQ(ierr); 765901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatStoreValues_C","",PETSC_NULL);CHKERRQ(ierr); 766901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatRetrieveValues_C","",PETSC_NULL);CHKERRQ(ierr); 767901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatConvert_seqaij_seqsbaij_C","",PETSC_NULL);CHKERRQ(ierr); 768901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatConvert_seqaij_seqbaij_C","",PETSC_NULL);CHKERRQ(ierr); 769ba03775dSHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatConvert_seqaij_seqcsrperm_C","",PETSC_NULL);CHKERRQ(ierr); 770901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatIsTranspose_C","",PETSC_NULL);CHKERRQ(ierr); 771901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatSeqAIJSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 772a1661176SMatthew Knepley ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatSeqAIJSetPreallocationCSR_C","",PETSC_NULL);CHKERRQ(ierr); 773901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatReorderForNonzeroDiagonal_C","",PETSC_NULL);CHKERRQ(ierr); 7743a40ed3dSBarry Smith PetscFunctionReturn(0); 77517ab2063SBarry Smith } 77617ab2063SBarry Smith 7774a2ae208SSatish Balay #undef __FUNCT__ 7784a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqAIJ" 7794e0d8c25SBarry Smith PetscErrorCode MatSetOption_SeqAIJ(Mat A,MatOption op,PetscTruth flg) 78017ab2063SBarry Smith { 781416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 7824846f1f5SKris Buschelman PetscErrorCode ierr; 7833a40ed3dSBarry Smith 7843a40ed3dSBarry Smith PetscFunctionBegin; 785a65d3064SKris Buschelman switch (op) { 786a65d3064SKris Buschelman case MAT_ROW_ORIENTED: 7874e0d8c25SBarry Smith a->roworiented = flg; 788a65d3064SKris Buschelman break; 789a9817697SBarry Smith case MAT_KEEP_NONZERO_PATTERN: 790a9817697SBarry Smith a->keepnonzeropattern = flg; 791a65d3064SKris Buschelman break; 792512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 793512a5fc5SBarry Smith a->nonew = (flg ? 0 : 1); 794a65d3064SKris Buschelman break; 795a65d3064SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 7964e0d8c25SBarry Smith a->nonew = (flg ? -1 : 0); 797a65d3064SKris Buschelman break; 798a65d3064SKris Buschelman case MAT_NEW_NONZERO_ALLOCATION_ERR: 7994e0d8c25SBarry Smith a->nonew = (flg ? -2 : 0); 800a65d3064SKris Buschelman break; 80128b2fa4aSMatthew Knepley case MAT_UNUSED_NONZERO_LOCATION_ERR: 80228b2fa4aSMatthew Knepley a->nounused = (flg ? -1 : 0); 80328b2fa4aSMatthew Knepley break; 804a65d3064SKris Buschelman case MAT_IGNORE_ZERO_ENTRIES: 8054e0d8c25SBarry Smith a->ignorezeroentries = flg; 8060df259c2SBarry Smith break; 807d487561eSHong Zhang case MAT_USE_COMPRESSEDROW: 8084e0d8c25SBarry Smith a->compressedrow.use = flg; 809d487561eSHong Zhang break; 8104e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 811a65d3064SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 812a65d3064SKris Buschelman case MAT_USE_HASH_TABLE: 813290bbb0aSBarry Smith ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 814a65d3064SKris Buschelman break; 815a65d3064SKris Buschelman default: 81671c2f376SKris Buschelman break; 817a65d3064SKris Buschelman } 8184e0d8c25SBarry Smith ierr = MatSetOption_Inode(A,op,flg);CHKERRQ(ierr); 8193a40ed3dSBarry Smith PetscFunctionReturn(0); 82017ab2063SBarry Smith } 82117ab2063SBarry Smith 8224a2ae208SSatish Balay #undef __FUNCT__ 8234a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqAIJ" 824dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqAIJ(Mat A,Vec v) 82517ab2063SBarry Smith { 826416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 8276849ba73SBarry Smith PetscErrorCode ierr; 82897f1f81fSBarry Smith PetscInt i,j,n; 82987828ca2SBarry Smith PetscScalar *x,zero = 0.0; 83017ab2063SBarry Smith 8313a40ed3dSBarry Smith PetscFunctionBegin; 8322dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 8331ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 83436db0b34SBarry Smith ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 835d0f46423SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 836d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 837bfeeae90SHong Zhang for (j=a->i[i]; j<a->i[i+1]; j++) { 838bfeeae90SHong Zhang if (a->j[j] == i) { 839416022c9SBarry Smith x[i] = a->a[j]; 84017ab2063SBarry Smith break; 84117ab2063SBarry Smith } 84217ab2063SBarry Smith } 84317ab2063SBarry Smith } 8441ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 8453a40ed3dSBarry Smith PetscFunctionReturn(0); 84617ab2063SBarry Smith } 84717ab2063SBarry Smith 848b377110cSBarry Smith #include "../src/mat/impls/aij/seq/ftn-kernels/fmult.h" 8494a2ae208SSatish Balay #undef __FUNCT__ 8504a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqAIJ" 851dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqAIJ(Mat A,Vec xx,Vec zz,Vec yy) 85217ab2063SBarry Smith { 853416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 8545c897100SBarry Smith PetscScalar *x,*y; 855dfbe8321SBarry Smith PetscErrorCode ierr; 856d0f46423SBarry Smith PetscInt m = A->rmap->n; 8575c897100SBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ) 858a77337e4SBarry Smith MatScalar *v; 859a77337e4SBarry Smith PetscScalar alpha; 8607b2bb3b9SHong Zhang PetscInt n,i,*idx,*ii,*ridx=PETSC_NULL; 8613447b6efSHong Zhang Mat_CompressedRow cprow = a->compressedrow; 8624eb6d288SHong Zhang PetscTruth usecprow = cprow.use; 8635c897100SBarry Smith #endif 86417ab2063SBarry Smith 8653a40ed3dSBarry Smith PetscFunctionBegin; 8662e8a6d31SBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 8671ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 8681ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8695c897100SBarry Smith 8705c897100SBarry Smith #if defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ) 871bfeeae90SHong Zhang fortranmulttransposeaddaij_(&m,x,a->i,a->j,a->a,y); 8725c897100SBarry Smith #else 8733447b6efSHong Zhang if (usecprow){ 8743447b6efSHong Zhang m = cprow.nrows; 8753447b6efSHong Zhang ii = cprow.i; 8767b2bb3b9SHong Zhang ridx = cprow.rindex; 8773447b6efSHong Zhang } else { 8783447b6efSHong Zhang ii = a->i; 8793447b6efSHong Zhang } 88017ab2063SBarry Smith for (i=0; i<m; i++) { 8813447b6efSHong Zhang idx = a->j + ii[i] ; 8823447b6efSHong Zhang v = a->a + ii[i] ; 8833447b6efSHong Zhang n = ii[i+1] - ii[i]; 8843447b6efSHong Zhang if (usecprow){ 8857b2bb3b9SHong Zhang alpha = x[ridx[i]]; 8863447b6efSHong Zhang } else { 88717ab2063SBarry Smith alpha = x[i]; 8883447b6efSHong Zhang } 88917ab2063SBarry Smith while (n-->0) {y[*idx++] += alpha * *v++;} 89017ab2063SBarry Smith } 8915c897100SBarry Smith #endif 892dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*a->nz);CHKERRQ(ierr); 8931ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 8941ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 8953a40ed3dSBarry Smith PetscFunctionReturn(0); 89617ab2063SBarry Smith } 89717ab2063SBarry Smith 8984a2ae208SSatish Balay #undef __FUNCT__ 8995c897100SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqAIJ" 900dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqAIJ(Mat A,Vec xx,Vec yy) 9015c897100SBarry Smith { 902dfbe8321SBarry Smith PetscErrorCode ierr; 9035c897100SBarry Smith 9045c897100SBarry Smith PetscFunctionBegin; 905170fe5c8SBarry Smith ierr = VecSet(yy,0.0);CHKERRQ(ierr); 9065c897100SBarry Smith ierr = MatMultTransposeAdd_SeqAIJ(A,xx,yy,yy);CHKERRQ(ierr); 9075c897100SBarry Smith PetscFunctionReturn(0); 9085c897100SBarry Smith } 9095c897100SBarry Smith 910a4005a5dSBarry Smith #include "../src/mat/impls/aij/seq/ftn-kernels/fmult.h" 9115c897100SBarry Smith #undef __FUNCT__ 9124a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqAIJ" 913dfbe8321SBarry Smith PetscErrorCode MatMult_SeqAIJ(Mat A,Vec xx,Vec yy) 91417ab2063SBarry Smith { 915416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 916d9fead3dSBarry Smith PetscScalar *y; 91754f21887SBarry Smith const PetscScalar *x; 91854f21887SBarry Smith const MatScalar *aa; 919dfbe8321SBarry Smith PetscErrorCode ierr; 920003131ecSBarry Smith PetscInt m=A->rmap->n; 921003131ecSBarry Smith const PetscInt *aj,*ii,*ridx=PETSC_NULL; 9228aee2decSHong Zhang PetscInt n,i,nonzerorow=0; 923362ced78SSatish Balay PetscScalar sum; 92497952fefSHong Zhang PetscTruth usecprow=a->compressedrow.use; 92517ab2063SBarry Smith 926b6410449SSatish Balay #if defined(PETSC_HAVE_PRAGMA_DISJOINT) 92797952fefSHong Zhang #pragma disjoint(*x,*y,*aa) 928fee21e36SBarry Smith #endif 929fee21e36SBarry Smith 9303a40ed3dSBarry Smith PetscFunctionBegin; 931d9fead3dSBarry Smith ierr = VecGetArray(xx,(PetscScalar**)&x);CHKERRQ(ierr); 9321ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 93397952fefSHong Zhang aj = a->j; 93497952fefSHong Zhang aa = a->a; 935416022c9SBarry Smith ii = a->i; 9364eb6d288SHong Zhang if (usecprow){ /* use compressed row format */ 93797952fefSHong Zhang m = a->compressedrow.nrows; 93897952fefSHong Zhang ii = a->compressedrow.i; 93997952fefSHong Zhang ridx = a->compressedrow.rindex; 94097952fefSHong Zhang for (i=0; i<m; i++){ 94197952fefSHong Zhang n = ii[i+1] - ii[i]; 94297952fefSHong Zhang aj = a->j + ii[i]; 94397952fefSHong Zhang aa = a->a + ii[i]; 94497952fefSHong Zhang sum = 0.0; 945a46b3154SVictor Eijkhout nonzerorow += (n>0); 946003131ecSBarry Smith PetscSparseDensePlusDot(sum,x,aa,aj,n); 947003131ecSBarry Smith /* for (j=0; j<n; j++) sum += (*aa++)*x[*aj++]; */ 94897952fefSHong Zhang y[*ridx++] = sum; 94997952fefSHong Zhang } 95097952fefSHong Zhang } else { /* do not use compressed row format */ 951b05257ddSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ) 952b05257ddSBarry Smith fortranmultaij_(&m,x,ii,aj,aa,y); 953b05257ddSBarry Smith #else 95417ab2063SBarry Smith for (i=0; i<m; i++) { 955003131ecSBarry Smith n = ii[i+1] - ii[i]; 956003131ecSBarry Smith aj = a->j + ii[i]; 957003131ecSBarry Smith aa = a->a + ii[i]; 95817ab2063SBarry Smith sum = 0.0; 959a46b3154SVictor Eijkhout nonzerorow += (n>0); 960003131ecSBarry Smith PetscSparseDensePlusDot(sum,x,aa,aj,n); 96117ab2063SBarry Smith y[i] = sum; 96217ab2063SBarry Smith } 9638d195f9aSBarry Smith #endif 964b05257ddSBarry Smith } 965dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*a->nz - nonzerorow);CHKERRQ(ierr); 966d9fead3dSBarry Smith ierr = VecRestoreArray(xx,(PetscScalar**)&x);CHKERRQ(ierr); 9671ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 9683a40ed3dSBarry Smith PetscFunctionReturn(0); 96917ab2063SBarry Smith } 97017ab2063SBarry Smith 971a4005a5dSBarry Smith #include "../src/mat/impls/aij/seq/ftn-kernels/fmultadd.h" 9724a2ae208SSatish Balay #undef __FUNCT__ 9734a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqAIJ" 974dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqAIJ(Mat A,Vec xx,Vec yy,Vec zz) 97517ab2063SBarry Smith { 976416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 97754f21887SBarry Smith PetscScalar *x,*y,*z; 97854f21887SBarry Smith const MatScalar *aa; 979dfbe8321SBarry Smith PetscErrorCode ierr; 980d0f46423SBarry Smith PetscInt m = A->rmap->n,*aj,*ii; 981aa482453SBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ) 98297952fefSHong Zhang PetscInt n,i,jrow,j,*ridx=PETSC_NULL; 983362ced78SSatish Balay PetscScalar sum; 98497952fefSHong Zhang PetscTruth usecprow=a->compressedrow.use; 985e36a17ebSSatish Balay #endif 9869ea0dfa2SSatish Balay 9873a40ed3dSBarry Smith PetscFunctionBegin; 9881ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 9891ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 9902e8a6d31SBarry Smith if (zz != yy) { 9911ebc52fbSHong Zhang ierr = VecGetArray(zz,&z);CHKERRQ(ierr); 9922e8a6d31SBarry Smith } else { 9932e8a6d31SBarry Smith z = y; 9942e8a6d31SBarry Smith } 995bfeeae90SHong Zhang 99697952fefSHong Zhang aj = a->j; 99797952fefSHong Zhang aa = a->a; 998cddf8d76SBarry Smith ii = a->i; 999aa482453SBarry Smith #if defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ) 100097952fefSHong Zhang fortranmultaddaij_(&m,x,ii,aj,aa,y,z); 100102ab625aSSatish Balay #else 10024eb6d288SHong Zhang if (usecprow){ /* use compressed row format */ 10034eb6d288SHong Zhang if (zz != yy){ 10044eb6d288SHong Zhang ierr = PetscMemcpy(z,y,m*sizeof(PetscScalar));CHKERRQ(ierr); 10054eb6d288SHong Zhang } 100697952fefSHong Zhang m = a->compressedrow.nrows; 100797952fefSHong Zhang ii = a->compressedrow.i; 100897952fefSHong Zhang ridx = a->compressedrow.rindex; 100997952fefSHong Zhang for (i=0; i<m; i++){ 101097952fefSHong Zhang n = ii[i+1] - ii[i]; 101197952fefSHong Zhang aj = a->j + ii[i]; 101297952fefSHong Zhang aa = a->a + ii[i]; 101397952fefSHong Zhang sum = y[*ridx]; 101497952fefSHong Zhang for (j=0; j<n; j++) sum += (*aa++)*x[*aj++]; 101597952fefSHong Zhang z[*ridx++] = sum; 101697952fefSHong Zhang } 101797952fefSHong Zhang } else { /* do not use compressed row format */ 101817ab2063SBarry Smith for (i=0; i<m; i++) { 10199ea0dfa2SSatish Balay jrow = ii[i]; 10209ea0dfa2SSatish Balay n = ii[i+1] - jrow; 102117ab2063SBarry Smith sum = y[i]; 10229ea0dfa2SSatish Balay for (j=0; j<n; j++) { 102397952fefSHong Zhang sum += aa[jrow]*x[aj[jrow]]; jrow++; 10249ea0dfa2SSatish Balay } 102517ab2063SBarry Smith z[i] = sum; 102617ab2063SBarry Smith } 102797952fefSHong Zhang } 102802ab625aSSatish Balay #endif 1029dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*a->nz);CHKERRQ(ierr); 10301ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 10311ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 10322e8a6d31SBarry Smith if (zz != yy) { 10331ebc52fbSHong Zhang ierr = VecRestoreArray(zz,&z);CHKERRQ(ierr); 10342e8a6d31SBarry Smith } 10353a40ed3dSBarry Smith PetscFunctionReturn(0); 103617ab2063SBarry Smith } 103717ab2063SBarry Smith 103817ab2063SBarry Smith /* 103917ab2063SBarry Smith Adds diagonal pointers to sparse matrix structure. 104017ab2063SBarry Smith */ 10414a2ae208SSatish Balay #undef __FUNCT__ 10424a2ae208SSatish Balay #define __FUNCT__ "MatMarkDiagonal_SeqAIJ" 1043dfbe8321SBarry Smith PetscErrorCode MatMarkDiagonal_SeqAIJ(Mat A) 104417ab2063SBarry Smith { 1045416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 10466849ba73SBarry Smith PetscErrorCode ierr; 1047d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n; 104817ab2063SBarry Smith 10493a40ed3dSBarry Smith PetscFunctionBegin; 105009f38230SBarry Smith if (!a->diag) { 105109f38230SBarry Smith ierr = PetscMalloc(m*sizeof(PetscInt),&a->diag);CHKERRQ(ierr); 10529518dbb4SMatthew Knepley ierr = PetscLogObjectMemory(A, m*sizeof(PetscInt));CHKERRQ(ierr); 105309f38230SBarry Smith } 1054d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 105509f38230SBarry Smith a->diag[i] = a->i[i+1]; 1056bfeeae90SHong Zhang for (j=a->i[i]; j<a->i[i+1]; j++) { 1057bfeeae90SHong Zhang if (a->j[j] == i) { 105809f38230SBarry Smith a->diag[i] = j; 105917ab2063SBarry Smith break; 106017ab2063SBarry Smith } 106117ab2063SBarry Smith } 106217ab2063SBarry Smith } 10633a40ed3dSBarry Smith PetscFunctionReturn(0); 106417ab2063SBarry Smith } 106517ab2063SBarry Smith 1066be5855fcSBarry Smith /* 1067be5855fcSBarry Smith Checks for missing diagonals 1068be5855fcSBarry Smith */ 10694a2ae208SSatish Balay #undef __FUNCT__ 10704a2ae208SSatish Balay #define __FUNCT__ "MatMissingDiagonal_SeqAIJ" 107109f38230SBarry Smith PetscErrorCode MatMissingDiagonal_SeqAIJ(Mat A,PetscTruth *missing,PetscInt *d) 1072be5855fcSBarry Smith { 1073be5855fcSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 107497f1f81fSBarry Smith PetscInt *diag,*jj = a->j,i; 1075be5855fcSBarry Smith 1076be5855fcSBarry Smith PetscFunctionBegin; 107709f38230SBarry Smith *missing = PETSC_FALSE; 1078d0f46423SBarry Smith if (A->rmap->n > 0 && !jj) { 107909f38230SBarry Smith *missing = PETSC_TRUE; 108009f38230SBarry Smith if (d) *d = 0; 108109f38230SBarry Smith PetscInfo(A,"Matrix has no entries therefor is missing diagonal"); 108209f38230SBarry Smith } else { 1083f1e2ffcdSBarry Smith diag = a->diag; 1084d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1085bfeeae90SHong Zhang if (jj[diag[i]] != i) { 108609f38230SBarry Smith *missing = PETSC_TRUE; 108709f38230SBarry Smith if (d) *d = i; 108809f38230SBarry Smith PetscInfo1(A,"Matrix is missing diagonal number %D",i); 108909f38230SBarry Smith } 1090be5855fcSBarry Smith } 1091be5855fcSBarry Smith } 1092be5855fcSBarry Smith PetscFunctionReturn(0); 1093be5855fcSBarry Smith } 1094be5855fcSBarry Smith 109571f1c65dSBarry Smith EXTERN_C_BEGIN 109671f1c65dSBarry Smith #undef __FUNCT__ 109771f1c65dSBarry Smith #define __FUNCT__ "MatInvertDiagonal_SeqAIJ" 109871f1c65dSBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatInvertDiagonal_SeqAIJ(Mat A,PetscScalar omega,PetscScalar fshift) 109971f1c65dSBarry Smith { 110071f1c65dSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*) A->data; 110171f1c65dSBarry Smith PetscErrorCode ierr; 1102d0f46423SBarry Smith PetscInt i,*diag,m = A->rmap->n; 110354f21887SBarry Smith MatScalar *v = a->a; 110454f21887SBarry Smith PetscScalar *idiag,*mdiag; 110571f1c65dSBarry Smith 110671f1c65dSBarry Smith PetscFunctionBegin; 110771f1c65dSBarry Smith if (a->idiagvalid) PetscFunctionReturn(0); 110871f1c65dSBarry Smith ierr = MatMarkDiagonal_SeqAIJ(A);CHKERRQ(ierr); 110971f1c65dSBarry Smith diag = a->diag; 111071f1c65dSBarry Smith if (!a->idiag) { 111171f1c65dSBarry Smith ierr = PetscMalloc3(m,PetscScalar,&a->idiag,m,PetscScalar,&a->mdiag,m,PetscScalar,&a->ssor_work);CHKERRQ(ierr); 111271f1c65dSBarry Smith ierr = PetscLogObjectMemory(A, 3*m*sizeof(PetscScalar));CHKERRQ(ierr); 111371f1c65dSBarry Smith v = a->a; 111471f1c65dSBarry Smith } 111571f1c65dSBarry Smith mdiag = a->mdiag; 111671f1c65dSBarry Smith idiag = a->idiag; 111771f1c65dSBarry Smith 1118028cd4eaSSatish Balay if (omega == 1.0 && !PetscAbsScalar(fshift)) { 111971f1c65dSBarry Smith for (i=0; i<m; i++) { 112071f1c65dSBarry Smith mdiag[i] = v[diag[i]]; 112171f1c65dSBarry Smith if (!PetscAbsScalar(mdiag[i])) SETERRQ1(PETSC_ERR_ARG_INCOMP,"Zero diagonal on row %D",i); 112271f1c65dSBarry Smith idiag[i] = 1.0/v[diag[i]]; 112371f1c65dSBarry Smith } 112471f1c65dSBarry Smith ierr = PetscLogFlops(m);CHKERRQ(ierr); 112571f1c65dSBarry Smith } else { 112671f1c65dSBarry Smith for (i=0; i<m; i++) { 112771f1c65dSBarry Smith mdiag[i] = v[diag[i]]; 112871f1c65dSBarry Smith idiag[i] = omega/(fshift + v[diag[i]]); 112971f1c65dSBarry Smith } 1130dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*m);CHKERRQ(ierr); 113171f1c65dSBarry Smith } 113271f1c65dSBarry Smith a->idiagvalid = PETSC_TRUE; 113371f1c65dSBarry Smith PetscFunctionReturn(0); 113471f1c65dSBarry Smith } 11355a9745a3SMatthew Knepley EXTERN_C_END 113671f1c65dSBarry Smith 1137a4005a5dSBarry Smith #include "../src/mat/impls/aij/seq/ftn-kernels/frelax.h" 11384a2ae208SSatish Balay #undef __FUNCT__ 11394a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqAIJ" 114097f1f81fSBarry Smith PetscErrorCode MatRelax_SeqAIJ(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal fshift,PetscInt its,PetscInt lits,Vec xx) 114117ab2063SBarry Smith { 1142416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 1143e6d1f457SBarry Smith PetscScalar *x,d,sum,*t,scale; 1144e6d1f457SBarry Smith const MatScalar *v = a->a,*idiag=0,*mdiag; 114554f21887SBarry Smith const PetscScalar *b, *bs,*xb, *ts; 1146dfbe8321SBarry Smith PetscErrorCode ierr; 1147d0f46423SBarry Smith PetscInt n = A->cmap->n,m = A->rmap->n,i; 114897f1f81fSBarry Smith const PetscInt *idx,*diag; 114917ab2063SBarry Smith 11503a40ed3dSBarry Smith PetscFunctionBegin; 1151b965ef7fSBarry Smith its = its*lits; 115291723122SBarry Smith 115371f1c65dSBarry Smith if (fshift != a->fshift || omega != a->omega) a->idiagvalid = PETSC_FALSE; /* must recompute idiag[] */ 115471f1c65dSBarry Smith if (!a->idiagvalid) {ierr = MatInvertDiagonal_SeqAIJ(A,omega,fshift);CHKERRQ(ierr);} 115571f1c65dSBarry Smith a->fshift = fshift; 115671f1c65dSBarry Smith a->omega = omega; 1157ed480e8bSBarry Smith 115871f1c65dSBarry Smith diag = a->diag; 115971f1c65dSBarry Smith t = a->ssor_work; 1160ed480e8bSBarry Smith idiag = a->idiag; 116171f1c65dSBarry Smith mdiag = a->mdiag; 1162ed480e8bSBarry Smith 11631ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 1164fb2e594dSBarry Smith if (xx != bb) { 11651ebc52fbSHong Zhang ierr = VecGetArray(bb,(PetscScalar**)&b);CHKERRQ(ierr); 1166fb2e594dSBarry Smith } else { 1167fb2e594dSBarry Smith b = x; 1168fb2e594dSBarry Smith } 116971f1c65dSBarry Smith CHKMEMQ; 1170ed480e8bSBarry Smith /* We count flops by assuming the upper triangular and lower triangular parts have the same number of nonzeros */ 117117ab2063SBarry Smith if (flag == SOR_APPLY_UPPER) { 117217ab2063SBarry Smith /* apply (U + D/omega) to the vector */ 1173ed480e8bSBarry Smith bs = b; 117417ab2063SBarry Smith for (i=0; i<m; i++) { 117571f1c65dSBarry Smith d = fshift + mdiag[i]; 1176416022c9SBarry Smith n = a->i[i+1] - diag[i] - 1; 1177ed480e8bSBarry Smith idx = a->j + diag[i] + 1; 1178ed480e8bSBarry Smith v = a->a + diag[i] + 1; 117917ab2063SBarry Smith sum = b[i]*d/omega; 1180003131ecSBarry Smith PetscSparseDensePlusDot(sum,bs,v,idx,n); 118117ab2063SBarry Smith x[i] = sum; 118217ab2063SBarry Smith } 11831ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 11841ebc52fbSHong Zhang if (bb != xx) {ierr = VecRestoreArray(bb,(PetscScalar**)&b);CHKERRQ(ierr);} 1185efee365bSSatish Balay ierr = PetscLogFlops(a->nz);CHKERRQ(ierr); 11863a40ed3dSBarry Smith PetscFunctionReturn(0); 118717ab2063SBarry Smith } 1188c783ea89SBarry Smith 118948af12d7SBarry Smith if (flag == SOR_APPLY_LOWER) { 119029bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"SOR_APPLY_LOWER is not implemented"); 11913a40ed3dSBarry Smith } else if (flag & SOR_EISENSTAT) { 119217ab2063SBarry Smith /* Let A = L + U + D; where L is lower trianglar, 119317ab2063SBarry Smith U is upper triangular, E is diagonal; This routine applies 119417ab2063SBarry Smith 119517ab2063SBarry Smith (L + E)^{-1} A (U + E)^{-1} 119617ab2063SBarry Smith 119717ab2063SBarry Smith to a vector efficiently using Eisenstat's trick. This is for 119817ab2063SBarry Smith the case of SSOR preconditioner, so E is D/omega where omega 119917ab2063SBarry Smith is the relaxation factor. 120017ab2063SBarry Smith */ 120117ab2063SBarry Smith scale = (2.0/omega) - 1.0; 120217ab2063SBarry Smith 120317ab2063SBarry Smith /* x = (E + U)^{-1} b */ 120417ab2063SBarry Smith for (i=m-1; i>=0; i--) { 1205416022c9SBarry Smith n = a->i[i+1] - diag[i] - 1; 1206ed480e8bSBarry Smith idx = a->j + diag[i] + 1; 1207ed480e8bSBarry Smith v = a->a + diag[i] + 1; 120817ab2063SBarry Smith sum = b[i]; 1209e6d1f457SBarry Smith PetscSparseDenseMinusDot(sum,x,v,idx,n); 1210ed480e8bSBarry Smith x[i] = sum*idiag[i]; 121117ab2063SBarry Smith } 121217ab2063SBarry Smith 121317ab2063SBarry Smith /* t = b - (2*E - D)x */ 1214416022c9SBarry Smith v = a->a; 1215ed480e8bSBarry Smith for (i=0; i<m; i++) { t[i] = b[i] - scale*(v[*diag++])*x[i]; } 121617ab2063SBarry Smith 121717ab2063SBarry Smith /* t = (E + L)^{-1}t */ 1218ed480e8bSBarry Smith ts = t; 1219416022c9SBarry Smith diag = a->diag; 122017ab2063SBarry Smith for (i=0; i<m; i++) { 1221416022c9SBarry Smith n = diag[i] - a->i[i]; 1222ed480e8bSBarry Smith idx = a->j + a->i[i]; 1223ed480e8bSBarry Smith v = a->a + a->i[i]; 122417ab2063SBarry Smith sum = t[i]; 1225003131ecSBarry Smith PetscSparseDenseMinusDot(sum,ts,v,idx,n); 1226ed480e8bSBarry Smith t[i] = sum*idiag[i]; 1227733d66baSBarry Smith /* x = x + t */ 1228733d66baSBarry Smith x[i] += t[i]; 122917ab2063SBarry Smith } 123017ab2063SBarry Smith 1231dc0b31edSSatish Balay ierr = PetscLogFlops(6.0*m-1 + 2.0*a->nz);CHKERRQ(ierr); 12321ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 12331ebc52fbSHong Zhang if (bb != xx) {ierr = VecRestoreArray(bb,(PetscScalar**)&b);CHKERRQ(ierr);} 12343a40ed3dSBarry Smith PetscFunctionReturn(0); 123517ab2063SBarry Smith } 123617ab2063SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 123717ab2063SBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 123877d8c4bbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ) 123997f1f81fSBarry Smith fortranrelaxaijforwardzero_(&m,&omega,x,a->i,a->j,(PetscInt*)diag,idiag,a->a,(void*)b); 124077d8c4bbSBarry Smith #else 124117ab2063SBarry Smith for (i=0; i<m; i++) { 1242416022c9SBarry Smith n = diag[i] - a->i[i]; 1243ed480e8bSBarry Smith idx = a->j + a->i[i]; 1244ed480e8bSBarry Smith v = a->a + a->i[i]; 124517ab2063SBarry Smith sum = b[i]; 1246e6d1f457SBarry Smith PetscSparseDenseMinusDot(sum,x,v,idx,n); 1247ed480e8bSBarry Smith x[i] = sum*idiag[i]; 124817ab2063SBarry Smith } 124977d8c4bbSBarry Smith #endif 125017ab2063SBarry Smith xb = x; 1251efee365bSSatish Balay ierr = PetscLogFlops(a->nz);CHKERRQ(ierr); 12523a40ed3dSBarry Smith } else xb = b; 125317ab2063SBarry Smith if ((flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) && 125417ab2063SBarry Smith (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP)) { 125517ab2063SBarry Smith for (i=0; i<m; i++) { 1256ed480e8bSBarry Smith x[i] *= mdiag[i]; 125717ab2063SBarry Smith } 1258efee365bSSatish Balay ierr = PetscLogFlops(m);CHKERRQ(ierr); 125917ab2063SBarry Smith } 126017ab2063SBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 126177d8c4bbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ) 126297f1f81fSBarry Smith fortranrelaxaijbackwardzero_(&m,&omega,x,a->i,a->j,(PetscInt*)diag,idiag,a->a,(void*)xb); 126377d8c4bbSBarry Smith #else 126417ab2063SBarry Smith for (i=m-1; i>=0; i--) { 1265416022c9SBarry Smith n = a->i[i+1] - diag[i] - 1; 1266ed480e8bSBarry Smith idx = a->j + diag[i] + 1; 1267ed480e8bSBarry Smith v = a->a + diag[i] + 1; 126817ab2063SBarry Smith sum = xb[i]; 1269e6d1f457SBarry Smith PetscSparseDenseMinusDot(sum,x,v,idx,n); 1270ed480e8bSBarry Smith x[i] = sum*idiag[i]; 127117ab2063SBarry Smith } 127277d8c4bbSBarry Smith #endif 1273efee365bSSatish Balay ierr = PetscLogFlops(a->nz);CHKERRQ(ierr); 127417ab2063SBarry Smith } 127517ab2063SBarry Smith its--; 127617ab2063SBarry Smith } 127717ab2063SBarry Smith while (its--) { 127817ab2063SBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 127977d8c4bbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ) 128097f1f81fSBarry Smith fortranrelaxaijforward_(&m,&omega,x,a->i,a->j,(PetscInt*)diag,a->a,(void*)b); 128177d8c4bbSBarry Smith #else 128217ab2063SBarry Smith for (i=0; i<m; i++) { 1283416022c9SBarry Smith n = a->i[i+1] - a->i[i]; 1284ed480e8bSBarry Smith idx = a->j + a->i[i]; 1285ed480e8bSBarry Smith v = a->a + a->i[i]; 128617ab2063SBarry Smith sum = b[i]; 1287e6d1f457SBarry Smith PetscSparseDenseMinusDot(sum,x,v,idx,n); 1288ed480e8bSBarry Smith x[i] = (1. - omega)*x[i] + (sum + mdiag[i]*x[i])*idiag[i]; 128917ab2063SBarry Smith } 129077d8c4bbSBarry Smith #endif 1291efee365bSSatish Balay ierr = PetscLogFlops(a->nz);CHKERRQ(ierr); 129217ab2063SBarry Smith } 129317ab2063SBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 129477d8c4bbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ) 129597f1f81fSBarry Smith fortranrelaxaijbackward_(&m,&omega,x,a->i,a->j,(PetscInt*)diag,a->a,(void*)b); 129677d8c4bbSBarry Smith #else 129717ab2063SBarry Smith for (i=m-1; i>=0; i--) { 1298416022c9SBarry Smith n = a->i[i+1] - a->i[i]; 1299ed480e8bSBarry Smith idx = a->j + a->i[i]; 1300ed480e8bSBarry Smith v = a->a + a->i[i]; 130117ab2063SBarry Smith sum = b[i]; 1302e6d1f457SBarry Smith PetscSparseDenseMinusDot(sum,x,v,idx,n); 1303ed480e8bSBarry Smith x[i] = (1. - omega)*x[i] + (sum + mdiag[i]*x[i])*idiag[i]; 130417ab2063SBarry Smith } 130577d8c4bbSBarry Smith #endif 1306efee365bSSatish Balay ierr = PetscLogFlops(a->nz);CHKERRQ(ierr); 130717ab2063SBarry Smith } 130817ab2063SBarry Smith } 13091ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 13101ebc52fbSHong Zhang if (bb != xx) {ierr = VecRestoreArray(bb,(PetscScalar**)&b);CHKERRQ(ierr);} 131171f1c65dSBarry Smith CHKMEMQ; PetscFunctionReturn(0); 131217ab2063SBarry Smith } 131317ab2063SBarry Smith 13142af78befSBarry Smith 13154a2ae208SSatish Balay #undef __FUNCT__ 13164a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqAIJ" 1317dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqAIJ(Mat A,MatInfoType flag,MatInfo *info) 131817ab2063SBarry Smith { 1319416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 13204e220ebcSLois Curfman McInnes 13213a40ed3dSBarry Smith PetscFunctionBegin; 13224e220ebcSLois Curfman McInnes info->block_size = 1.0; 13234e220ebcSLois Curfman McInnes info->nz_allocated = (double)a->maxnz; 13244e220ebcSLois Curfman McInnes info->nz_used = (double)a->nz; 13254e220ebcSLois Curfman McInnes info->nz_unneeded = (double)(a->maxnz - a->nz); 13264e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 13274e220ebcSLois Curfman McInnes info->mallocs = (double)a->reallocs; 13287adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 13294e220ebcSLois Curfman McInnes if (A->factor) { 13304e220ebcSLois Curfman McInnes info->fill_ratio_given = A->info.fill_ratio_given; 13314e220ebcSLois Curfman McInnes info->fill_ratio_needed = A->info.fill_ratio_needed; 13324e220ebcSLois Curfman McInnes info->factor_mallocs = A->info.factor_mallocs; 13334e220ebcSLois Curfman McInnes } else { 13344e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 13354e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 13364e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 13374e220ebcSLois Curfman McInnes } 13383a40ed3dSBarry Smith PetscFunctionReturn(0); 133917ab2063SBarry Smith } 134017ab2063SBarry Smith 13414a2ae208SSatish Balay #undef __FUNCT__ 13424a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqAIJ" 1343f4df32b1SMatthew Knepley PetscErrorCode MatZeroRows_SeqAIJ(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag) 134417ab2063SBarry Smith { 1345416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 1346d0f46423SBarry Smith PetscInt i,m = A->rmap->n - 1,d; 13476849ba73SBarry Smith PetscErrorCode ierr; 134809f38230SBarry Smith PetscTruth missing; 134917ab2063SBarry Smith 13503a40ed3dSBarry Smith PetscFunctionBegin; 1351a9817697SBarry Smith if (a->keepnonzeropattern) { 1352f1e2ffcdSBarry Smith for (i=0; i<N; i++) { 135377431f27SBarry Smith if (rows[i] < 0 || rows[i] > m) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"row %D out of range", rows[i]); 1354bfeeae90SHong Zhang ierr = PetscMemzero(&a->a[a->i[rows[i]]],a->ilen[rows[i]]*sizeof(PetscScalar));CHKERRQ(ierr); 1355f1e2ffcdSBarry Smith } 1356f4df32b1SMatthew Knepley if (diag != 0.0) { 135709f38230SBarry Smith ierr = MatMissingDiagonal_SeqAIJ(A,&missing,&d);CHKERRQ(ierr); 135809f38230SBarry Smith if (missing) SETERRQ1(PETSC_ERR_ARG_WRONGSTATE,"Matrix is missing diagonal entry in row %D",d); 1359f1e2ffcdSBarry Smith for (i=0; i<N; i++) { 1360f4df32b1SMatthew Knepley a->a[a->diag[rows[i]]] = diag; 1361f1e2ffcdSBarry Smith } 1362f1e2ffcdSBarry Smith } 136388e51ccdSHong Zhang A->same_nonzero = PETSC_TRUE; 1364f1e2ffcdSBarry Smith } else { 1365f4df32b1SMatthew Knepley if (diag != 0.0) { 136617ab2063SBarry Smith for (i=0; i<N; i++) { 136777431f27SBarry Smith if (rows[i] < 0 || rows[i] > m) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"row %D out of range", rows[i]); 13687ae801bdSBarry Smith if (a->ilen[rows[i]] > 0) { 1369416022c9SBarry Smith a->ilen[rows[i]] = 1; 1370f4df32b1SMatthew Knepley a->a[a->i[rows[i]]] = diag; 1371bfeeae90SHong Zhang a->j[a->i[rows[i]]] = rows[i]; 13727ae801bdSBarry Smith } else { /* in case row was completely empty */ 1373f4df32b1SMatthew Knepley ierr = MatSetValues_SeqAIJ(A,1,&rows[i],1,&rows[i],&diag,INSERT_VALUES);CHKERRQ(ierr); 137417ab2063SBarry Smith } 137517ab2063SBarry Smith } 13763a40ed3dSBarry Smith } else { 137717ab2063SBarry Smith for (i=0; i<N; i++) { 137877431f27SBarry Smith if (rows[i] < 0 || rows[i] > m) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"row %D out of range", rows[i]); 1379416022c9SBarry Smith a->ilen[rows[i]] = 0; 138017ab2063SBarry Smith } 138117ab2063SBarry Smith } 138288e51ccdSHong Zhang A->same_nonzero = PETSC_FALSE; 1383f1e2ffcdSBarry Smith } 138443a90d84SBarry Smith ierr = MatAssemblyEnd_SeqAIJ(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13853a40ed3dSBarry Smith PetscFunctionReturn(0); 138617ab2063SBarry Smith } 138717ab2063SBarry Smith 13884a2ae208SSatish Balay #undef __FUNCT__ 13894a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqAIJ" 1390a77337e4SBarry Smith PetscErrorCode MatGetRow_SeqAIJ(Mat A,PetscInt row,PetscInt *nz,PetscInt **idx,PetscScalar **v) 139117ab2063SBarry Smith { 1392416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 139397f1f81fSBarry Smith PetscInt *itmp; 139417ab2063SBarry Smith 13953a40ed3dSBarry Smith PetscFunctionBegin; 1396d0f46423SBarry Smith if (row < 0 || row >= A->rmap->n) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Row %D out of range",row); 139717ab2063SBarry Smith 1398416022c9SBarry Smith *nz = a->i[row+1] - a->i[row]; 1399bfeeae90SHong Zhang if (v) *v = a->a + a->i[row]; 140017ab2063SBarry Smith if (idx) { 1401bfeeae90SHong Zhang itmp = a->j + a->i[row]; 1402bfeeae90SHong Zhang if (*nz) { 14034e093b46SBarry Smith *idx = itmp; 140417ab2063SBarry Smith } 140517ab2063SBarry Smith else *idx = 0; 140617ab2063SBarry Smith } 14073a40ed3dSBarry Smith PetscFunctionReturn(0); 140817ab2063SBarry Smith } 140917ab2063SBarry Smith 1410bfeeae90SHong Zhang /* remove this function? */ 14114a2ae208SSatish Balay #undef __FUNCT__ 14124a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqAIJ" 1413a77337e4SBarry Smith PetscErrorCode MatRestoreRow_SeqAIJ(Mat A,PetscInt row,PetscInt *nz,PetscInt **idx,PetscScalar **v) 141417ab2063SBarry Smith { 14153a40ed3dSBarry Smith PetscFunctionBegin; 14163a40ed3dSBarry Smith PetscFunctionReturn(0); 141717ab2063SBarry Smith } 141817ab2063SBarry Smith 14194a2ae208SSatish Balay #undef __FUNCT__ 14204a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqAIJ" 1421dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqAIJ(Mat A,NormType type,PetscReal *nrm) 142217ab2063SBarry Smith { 1423416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 142454f21887SBarry Smith MatScalar *v = a->a; 142536db0b34SBarry Smith PetscReal sum = 0.0; 14266849ba73SBarry Smith PetscErrorCode ierr; 142797f1f81fSBarry Smith PetscInt i,j; 142817ab2063SBarry Smith 14293a40ed3dSBarry Smith PetscFunctionBegin; 143017ab2063SBarry Smith if (type == NORM_FROBENIUS) { 1431416022c9SBarry Smith for (i=0; i<a->nz; i++) { 1432aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 143336db0b34SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 143417ab2063SBarry Smith #else 143517ab2063SBarry Smith sum += (*v)*(*v); v++; 143617ab2063SBarry Smith #endif 143717ab2063SBarry Smith } 1438064f8208SBarry Smith *nrm = sqrt(sum); 14393a40ed3dSBarry Smith } else if (type == NORM_1) { 144036db0b34SBarry Smith PetscReal *tmp; 144197f1f81fSBarry Smith PetscInt *jj = a->j; 1442d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscReal),&tmp);CHKERRQ(ierr); 1443d0f46423SBarry Smith ierr = PetscMemzero(tmp,A->cmap->n*sizeof(PetscReal));CHKERRQ(ierr); 1444064f8208SBarry Smith *nrm = 0.0; 1445416022c9SBarry Smith for (j=0; j<a->nz; j++) { 1446bfeeae90SHong Zhang tmp[*jj++] += PetscAbsScalar(*v); v++; 144717ab2063SBarry Smith } 1448d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1449064f8208SBarry Smith if (tmp[j] > *nrm) *nrm = tmp[j]; 145017ab2063SBarry Smith } 1451606d414cSSatish Balay ierr = PetscFree(tmp);CHKERRQ(ierr); 14523a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1453064f8208SBarry Smith *nrm = 0.0; 1454d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1455bfeeae90SHong Zhang v = a->a + a->i[j]; 145617ab2063SBarry Smith sum = 0.0; 1457416022c9SBarry Smith for (i=0; i<a->i[j+1]-a->i[j]; i++) { 1458cddf8d76SBarry Smith sum += PetscAbsScalar(*v); v++; 145917ab2063SBarry Smith } 1460064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 146117ab2063SBarry Smith } 14623a40ed3dSBarry Smith } else { 146329bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"No support for two norm"); 146417ab2063SBarry Smith } 14653a40ed3dSBarry Smith PetscFunctionReturn(0); 146617ab2063SBarry Smith } 146717ab2063SBarry Smith 14684a2ae208SSatish Balay #undef __FUNCT__ 14694a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqAIJ" 1470fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqAIJ(Mat A,MatReuse reuse,Mat *B) 147117ab2063SBarry Smith { 1472416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 1473416022c9SBarry Smith Mat C; 14746849ba73SBarry Smith PetscErrorCode ierr; 1475d0f46423SBarry Smith PetscInt i,*aj = a->j,*ai = a->i,m = A->rmap->n,len,*col; 147654f21887SBarry Smith MatScalar *array = a->a; 147717ab2063SBarry Smith 14783a40ed3dSBarry Smith PetscFunctionBegin; 1479d0f46423SBarry Smith if (reuse == MAT_REUSE_MATRIX && A == *B && m != A->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Square matrix only for in-place"); 1480fc4dec0aSBarry Smith 1481fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX || *B == A) { 1482d0f46423SBarry Smith ierr = PetscMalloc((1+A->cmap->n)*sizeof(PetscInt),&col);CHKERRQ(ierr); 1483d0f46423SBarry Smith ierr = PetscMemzero(col,(1+A->cmap->n)*sizeof(PetscInt));CHKERRQ(ierr); 1484bfeeae90SHong Zhang 1485bfeeae90SHong Zhang for (i=0; i<ai[m]; i++) col[aj[i]] += 1; 14867adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&C);CHKERRQ(ierr); 1487d0f46423SBarry Smith ierr = MatSetSizes(C,A->cmap->n,m,A->cmap->n,m);CHKERRQ(ierr); 14887adad957SLisandro Dalcin ierr = MatSetType(C,((PetscObject)A)->type_name);CHKERRQ(ierr); 1489ab93d7beSBarry Smith ierr = MatSeqAIJSetPreallocation_SeqAIJ(C,0,col);CHKERRQ(ierr); 1490606d414cSSatish Balay ierr = PetscFree(col);CHKERRQ(ierr); 1491a541d17aSBarry Smith } else { 1492a541d17aSBarry Smith C = *B; 1493a541d17aSBarry Smith } 1494a541d17aSBarry Smith 149517ab2063SBarry Smith for (i=0; i<m; i++) { 149617ab2063SBarry Smith len = ai[i+1]-ai[i]; 149787d4246cSBarry Smith ierr = MatSetValues_SeqAIJ(C,len,aj,1,&i,array,INSERT_VALUES);CHKERRQ(ierr); 1498b9b97703SBarry Smith array += len; 1499b9b97703SBarry Smith aj += len; 150017ab2063SBarry Smith } 15016d4a8577SBarry Smith ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15026d4a8577SBarry Smith ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 150317ab2063SBarry Smith 1504815cbec1SBarry Smith if (reuse == MAT_INITIAL_MATRIX || *B != A) { 1505416022c9SBarry Smith *B = C; 150617ab2063SBarry Smith } else { 1507273d9f13SBarry Smith ierr = MatHeaderCopy(A,C);CHKERRQ(ierr); 150817ab2063SBarry Smith } 15093a40ed3dSBarry Smith PetscFunctionReturn(0); 151017ab2063SBarry Smith } 151117ab2063SBarry Smith 1512cd0d46ebSvictorle EXTERN_C_BEGIN 1513cd0d46ebSvictorle #undef __FUNCT__ 15145fbd3699SBarry Smith #define __FUNCT__ "MatIsTranspose_SeqAIJ" 1515be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatIsTranspose_SeqAIJ(Mat A,Mat B,PetscReal tol,PetscTruth *f) 1516cd0d46ebSvictorle { 1517cd0d46ebSvictorle Mat_SeqAIJ *aij = (Mat_SeqAIJ *) A->data,*bij = (Mat_SeqAIJ*) A->data; 151854f21887SBarry Smith PetscInt *adx,*bdx,*aii,*bii,*aptr,*bptr; 151954f21887SBarry Smith MatScalar *va,*vb; 15206849ba73SBarry Smith PetscErrorCode ierr; 152197f1f81fSBarry Smith PetscInt ma,na,mb,nb, i; 1522cd0d46ebSvictorle 1523cd0d46ebSvictorle PetscFunctionBegin; 1524cd0d46ebSvictorle bij = (Mat_SeqAIJ *) B->data; 1525cd0d46ebSvictorle 1526cd0d46ebSvictorle ierr = MatGetSize(A,&ma,&na);CHKERRQ(ierr); 1527cd0d46ebSvictorle ierr = MatGetSize(B,&mb,&nb);CHKERRQ(ierr); 15285485867bSBarry Smith if (ma!=nb || na!=mb){ 15295485867bSBarry Smith *f = PETSC_FALSE; 15305485867bSBarry Smith PetscFunctionReturn(0); 15315485867bSBarry Smith } 1532cd0d46ebSvictorle aii = aij->i; bii = bij->i; 1533cd0d46ebSvictorle adx = aij->j; bdx = bij->j; 1534cd0d46ebSvictorle va = aij->a; vb = bij->a; 153597f1f81fSBarry Smith ierr = PetscMalloc(ma*sizeof(PetscInt),&aptr);CHKERRQ(ierr); 153697f1f81fSBarry Smith ierr = PetscMalloc(mb*sizeof(PetscInt),&bptr);CHKERRQ(ierr); 1537cd0d46ebSvictorle for (i=0; i<ma; i++) aptr[i] = aii[i]; 1538cd0d46ebSvictorle for (i=0; i<mb; i++) bptr[i] = bii[i]; 1539cd0d46ebSvictorle 1540cd0d46ebSvictorle *f = PETSC_TRUE; 1541cd0d46ebSvictorle for (i=0; i<ma; i++) { 1542cd0d46ebSvictorle while (aptr[i]<aii[i+1]) { 154397f1f81fSBarry Smith PetscInt idc,idr; 15445485867bSBarry Smith PetscScalar vc,vr; 1545cd0d46ebSvictorle /* column/row index/value */ 15465485867bSBarry Smith idc = adx[aptr[i]]; 15475485867bSBarry Smith idr = bdx[bptr[idc]]; 15485485867bSBarry Smith vc = va[aptr[i]]; 15495485867bSBarry Smith vr = vb[bptr[idc]]; 15505485867bSBarry Smith if (i!=idr || PetscAbsScalar(vc-vr) > tol) { 15515485867bSBarry Smith *f = PETSC_FALSE; 15525485867bSBarry Smith goto done; 1553cd0d46ebSvictorle } else { 15545485867bSBarry Smith aptr[i]++; 15555485867bSBarry Smith if (B || i!=idc) bptr[idc]++; 1556cd0d46ebSvictorle } 1557cd0d46ebSvictorle } 1558cd0d46ebSvictorle } 1559cd0d46ebSvictorle done: 1560cd0d46ebSvictorle ierr = PetscFree(aptr);CHKERRQ(ierr); 15613aeef889SHong Zhang if (B) { 15623aeef889SHong Zhang ierr = PetscFree(bptr);CHKERRQ(ierr); 15633aeef889SHong Zhang } 1564cd0d46ebSvictorle PetscFunctionReturn(0); 1565cd0d46ebSvictorle } 1566cd0d46ebSvictorle EXTERN_C_END 1567cd0d46ebSvictorle 15681cbb95d3SBarry Smith EXTERN_C_BEGIN 15691cbb95d3SBarry Smith #undef __FUNCT__ 15701cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitianTranspose_SeqAIJ" 15711cbb95d3SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitianTranspose_SeqAIJ(Mat A,Mat B,PetscReal tol,PetscTruth *f) 15721cbb95d3SBarry Smith { 15731cbb95d3SBarry Smith Mat_SeqAIJ *aij = (Mat_SeqAIJ *) A->data,*bij = (Mat_SeqAIJ*) A->data; 157454f21887SBarry Smith PetscInt *adx,*bdx,*aii,*bii,*aptr,*bptr; 157554f21887SBarry Smith MatScalar *va,*vb; 15761cbb95d3SBarry Smith PetscErrorCode ierr; 15771cbb95d3SBarry Smith PetscInt ma,na,mb,nb, i; 15781cbb95d3SBarry Smith 15791cbb95d3SBarry Smith PetscFunctionBegin; 15801cbb95d3SBarry Smith bij = (Mat_SeqAIJ *) B->data; 15811cbb95d3SBarry Smith 15821cbb95d3SBarry Smith ierr = MatGetSize(A,&ma,&na);CHKERRQ(ierr); 15831cbb95d3SBarry Smith ierr = MatGetSize(B,&mb,&nb);CHKERRQ(ierr); 15841cbb95d3SBarry Smith if (ma!=nb || na!=mb){ 15851cbb95d3SBarry Smith *f = PETSC_FALSE; 15861cbb95d3SBarry Smith PetscFunctionReturn(0); 15871cbb95d3SBarry Smith } 15881cbb95d3SBarry Smith aii = aij->i; bii = bij->i; 15891cbb95d3SBarry Smith adx = aij->j; bdx = bij->j; 15901cbb95d3SBarry Smith va = aij->a; vb = bij->a; 15911cbb95d3SBarry Smith ierr = PetscMalloc(ma*sizeof(PetscInt),&aptr);CHKERRQ(ierr); 15921cbb95d3SBarry Smith ierr = PetscMalloc(mb*sizeof(PetscInt),&bptr);CHKERRQ(ierr); 15931cbb95d3SBarry Smith for (i=0; i<ma; i++) aptr[i] = aii[i]; 15941cbb95d3SBarry Smith for (i=0; i<mb; i++) bptr[i] = bii[i]; 15951cbb95d3SBarry Smith 15961cbb95d3SBarry Smith *f = PETSC_TRUE; 15971cbb95d3SBarry Smith for (i=0; i<ma; i++) { 15981cbb95d3SBarry Smith while (aptr[i]<aii[i+1]) { 15991cbb95d3SBarry Smith PetscInt idc,idr; 16001cbb95d3SBarry Smith PetscScalar vc,vr; 16011cbb95d3SBarry Smith /* column/row index/value */ 16021cbb95d3SBarry Smith idc = adx[aptr[i]]; 16031cbb95d3SBarry Smith idr = bdx[bptr[idc]]; 16041cbb95d3SBarry Smith vc = va[aptr[i]]; 16051cbb95d3SBarry Smith vr = vb[bptr[idc]]; 16061cbb95d3SBarry Smith if (i!=idr || PetscAbsScalar(vc-PetscConj(vr)) > tol) { 16071cbb95d3SBarry Smith *f = PETSC_FALSE; 16081cbb95d3SBarry Smith goto done; 16091cbb95d3SBarry Smith } else { 16101cbb95d3SBarry Smith aptr[i]++; 16111cbb95d3SBarry Smith if (B || i!=idc) bptr[idc]++; 16121cbb95d3SBarry Smith } 16131cbb95d3SBarry Smith } 16141cbb95d3SBarry Smith } 16151cbb95d3SBarry Smith done: 16161cbb95d3SBarry Smith ierr = PetscFree(aptr);CHKERRQ(ierr); 16171cbb95d3SBarry Smith if (B) { 16181cbb95d3SBarry Smith ierr = PetscFree(bptr);CHKERRQ(ierr); 16191cbb95d3SBarry Smith } 16201cbb95d3SBarry Smith PetscFunctionReturn(0); 16211cbb95d3SBarry Smith } 16221cbb95d3SBarry Smith EXTERN_C_END 16231cbb95d3SBarry Smith 16249e29f15eSvictorle #undef __FUNCT__ 16259e29f15eSvictorle #define __FUNCT__ "MatIsSymmetric_SeqAIJ" 1626dfbe8321SBarry Smith PetscErrorCode MatIsSymmetric_SeqAIJ(Mat A,PetscReal tol,PetscTruth *f) 16279e29f15eSvictorle { 1628dfbe8321SBarry Smith PetscErrorCode ierr; 16299e29f15eSvictorle PetscFunctionBegin; 16305485867bSBarry Smith ierr = MatIsTranspose_SeqAIJ(A,A,tol,f);CHKERRQ(ierr); 16319e29f15eSvictorle PetscFunctionReturn(0); 16329e29f15eSvictorle } 16339e29f15eSvictorle 16344a2ae208SSatish Balay #undef __FUNCT__ 16351cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqAIJ" 16361cbb95d3SBarry Smith PetscErrorCode MatIsHermitian_SeqAIJ(Mat A,PetscReal tol,PetscTruth *f) 16371cbb95d3SBarry Smith { 16381cbb95d3SBarry Smith PetscErrorCode ierr; 16391cbb95d3SBarry Smith PetscFunctionBegin; 16401cbb95d3SBarry Smith ierr = MatIsHermitianTranspose_SeqAIJ(A,A,tol,f);CHKERRQ(ierr); 16411cbb95d3SBarry Smith PetscFunctionReturn(0); 16421cbb95d3SBarry Smith } 16431cbb95d3SBarry Smith 16441cbb95d3SBarry Smith #undef __FUNCT__ 16454a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqAIJ" 1646dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqAIJ(Mat A,Vec ll,Vec rr) 164717ab2063SBarry Smith { 1648416022c9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 164954f21887SBarry Smith PetscScalar *l,*r,x; 165054f21887SBarry Smith MatScalar *v; 1651dfbe8321SBarry Smith PetscErrorCode ierr; 1652d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,M,nz = a->nz,*jj; 165317ab2063SBarry Smith 16543a40ed3dSBarry Smith PetscFunctionBegin; 165517ab2063SBarry Smith if (ll) { 16563ea7c6a1SSatish Balay /* The local size is used so that VecMPI can be passed to this routine 16573ea7c6a1SSatish Balay by MatDiagonalScale_MPIAIJ */ 1658e1311b90SBarry Smith ierr = VecGetLocalSize(ll,&m);CHKERRQ(ierr); 1659d0f46423SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vector wrong length"); 16601ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1661416022c9SBarry Smith v = a->a; 166217ab2063SBarry Smith for (i=0; i<m; i++) { 166317ab2063SBarry Smith x = l[i]; 1664416022c9SBarry Smith M = a->i[i+1] - a->i[i]; 166517ab2063SBarry Smith for (j=0; j<M; j++) { (*v++) *= x;} 166617ab2063SBarry Smith } 16671ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1668efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 166917ab2063SBarry Smith } 167017ab2063SBarry Smith if (rr) { 1671e1311b90SBarry Smith ierr = VecGetLocalSize(rr,&n);CHKERRQ(ierr); 1672d0f46423SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vector wrong length"); 16731ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1674416022c9SBarry Smith v = a->a; jj = a->j; 167517ab2063SBarry Smith for (i=0; i<nz; i++) { 1676bfeeae90SHong Zhang (*v++) *= r[*jj++]; 167717ab2063SBarry Smith } 16781ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1679efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 168017ab2063SBarry Smith } 16813a40ed3dSBarry Smith PetscFunctionReturn(0); 168217ab2063SBarry Smith } 168317ab2063SBarry Smith 16844a2ae208SSatish Balay #undef __FUNCT__ 16854a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqAIJ" 168697f1f81fSBarry Smith PetscErrorCode MatGetSubMatrix_SeqAIJ(Mat A,IS isrow,IS iscol,PetscInt csize,MatReuse scall,Mat *B) 168717ab2063SBarry Smith { 1688db02288aSLois Curfman McInnes Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data,*c; 16896849ba73SBarry Smith PetscErrorCode ierr; 1690d0f46423SBarry Smith PetscInt *smap,i,k,kstart,kend,oldcols = A->cmap->n,*lens; 169197f1f81fSBarry Smith PetscInt row,mat_i,*mat_j,tcol,first,step,*mat_ilen,sum,lensi; 16925d0c19d7SBarry Smith const PetscInt *irow,*icol; 16935d0c19d7SBarry Smith PetscInt nrows,ncols; 169497f1f81fSBarry Smith PetscInt *starts,*j_new,*i_new,*aj = a->j,*ai = a->i,ii,*ailen = a->ilen; 169554f21887SBarry Smith MatScalar *a_new,*mat_a; 1696416022c9SBarry Smith Mat C; 169714ca34e6SBarry Smith PetscTruth stride,sorted; 169817ab2063SBarry Smith 16993a40ed3dSBarry Smith PetscFunctionBegin; 170014ca34e6SBarry Smith ierr = ISSorted(isrow,&sorted);CHKERRQ(ierr); 170114ca34e6SBarry Smith if (!sorted) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"ISrow is not sorted"); 170214ca34e6SBarry Smith ierr = ISSorted(iscol,&sorted);CHKERRQ(ierr); 170314ca34e6SBarry Smith if (!sorted) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"IScol is not sorted"); 170499141d43SSatish Balay 170517ab2063SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 1706b9b97703SBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1707b9b97703SBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 170817ab2063SBarry Smith 1709fee21e36SBarry Smith ierr = ISStrideGetInfo(iscol,&first,&step);CHKERRQ(ierr); 1710fee21e36SBarry Smith ierr = ISStride(iscol,&stride);CHKERRQ(ierr); 1711fee21e36SBarry Smith if (stride && step == 1) { 171202834360SBarry Smith /* special case of contiguous rows */ 171397f1f81fSBarry Smith ierr = PetscMalloc((2*nrows+1)*sizeof(PetscInt),&lens);CHKERRQ(ierr); 171431ebf83bSSatish Balay starts = lens + nrows; 171502834360SBarry Smith /* loop over new rows determining lens and starting points */ 171602834360SBarry Smith for (i=0; i<nrows; i++) { 1717bfeeae90SHong Zhang kstart = ai[irow[i]]; 1718a2744918SBarry Smith kend = kstart + ailen[irow[i]]; 171902834360SBarry Smith for (k=kstart; k<kend; k++) { 1720bfeeae90SHong Zhang if (aj[k] >= first) { 172102834360SBarry Smith starts[i] = k; 172202834360SBarry Smith break; 172302834360SBarry Smith } 172402834360SBarry Smith } 1725a2744918SBarry Smith sum = 0; 172602834360SBarry Smith while (k < kend) { 1727bfeeae90SHong Zhang if (aj[k++] >= first+ncols) break; 1728a2744918SBarry Smith sum++; 172902834360SBarry Smith } 1730a2744918SBarry Smith lens[i] = sum; 173102834360SBarry Smith } 173202834360SBarry Smith /* create submatrix */ 1733cddf8d76SBarry Smith if (scall == MAT_REUSE_MATRIX) { 173497f1f81fSBarry Smith PetscInt n_cols,n_rows; 173508480c60SBarry Smith ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 173629bbc08cSBarry Smith if (n_rows != nrows || n_cols != ncols) SETERRQ(PETSC_ERR_ARG_SIZ,"Reused submatrix wrong size"); 1737d8ced48eSBarry Smith ierr = MatZeroEntries(*B);CHKERRQ(ierr); 173808480c60SBarry Smith C = *B; 17393a40ed3dSBarry Smith } else { 17407adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&C);CHKERRQ(ierr); 1741f69a0ea3SMatthew Knepley ierr = MatSetSizes(C,nrows,ncols,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr); 17427adad957SLisandro Dalcin ierr = MatSetType(C,((PetscObject)A)->type_name);CHKERRQ(ierr); 1743ab93d7beSBarry Smith ierr = MatSeqAIJSetPreallocation_SeqAIJ(C,0,lens);CHKERRQ(ierr); 174408480c60SBarry Smith } 1745db02288aSLois Curfman McInnes c = (Mat_SeqAIJ*)C->data; 1746db02288aSLois Curfman McInnes 174702834360SBarry Smith /* loop over rows inserting into submatrix */ 1748db02288aSLois Curfman McInnes a_new = c->a; 1749db02288aSLois Curfman McInnes j_new = c->j; 1750db02288aSLois Curfman McInnes i_new = c->i; 1751bfeeae90SHong Zhang 175202834360SBarry Smith for (i=0; i<nrows; i++) { 1753a2744918SBarry Smith ii = starts[i]; 1754a2744918SBarry Smith lensi = lens[i]; 1755a2744918SBarry Smith for (k=0; k<lensi; k++) { 1756a2744918SBarry Smith *j_new++ = aj[ii+k] - first; 175702834360SBarry Smith } 175887828ca2SBarry Smith ierr = PetscMemcpy(a_new,a->a + starts[i],lensi*sizeof(PetscScalar));CHKERRQ(ierr); 1759a2744918SBarry Smith a_new += lensi; 1760a2744918SBarry Smith i_new[i+1] = i_new[i] + lensi; 1761a2744918SBarry Smith c->ilen[i] = lensi; 176202834360SBarry Smith } 1763606d414cSSatish Balay ierr = PetscFree(lens);CHKERRQ(ierr); 17643a40ed3dSBarry Smith } else { 176502834360SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 176697f1f81fSBarry Smith ierr = PetscMalloc((1+oldcols)*sizeof(PetscInt),&smap);CHKERRQ(ierr); 1767bfeeae90SHong Zhang 176897f1f81fSBarry Smith ierr = PetscMalloc((1+nrows)*sizeof(PetscInt),&lens);CHKERRQ(ierr); 176997f1f81fSBarry Smith ierr = PetscMemzero(smap,oldcols*sizeof(PetscInt));CHKERRQ(ierr); 177017ab2063SBarry Smith for (i=0; i<ncols; i++) smap[icol[i]] = i+1; 177102834360SBarry Smith /* determine lens of each row */ 177202834360SBarry Smith for (i=0; i<nrows; i++) { 1773bfeeae90SHong Zhang kstart = ai[irow[i]]; 177402834360SBarry Smith kend = kstart + a->ilen[irow[i]]; 177502834360SBarry Smith lens[i] = 0; 177602834360SBarry Smith for (k=kstart; k<kend; k++) { 1777bfeeae90SHong Zhang if (smap[aj[k]]) { 177802834360SBarry Smith lens[i]++; 177902834360SBarry Smith } 178002834360SBarry Smith } 178102834360SBarry Smith } 178217ab2063SBarry Smith /* Create and fill new matrix */ 1783a2744918SBarry Smith if (scall == MAT_REUSE_MATRIX) { 17840f5bd95cSBarry Smith PetscTruth equal; 17850f5bd95cSBarry Smith 178699141d43SSatish Balay c = (Mat_SeqAIJ *)((*B)->data); 1787d0f46423SBarry Smith if ((*B)->rmap->n != nrows || (*B)->cmap->n != ncols) SETERRQ(PETSC_ERR_ARG_SIZ,"Cannot reuse matrix. wrong size"); 1788d0f46423SBarry Smith ierr = PetscMemcmp(c->ilen,lens,(*B)->rmap->n*sizeof(PetscInt),&equal);CHKERRQ(ierr); 17890f5bd95cSBarry Smith if (!equal) { 179029bbc08cSBarry Smith SETERRQ(PETSC_ERR_ARG_SIZ,"Cannot reuse matrix. wrong no of nonzeros"); 179199141d43SSatish Balay } 1792d0f46423SBarry Smith ierr = PetscMemzero(c->ilen,(*B)->rmap->n*sizeof(PetscInt));CHKERRQ(ierr); 179308480c60SBarry Smith C = *B; 17943a40ed3dSBarry Smith } else { 17957adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&C);CHKERRQ(ierr); 1796f69a0ea3SMatthew Knepley ierr = MatSetSizes(C,nrows,ncols,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr); 17977adad957SLisandro Dalcin ierr = MatSetType(C,((PetscObject)A)->type_name);CHKERRQ(ierr); 1798ab93d7beSBarry Smith ierr = MatSeqAIJSetPreallocation_SeqAIJ(C,0,lens);CHKERRQ(ierr); 179908480c60SBarry Smith } 180099141d43SSatish Balay c = (Mat_SeqAIJ *)(C->data); 180117ab2063SBarry Smith for (i=0; i<nrows; i++) { 180299141d43SSatish Balay row = irow[i]; 1803bfeeae90SHong Zhang kstart = ai[row]; 180499141d43SSatish Balay kend = kstart + a->ilen[row]; 1805bfeeae90SHong Zhang mat_i = c->i[i]; 180699141d43SSatish Balay mat_j = c->j + mat_i; 180799141d43SSatish Balay mat_a = c->a + mat_i; 180899141d43SSatish Balay mat_ilen = c->ilen + i; 180917ab2063SBarry Smith for (k=kstart; k<kend; k++) { 1810bfeeae90SHong Zhang if ((tcol=smap[a->j[k]])) { 1811ed480e8bSBarry Smith *mat_j++ = tcol - 1; 181299141d43SSatish Balay *mat_a++ = a->a[k]; 181399141d43SSatish Balay (*mat_ilen)++; 181499141d43SSatish Balay 181517ab2063SBarry Smith } 181617ab2063SBarry Smith } 181717ab2063SBarry Smith } 181802834360SBarry Smith /* Free work space */ 181902834360SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1820606d414cSSatish Balay ierr = PetscFree(smap);CHKERRQ(ierr); 1821606d414cSSatish Balay ierr = PetscFree(lens);CHKERRQ(ierr); 182202834360SBarry Smith } 18236d4a8577SBarry Smith ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 18246d4a8577SBarry Smith ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 182517ab2063SBarry Smith 182617ab2063SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 1827416022c9SBarry Smith *B = C; 18283a40ed3dSBarry Smith PetscFunctionReturn(0); 182917ab2063SBarry Smith } 183017ab2063SBarry Smith 1831a871dcd8SBarry Smith /* 1832a871dcd8SBarry Smith */ 18334a2ae208SSatish Balay #undef __FUNCT__ 18344a2ae208SSatish Balay #define __FUNCT__ "MatILUFactor_SeqAIJ" 18350481f469SBarry Smith PetscErrorCode MatILUFactor_SeqAIJ(Mat inA,IS row,IS col,const MatFactorInfo *info) 1836a871dcd8SBarry Smith { 183763b91edcSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)inA->data; 1838dfbe8321SBarry Smith PetscErrorCode ierr; 183963b91edcSBarry Smith Mat outA; 1840b8a78c4aSBarry Smith PetscTruth row_identity,col_identity; 184163b91edcSBarry Smith 18423a40ed3dSBarry Smith PetscFunctionBegin; 1843d3d32019SBarry Smith if (info->levels != 0) SETERRQ(PETSC_ERR_SUP,"Only levels=0 supported for in-place ilu"); 1844b8a78c4aSBarry Smith ierr = ISIdentity(row,&row_identity);CHKERRQ(ierr); 1845b8a78c4aSBarry Smith ierr = ISIdentity(col,&col_identity);CHKERRQ(ierr); 1846a871dcd8SBarry Smith 184763b91edcSBarry Smith outA = inA; 18485c9eb25fSBarry Smith inA->factor = MAT_FACTOR_LU; 1849c38d4ed2SBarry Smith ierr = PetscObjectReference((PetscObject)row);CHKERRQ(ierr); 1850c3122656SLisandro Dalcin if (a->row) { ierr = ISDestroy(a->row);CHKERRQ(ierr);} 1851c3122656SLisandro Dalcin a->row = row; 1852c38d4ed2SBarry Smith ierr = PetscObjectReference((PetscObject)col);CHKERRQ(ierr); 1853c3122656SLisandro Dalcin if (a->col) { ierr = ISDestroy(a->col);CHKERRQ(ierr);} 1854c3122656SLisandro Dalcin a->col = col; 185563b91edcSBarry Smith 185636db0b34SBarry Smith /* Create the inverse permutation so that it can be used in MatLUFactorNumeric() */ 1857b9b97703SBarry Smith if (a->icol) {ierr = ISDestroy(a->icol);CHKERRQ(ierr);} /* need to remove old one */ 18584c49b128SBarry Smith ierr = ISInvertPermutation(col,PETSC_DECIDE,&a->icol);CHKERRQ(ierr); 185952e6d16bSBarry Smith ierr = PetscLogObjectParent(inA,a->icol);CHKERRQ(ierr); 1860f0ec6fceSSatish Balay 186194a9d846SBarry Smith if (!a->solve_work) { /* this matrix may have been factored before */ 1862d0f46423SBarry Smith ierr = PetscMalloc((inA->rmap->n+1)*sizeof(PetscScalar),&a->solve_work);CHKERRQ(ierr); 1863d0f46423SBarry Smith ierr = PetscLogObjectMemory(inA, (inA->rmap->n+1)*sizeof(PetscScalar));CHKERRQ(ierr); 186494a9d846SBarry Smith } 186563b91edcSBarry Smith 1866f1e2ffcdSBarry Smith ierr = MatMarkDiagonal_SeqAIJ(inA);CHKERRQ(ierr); 1867137fb511SHong Zhang if (row_identity && col_identity) { 1868719d5645SBarry Smith ierr = MatLUFactorNumeric_SeqAIJ(outA,inA,info);CHKERRQ(ierr); 1869137fb511SHong Zhang } else { 1870719d5645SBarry Smith ierr = MatLUFactorNumeric_SeqAIJ_InplaceWithPerm(outA,inA,info);CHKERRQ(ierr); 1871137fb511SHong Zhang } 18723a40ed3dSBarry Smith PetscFunctionReturn(0); 1873a871dcd8SBarry Smith } 1874a871dcd8SBarry Smith 1875d9eff348SSatish Balay #include "petscblaslapack.h" 18764a2ae208SSatish Balay #undef __FUNCT__ 18774a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqAIJ" 1878f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqAIJ(Mat inA,PetscScalar alpha) 1879f0b747eeSBarry Smith { 1880f0b747eeSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)inA->data; 1881f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 1882efee365bSSatish Balay PetscErrorCode ierr; 18830805154bSBarry Smith PetscBLASInt one = 1,bnz = PetscBLASIntCast(a->nz); 18843a40ed3dSBarry Smith 18853a40ed3dSBarry Smith PetscFunctionBegin; 1886f4df32b1SMatthew Knepley BLASscal_(&bnz,&oalpha,a->a,&one); 1887efee365bSSatish Balay ierr = PetscLogFlops(a->nz);CHKERRQ(ierr); 18883a40ed3dSBarry Smith PetscFunctionReturn(0); 1889f0b747eeSBarry Smith } 1890f0b747eeSBarry Smith 18914a2ae208SSatish Balay #undef __FUNCT__ 18924a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqAIJ" 189397f1f81fSBarry Smith PetscErrorCode MatGetSubMatrices_SeqAIJ(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1894cddf8d76SBarry Smith { 1895dfbe8321SBarry Smith PetscErrorCode ierr; 189697f1f81fSBarry Smith PetscInt i; 1897cddf8d76SBarry Smith 18983a40ed3dSBarry Smith PetscFunctionBegin; 1899cddf8d76SBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1900b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1901cddf8d76SBarry Smith } 1902cddf8d76SBarry Smith 1903cddf8d76SBarry Smith for (i=0; i<n; i++) { 19046a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqAIJ(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1905cddf8d76SBarry Smith } 19063a40ed3dSBarry Smith PetscFunctionReturn(0); 1907cddf8d76SBarry Smith } 1908cddf8d76SBarry Smith 19094a2ae208SSatish Balay #undef __FUNCT__ 19104a2ae208SSatish Balay #define __FUNCT__ "MatIncreaseOverlap_SeqAIJ" 191197f1f81fSBarry Smith PetscErrorCode MatIncreaseOverlap_SeqAIJ(Mat A,PetscInt is_max,IS is[],PetscInt ov) 19124dcbc457SBarry Smith { 1913e4d965acSSatish Balay Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 19146849ba73SBarry Smith PetscErrorCode ierr; 19155d0c19d7SBarry Smith PetscInt row,i,j,k,l,m,n,*nidx,isz,val; 19165d0c19d7SBarry Smith const PetscInt *idx; 191797f1f81fSBarry Smith PetscInt start,end,*ai,*aj; 1918f1af5d2fSBarry Smith PetscBT table; 1919bbd702dbSSatish Balay 19203a40ed3dSBarry Smith PetscFunctionBegin; 1921d0f46423SBarry Smith m = A->rmap->n; 1922e4d965acSSatish Balay ai = a->i; 1923bfeeae90SHong Zhang aj = a->j; 19248a047759SSatish Balay 1925a45adfd6SMatthew Knepley if (ov < 0) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"illegal negative overlap value used"); 192606763907SSatish Balay 192797f1f81fSBarry Smith ierr = PetscMalloc((m+1)*sizeof(PetscInt),&nidx);CHKERRQ(ierr); 19286831982aSBarry Smith ierr = PetscBTCreate(m,table);CHKERRQ(ierr); 192906763907SSatish Balay 1930e4d965acSSatish Balay for (i=0; i<is_max; i++) { 1931b97fc60eSLois Curfman McInnes /* Initialize the two local arrays */ 1932e4d965acSSatish Balay isz = 0; 19336831982aSBarry Smith ierr = PetscBTMemzero(m,table);CHKERRQ(ierr); 1934e4d965acSSatish Balay 1935e4d965acSSatish Balay /* Extract the indices, assume there can be duplicate entries */ 19364dcbc457SBarry Smith ierr = ISGetIndices(is[i],&idx);CHKERRQ(ierr); 1937b9b97703SBarry Smith ierr = ISGetLocalSize(is[i],&n);CHKERRQ(ierr); 1938e4d965acSSatish Balay 1939dd097bc3SLois Curfman McInnes /* Enter these into the temp arrays. I.e., mark table[row], enter row into new index */ 1940e4d965acSSatish Balay for (j=0; j<n ; ++j){ 1941f1af5d2fSBarry Smith if(!PetscBTLookupSet(table,idx[j])) { nidx[isz++] = idx[j];} 19424dcbc457SBarry Smith } 194306763907SSatish Balay ierr = ISRestoreIndices(is[i],&idx);CHKERRQ(ierr); 194406763907SSatish Balay ierr = ISDestroy(is[i]);CHKERRQ(ierr); 1945e4d965acSSatish Balay 194604a348a9SBarry Smith k = 0; 194704a348a9SBarry Smith for (j=0; j<ov; j++){ /* for each overlap */ 194804a348a9SBarry Smith n = isz; 194906763907SSatish Balay for (; k<n ; k++){ /* do only those rows in nidx[k], which are not done yet */ 1950e4d965acSSatish Balay row = nidx[k]; 1951e4d965acSSatish Balay start = ai[row]; 1952e4d965acSSatish Balay end = ai[row+1]; 195304a348a9SBarry Smith for (l = start; l<end ; l++){ 1954efb16452SHong Zhang val = aj[l] ; 1955f1af5d2fSBarry Smith if (!PetscBTLookupSet(table,val)) {nidx[isz++] = val;} 1956e4d965acSSatish Balay } 1957e4d965acSSatish Balay } 1958e4d965acSSatish Balay } 1959029af93fSBarry Smith ierr = ISCreateGeneral(PETSC_COMM_SELF,isz,nidx,(is+i));CHKERRQ(ierr); 1960e4d965acSSatish Balay } 19616831982aSBarry Smith ierr = PetscBTDestroy(table);CHKERRQ(ierr); 1962606d414cSSatish Balay ierr = PetscFree(nidx);CHKERRQ(ierr); 19633a40ed3dSBarry Smith PetscFunctionReturn(0); 19644dcbc457SBarry Smith } 196517ab2063SBarry Smith 19660513a670SBarry Smith /* -------------------------------------------------------------- */ 19674a2ae208SSatish Balay #undef __FUNCT__ 19684a2ae208SSatish Balay #define __FUNCT__ "MatPermute_SeqAIJ" 1969dfbe8321SBarry Smith PetscErrorCode MatPermute_SeqAIJ(Mat A,IS rowp,IS colp,Mat *B) 19700513a670SBarry Smith { 19710513a670SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 19726849ba73SBarry Smith PetscErrorCode ierr; 19735d0c19d7SBarry Smith PetscInt i,nz,m = A->rmap->n,n = A->cmap->n; 19745d0c19d7SBarry Smith const PetscInt *row,*col; 19755d0c19d7SBarry Smith PetscInt *cnew,j,*lens; 197656cd22aeSBarry Smith IS icolp,irowp; 197797f1f81fSBarry Smith PetscInt *cwork; 197832ec9ce4SBarry Smith PetscScalar *vwork; 19790513a670SBarry Smith 19803a40ed3dSBarry Smith PetscFunctionBegin; 19814c49b128SBarry Smith ierr = ISInvertPermutation(rowp,PETSC_DECIDE,&irowp);CHKERRQ(ierr); 198256cd22aeSBarry Smith ierr = ISGetIndices(irowp,&row);CHKERRQ(ierr); 19834c49b128SBarry Smith ierr = ISInvertPermutation(colp,PETSC_DECIDE,&icolp);CHKERRQ(ierr); 198456cd22aeSBarry Smith ierr = ISGetIndices(icolp,&col);CHKERRQ(ierr); 19850513a670SBarry Smith 19860513a670SBarry Smith /* determine lengths of permuted rows */ 198797f1f81fSBarry Smith ierr = PetscMalloc((m+1)*sizeof(PetscInt),&lens);CHKERRQ(ierr); 19880513a670SBarry Smith for (i=0; i<m; i++) { 19890513a670SBarry Smith lens[row[i]] = a->i[i+1] - a->i[i]; 19900513a670SBarry Smith } 19917adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,B);CHKERRQ(ierr); 1992f69a0ea3SMatthew Knepley ierr = MatSetSizes(*B,m,n,m,n);CHKERRQ(ierr); 19937adad957SLisandro Dalcin ierr = MatSetType(*B,((PetscObject)A)->type_name);CHKERRQ(ierr); 1994ab93d7beSBarry Smith ierr = MatSeqAIJSetPreallocation_SeqAIJ(*B,0,lens);CHKERRQ(ierr); 1995606d414cSSatish Balay ierr = PetscFree(lens);CHKERRQ(ierr); 19960513a670SBarry Smith 199797f1f81fSBarry Smith ierr = PetscMalloc(n*sizeof(PetscInt),&cnew);CHKERRQ(ierr); 19980513a670SBarry Smith for (i=0; i<m; i++) { 199932ec9ce4SBarry Smith ierr = MatGetRow_SeqAIJ(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 20000513a670SBarry Smith for (j=0; j<nz; j++) { cnew[j] = col[cwork[j]];} 2001cdc0ba36SBarry Smith ierr = MatSetValues_SeqAIJ(*B,1,&row[i],nz,cnew,vwork,INSERT_VALUES);CHKERRQ(ierr); 200232ec9ce4SBarry Smith ierr = MatRestoreRow_SeqAIJ(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 20030513a670SBarry Smith } 2004606d414cSSatish Balay ierr = PetscFree(cnew);CHKERRQ(ierr); 20053c7d62e4SBarry Smith (*B)->assembled = PETSC_FALSE; 20060513a670SBarry Smith ierr = MatAssemblyBegin(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 20070513a670SBarry Smith ierr = MatAssemblyEnd(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 200856cd22aeSBarry Smith ierr = ISRestoreIndices(irowp,&row);CHKERRQ(ierr); 200956cd22aeSBarry Smith ierr = ISRestoreIndices(icolp,&col);CHKERRQ(ierr); 201056cd22aeSBarry Smith ierr = ISDestroy(irowp);CHKERRQ(ierr); 201156cd22aeSBarry Smith ierr = ISDestroy(icolp);CHKERRQ(ierr); 20123a40ed3dSBarry Smith PetscFunctionReturn(0); 20130513a670SBarry Smith } 20140513a670SBarry Smith 20154a2ae208SSatish Balay #undef __FUNCT__ 20164a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqAIJ" 2017dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqAIJ(Mat A,Mat B,MatStructure str) 2018cb5b572fSBarry Smith { 2019dfbe8321SBarry Smith PetscErrorCode ierr; 2020cb5b572fSBarry Smith 2021cb5b572fSBarry Smith PetscFunctionBegin; 202233f4a19fSKris Buschelman /* If the two matrices have the same copy implementation, use fast copy. */ 202333f4a19fSKris Buschelman if (str == SAME_NONZERO_PATTERN && (A->ops->copy == B->ops->copy)) { 2024be6bf707SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 2025be6bf707SBarry Smith Mat_SeqAIJ *b = (Mat_SeqAIJ*)B->data; 2026be6bf707SBarry Smith 2027d0f46423SBarry Smith if (a->i[A->rmap->n] != b->i[B->rmap->n]) { 2028634064b4SBarry Smith SETERRQ(PETSC_ERR_ARG_INCOMP,"Number of nonzeros in two matrices are different"); 2029cb5b572fSBarry Smith } 2030d0f46423SBarry Smith ierr = PetscMemcpy(b->a,a->a,(a->i[A->rmap->n])*sizeof(PetscScalar));CHKERRQ(ierr); 2031cb5b572fSBarry Smith } else { 2032cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 2033cb5b572fSBarry Smith } 2034cb5b572fSBarry Smith PetscFunctionReturn(0); 2035cb5b572fSBarry Smith } 2036cb5b572fSBarry Smith 20374a2ae208SSatish Balay #undef __FUNCT__ 20384a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqAIJ" 2039dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqAIJ(Mat A) 2040273d9f13SBarry Smith { 2041dfbe8321SBarry Smith PetscErrorCode ierr; 2042273d9f13SBarry Smith 2043273d9f13SBarry Smith PetscFunctionBegin; 2044ab93d7beSBarry Smith ierr = MatSeqAIJSetPreallocation_SeqAIJ(A,PETSC_DEFAULT,0);CHKERRQ(ierr); 2045273d9f13SBarry Smith PetscFunctionReturn(0); 2046273d9f13SBarry Smith } 2047273d9f13SBarry Smith 20484a2ae208SSatish Balay #undef __FUNCT__ 20494a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqAIJ" 2050a77337e4SBarry Smith PetscErrorCode MatGetArray_SeqAIJ(Mat A,PetscScalar *array[]) 20516c0721eeSBarry Smith { 20526c0721eeSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 20536c0721eeSBarry Smith PetscFunctionBegin; 20546c0721eeSBarry Smith *array = a->a; 20556c0721eeSBarry Smith PetscFunctionReturn(0); 20566c0721eeSBarry Smith } 20576c0721eeSBarry Smith 20584a2ae208SSatish Balay #undef __FUNCT__ 20594a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqAIJ" 2060dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqAIJ(Mat A,PetscScalar *array[]) 20616c0721eeSBarry Smith { 20626c0721eeSBarry Smith PetscFunctionBegin; 20636c0721eeSBarry Smith PetscFunctionReturn(0); 20646c0721eeSBarry Smith } 2065273d9f13SBarry Smith 2066ee4f033dSBarry Smith #undef __FUNCT__ 2067ee4f033dSBarry Smith #define __FUNCT__ "MatFDColoringApply_SeqAIJ" 2068dfbe8321SBarry Smith PetscErrorCode MatFDColoringApply_SeqAIJ(Mat J,MatFDColoring coloring,Vec x1,MatStructure *flag,void *sctx) 2069ee4f033dSBarry Smith { 20706849ba73SBarry Smith PetscErrorCode (*f)(void*,Vec,Vec,void*) = (PetscErrorCode (*)(void*,Vec,Vec,void *))coloring->f; 20716849ba73SBarry Smith PetscErrorCode ierr; 207297f1f81fSBarry Smith PetscInt k,N,start,end,l,row,col,srow,**vscaleforrow,m1,m2; 2073efb30889SBarry Smith PetscScalar dx,*y,*xx,*w3_array; 207487828ca2SBarry Smith PetscScalar *vscale_array; 2075ee4f033dSBarry Smith PetscReal epsilon = coloring->error_rel,umin = coloring->umin; 2076ee4f033dSBarry Smith Vec w1,w2,w3; 2077ee4f033dSBarry Smith void *fctx = coloring->fctx; 207890d69ab7SBarry Smith PetscTruth flg = PETSC_FALSE; 2079ee4f033dSBarry Smith 2080ee4f033dSBarry Smith PetscFunctionBegin; 2081ee4f033dSBarry Smith if (!coloring->w1) { 2082ee4f033dSBarry Smith ierr = VecDuplicate(x1,&coloring->w1);CHKERRQ(ierr); 208352e6d16bSBarry Smith ierr = PetscLogObjectParent(coloring,coloring->w1);CHKERRQ(ierr); 2084ee4f033dSBarry Smith ierr = VecDuplicate(x1,&coloring->w2);CHKERRQ(ierr); 208552e6d16bSBarry Smith ierr = PetscLogObjectParent(coloring,coloring->w2);CHKERRQ(ierr); 2086ee4f033dSBarry Smith ierr = VecDuplicate(x1,&coloring->w3);CHKERRQ(ierr); 208752e6d16bSBarry Smith ierr = PetscLogObjectParent(coloring,coloring->w3);CHKERRQ(ierr); 2088ee4f033dSBarry Smith } 2089ee4f033dSBarry Smith w1 = coloring->w1; w2 = coloring->w2; w3 = coloring->w3; 2090ee4f033dSBarry Smith 2091ee4f033dSBarry Smith ierr = MatSetUnfactored(J);CHKERRQ(ierr); 209290d69ab7SBarry Smith ierr = PetscOptionsGetTruth(((PetscObject)coloring)->prefix,"-mat_fd_coloring_dont_rezero",&flg,PETSC_NULL);CHKERRQ(ierr); 2093ee4f033dSBarry Smith if (flg) { 2094ae15b995SBarry Smith ierr = PetscInfo(coloring,"Not calling MatZeroEntries()\n");CHKERRQ(ierr); 2095ee4f033dSBarry Smith } else { 20960b9b6f31SBarry Smith PetscTruth assembled; 20970b9b6f31SBarry Smith ierr = MatAssembled(J,&assembled);CHKERRQ(ierr); 20980b9b6f31SBarry Smith if (assembled) { 2099ee4f033dSBarry Smith ierr = MatZeroEntries(J);CHKERRQ(ierr); 2100ee4f033dSBarry Smith } 21010b9b6f31SBarry Smith } 2102ee4f033dSBarry Smith 2103ee4f033dSBarry Smith ierr = VecGetOwnershipRange(x1,&start,&end);CHKERRQ(ierr); 2104ee4f033dSBarry Smith ierr = VecGetSize(x1,&N);CHKERRQ(ierr); 2105ee4f033dSBarry Smith 2106ee4f033dSBarry Smith /* 2107ee4f033dSBarry Smith This is a horrible, horrible, hack. See DMMGComputeJacobian_Multigrid() it inproperly sets 2108ee4f033dSBarry Smith coloring->F for the coarser grids from the finest 2109ee4f033dSBarry Smith */ 2110ee4f033dSBarry Smith if (coloring->F) { 2111ee4f033dSBarry Smith ierr = VecGetLocalSize(coloring->F,&m1);CHKERRQ(ierr); 2112ee4f033dSBarry Smith ierr = VecGetLocalSize(w1,&m2);CHKERRQ(ierr); 2113ee4f033dSBarry Smith if (m1 != m2) { 2114ee4f033dSBarry Smith coloring->F = 0; 2115ee4f033dSBarry Smith } 2116ee4f033dSBarry Smith } 2117ee4f033dSBarry Smith 2118ee4f033dSBarry Smith if (coloring->F) { 2119ee4f033dSBarry Smith w1 = coloring->F; 2120ee4f033dSBarry Smith coloring->F = 0; 2121ee4f033dSBarry Smith } else { 212266f9b7ceSBarry Smith ierr = PetscLogEventBegin(MAT_FDColoringFunction,0,0,0,0);CHKERRQ(ierr); 2123ee4f033dSBarry Smith ierr = (*f)(sctx,x1,w1,fctx);CHKERRQ(ierr); 212466f9b7ceSBarry Smith ierr = PetscLogEventEnd(MAT_FDColoringFunction,0,0,0,0);CHKERRQ(ierr); 2125ee4f033dSBarry Smith } 2126ee4f033dSBarry Smith 2127ee4f033dSBarry Smith /* 2128ee4f033dSBarry Smith Compute all the scale factors and share with other processors 2129ee4f033dSBarry Smith */ 21301ebc52fbSHong Zhang ierr = VecGetArray(x1,&xx);CHKERRQ(ierr);xx = xx - start; 21311ebc52fbSHong Zhang ierr = VecGetArray(coloring->vscale,&vscale_array);CHKERRQ(ierr);vscale_array = vscale_array - start; 2132ee4f033dSBarry Smith for (k=0; k<coloring->ncolors; k++) { 2133ee4f033dSBarry Smith /* 2134ee4f033dSBarry Smith Loop over each column associated with color adding the 2135ee4f033dSBarry Smith perturbation to the vector w3. 2136ee4f033dSBarry Smith */ 2137ee4f033dSBarry Smith for (l=0; l<coloring->ncolumns[k]; l++) { 2138ee4f033dSBarry Smith col = coloring->columns[k][l]; /* column of the matrix we are probing for */ 2139ee4f033dSBarry Smith dx = xx[col]; 2140ee4f033dSBarry Smith if (dx == 0.0) dx = 1.0; 2141ee4f033dSBarry Smith #if !defined(PETSC_USE_COMPLEX) 2142ee4f033dSBarry Smith if (dx < umin && dx >= 0.0) dx = umin; 2143ee4f033dSBarry Smith else if (dx < 0.0 && dx > -umin) dx = -umin; 2144ee4f033dSBarry Smith #else 2145ee4f033dSBarry Smith if (PetscAbsScalar(dx) < umin && PetscRealPart(dx) >= 0.0) dx = umin; 2146ee4f033dSBarry Smith else if (PetscRealPart(dx) < 0.0 && PetscAbsScalar(dx) < umin) dx = -umin; 2147ee4f033dSBarry Smith #endif 2148ee4f033dSBarry Smith dx *= epsilon; 2149ee4f033dSBarry Smith vscale_array[col] = 1.0/dx; 2150ee4f033dSBarry Smith } 2151ee4f033dSBarry Smith } 21521ebc52fbSHong Zhang vscale_array = vscale_array + start;ierr = VecRestoreArray(coloring->vscale,&vscale_array);CHKERRQ(ierr); 2153ee4f033dSBarry Smith ierr = VecGhostUpdateBegin(coloring->vscale,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 2154ee4f033dSBarry Smith ierr = VecGhostUpdateEnd(coloring->vscale,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 2155ee4f033dSBarry Smith 2156ee4f033dSBarry Smith /* ierr = VecView(coloring->vscale,PETSC_VIEWER_STDOUT_WORLD); 2157ee4f033dSBarry Smith ierr = VecView(x1,PETSC_VIEWER_STDOUT_WORLD);*/ 2158ee4f033dSBarry Smith 2159ee4f033dSBarry Smith if (coloring->vscaleforrow) vscaleforrow = coloring->vscaleforrow; 2160ee4f033dSBarry Smith else vscaleforrow = coloring->columnsforrow; 2161ee4f033dSBarry Smith 21621ebc52fbSHong Zhang ierr = VecGetArray(coloring->vscale,&vscale_array);CHKERRQ(ierr); 2163ee4f033dSBarry Smith /* 2164ee4f033dSBarry Smith Loop over each color 2165ee4f033dSBarry Smith */ 2166ee4f033dSBarry Smith for (k=0; k<coloring->ncolors; k++) { 216749b058dcSBarry Smith coloring->currentcolor = k; 2168ee4f033dSBarry Smith ierr = VecCopy(x1,w3);CHKERRQ(ierr); 21691ebc52fbSHong Zhang ierr = VecGetArray(w3,&w3_array);CHKERRQ(ierr);w3_array = w3_array - start; 2170ee4f033dSBarry Smith /* 2171ee4f033dSBarry Smith Loop over each column associated with color adding the 2172ee4f033dSBarry Smith perturbation to the vector w3. 2173ee4f033dSBarry Smith */ 2174ee4f033dSBarry Smith for (l=0; l<coloring->ncolumns[k]; l++) { 2175ee4f033dSBarry Smith col = coloring->columns[k][l]; /* column of the matrix we are probing for */ 2176ee4f033dSBarry Smith dx = xx[col]; 21775b8514ebSBarry Smith if (dx == 0.0) dx = 1.0; 2178ee4f033dSBarry Smith #if !defined(PETSC_USE_COMPLEX) 2179ee4f033dSBarry Smith if (dx < umin && dx >= 0.0) dx = umin; 2180ee4f033dSBarry Smith else if (dx < 0.0 && dx > -umin) dx = -umin; 2181ee4f033dSBarry Smith #else 2182ee4f033dSBarry Smith if (PetscAbsScalar(dx) < umin && PetscRealPart(dx) >= 0.0) dx = umin; 2183ee4f033dSBarry Smith else if (PetscRealPart(dx) < 0.0 && PetscAbsScalar(dx) < umin) dx = -umin; 2184ee4f033dSBarry Smith #endif 2185ee4f033dSBarry Smith dx *= epsilon; 2186634064b4SBarry Smith if (!PetscAbsScalar(dx)) SETERRQ(PETSC_ERR_PLIB,"Computed 0 differencing parameter"); 2187ee4f033dSBarry Smith w3_array[col] += dx; 2188ee4f033dSBarry Smith } 21891ebc52fbSHong Zhang w3_array = w3_array + start; ierr = VecRestoreArray(w3,&w3_array);CHKERRQ(ierr); 2190ee4f033dSBarry Smith 2191ee4f033dSBarry Smith /* 2192ee4f033dSBarry Smith Evaluate function at x1 + dx (here dx is a vector of perturbations) 2193ee4f033dSBarry Smith */ 2194ee4f033dSBarry Smith 219566f9b7ceSBarry Smith ierr = PetscLogEventBegin(MAT_FDColoringFunction,0,0,0,0);CHKERRQ(ierr); 2196ee4f033dSBarry Smith ierr = (*f)(sctx,w3,w2,fctx);CHKERRQ(ierr); 219766f9b7ceSBarry Smith ierr = PetscLogEventEnd(MAT_FDColoringFunction,0,0,0,0);CHKERRQ(ierr); 2198efb30889SBarry Smith ierr = VecAXPY(w2,-1.0,w1);CHKERRQ(ierr); 2199ee4f033dSBarry Smith 2200ee4f033dSBarry Smith /* 2201ee4f033dSBarry Smith Loop over rows of vector, putting results into Jacobian matrix 2202ee4f033dSBarry Smith */ 22031ebc52fbSHong Zhang ierr = VecGetArray(w2,&y);CHKERRQ(ierr); 2204ee4f033dSBarry Smith for (l=0; l<coloring->nrows[k]; l++) { 2205ee4f033dSBarry Smith row = coloring->rows[k][l]; 2206ee4f033dSBarry Smith col = coloring->columnsforrow[k][l]; 2207ee4f033dSBarry Smith y[row] *= vscale_array[vscaleforrow[k][l]]; 2208ee4f033dSBarry Smith srow = row + start; 2209ee4f033dSBarry Smith ierr = MatSetValues_SeqAIJ(J,1,&srow,1,&col,y+row,INSERT_VALUES);CHKERRQ(ierr); 2210ee4f033dSBarry Smith } 22111ebc52fbSHong Zhang ierr = VecRestoreArray(w2,&y);CHKERRQ(ierr); 2212ee4f033dSBarry Smith } 221349b058dcSBarry Smith coloring->currentcolor = k; 22141ebc52fbSHong Zhang ierr = VecRestoreArray(coloring->vscale,&vscale_array);CHKERRQ(ierr); 22151ebc52fbSHong Zhang xx = xx + start; ierr = VecRestoreArray(x1,&xx);CHKERRQ(ierr); 2216ee4f033dSBarry Smith ierr = MatAssemblyBegin(J,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2217ee4f033dSBarry Smith ierr = MatAssemblyEnd(J,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2218ee4f033dSBarry Smith PetscFunctionReturn(0); 2219ee4f033dSBarry Smith } 2220ee4f033dSBarry Smith 2221ac90fabeSBarry Smith #include "petscblaslapack.h" 2222ac90fabeSBarry Smith #undef __FUNCT__ 2223ac90fabeSBarry Smith #define __FUNCT__ "MatAXPY_SeqAIJ" 2224f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqAIJ(Mat Y,PetscScalar a,Mat X,MatStructure str) 2225ac90fabeSBarry Smith { 2226dfbe8321SBarry Smith PetscErrorCode ierr; 222797f1f81fSBarry Smith PetscInt i; 2228ac90fabeSBarry Smith Mat_SeqAIJ *x = (Mat_SeqAIJ *)X->data,*y = (Mat_SeqAIJ *)Y->data; 22290805154bSBarry Smith PetscBLASInt one=1,bnz = PetscBLASIntCast(x->nz); 2230ac90fabeSBarry Smith 2231ac90fabeSBarry Smith PetscFunctionBegin; 2232ac90fabeSBarry Smith if (str == SAME_NONZERO_PATTERN) { 2233f4df32b1SMatthew Knepley PetscScalar alpha = a; 2234f4df32b1SMatthew Knepley BLASaxpy_(&bnz,&alpha,x->a,&one,y->a,&one); 2235c537a176SHong Zhang } else if (str == SUBSET_NONZERO_PATTERN) { /* nonzeros of X is a subset of Y's */ 2236a30b2313SHong Zhang if (y->xtoy && y->XtoY != X) { 2237a30b2313SHong Zhang ierr = PetscFree(y->xtoy);CHKERRQ(ierr); 2238a30b2313SHong Zhang ierr = MatDestroy(y->XtoY);CHKERRQ(ierr); 2239a30b2313SHong Zhang } 2240a30b2313SHong Zhang if (!y->xtoy) { /* get xtoy */ 2241d0f46423SBarry Smith ierr = MatAXPYGetxtoy_Private(X->rmap->n,x->i,x->j,PETSC_NULL, y->i,y->j,PETSC_NULL, &y->xtoy);CHKERRQ(ierr); 2242a30b2313SHong Zhang y->XtoY = X; 2243407f6b05SHong Zhang ierr = PetscObjectReference((PetscObject)X);CHKERRQ(ierr); 2244c537a176SHong Zhang } 2245f4df32b1SMatthew Knepley for (i=0; i<x->nz; i++) y->a[y->xtoy[i]] += a*(x->a[i]); 22461e2582c4SBarry Smith ierr = PetscInfo3(Y,"ratio of nnz(X)/nnz(Y): %d/%d = %G\n",x->nz,y->nz,(PetscReal)(x->nz)/y->nz);CHKERRQ(ierr); 2247ac90fabeSBarry Smith } else { 2248f4df32b1SMatthew Knepley ierr = MatAXPY_Basic(Y,a,X,str);CHKERRQ(ierr); 2249ac90fabeSBarry Smith } 2250ac90fabeSBarry Smith PetscFunctionReturn(0); 2251ac90fabeSBarry Smith } 2252ac90fabeSBarry Smith 2253521d7252SBarry Smith #undef __FUNCT__ 2254521d7252SBarry Smith #define __FUNCT__ "MatSetBlockSize_SeqAIJ" 2255521d7252SBarry Smith PetscErrorCode MatSetBlockSize_SeqAIJ(Mat A,PetscInt bs) 2256521d7252SBarry Smith { 2257521d7252SBarry Smith PetscFunctionBegin; 2258521d7252SBarry Smith PetscFunctionReturn(0); 2259521d7252SBarry Smith } 2260521d7252SBarry Smith 2261354c94deSBarry Smith #undef __FUNCT__ 2262354c94deSBarry Smith #define __FUNCT__ "MatConjugate_SeqAIJ" 2263354c94deSBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatConjugate_SeqAIJ(Mat mat) 2264354c94deSBarry Smith { 2265354c94deSBarry Smith #if defined(PETSC_USE_COMPLEX) 2266354c94deSBarry Smith Mat_SeqAIJ *aij = (Mat_SeqAIJ *)mat->data; 2267354c94deSBarry Smith PetscInt i,nz; 2268354c94deSBarry Smith PetscScalar *a; 2269354c94deSBarry Smith 2270354c94deSBarry Smith PetscFunctionBegin; 2271354c94deSBarry Smith nz = aij->nz; 2272354c94deSBarry Smith a = aij->a; 2273354c94deSBarry Smith for (i=0; i<nz; i++) { 2274354c94deSBarry Smith a[i] = PetscConj(a[i]); 2275354c94deSBarry Smith } 2276354c94deSBarry Smith #else 2277354c94deSBarry Smith PetscFunctionBegin; 2278354c94deSBarry Smith #endif 2279354c94deSBarry Smith PetscFunctionReturn(0); 2280354c94deSBarry Smith } 2281354c94deSBarry Smith 2282e34fafa9SBarry Smith #undef __FUNCT__ 2283985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqAIJ" 2284985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqAIJ(Mat A,Vec v,PetscInt idx[]) 2285e34fafa9SBarry Smith { 2286e34fafa9SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 2287e34fafa9SBarry Smith PetscErrorCode ierr; 2288d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,*ai,*aj,ncols,n; 2289e34fafa9SBarry Smith PetscReal atmp; 2290985db425SBarry Smith PetscScalar *x; 2291e34fafa9SBarry Smith MatScalar *aa; 2292e34fafa9SBarry Smith 2293e34fafa9SBarry Smith PetscFunctionBegin; 2294e34fafa9SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2295e34fafa9SBarry Smith aa = a->a; 2296e34fafa9SBarry Smith ai = a->i; 2297e34fafa9SBarry Smith aj = a->j; 2298e34fafa9SBarry Smith 2299985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2300e34fafa9SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2301e34fafa9SBarry Smith ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 2302d0f46423SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2303e34fafa9SBarry Smith for (i=0; i<m; i++) { 2304e34fafa9SBarry Smith ncols = ai[1] - ai[0]; ai++; 23059189402eSHong Zhang x[i] = 0.0; 2306e34fafa9SBarry Smith for (j=0; j<ncols; j++){ 2307985db425SBarry Smith atmp = PetscAbsScalar(*aa); 2308985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = *aj;} 2309985db425SBarry Smith aa++; aj++; 2310985db425SBarry Smith } 2311985db425SBarry Smith } 2312985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2313985db425SBarry Smith PetscFunctionReturn(0); 2314985db425SBarry Smith } 2315985db425SBarry Smith 2316985db425SBarry Smith #undef __FUNCT__ 2317985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqAIJ" 2318985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqAIJ(Mat A,Vec v,PetscInt idx[]) 2319985db425SBarry Smith { 2320985db425SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 2321985db425SBarry Smith PetscErrorCode ierr; 2322d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,*ai,*aj,ncols,n; 2323985db425SBarry Smith PetscScalar *x; 2324985db425SBarry Smith MatScalar *aa; 2325985db425SBarry Smith 2326985db425SBarry Smith PetscFunctionBegin; 2327985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2328985db425SBarry Smith aa = a->a; 2329985db425SBarry Smith ai = a->i; 2330985db425SBarry Smith aj = a->j; 2331985db425SBarry Smith 2332985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2333985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2334985db425SBarry Smith ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 2335d0f46423SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2336985db425SBarry Smith for (i=0; i<m; i++) { 2337985db425SBarry Smith ncols = ai[1] - ai[0]; ai++; 2338d0f46423SBarry Smith if (ncols == A->cmap->n) { /* row is dense */ 2339985db425SBarry Smith x[i] = *aa; if (idx) idx[i] = 0; 2340985db425SBarry Smith } else { /* row is sparse so already KNOW maximum is 0.0 or higher */ 2341985db425SBarry Smith x[i] = 0.0; 2342985db425SBarry Smith if (idx) { 2343985db425SBarry Smith idx[i] = 0; /* in case ncols is zero */ 2344985db425SBarry Smith for (j=0;j<ncols;j++) { /* find first implicit 0.0 in the row */ 2345985db425SBarry Smith if (aj[j] > j) { 2346985db425SBarry Smith idx[i] = j; 2347985db425SBarry Smith break; 2348985db425SBarry Smith } 2349985db425SBarry Smith } 2350985db425SBarry Smith } 2351985db425SBarry Smith } 2352985db425SBarry Smith for (j=0; j<ncols; j++){ 2353985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(*aa)) {x[i] = *aa; if (idx) idx[i] = *aj;} 2354985db425SBarry Smith aa++; aj++; 2355985db425SBarry Smith } 2356985db425SBarry Smith } 2357985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2358985db425SBarry Smith PetscFunctionReturn(0); 2359985db425SBarry Smith } 2360985db425SBarry Smith 2361985db425SBarry Smith #undef __FUNCT__ 2362c87e5d42SMatthew Knepley #define __FUNCT__ "MatGetRowMinAbs_SeqAIJ" 2363c87e5d42SMatthew Knepley PetscErrorCode MatGetRowMinAbs_SeqAIJ(Mat A,Vec v,PetscInt idx[]) 2364c87e5d42SMatthew Knepley { 2365c87e5d42SMatthew Knepley Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 2366c87e5d42SMatthew Knepley PetscErrorCode ierr; 2367c87e5d42SMatthew Knepley PetscInt i,j,m = A->rmap->n,*ai,*aj,ncols,n; 2368c87e5d42SMatthew Knepley PetscReal atmp; 2369c87e5d42SMatthew Knepley PetscScalar *x; 2370c87e5d42SMatthew Knepley MatScalar *aa; 2371c87e5d42SMatthew Knepley 2372c87e5d42SMatthew Knepley PetscFunctionBegin; 2373c87e5d42SMatthew Knepley if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2374c87e5d42SMatthew Knepley aa = a->a; 2375c87e5d42SMatthew Knepley ai = a->i; 2376c87e5d42SMatthew Knepley aj = a->j; 2377c87e5d42SMatthew Knepley 2378c87e5d42SMatthew Knepley ierr = VecSet(v,0.0);CHKERRQ(ierr); 2379c87e5d42SMatthew Knepley ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2380c87e5d42SMatthew Knepley ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 2381c87e5d42SMatthew Knepley if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2382c87e5d42SMatthew Knepley for (i=0; i<m; i++) { 2383c87e5d42SMatthew Knepley ncols = ai[1] - ai[0]; ai++; 2384289a08f5SMatthew Knepley if (ncols) { 2385289a08f5SMatthew Knepley /* Get first nonzero */ 2386289a08f5SMatthew Knepley for(j = 0; j < ncols; j++) { 2387289a08f5SMatthew Knepley atmp = PetscAbsScalar(aa[j]); 2388289a08f5SMatthew Knepley if (atmp > 1.0e-12) {x[i] = atmp; if (idx) idx[i] = aj[j]; break;} 2389289a08f5SMatthew Knepley } 2390289a08f5SMatthew Knepley if (j == ncols) {x[i] = *aa; if (idx) idx[i] = *aj;} 2391289a08f5SMatthew Knepley } else { 2392289a08f5SMatthew Knepley x[i] = 0.0; if (idx) idx[i] = 0; 2393289a08f5SMatthew Knepley } 2394c87e5d42SMatthew Knepley for(j = 0; j < ncols; j++) { 2395c87e5d42SMatthew Knepley atmp = PetscAbsScalar(*aa); 2396289a08f5SMatthew Knepley if (atmp > 1.0e-12 && PetscAbsScalar(x[i]) > atmp) {x[i] = atmp; if (idx) idx[i] = *aj;} 2397c87e5d42SMatthew Knepley aa++; aj++; 2398c87e5d42SMatthew Knepley } 2399c87e5d42SMatthew Knepley } 2400c87e5d42SMatthew Knepley ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2401c87e5d42SMatthew Knepley PetscFunctionReturn(0); 2402c87e5d42SMatthew Knepley } 2403c87e5d42SMatthew Knepley 2404c87e5d42SMatthew Knepley #undef __FUNCT__ 2405985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqAIJ" 2406985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqAIJ(Mat A,Vec v,PetscInt idx[]) 2407985db425SBarry Smith { 2408985db425SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 2409985db425SBarry Smith PetscErrorCode ierr; 2410d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,*ai,*aj,ncols,n; 2411985db425SBarry Smith PetscScalar *x; 2412985db425SBarry Smith MatScalar *aa; 2413985db425SBarry Smith 2414985db425SBarry Smith PetscFunctionBegin; 2415985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2416985db425SBarry Smith aa = a->a; 2417985db425SBarry Smith ai = a->i; 2418985db425SBarry Smith aj = a->j; 2419985db425SBarry Smith 2420985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2421985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2422985db425SBarry Smith ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 2423d0f46423SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2424985db425SBarry Smith for (i=0; i<m; i++) { 2425985db425SBarry Smith ncols = ai[1] - ai[0]; ai++; 2426d0f46423SBarry Smith if (ncols == A->cmap->n) { /* row is dense */ 2427985db425SBarry Smith x[i] = *aa; if (idx) idx[i] = 0; 2428985db425SBarry Smith } else { /* row is sparse so already KNOW minimum is 0.0 or lower */ 2429985db425SBarry Smith x[i] = 0.0; 2430985db425SBarry Smith if (idx) { /* find first implicit 0.0 in the row */ 2431985db425SBarry Smith idx[i] = 0; /* in case ncols is zero */ 2432985db425SBarry Smith for (j=0;j<ncols;j++) { 2433985db425SBarry Smith if (aj[j] > j) { 2434985db425SBarry Smith idx[i] = j; 2435985db425SBarry Smith break; 2436985db425SBarry Smith } 2437985db425SBarry Smith } 2438985db425SBarry Smith } 2439985db425SBarry Smith } 2440985db425SBarry Smith for (j=0; j<ncols; j++){ 2441985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(*aa)) {x[i] = *aa; if (idx) idx[i] = *aj;} 2442985db425SBarry Smith aa++; aj++; 2443e34fafa9SBarry Smith } 2444e34fafa9SBarry Smith } 2445e34fafa9SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2446e34fafa9SBarry Smith PetscFunctionReturn(0); 2447e34fafa9SBarry Smith } 2448*3acb8795SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatFDColoringApply_AIJ(Mat,MatFDColoring,Vec,MatStructure*,void*); 2449682d7d0cSBarry Smith /* -------------------------------------------------------------------*/ 24500a6ffc59SBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqAIJ, 2451cb5b572fSBarry Smith MatGetRow_SeqAIJ, 2452cb5b572fSBarry Smith MatRestoreRow_SeqAIJ, 2453cb5b572fSBarry Smith MatMult_SeqAIJ, 245497304618SKris Buschelman /* 4*/ MatMultAdd_SeqAIJ, 24557c922b88SBarry Smith MatMultTranspose_SeqAIJ, 24567c922b88SBarry Smith MatMultTransposeAdd_SeqAIJ, 2457db4efbfdSBarry Smith 0, 2458db4efbfdSBarry Smith 0, 2459db4efbfdSBarry Smith 0, 2460db4efbfdSBarry Smith /*10*/ 0, 2461cb5b572fSBarry Smith MatLUFactor_SeqAIJ, 2462cb5b572fSBarry Smith 0, 246317ab2063SBarry Smith MatRelax_SeqAIJ, 246417ab2063SBarry Smith MatTranspose_SeqAIJ, 246597304618SKris Buschelman /*15*/ MatGetInfo_SeqAIJ, 2466cb5b572fSBarry Smith MatEqual_SeqAIJ, 2467cb5b572fSBarry Smith MatGetDiagonal_SeqAIJ, 2468cb5b572fSBarry Smith MatDiagonalScale_SeqAIJ, 2469cb5b572fSBarry Smith MatNorm_SeqAIJ, 247097304618SKris Buschelman /*20*/ 0, 2471cb5b572fSBarry Smith MatAssemblyEnd_SeqAIJ, 2472cb5b572fSBarry Smith MatSetOption_SeqAIJ, 2473cb5b572fSBarry Smith MatZeroEntries_SeqAIJ, 2474d519adbfSMatthew Knepley /*24*/ MatZeroRows_SeqAIJ, 2475db4efbfdSBarry Smith 0, 2476db4efbfdSBarry Smith 0, 2477db4efbfdSBarry Smith 0, 2478db4efbfdSBarry Smith 0, 2479d519adbfSMatthew Knepley /*29*/ MatSetUpPreallocation_SeqAIJ, 2480db4efbfdSBarry Smith 0, 2481db4efbfdSBarry Smith 0, 24826c0721eeSBarry Smith MatGetArray_SeqAIJ, 24836c0721eeSBarry Smith MatRestoreArray_SeqAIJ, 2484d519adbfSMatthew Knepley /*34*/ MatDuplicate_SeqAIJ, 2485cb5b572fSBarry Smith 0, 2486cb5b572fSBarry Smith 0, 2487cb5b572fSBarry Smith MatILUFactor_SeqAIJ, 2488cb5b572fSBarry Smith 0, 2489d519adbfSMatthew Knepley /*39*/ MatAXPY_SeqAIJ, 2490cb5b572fSBarry Smith MatGetSubMatrices_SeqAIJ, 2491cb5b572fSBarry Smith MatIncreaseOverlap_SeqAIJ, 2492cb5b572fSBarry Smith MatGetValues_SeqAIJ, 2493cb5b572fSBarry Smith MatCopy_SeqAIJ, 2494d519adbfSMatthew Knepley /*44*/ MatGetRowMax_SeqAIJ, 2495cb5b572fSBarry Smith MatScale_SeqAIJ, 2496cb5b572fSBarry Smith 0, 249779299369SBarry Smith MatDiagonalSet_SeqAIJ, 24986945ee14SBarry Smith MatILUDTFactor_SeqAIJ, 2499d519adbfSMatthew Knepley /*49*/ MatSetBlockSize_SeqAIJ, 25003b2fbd54SBarry Smith MatGetRowIJ_SeqAIJ, 25013b2fbd54SBarry Smith MatRestoreRowIJ_SeqAIJ, 25023b2fbd54SBarry Smith MatGetColumnIJ_SeqAIJ, 2503a93ec695SBarry Smith MatRestoreColumnIJ_SeqAIJ, 2504d519adbfSMatthew Knepley /*54*/ MatFDColoringCreate_SeqAIJ, 2505b9617806SBarry Smith 0, 25060513a670SBarry Smith 0, 2507cda55fadSBarry Smith MatPermute_SeqAIJ, 2508cda55fadSBarry Smith 0, 2509d519adbfSMatthew Knepley /*59*/ 0, 2510b9b97703SBarry Smith MatDestroy_SeqAIJ, 2511b9b97703SBarry Smith MatView_SeqAIJ, 2512357abbc8SBarry Smith 0, 2513ee4f033dSBarry Smith 0, 2514d519adbfSMatthew Knepley /*64*/ 0, 2515ee4f033dSBarry Smith 0, 2516ee4f033dSBarry Smith 0, 2517ee4f033dSBarry Smith 0, 2518ee4f033dSBarry Smith 0, 2519d519adbfSMatthew Knepley /*69*/ MatGetRowMaxAbs_SeqAIJ, 2520c87e5d42SMatthew Knepley MatGetRowMinAbs_SeqAIJ, 2521ee4f033dSBarry Smith 0, 2522ee4f033dSBarry Smith MatSetColoring_SeqAIJ, 2523dcf5cc72SBarry Smith #if defined(PETSC_HAVE_ADIC) 2524ee4f033dSBarry Smith MatSetValuesAdic_SeqAIJ, 2525dcf5cc72SBarry Smith #else 2526dcf5cc72SBarry Smith 0, 2527dcf5cc72SBarry Smith #endif 2528d519adbfSMatthew Knepley /*74*/ MatSetValuesAdifor_SeqAIJ, 2529*3acb8795SBarry Smith MatFDColoringApply_AIJ, 253097304618SKris Buschelman 0, 253197304618SKris Buschelman 0, 253297304618SKris Buschelman 0, 2533d519adbfSMatthew Knepley /*79*/ 0, 253497304618SKris Buschelman 0, 253597304618SKris Buschelman 0, 253697304618SKris Buschelman 0, 2537bc011b1eSHong Zhang MatLoad_SeqAIJ, 2538d519adbfSMatthew Knepley /*84*/ MatIsSymmetric_SeqAIJ, 25391cbb95d3SBarry Smith MatIsHermitian_SeqAIJ, 25406284ec50SHong Zhang 0, 25416284ec50SHong Zhang 0, 2542bc011b1eSHong Zhang 0, 2543d519adbfSMatthew Knepley /*89*/ MatMatMult_SeqAIJ_SeqAIJ, 254426be0446SHong Zhang MatMatMultSymbolic_SeqAIJ_SeqAIJ, 254526be0446SHong Zhang MatMatMultNumeric_SeqAIJ_SeqAIJ, 2546d439da42SKris Buschelman MatPtAP_Basic, 25477ba1a0bfSKris Buschelman MatPtAPSymbolic_SeqAIJ, 2548d519adbfSMatthew Knepley /*94*/ MatPtAPNumeric_SeqAIJ, 2549bc011b1eSHong Zhang MatMatMultTranspose_SeqAIJ_SeqAIJ, 2550bc011b1eSHong Zhang MatMatMultTransposeSymbolic_SeqAIJ_SeqAIJ, 2551bc011b1eSHong Zhang MatMatMultTransposeNumeric_SeqAIJ_SeqAIJ, 25527ba1a0bfSKris Buschelman MatPtAPSymbolic_SeqAIJ_SeqAIJ, 2553d519adbfSMatthew Knepley /*99*/ MatPtAPNumeric_SeqAIJ_SeqAIJ, 2554609c6c4dSKris Buschelman 0, 2555609c6c4dSKris Buschelman 0, 255687d4246cSBarry Smith MatConjugate_SeqAIJ, 255787d4246cSBarry Smith 0, 2558d519adbfSMatthew Knepley /*104*/MatSetValuesRow_SeqAIJ, 255999cafbc1SBarry Smith MatRealPart_SeqAIJ, 2560f5edf698SHong Zhang MatImaginaryPart_SeqAIJ, 2561f5edf698SHong Zhang 0, 25622bebee5dSHong Zhang 0, 2563d519adbfSMatthew Knepley /*109*/0, 2564985db425SBarry Smith 0, 25652af78befSBarry Smith MatGetRowMin_SeqAIJ, 25662af78befSBarry Smith 0, 2567599ef60dSHong Zhang MatMissingDiagonal_SeqAIJ, 2568d519adbfSMatthew Knepley /*114*/0, 2569599ef60dSHong Zhang 0, 25703c2a7987SHong Zhang 0, 25713c2a7987SHong Zhang MatILUDTFactorSymbolic_SeqAIJ, 25723c2a7987SHong Zhang MatILUDTFactorNumeric_SeqAIJ 25739e29f15eSvictorle }; 257417ab2063SBarry Smith 2575fb2e594dSBarry Smith EXTERN_C_BEGIN 25764a2ae208SSatish Balay #undef __FUNCT__ 25774a2ae208SSatish Balay #define __FUNCT__ "MatSeqAIJSetColumnIndices_SeqAIJ" 2578be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetColumnIndices_SeqAIJ(Mat mat,PetscInt *indices) 2579bef8e0ddSBarry Smith { 2580bef8e0ddSBarry Smith Mat_SeqAIJ *aij = (Mat_SeqAIJ *)mat->data; 258197f1f81fSBarry Smith PetscInt i,nz,n; 2582bef8e0ddSBarry Smith 2583bef8e0ddSBarry Smith PetscFunctionBegin; 2584bef8e0ddSBarry Smith 2585bef8e0ddSBarry Smith nz = aij->maxnz; 2586d0f46423SBarry Smith n = mat->rmap->n; 2587bef8e0ddSBarry Smith for (i=0; i<nz; i++) { 2588bef8e0ddSBarry Smith aij->j[i] = indices[i]; 2589bef8e0ddSBarry Smith } 2590bef8e0ddSBarry Smith aij->nz = nz; 2591bef8e0ddSBarry Smith for (i=0; i<n; i++) { 2592bef8e0ddSBarry Smith aij->ilen[i] = aij->imax[i]; 2593bef8e0ddSBarry Smith } 2594bef8e0ddSBarry Smith 2595bef8e0ddSBarry Smith PetscFunctionReturn(0); 2596bef8e0ddSBarry Smith } 2597fb2e594dSBarry Smith EXTERN_C_END 2598bef8e0ddSBarry Smith 25994a2ae208SSatish Balay #undef __FUNCT__ 26004a2ae208SSatish Balay #define __FUNCT__ "MatSeqAIJSetColumnIndices" 2601bef8e0ddSBarry Smith /*@ 2602bef8e0ddSBarry Smith MatSeqAIJSetColumnIndices - Set the column indices for all the rows 2603bef8e0ddSBarry Smith in the matrix. 2604bef8e0ddSBarry Smith 2605bef8e0ddSBarry Smith Input Parameters: 2606bef8e0ddSBarry Smith + mat - the SeqAIJ matrix 2607bef8e0ddSBarry Smith - indices - the column indices 2608bef8e0ddSBarry Smith 260915091d37SBarry Smith Level: advanced 261015091d37SBarry Smith 2611bef8e0ddSBarry Smith Notes: 2612bef8e0ddSBarry Smith This can be called if you have precomputed the nonzero structure of the 2613bef8e0ddSBarry Smith matrix and want to provide it to the matrix object to improve the performance 2614bef8e0ddSBarry Smith of the MatSetValues() operation. 2615bef8e0ddSBarry Smith 2616bef8e0ddSBarry Smith You MUST have set the correct numbers of nonzeros per row in the call to 2617d1be2dadSMatthew Knepley MatCreateSeqAIJ(), and the columns indices MUST be sorted. 2618bef8e0ddSBarry Smith 2619bef8e0ddSBarry Smith MUST be called before any calls to MatSetValues(); 2620bef8e0ddSBarry Smith 2621b9617806SBarry Smith The indices should start with zero, not one. 2622b9617806SBarry Smith 2623bef8e0ddSBarry Smith @*/ 2624be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetColumnIndices(Mat mat,PetscInt *indices) 2625bef8e0ddSBarry Smith { 262697f1f81fSBarry Smith PetscErrorCode ierr,(*f)(Mat,PetscInt *); 2627bef8e0ddSBarry Smith 2628bef8e0ddSBarry Smith PetscFunctionBegin; 26294482741eSBarry Smith PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 26304482741eSBarry Smith PetscValidPointer(indices,2); 2631c134de8dSSatish Balay ierr = PetscObjectQueryFunction((PetscObject)mat,"MatSeqAIJSetColumnIndices_C",(void (**)(void))&f);CHKERRQ(ierr); 2632bef8e0ddSBarry Smith if (f) { 2633bef8e0ddSBarry Smith ierr = (*f)(mat,indices);CHKERRQ(ierr); 2634bef8e0ddSBarry Smith } else { 2635634064b4SBarry Smith SETERRQ(PETSC_ERR_SUP,"Wrong type of matrix to set column indices"); 2636bef8e0ddSBarry Smith } 2637bef8e0ddSBarry Smith PetscFunctionReturn(0); 2638bef8e0ddSBarry Smith } 2639bef8e0ddSBarry Smith 2640be6bf707SBarry Smith /* ----------------------------------------------------------------------------------------*/ 2641be6bf707SBarry Smith 2642fb2e594dSBarry Smith EXTERN_C_BEGIN 26434a2ae208SSatish Balay #undef __FUNCT__ 26444a2ae208SSatish Balay #define __FUNCT__ "MatStoreValues_SeqAIJ" 2645be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatStoreValues_SeqAIJ(Mat mat) 2646be6bf707SBarry Smith { 2647be6bf707SBarry Smith Mat_SeqAIJ *aij = (Mat_SeqAIJ *)mat->data; 26486849ba73SBarry Smith PetscErrorCode ierr; 2649d0f46423SBarry Smith size_t nz = aij->i[mat->rmap->n]; 2650be6bf707SBarry Smith 2651be6bf707SBarry Smith PetscFunctionBegin; 2652be6bf707SBarry Smith if (aij->nonew != 1) { 2653512a5fc5SBarry Smith SETERRQ(PETSC_ERR_ORDER,"Must call MatSetOption(A,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);first"); 2654be6bf707SBarry Smith } 2655be6bf707SBarry Smith 2656be6bf707SBarry Smith /* allocate space for values if not already there */ 2657be6bf707SBarry Smith if (!aij->saved_values) { 265887828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&aij->saved_values);CHKERRQ(ierr); 26599518dbb4SMatthew Knepley ierr = PetscLogObjectMemory(mat,(nz+1)*sizeof(PetscScalar));CHKERRQ(ierr); 2660be6bf707SBarry Smith } 2661be6bf707SBarry Smith 2662be6bf707SBarry Smith /* copy values over */ 266387828ca2SBarry Smith ierr = PetscMemcpy(aij->saved_values,aij->a,nz*sizeof(PetscScalar));CHKERRQ(ierr); 2664be6bf707SBarry Smith PetscFunctionReturn(0); 2665be6bf707SBarry Smith } 2666fb2e594dSBarry Smith EXTERN_C_END 2667be6bf707SBarry Smith 26684a2ae208SSatish Balay #undef __FUNCT__ 2669b9617806SBarry Smith #define __FUNCT__ "MatStoreValues" 2670be6bf707SBarry Smith /*@ 2671be6bf707SBarry Smith MatStoreValues - Stashes a copy of the matrix values; this allows, for 2672be6bf707SBarry Smith example, reuse of the linear part of a Jacobian, while recomputing the 2673be6bf707SBarry Smith nonlinear portion. 2674be6bf707SBarry Smith 2675be6bf707SBarry Smith Collect on Mat 2676be6bf707SBarry Smith 2677be6bf707SBarry Smith Input Parameters: 26780e609b76SBarry Smith . mat - the matrix (currently only AIJ matrices support this option) 2679be6bf707SBarry Smith 268015091d37SBarry Smith Level: advanced 268115091d37SBarry Smith 2682be6bf707SBarry Smith Common Usage, with SNESSolve(): 2683be6bf707SBarry Smith $ Create Jacobian matrix 2684be6bf707SBarry Smith $ Set linear terms into matrix 2685be6bf707SBarry Smith $ Apply boundary conditions to matrix, at this time matrix must have 2686be6bf707SBarry Smith $ final nonzero structure (i.e. setting the nonlinear terms and applying 2687be6bf707SBarry Smith $ boundary conditions again will not change the nonzero structure 2688512a5fc5SBarry Smith $ ierr = MatSetOption(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE); 2689be6bf707SBarry Smith $ ierr = MatStoreValues(mat); 2690be6bf707SBarry Smith $ Call SNESSetJacobian() with matrix 2691be6bf707SBarry Smith $ In your Jacobian routine 2692be6bf707SBarry Smith $ ierr = MatRetrieveValues(mat); 2693be6bf707SBarry Smith $ Set nonlinear terms in matrix 2694be6bf707SBarry Smith 2695be6bf707SBarry Smith Common Usage without SNESSolve(), i.e. when you handle nonlinear solve yourself: 2696be6bf707SBarry Smith $ // build linear portion of Jacobian 2697512a5fc5SBarry Smith $ ierr = MatSetOption(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE); 2698be6bf707SBarry Smith $ ierr = MatStoreValues(mat); 2699be6bf707SBarry Smith $ loop over nonlinear iterations 2700be6bf707SBarry Smith $ ierr = MatRetrieveValues(mat); 2701be6bf707SBarry Smith $ // call MatSetValues(mat,...) to set nonliner portion of Jacobian 2702be6bf707SBarry Smith $ // call MatAssemblyBegin/End() on matrix 2703be6bf707SBarry Smith $ Solve linear system with Jacobian 2704be6bf707SBarry Smith $ endloop 2705be6bf707SBarry Smith 2706be6bf707SBarry Smith Notes: 2707be6bf707SBarry Smith Matrix must already be assemblied before calling this routine 2708512a5fc5SBarry Smith Must set the matrix option MatSetOption(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE); before 2709be6bf707SBarry Smith calling this routine. 2710be6bf707SBarry Smith 27110c468ba9SBarry Smith When this is called multiple times it overwrites the previous set of stored values 27120c468ba9SBarry Smith and does not allocated additional space. 27130c468ba9SBarry Smith 2714be6bf707SBarry Smith .seealso: MatRetrieveValues() 2715be6bf707SBarry Smith 2716be6bf707SBarry Smith @*/ 2717be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatStoreValues(Mat mat) 2718be6bf707SBarry Smith { 2719dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(Mat); 2720be6bf707SBarry Smith 2721be6bf707SBarry Smith PetscFunctionBegin; 27224482741eSBarry Smith PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 272329bbc08cSBarry Smith if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 272429bbc08cSBarry Smith if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2725be6bf707SBarry Smith 2726c134de8dSSatish Balay ierr = PetscObjectQueryFunction((PetscObject)mat,"MatStoreValues_C",(void (**)(void))&f);CHKERRQ(ierr); 2727be6bf707SBarry Smith if (f) { 2728be6bf707SBarry Smith ierr = (*f)(mat);CHKERRQ(ierr); 2729be6bf707SBarry Smith } else { 2730634064b4SBarry Smith SETERRQ(PETSC_ERR_SUP,"Wrong type of matrix to store values"); 2731be6bf707SBarry Smith } 2732be6bf707SBarry Smith PetscFunctionReturn(0); 2733be6bf707SBarry Smith } 2734be6bf707SBarry Smith 2735fb2e594dSBarry Smith EXTERN_C_BEGIN 27364a2ae208SSatish Balay #undef __FUNCT__ 27374a2ae208SSatish Balay #define __FUNCT__ "MatRetrieveValues_SeqAIJ" 2738be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatRetrieveValues_SeqAIJ(Mat mat) 2739be6bf707SBarry Smith { 2740be6bf707SBarry Smith Mat_SeqAIJ *aij = (Mat_SeqAIJ *)mat->data; 27416849ba73SBarry Smith PetscErrorCode ierr; 2742d0f46423SBarry Smith PetscInt nz = aij->i[mat->rmap->n]; 2743be6bf707SBarry Smith 2744be6bf707SBarry Smith PetscFunctionBegin; 2745be6bf707SBarry Smith if (aij->nonew != 1) { 2746512a5fc5SBarry Smith SETERRQ(PETSC_ERR_ORDER,"Must call MatSetOption(A,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);first"); 2747be6bf707SBarry Smith } 2748be6bf707SBarry Smith if (!aij->saved_values) { 2749634064b4SBarry Smith SETERRQ(PETSC_ERR_ORDER,"Must call MatStoreValues(A);first"); 2750be6bf707SBarry Smith } 2751be6bf707SBarry Smith /* copy values over */ 275287828ca2SBarry Smith ierr = PetscMemcpy(aij->a,aij->saved_values,nz*sizeof(PetscScalar));CHKERRQ(ierr); 2753be6bf707SBarry Smith PetscFunctionReturn(0); 2754be6bf707SBarry Smith } 2755fb2e594dSBarry Smith EXTERN_C_END 2756be6bf707SBarry Smith 27574a2ae208SSatish Balay #undef __FUNCT__ 27584a2ae208SSatish Balay #define __FUNCT__ "MatRetrieveValues" 2759be6bf707SBarry Smith /*@ 2760be6bf707SBarry Smith MatRetrieveValues - Retrieves the copy of the matrix values; this allows, for 2761be6bf707SBarry Smith example, reuse of the linear part of a Jacobian, while recomputing the 2762be6bf707SBarry Smith nonlinear portion. 2763be6bf707SBarry Smith 2764be6bf707SBarry Smith Collect on Mat 2765be6bf707SBarry Smith 2766be6bf707SBarry Smith Input Parameters: 2767be6bf707SBarry Smith . mat - the matrix (currently on AIJ matrices support this option) 2768be6bf707SBarry Smith 276915091d37SBarry Smith Level: advanced 277015091d37SBarry Smith 2771be6bf707SBarry Smith .seealso: MatStoreValues() 2772be6bf707SBarry Smith 2773be6bf707SBarry Smith @*/ 2774be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatRetrieveValues(Mat mat) 2775be6bf707SBarry Smith { 2776dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(Mat); 2777be6bf707SBarry Smith 2778be6bf707SBarry Smith PetscFunctionBegin; 27794482741eSBarry Smith PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 278029bbc08cSBarry Smith if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 278129bbc08cSBarry Smith if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2782be6bf707SBarry Smith 2783c134de8dSSatish Balay ierr = PetscObjectQueryFunction((PetscObject)mat,"MatRetrieveValues_C",(void (**)(void))&f);CHKERRQ(ierr); 2784be6bf707SBarry Smith if (f) { 2785be6bf707SBarry Smith ierr = (*f)(mat);CHKERRQ(ierr); 2786be6bf707SBarry Smith } else { 2787634064b4SBarry Smith SETERRQ(PETSC_ERR_SUP,"Wrong type of matrix to retrieve values"); 2788be6bf707SBarry Smith } 2789be6bf707SBarry Smith PetscFunctionReturn(0); 2790be6bf707SBarry Smith } 2791be6bf707SBarry Smith 2792f83d6046SBarry Smith 2793be6bf707SBarry Smith /* --------------------------------------------------------------------------------*/ 27944a2ae208SSatish Balay #undef __FUNCT__ 27954a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqAIJ" 279617ab2063SBarry Smith /*@C 2797682d7d0cSBarry Smith MatCreateSeqAIJ - Creates a sparse matrix in AIJ (compressed row) format 27980d15e28bSLois Curfman McInnes (the default parallel PETSc format). For good matrix assembly performance 27996e62573dSLois Curfman McInnes the user should preallocate the matrix storage by setting the parameter nz 280051c19458SBarry Smith (or the array nnz). By setting these parameters accurately, performance 28012bd5e0b2SLois Curfman McInnes during matrix assembly can be increased by more than a factor of 50. 280217ab2063SBarry Smith 2803db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2804db81eaa0SLois Curfman McInnes 280517ab2063SBarry Smith Input Parameters: 2806db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 280717ab2063SBarry Smith . m - number of rows 280817ab2063SBarry Smith . n - number of columns 280917ab2063SBarry Smith . nz - number of nonzeros per row (same for all rows) 281051c19458SBarry Smith - nnz - array containing the number of nonzeros in the various rows 28112bd5e0b2SLois Curfman McInnes (possibly different for each row) or PETSC_NULL 281217ab2063SBarry Smith 281317ab2063SBarry Smith Output Parameter: 2814416022c9SBarry Smith . A - the matrix 281517ab2063SBarry Smith 2816175b88e8SBarry Smith It is recommended that one use the MatCreate(), MatSetType() and/or MatSetFromOptions(), 2817ae1d86c5SBarry Smith MatXXXXSetPreallocation() paradgm instead of this routine directly. 2818175b88e8SBarry Smith [MatXXXXSetPreallocation() is, for example, MatSeqAIJSetPreallocation] 2819175b88e8SBarry Smith 2820b259b22eSLois Curfman McInnes Notes: 282149a6f317SBarry Smith If nnz is given then nz is ignored 282249a6f317SBarry Smith 282317ab2063SBarry Smith The AIJ format (also called the Yale sparse matrix format or 282417ab2063SBarry Smith compressed row storage), is fully compatible with standard Fortran 77 28250002213bSLois Curfman McInnes storage. That is, the stored row and column indices can begin at 282644cd7ae7SLois Curfman McInnes either one (as in Fortran) or zero. See the users' manual for details. 282717ab2063SBarry Smith 282817ab2063SBarry Smith Specify the preallocated storage with either nz or nnz (not both). 2829a40aa06bSLois Curfman McInnes Set nz=PETSC_DEFAULT and nnz=PETSC_NULL for PETSc to control dynamic memory 28303d323bbdSBarry Smith allocation. For large problems you MUST preallocate memory or you 28316da5968aSLois Curfman McInnes will get TERRIBLE performance, see the users' manual chapter on matrices. 283217ab2063SBarry Smith 2833682d7d0cSBarry Smith By default, this format uses inodes (identical nodes) when possible, to 28344fca80b9SLois Curfman McInnes improve numerical efficiency of matrix-vector products and solves. We 2835682d7d0cSBarry Smith search for consecutive rows with the same nonzero structure, thereby 28366c7ebb05SLois Curfman McInnes reusing matrix information to achieve increased efficiency. 28376c7ebb05SLois Curfman McInnes 28386c7ebb05SLois Curfman McInnes Options Database Keys: 2839698d4c6aSKris Buschelman + -mat_no_inode - Do not use inodes 2840698d4c6aSKris Buschelman . -mat_inode_limit <limit> - Sets inode limit (max limit=5) 2841db81eaa0SLois Curfman McInnes - -mat_aij_oneindex - Internally use indexing starting at 1 2842db81eaa0SLois Curfman McInnes rather than 0. Note that when calling MatSetValues(), 2843db81eaa0SLois Curfman McInnes the user still MUST index entries starting at 0! 284417ab2063SBarry Smith 2845027ccd11SLois Curfman McInnes Level: intermediate 2846027ccd11SLois Curfman McInnes 284736db0b34SBarry Smith .seealso: MatCreate(), MatCreateMPIAIJ(), MatSetValues(), MatSeqAIJSetColumnIndices(), MatCreateSeqAIJWithArrays() 284836db0b34SBarry Smith 284917ab2063SBarry Smith @*/ 2850be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqAIJ(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt nz,const PetscInt nnz[],Mat *A) 285117ab2063SBarry Smith { 2852dfbe8321SBarry Smith PetscErrorCode ierr; 28536945ee14SBarry Smith 28543a40ed3dSBarry Smith PetscFunctionBegin; 2855f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2856117016b1SBarry Smith ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2857c4752a88SBarry Smith ierr = MatSetType(*A,MATSEQAIJ);CHKERRQ(ierr); 2858ab93d7beSBarry Smith ierr = MatSeqAIJSetPreallocation_SeqAIJ(*A,nz,(PetscInt*)nnz);CHKERRQ(ierr); 2859273d9f13SBarry Smith PetscFunctionReturn(0); 2860273d9f13SBarry Smith } 2861273d9f13SBarry Smith 28624a2ae208SSatish Balay #undef __FUNCT__ 28634a2ae208SSatish Balay #define __FUNCT__ "MatSeqAIJSetPreallocation" 2864273d9f13SBarry Smith /*@C 2865273d9f13SBarry Smith MatSeqAIJSetPreallocation - For good matrix assembly performance 2866273d9f13SBarry Smith the user should preallocate the matrix storage by setting the parameter nz 2867273d9f13SBarry Smith (or the array nnz). By setting these parameters accurately, performance 2868273d9f13SBarry Smith during matrix assembly can be increased by more than a factor of 50. 2869273d9f13SBarry Smith 2870273d9f13SBarry Smith Collective on MPI_Comm 2871273d9f13SBarry Smith 2872273d9f13SBarry Smith Input Parameters: 2873117016b1SBarry Smith + B - The matrix-free 2874273d9f13SBarry Smith . nz - number of nonzeros per row (same for all rows) 2875273d9f13SBarry Smith - nnz - array containing the number of nonzeros in the various rows 2876273d9f13SBarry Smith (possibly different for each row) or PETSC_NULL 2877273d9f13SBarry Smith 2878273d9f13SBarry Smith Notes: 287949a6f317SBarry Smith If nnz is given then nz is ignored 288049a6f317SBarry Smith 2881273d9f13SBarry Smith The AIJ format (also called the Yale sparse matrix format or 2882273d9f13SBarry Smith compressed row storage), is fully compatible with standard Fortran 77 2883273d9f13SBarry Smith storage. That is, the stored row and column indices can begin at 2884273d9f13SBarry Smith either one (as in Fortran) or zero. See the users' manual for details. 2885273d9f13SBarry Smith 2886273d9f13SBarry Smith Specify the preallocated storage with either nz or nnz (not both). 2887273d9f13SBarry Smith Set nz=PETSC_DEFAULT and nnz=PETSC_NULL for PETSc to control dynamic memory 2888273d9f13SBarry Smith allocation. For large problems you MUST preallocate memory or you 2889273d9f13SBarry Smith will get TERRIBLE performance, see the users' manual chapter on matrices. 2890273d9f13SBarry Smith 2891aa95bbe8SBarry Smith You can call MatGetInfo() to get information on how effective the preallocation was; 2892aa95bbe8SBarry Smith for example the fields mallocs,nz_allocated,nz_used,nz_unneeded; 2893aa95bbe8SBarry Smith You can also run with the option -info and look for messages with the string 2894aa95bbe8SBarry Smith malloc in them to see if additional memory allocation was needed. 2895aa95bbe8SBarry Smith 2896a96a251dSBarry Smith Developers: Use nz of MAT_SKIP_ALLOCATION to not allocate any space for the matrix 2897a96a251dSBarry Smith entries or columns indices 2898a96a251dSBarry Smith 2899273d9f13SBarry Smith By default, this format uses inodes (identical nodes) when possible, to 2900273d9f13SBarry Smith improve numerical efficiency of matrix-vector products and solves. We 2901273d9f13SBarry Smith search for consecutive rows with the same nonzero structure, thereby 2902273d9f13SBarry Smith reusing matrix information to achieve increased efficiency. 2903273d9f13SBarry Smith 2904273d9f13SBarry Smith Options Database Keys: 2905698d4c6aSKris Buschelman + -mat_no_inode - Do not use inodes 2906698d4c6aSKris Buschelman . -mat_inode_limit <limit> - Sets inode limit (max limit=5) 2907273d9f13SBarry Smith - -mat_aij_oneindex - Internally use indexing starting at 1 2908273d9f13SBarry Smith rather than 0. Note that when calling MatSetValues(), 2909273d9f13SBarry Smith the user still MUST index entries starting at 0! 2910273d9f13SBarry Smith 2911273d9f13SBarry Smith Level: intermediate 2912273d9f13SBarry Smith 2913aa95bbe8SBarry Smith .seealso: MatCreate(), MatCreateMPIAIJ(), MatSetValues(), MatSeqAIJSetColumnIndices(), MatCreateSeqAIJWithArrays(), MatGetInfo() 2914273d9f13SBarry Smith 2915273d9f13SBarry Smith @*/ 2916be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetPreallocation(Mat B,PetscInt nz,const PetscInt nnz[]) 2917273d9f13SBarry Smith { 291897f1f81fSBarry Smith PetscErrorCode ierr,(*f)(Mat,PetscInt,const PetscInt[]); 2919a23d5eceSKris Buschelman 2920a23d5eceSKris Buschelman PetscFunctionBegin; 2921a23d5eceSKris Buschelman ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqAIJSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr); 2922a23d5eceSKris Buschelman if (f) { 2923a23d5eceSKris Buschelman ierr = (*f)(B,nz,nnz);CHKERRQ(ierr); 2924a23d5eceSKris Buschelman } 2925a23d5eceSKris Buschelman PetscFunctionReturn(0); 2926a23d5eceSKris Buschelman } 2927a23d5eceSKris Buschelman 2928a23d5eceSKris Buschelman EXTERN_C_BEGIN 2929a23d5eceSKris Buschelman #undef __FUNCT__ 2930a23d5eceSKris Buschelman #define __FUNCT__ "MatSeqAIJSetPreallocation_SeqAIJ" 2931be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetPreallocation_SeqAIJ(Mat B,PetscInt nz,PetscInt *nnz) 2932a23d5eceSKris Buschelman { 2933273d9f13SBarry Smith Mat_SeqAIJ *b; 2934a43ee2ecSKris Buschelman PetscTruth skipallocation = PETSC_FALSE; 29356849ba73SBarry Smith PetscErrorCode ierr; 293697f1f81fSBarry Smith PetscInt i; 2937273d9f13SBarry Smith 2938273d9f13SBarry Smith PetscFunctionBegin; 2939d5d45c9bSBarry Smith 2940a96a251dSBarry Smith if (nz == MAT_SKIP_ALLOCATION) { 2941c461c341SBarry Smith skipallocation = PETSC_TRUE; 2942c461c341SBarry Smith nz = 0; 2943c461c341SBarry Smith } 2944c461c341SBarry Smith 29457408324eSLisandro Dalcin ierr = PetscMapSetBlockSize(B->rmap,1);CHKERRQ(ierr); 29467408324eSLisandro Dalcin ierr = PetscMapSetBlockSize(B->cmap,1);CHKERRQ(ierr); 2947d0f46423SBarry Smith ierr = PetscMapSetUp(B->rmap);CHKERRQ(ierr); 2948d0f46423SBarry Smith ierr = PetscMapSetUp(B->cmap);CHKERRQ(ierr); 2949899cda47SBarry Smith 2950435da068SBarry Smith if (nz == PETSC_DEFAULT || nz == PETSC_DECIDE) nz = 5; 2951435da068SBarry Smith if (nz < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"nz cannot be less than 0: value %d",nz); 2952b73539f3SBarry Smith if (nnz) { 2953d0f46423SBarry Smith for (i=0; i<B->rmap->n; i++) { 295429bbc08cSBarry Smith if (nnz[i] < 0) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"nnz cannot be less than 0: local row %d value %d",i,nnz[i]); 2955d0f46423SBarry Smith if (nnz[i] > B->cmap->n) SETERRQ3(PETSC_ERR_ARG_OUTOFRANGE,"nnz cannot be greater than row length: local row %d value %d rowlength %d",i,nnz[i],B->cmap->n); 2956b73539f3SBarry Smith } 2957b73539f3SBarry Smith } 2958b73539f3SBarry Smith 2959273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2960273d9f13SBarry Smith b = (Mat_SeqAIJ*)B->data; 2961273d9f13SBarry Smith 2962ab93d7beSBarry Smith if (!skipallocation) { 29632ee49352SLisandro Dalcin if (!b->imax) { 2964d0f46423SBarry Smith ierr = PetscMalloc2(B->rmap->n,PetscInt,&b->imax,B->rmap->n,PetscInt,&b->ilen);CHKERRQ(ierr); 2965d0f46423SBarry Smith ierr = PetscLogObjectMemory(B,2*B->rmap->n*sizeof(PetscInt));CHKERRQ(ierr); 29662ee49352SLisandro Dalcin } 2967273d9f13SBarry Smith if (!nnz) { 2968435da068SBarry Smith if (nz == PETSC_DEFAULT || nz == PETSC_DECIDE) nz = 10; 2969273d9f13SBarry Smith else if (nz <= 0) nz = 1; 2970d0f46423SBarry Smith for (i=0; i<B->rmap->n; i++) b->imax[i] = nz; 2971d0f46423SBarry Smith nz = nz*B->rmap->n; 2972273d9f13SBarry Smith } else { 2973273d9f13SBarry Smith nz = 0; 2974d0f46423SBarry Smith for (i=0; i<B->rmap->n; i++) {b->imax[i] = nnz[i]; nz += nnz[i];} 2975273d9f13SBarry Smith } 2976ab93d7beSBarry Smith /* b->ilen will count nonzeros in each row so far. */ 2977d0f46423SBarry Smith for (i=0; i<B->rmap->n; i++) { b->ilen[i] = 0; } 2978ab93d7beSBarry Smith 2979273d9f13SBarry Smith /* allocate the matrix space */ 29802ee49352SLisandro Dalcin ierr = MatSeqXAIJFreeAIJ(B,&b->a,&b->j,&b->i);CHKERRQ(ierr); 2981d0f46423SBarry Smith ierr = PetscMalloc3(nz,PetscScalar,&b->a,nz,PetscInt,&b->j,B->rmap->n+1,PetscInt,&b->i);CHKERRQ(ierr); 2982d0f46423SBarry Smith ierr = PetscLogObjectMemory(B,(B->rmap->n+1)*sizeof(PetscInt)+nz*(sizeof(PetscScalar)+sizeof(PetscInt)));CHKERRQ(ierr); 2983bfeeae90SHong Zhang b->i[0] = 0; 2984d0f46423SBarry Smith for (i=1; i<B->rmap->n+1; i++) { 29855da197adSKris Buschelman b->i[i] = b->i[i-1] + b->imax[i-1]; 29865da197adSKris Buschelman } 2987273d9f13SBarry Smith b->singlemalloc = PETSC_TRUE; 2988e6b907acSBarry Smith b->free_a = PETSC_TRUE; 2989e6b907acSBarry Smith b->free_ij = PETSC_TRUE; 2990c461c341SBarry Smith } else { 2991e6b907acSBarry Smith b->free_a = PETSC_FALSE; 2992e6b907acSBarry Smith b->free_ij = PETSC_FALSE; 2993c461c341SBarry Smith } 2994273d9f13SBarry Smith 2995273d9f13SBarry Smith b->nz = 0; 2996273d9f13SBarry Smith b->maxnz = nz; 2997273d9f13SBarry Smith B->info.nz_unneeded = (double)b->maxnz; 2998273d9f13SBarry Smith PetscFunctionReturn(0); 2999273d9f13SBarry Smith } 3000a23d5eceSKris Buschelman EXTERN_C_END 3001273d9f13SBarry Smith 3002a1661176SMatthew Knepley #undef __FUNCT__ 3003a1661176SMatthew Knepley #define __FUNCT__ "MatSeqAIJSetPreallocationCSR" 300458d36128SBarry Smith /*@ 3005a1661176SMatthew Knepley MatSeqAIJSetPreallocationCSR - Allocates memory for a sparse sequential matrix in AIJ format. 3006a1661176SMatthew Knepley 3007a1661176SMatthew Knepley Input Parameters: 3008a1661176SMatthew Knepley + B - the matrix 3009a1661176SMatthew Knepley . i - the indices into j for the start of each row (starts with zero) 3010a1661176SMatthew Knepley . j - the column indices for each row (starts with zero) these must be sorted for each row 3011a1661176SMatthew Knepley - v - optional values in the matrix 3012a1661176SMatthew Knepley 3013d58b2322SMatthew Knepley Contributed by: Lisandro Dalchin 3014d58b2322SMatthew Knepley 3015a1661176SMatthew Knepley Level: developer 3016a1661176SMatthew Knepley 301758d36128SBarry Smith The i,j,v values are COPIED with this routine; to avoid the copy use MatCreateSeqAIJWithArrays() 301858d36128SBarry Smith 3019a1661176SMatthew Knepley .keywords: matrix, aij, compressed row, sparse, sequential 3020a1661176SMatthew Knepley 3021a1661176SMatthew Knepley .seealso: MatCreate(), MatCreateSeqAIJ(), MatSetValues(), MatSeqAIJSetPreallocation(), MatCreateSeqAIJ(), SeqAIJ 3022a1661176SMatthew Knepley @*/ 3023a1661176SMatthew Knepley PetscErrorCode MatSeqAIJSetPreallocationCSR(Mat B,const PetscInt i[],const PetscInt j[],const PetscScalar v[]) 3024a1661176SMatthew Knepley { 3025a1661176SMatthew Knepley PetscErrorCode (*f)(Mat,const PetscInt[],const PetscInt[],const PetscScalar[]); 3026a1661176SMatthew Knepley PetscErrorCode ierr; 3027a1661176SMatthew Knepley 3028a1661176SMatthew Knepley PetscFunctionBegin; 3029a1661176SMatthew Knepley PetscValidHeaderSpecific(B,MAT_COOKIE,1); 3030a1661176SMatthew Knepley ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqAIJSetPreallocationCSR_C",(void (**)(void))&f);CHKERRQ(ierr); 3031a1661176SMatthew Knepley if (f) { 3032a1661176SMatthew Knepley ierr = (*f)(B,i,j,v);CHKERRQ(ierr); 3033a1661176SMatthew Knepley } 3034a1661176SMatthew Knepley PetscFunctionReturn(0); 3035a1661176SMatthew Knepley } 3036a1661176SMatthew Knepley 3037a1661176SMatthew Knepley EXTERN_C_BEGIN 3038a1661176SMatthew Knepley #undef __FUNCT__ 3039a1661176SMatthew Knepley #define __FUNCT__ "MatSeqAIJSetPreallocationCSR_SeqAIJ" 3040b7940d39SSatish Balay PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJSetPreallocationCSR_SeqAIJ(Mat B,const PetscInt Ii[],const PetscInt J[],const PetscScalar v[]) 3041a1661176SMatthew Knepley { 3042a1661176SMatthew Knepley PetscInt i; 3043a1661176SMatthew Knepley PetscInt m,n; 3044a1661176SMatthew Knepley PetscInt nz; 3045a1661176SMatthew Knepley PetscInt *nnz, nz_max = 0; 3046a1661176SMatthew Knepley PetscScalar *values; 3047a1661176SMatthew Knepley PetscErrorCode ierr; 3048a1661176SMatthew Knepley 3049a1661176SMatthew Knepley PetscFunctionBegin; 3050a1661176SMatthew Knepley ierr = MatGetSize(B, &m, &n);CHKERRQ(ierr); 3051a1661176SMatthew Knepley 3052b7940d39SSatish Balay if (Ii[0]) { 3053b7940d39SSatish Balay SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Ii[0] must be 0 it is %D", Ii[0]); 3054a1661176SMatthew Knepley } 3055a1661176SMatthew Knepley ierr = PetscMalloc((m+1) * sizeof(PetscInt), &nnz);CHKERRQ(ierr); 3056a1661176SMatthew Knepley for(i = 0; i < m; i++) { 3057b7940d39SSatish Balay nz = Ii[i+1]- Ii[i]; 3058a1661176SMatthew Knepley nz_max = PetscMax(nz_max, nz); 3059a1661176SMatthew Knepley if (nz < 0) { 3060a1661176SMatthew Knepley SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE, "Local row %D has a negative number of columns %D", i, nnz); 3061a1661176SMatthew Knepley } 3062a1661176SMatthew Knepley nnz[i] = nz; 3063a1661176SMatthew Knepley } 3064a1661176SMatthew Knepley ierr = MatSeqAIJSetPreallocation(B, 0, nnz);CHKERRQ(ierr); 3065a1661176SMatthew Knepley ierr = PetscFree(nnz);CHKERRQ(ierr); 3066a1661176SMatthew Knepley 3067a1661176SMatthew Knepley if (v) { 3068a1661176SMatthew Knepley values = (PetscScalar*) v; 3069a1661176SMatthew Knepley } else { 3070a1661176SMatthew Knepley ierr = PetscMalloc((nz_max+1)*sizeof(PetscScalar), &values);CHKERRQ(ierr); 3071a1661176SMatthew Knepley ierr = PetscMemzero(values, nz_max*sizeof(PetscScalar));CHKERRQ(ierr); 3072a1661176SMatthew Knepley } 3073a1661176SMatthew Knepley 3074a1661176SMatthew Knepley for(i = 0; i < m; i++) { 3075b7940d39SSatish Balay nz = Ii[i+1] - Ii[i]; 3076b7940d39SSatish Balay ierr = MatSetValues_SeqAIJ(B, 1, &i, nz, J+Ii[i], values + (v ? Ii[i] : 0), INSERT_VALUES);CHKERRQ(ierr); 3077a1661176SMatthew Knepley } 3078a1661176SMatthew Knepley 3079a1661176SMatthew Knepley ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 3080a1661176SMatthew Knepley ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 3081a1661176SMatthew Knepley 3082a1661176SMatthew Knepley if (!v) { 3083a1661176SMatthew Knepley ierr = PetscFree(values);CHKERRQ(ierr); 3084a1661176SMatthew Knepley } 3085a1661176SMatthew Knepley PetscFunctionReturn(0); 3086a1661176SMatthew Knepley } 3087a1661176SMatthew Knepley EXTERN_C_END 3088a1661176SMatthew Knepley 30897c4f633dSBarry Smith #include "../src/mat/impls/dense/seq/dense.h" 3090be7314b0SBarry Smith #include "private/petscaxpy.h" 3091170fe5c8SBarry Smith 3092170fe5c8SBarry Smith #undef __FUNCT__ 3093170fe5c8SBarry Smith #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqAIJ" 3094170fe5c8SBarry Smith /* 3095170fe5c8SBarry Smith Computes (B'*A')' since computing B*A directly is untenable 3096170fe5c8SBarry Smith 3097170fe5c8SBarry Smith n p p 3098170fe5c8SBarry Smith ( ) ( ) ( ) 3099170fe5c8SBarry Smith m ( A ) * n ( B ) = m ( C ) 3100170fe5c8SBarry Smith ( ) ( ) ( ) 3101170fe5c8SBarry Smith 3102170fe5c8SBarry Smith */ 3103170fe5c8SBarry Smith PetscErrorCode MatMatMultNumeric_SeqDense_SeqAIJ(Mat A,Mat B,Mat C) 3104170fe5c8SBarry Smith { 3105170fe5c8SBarry Smith PetscErrorCode ierr; 3106170fe5c8SBarry Smith Mat_SeqDense *sub_a = (Mat_SeqDense*)A->data; 3107170fe5c8SBarry Smith Mat_SeqAIJ *sub_b = (Mat_SeqAIJ*)B->data; 3108170fe5c8SBarry Smith Mat_SeqDense *sub_c = (Mat_SeqDense*)C->data; 31091de00fd4SBarry Smith PetscInt i,n,m,q,p; 3110170fe5c8SBarry Smith const PetscInt *ii,*idx; 3111170fe5c8SBarry Smith const PetscScalar *b,*a,*a_q; 3112170fe5c8SBarry Smith PetscScalar *c,*c_q; 3113170fe5c8SBarry Smith 3114170fe5c8SBarry Smith PetscFunctionBegin; 3115d0f46423SBarry Smith m = A->rmap->n; 3116d0f46423SBarry Smith n = A->cmap->n; 3117d0f46423SBarry Smith p = B->cmap->n; 3118170fe5c8SBarry Smith a = sub_a->v; 3119170fe5c8SBarry Smith b = sub_b->a; 3120170fe5c8SBarry Smith c = sub_c->v; 3121170fe5c8SBarry Smith ierr = PetscMemzero(c,m*p*sizeof(PetscScalar));CHKERRQ(ierr); 3122170fe5c8SBarry Smith 3123170fe5c8SBarry Smith ii = sub_b->i; 3124170fe5c8SBarry Smith idx = sub_b->j; 3125170fe5c8SBarry Smith for (i=0; i<n; i++) { 3126170fe5c8SBarry Smith q = ii[i+1] - ii[i]; 3127170fe5c8SBarry Smith while (q-->0) { 3128170fe5c8SBarry Smith c_q = c + m*(*idx); 3129170fe5c8SBarry Smith a_q = a + m*i; 3130be7314b0SBarry Smith PetscAXPY(c_q,*b,a_q,m); 3131170fe5c8SBarry Smith idx++; 3132170fe5c8SBarry Smith b++; 3133170fe5c8SBarry Smith } 3134170fe5c8SBarry Smith } 3135170fe5c8SBarry Smith PetscFunctionReturn(0); 3136170fe5c8SBarry Smith } 3137170fe5c8SBarry Smith 3138170fe5c8SBarry Smith #undef __FUNCT__ 3139170fe5c8SBarry Smith #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqAIJ" 3140170fe5c8SBarry Smith PetscErrorCode MatMatMultSymbolic_SeqDense_SeqAIJ(Mat A,Mat B,PetscReal fill,Mat *C) 3141170fe5c8SBarry Smith { 3142170fe5c8SBarry Smith PetscErrorCode ierr; 3143d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 3144170fe5c8SBarry Smith Mat Cmat; 3145170fe5c8SBarry Smith 3146170fe5c8SBarry Smith PetscFunctionBegin; 3147d0f46423SBarry Smith if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n); 314839804f7cSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,&Cmat);CHKERRQ(ierr); 3149170fe5c8SBarry Smith ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 3150170fe5c8SBarry Smith ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 3151170fe5c8SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 3152170fe5c8SBarry Smith Cmat->assembled = PETSC_TRUE; 3153170fe5c8SBarry Smith *C = Cmat; 3154170fe5c8SBarry Smith PetscFunctionReturn(0); 3155170fe5c8SBarry Smith } 3156170fe5c8SBarry Smith 3157170fe5c8SBarry Smith /* ----------------------------------------------------------------*/ 3158170fe5c8SBarry Smith #undef __FUNCT__ 3159170fe5c8SBarry Smith #define __FUNCT__ "MatMatMult_SeqDense_SeqAIJ" 3160170fe5c8SBarry Smith PetscErrorCode MatMatMult_SeqDense_SeqAIJ(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 3161170fe5c8SBarry Smith { 3162170fe5c8SBarry Smith PetscErrorCode ierr; 3163170fe5c8SBarry Smith 3164170fe5c8SBarry Smith PetscFunctionBegin; 3165170fe5c8SBarry Smith if (scall == MAT_INITIAL_MATRIX){ 3166170fe5c8SBarry Smith ierr = MatMatMultSymbolic_SeqDense_SeqAIJ(A,B,fill,C);CHKERRQ(ierr); 3167170fe5c8SBarry Smith } 3168170fe5c8SBarry Smith ierr = MatMatMultNumeric_SeqDense_SeqAIJ(A,B,*C);CHKERRQ(ierr); 3169170fe5c8SBarry Smith PetscFunctionReturn(0); 3170170fe5c8SBarry Smith } 3171170fe5c8SBarry Smith 3172170fe5c8SBarry Smith 31730bad9183SKris Buschelman /*MC 3174fafad747SKris Buschelman MATSEQAIJ - MATSEQAIJ = "seqaij" - A matrix type to be used for sequential sparse matrices, 31750bad9183SKris Buschelman based on compressed sparse row format. 31760bad9183SKris Buschelman 31770bad9183SKris Buschelman Options Database Keys: 31780bad9183SKris Buschelman . -mat_type seqaij - sets the matrix type to "seqaij" during a call to MatSetFromOptions() 31790bad9183SKris Buschelman 31800bad9183SKris Buschelman Level: beginner 31810bad9183SKris Buschelman 3182f587520bSBarry Smith .seealso: MatCreateSeqAIJ(), MatSetFromOptions(), MatSetType(), MatCreate(), MatType 31830bad9183SKris Buschelman M*/ 31840bad9183SKris Buschelman 3185a6175056SHong Zhang EXTERN_C_BEGIN 3186b5e56a35SBarry Smith #if defined(PETSC_HAVE_PASTIX) 3187b5e56a35SBarry Smith extern PetscErrorCode MatGetFactor_seqaij_pastix(Mat,MatFactorType,Mat*); 3188b5e56a35SBarry Smith #endif 3189611a798aSSatish Balay #if defined(PETSC_HAVE_ESSL) && !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_SINGLE) && !defined(PETSC_USE_MAT_SINGLE) 3190af1023dbSSatish Balay extern PetscErrorCode MatGetFactor_seqaij_essl(Mat,MatFactorType,Mat *); 3191af1023dbSSatish Balay #endif 319217667f90SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatConvert_SeqAIJ_SeqCRL(Mat,MatType,MatReuse,Mat*); 3193b24902e0SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor_seqaij_petsc(Mat,MatFactorType,Mat*); 3194db4efbfdSBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactorAvailable_seqaij_petsc(Mat,MatFactorType,PetscTruth *); 3195611f576cSBarry Smith #if defined(PETSC_HAVE_MUMPS) 31965c9eb25fSBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor_seqaij_mumps(Mat,MatFactorType,Mat*); 3197611f576cSBarry Smith #endif 3198611f576cSBarry Smith #if defined(PETSC_HAVE_SUPERLU) 31995c9eb25fSBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor_seqaij_superlu(Mat,MatFactorType,Mat*); 3200611f576cSBarry Smith #endif 3201f3c0ef26SHong Zhang #if defined(PETSC_HAVE_SUPERLU_DIST) 3202f3c0ef26SHong Zhang extern PetscErrorCode MatGetFactor_seqaij_superlu_dist(Mat,MatFactorType,Mat*); 3203f3c0ef26SHong Zhang #endif 3204611f576cSBarry Smith #if defined(PETSC_HAVE_SPOOLES) 32055c9eb25fSBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor_seqaij_spooles(Mat,MatFactorType,Mat*); 3206611f576cSBarry Smith #endif 3207eb3b5408SSatish Balay #if defined(PETSC_HAVE_UMFPACK) 3208eb3b5408SSatish Balay extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor_seqaij_umfpack(Mat,MatFactorType,Mat*); 3209eb3b5408SSatish Balay #endif 3210719d5645SBarry Smith #if defined(PETSC_HAVE_LUSOL) 3211719d5645SBarry Smith extern PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor_seqaij_lusol(Mat,MatFactorType,Mat*); 3212719d5645SBarry Smith #endif 321317667f90SBarry Smith EXTERN_C_END 321417667f90SBarry Smith 3215b24902e0SBarry Smith 321617667f90SBarry Smith EXTERN_C_BEGIN 32174a2ae208SSatish Balay #undef __FUNCT__ 32184a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqAIJ" 3219be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqAIJ(Mat B) 3220273d9f13SBarry Smith { 3221273d9f13SBarry Smith Mat_SeqAIJ *b; 3222dfbe8321SBarry Smith PetscErrorCode ierr; 322338baddfdSBarry Smith PetscMPIInt size; 3224273d9f13SBarry Smith 3225273d9f13SBarry Smith PetscFunctionBegin; 32267adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr); 3227273d9f13SBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Comm must be of size 1"); 3228273d9f13SBarry Smith 322938f2d2fdSLisandro Dalcin ierr = PetscNewLog(B,Mat_SeqAIJ,&b);CHKERRQ(ierr); 3230b0a32e0cSBarry Smith B->data = (void*)b; 3231549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 323290f02eecSBarry Smith B->mapping = 0; 3233416022c9SBarry Smith b->row = 0; 3234416022c9SBarry Smith b->col = 0; 323582bf6240SBarry Smith b->icol = 0; 3236b810aeb4SBarry Smith b->reallocs = 0; 323736db0b34SBarry Smith b->ignorezeroentries = PETSC_FALSE; 3238f1e2ffcdSBarry Smith b->roworiented = PETSC_TRUE; 3239416022c9SBarry Smith b->nonew = 0; 3240416022c9SBarry Smith b->diag = 0; 3241416022c9SBarry Smith b->solve_work = 0; 32422a1b7f2aSHong Zhang B->spptr = 0; 3243be6bf707SBarry Smith b->saved_values = 0; 3244d7f994e1SBarry Smith b->idiag = 0; 324571f1c65dSBarry Smith b->mdiag = 0; 324671f1c65dSBarry Smith b->ssor_work = 0; 324771f1c65dSBarry Smith b->omega = 1.0; 324871f1c65dSBarry Smith b->fshift = 0.0; 324971f1c65dSBarry Smith b->idiagvalid = PETSC_FALSE; 3250a9817697SBarry Smith b->keepnonzeropattern = PETSC_FALSE; 3251a30b2313SHong Zhang b->xtoy = 0; 3252a30b2313SHong Zhang b->XtoY = 0; 325373e7a558SHong Zhang b->compressedrow.use = PETSC_FALSE; 3254d0f46423SBarry Smith b->compressedrow.nrows = B->rmap->n; 3255d487561eSHong Zhang b->compressedrow.i = PETSC_NULL; 3256d487561eSHong Zhang b->compressedrow.rindex = PETSC_NULL; 3257d487561eSHong Zhang b->compressedrow.checked = PETSC_FALSE; 325888e51ccdSHong Zhang B->same_nonzero = PETSC_FALSE; 325917ab2063SBarry Smith 326035d8aa7fSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr); 3261b5e56a35SBarry Smith #if defined(PETSC_HAVE_PASTIX) 3262b5e56a35SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_pastix_C", 3263b5e56a35SBarry Smith "MatGetFactor_seqaij_pastix", 3264b5e56a35SBarry Smith MatGetFactor_seqaij_pastix);CHKERRQ(ierr); 3265b5e56a35SBarry Smith #endif 3266611a798aSSatish Balay #if defined(PETSC_HAVE_ESSL) && !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_SINGLE) && !defined(PETSC_USE_MAT_SINGLE) 3267719d5645SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_essl_C", 3268719d5645SBarry Smith "MatGetFactor_seqaij_essl", 3269719d5645SBarry Smith MatGetFactor_seqaij_essl);CHKERRQ(ierr); 3270719d5645SBarry Smith #endif 3271611f576cSBarry Smith #if defined(PETSC_HAVE_SUPERLU) 32725c9eb25fSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_superlu_C", 32735c9eb25fSBarry Smith "MatGetFactor_seqaij_superlu", 32745c9eb25fSBarry Smith MatGetFactor_seqaij_superlu);CHKERRQ(ierr); 3275611f576cSBarry Smith #endif 3276f3c0ef26SHong Zhang #if defined(PETSC_HAVE_SUPERLU_DIST) 3277f3c0ef26SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_superlu_dist_C", 3278f3c0ef26SHong Zhang "MatGetFactor_seqaij_superlu_dist", 3279f3c0ef26SHong Zhang MatGetFactor_seqaij_superlu_dist);CHKERRQ(ierr); 3280f3c0ef26SHong Zhang #endif 3281611f576cSBarry Smith #if defined(PETSC_HAVE_SPOOLES) 32825c9eb25fSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_spooles_C", 32835c9eb25fSBarry Smith "MatGetFactor_seqaij_spooles", 32845c9eb25fSBarry Smith MatGetFactor_seqaij_spooles);CHKERRQ(ierr); 3285611f576cSBarry Smith #endif 3286611f576cSBarry Smith #if defined(PETSC_HAVE_MUMPS) 32875c9eb25fSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_mumps_C", 32885c9eb25fSBarry Smith "MatGetFactor_seqaij_mumps", 32895c9eb25fSBarry Smith MatGetFactor_seqaij_mumps);CHKERRQ(ierr); 3290611f576cSBarry Smith #endif 3291eb3b5408SSatish Balay #if defined(PETSC_HAVE_UMFPACK) 3292eb3b5408SSatish Balay ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_umfpack_C", 3293eb3b5408SSatish Balay "MatGetFactor_seqaij_umfpack", 3294eb3b5408SSatish Balay MatGetFactor_seqaij_umfpack);CHKERRQ(ierr); 3295eb3b5408SSatish Balay #endif 3296719d5645SBarry Smith #if defined(PETSC_HAVE_LUSOL) 3297719d5645SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_lusol_C", 3298719d5645SBarry Smith "MatGetFactor_seqaij_lusol", 3299719d5645SBarry Smith MatGetFactor_seqaij_lusol);CHKERRQ(ierr); 3300719d5645SBarry Smith #endif 3301b24902e0SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqaij_petsc_C", 3302b24902e0SBarry Smith "MatGetFactor_seqaij_petsc", 3303b24902e0SBarry Smith MatGetFactor_seqaij_petsc);CHKERRQ(ierr); 3304db4efbfdSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactorAvailable_seqaij_petsc_C", 3305db4efbfdSBarry Smith "MatGetFactorAvailable_seqaij_petsc", 3306db4efbfdSBarry Smith MatGetFactorAvailable_seqaij_petsc);CHKERRQ(ierr); 3307f1af5d2fSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqAIJSetColumnIndices_C", 3308bef8e0ddSBarry Smith "MatSeqAIJSetColumnIndices_SeqAIJ", 3309bc4b532fSSatish Balay MatSeqAIJSetColumnIndices_SeqAIJ);CHKERRQ(ierr); 3310f1af5d2fSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatStoreValues_C", 3311be6bf707SBarry Smith "MatStoreValues_SeqAIJ", 3312bc4b532fSSatish Balay MatStoreValues_SeqAIJ);CHKERRQ(ierr); 3313f1af5d2fSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatRetrieveValues_C", 3314be6bf707SBarry Smith "MatRetrieveValues_SeqAIJ", 3315bc4b532fSSatish Balay MatRetrieveValues_SeqAIJ);CHKERRQ(ierr); 3316a6175056SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_seqsbaij_C", 3317a6175056SHong Zhang "MatConvert_SeqAIJ_SeqSBAIJ", 3318a6175056SHong Zhang MatConvert_SeqAIJ_SeqSBAIJ);CHKERRQ(ierr); 331985fc7724SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_seqbaij_C", 332085fc7724SBarry Smith "MatConvert_SeqAIJ_SeqBAIJ", 332185fc7724SBarry Smith MatConvert_SeqAIJ_SeqBAIJ);CHKERRQ(ierr); 3322ba03775dSHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_seqcsrperm_C", 3323ba03775dSHong Zhang "MatConvert_SeqAIJ_SeqCSRPERM", 3324ba03775dSHong Zhang MatConvert_SeqAIJ_SeqCSRPERM);CHKERRQ(ierr); 332517667f90SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_seqcrl_C", 332617667f90SBarry Smith "MatConvert_SeqAIJ_SeqCRL", 332717667f90SBarry Smith MatConvert_SeqAIJ_SeqCRL);CHKERRQ(ierr); 33285fbd3699SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatIsTranspose_C", 33295fbd3699SBarry Smith "MatIsTranspose_SeqAIJ", 33305fbd3699SBarry Smith MatIsTranspose_SeqAIJ);CHKERRQ(ierr); 33311cbb95d3SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatIsHermitianTranspose_C", 33321cbb95d3SBarry Smith "MatIsHermitianTranspose_SeqAIJ", 33331cbb95d3SBarry Smith MatIsTranspose_SeqAIJ);CHKERRQ(ierr); 3334a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqAIJSetPreallocation_C", 3335a23d5eceSKris Buschelman "MatSeqAIJSetPreallocation_SeqAIJ", 3336a23d5eceSKris Buschelman MatSeqAIJSetPreallocation_SeqAIJ);CHKERRQ(ierr); 3337a1661176SMatthew Knepley ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqAIJSetPreallocationCSR_C", 3338a1661176SMatthew Knepley "MatSeqAIJSetPreallocationCSR_SeqAIJ", 3339a1661176SMatthew Knepley MatSeqAIJSetPreallocationCSR_SeqAIJ);CHKERRQ(ierr); 334005b94e36SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatReorderForNonzeroDiagonal_C", 334105b94e36SKris Buschelman "MatReorderForNonzeroDiagonal_SeqAIJ", 334205b94e36SKris Buschelman MatReorderForNonzeroDiagonal_SeqAIJ);CHKERRQ(ierr); 3343170fe5c8SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqdense_seqaij_C", 3344170fe5c8SBarry Smith "MatMatMult_SeqDense_SeqAIJ", 3345170fe5c8SBarry Smith MatMatMult_SeqDense_SeqAIJ);CHKERRQ(ierr); 3346170fe5c8SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqdense_seqaij_C", 3347170fe5c8SBarry Smith "MatMatMultSymbolic_SeqDense_SeqAIJ", 3348170fe5c8SBarry Smith MatMatMultSymbolic_SeqDense_SeqAIJ);CHKERRQ(ierr); 3349170fe5c8SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqdense_seqaij_C", 3350170fe5c8SBarry Smith "MatMatMultNumeric_SeqDense_SeqAIJ", 3351170fe5c8SBarry Smith MatMatMultNumeric_SeqDense_SeqAIJ);CHKERRQ(ierr); 33524846f1f5SKris Buschelman ierr = MatCreate_Inode(B);CHKERRQ(ierr); 335317667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr); 33543a40ed3dSBarry Smith PetscFunctionReturn(0); 335517ab2063SBarry Smith } 3356273d9f13SBarry Smith EXTERN_C_END 335717ab2063SBarry Smith 33584a2ae208SSatish Balay #undef __FUNCT__ 3359b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqAIJ" 3360b24902e0SBarry Smith /* 3361b24902e0SBarry Smith Given a matrix generated with MatGetFactor() duplicates all the information in A into B 3362b24902e0SBarry Smith */ 3363719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqAIJ(Mat C,Mat A,MatDuplicateOption cpvalues) 336417ab2063SBarry Smith { 3365416022c9SBarry Smith Mat_SeqAIJ *c,*a = (Mat_SeqAIJ*)A->data; 33666849ba73SBarry Smith PetscErrorCode ierr; 3367d0f46423SBarry Smith PetscInt i,m = A->rmap->n; 336817ab2063SBarry Smith 33693a40ed3dSBarry Smith PetscFunctionBegin; 33701d5dac46SHong Zhang ierr = PetscMemcpy(C->ops,A->ops,sizeof(struct _MatOps));CHKERRQ(ierr); 33711d5dac46SHong Zhang 3372273d9f13SBarry Smith c = (Mat_SeqAIJ*)C->data; 3373273d9f13SBarry Smith 3374416022c9SBarry Smith C->factor = A->factor; 33756ad4291fSHong Zhang 3376416022c9SBarry Smith c->row = 0; 3377416022c9SBarry Smith c->col = 0; 337882bf6240SBarry Smith c->icol = 0; 33796ad4291fSHong Zhang c->reallocs = 0; 338017ab2063SBarry Smith 33816ad4291fSHong Zhang C->assembled = PETSC_TRUE; 338217ab2063SBarry Smith 33837408324eSLisandro Dalcin ierr = PetscMapSetBlockSize(C->rmap,1);CHKERRQ(ierr); 33847408324eSLisandro Dalcin ierr = PetscMapSetBlockSize(C->cmap,1);CHKERRQ(ierr); 3385d0f46423SBarry Smith ierr = PetscMapSetUp(C->rmap);CHKERRQ(ierr); 3386d0f46423SBarry Smith ierr = PetscMapSetUp(C->cmap);CHKERRQ(ierr); 3387eec197d1SBarry Smith 338833b91e9fSSatish Balay ierr = PetscMalloc2(m,PetscInt,&c->imax,m,PetscInt,&c->ilen);CHKERRQ(ierr); 33899518dbb4SMatthew Knepley ierr = PetscLogObjectMemory(C, 2*m*sizeof(PetscInt));CHKERRQ(ierr); 339017ab2063SBarry Smith for (i=0; i<m; i++) { 3391416022c9SBarry Smith c->imax[i] = a->imax[i]; 3392416022c9SBarry Smith c->ilen[i] = a->ilen[i]; 339317ab2063SBarry Smith } 339417ab2063SBarry Smith 339517ab2063SBarry Smith /* allocate the matrix space */ 3396a96a251dSBarry Smith ierr = PetscMalloc3(a->i[m],PetscScalar,&c->a,a->i[m],PetscInt,&c->j,m+1,PetscInt,&c->i);CHKERRQ(ierr); 33979518dbb4SMatthew Knepley ierr = PetscLogObjectMemory(C, a->i[m]*(sizeof(PetscScalar)+sizeof(PetscInt))+(m+1)*sizeof(PetscInt));CHKERRQ(ierr); 3398f1e2ffcdSBarry Smith c->singlemalloc = PETSC_TRUE; 339997f1f81fSBarry Smith ierr = PetscMemcpy(c->i,a->i,(m+1)*sizeof(PetscInt));CHKERRQ(ierr); 340017ab2063SBarry Smith if (m > 0) { 340197f1f81fSBarry Smith ierr = PetscMemcpy(c->j,a->j,(a->i[m])*sizeof(PetscInt));CHKERRQ(ierr); 3402be6bf707SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 3403bfeeae90SHong Zhang ierr = PetscMemcpy(c->a,a->a,(a->i[m])*sizeof(PetscScalar));CHKERRQ(ierr); 3404be6bf707SBarry Smith } else { 3405bfeeae90SHong Zhang ierr = PetscMemzero(c->a,(a->i[m])*sizeof(PetscScalar));CHKERRQ(ierr); 340617ab2063SBarry Smith } 340708480c60SBarry Smith } 340817ab2063SBarry Smith 34096ad4291fSHong Zhang c->ignorezeroentries = a->ignorezeroentries; 3410416022c9SBarry Smith c->roworiented = a->roworiented; 3411416022c9SBarry Smith c->nonew = a->nonew; 3412416022c9SBarry Smith if (a->diag) { 341397f1f81fSBarry Smith ierr = PetscMalloc((m+1)*sizeof(PetscInt),&c->diag);CHKERRQ(ierr); 341452e6d16bSBarry Smith ierr = PetscLogObjectMemory(C,(m+1)*sizeof(PetscInt));CHKERRQ(ierr); 341517ab2063SBarry Smith for (i=0; i<m; i++) { 3416416022c9SBarry Smith c->diag[i] = a->diag[i]; 341717ab2063SBarry Smith } 34183a40ed3dSBarry Smith } else c->diag = 0; 34196ad4291fSHong Zhang c->solve_work = 0; 34206ad4291fSHong Zhang c->saved_values = 0; 34216ad4291fSHong Zhang c->idiag = 0; 342271f1c65dSBarry Smith c->ssor_work = 0; 3423a9817697SBarry Smith c->keepnonzeropattern = a->keepnonzeropattern; 3424e6b907acSBarry Smith c->free_a = PETSC_TRUE; 3425e6b907acSBarry Smith c->free_ij = PETSC_TRUE; 34266ad4291fSHong Zhang c->xtoy = 0; 34276ad4291fSHong Zhang c->XtoY = 0; 34286ad4291fSHong Zhang 3429416022c9SBarry Smith c->nz = a->nz; 3430416022c9SBarry Smith c->maxnz = a->maxnz; 3431273d9f13SBarry Smith C->preallocated = PETSC_TRUE; 3432754ec7b1SSatish Balay 34336ad4291fSHong Zhang c->compressedrow.use = a->compressedrow.use; 34346ad4291fSHong Zhang c->compressedrow.nrows = a->compressedrow.nrows; 34356ad4291fSHong Zhang c->compressedrow.checked = a->compressedrow.checked; 34366ad4291fSHong Zhang if ( a->compressedrow.checked && a->compressedrow.use){ 34376ad4291fSHong Zhang i = a->compressedrow.nrows; 34386ad4291fSHong Zhang ierr = PetscMalloc((2*i+1)*sizeof(PetscInt),&c->compressedrow.i);CHKERRQ(ierr); 34396ad4291fSHong Zhang c->compressedrow.rindex = c->compressedrow.i + i + 1; 34406ad4291fSHong Zhang ierr = PetscMemcpy(c->compressedrow.i,a->compressedrow.i,(i+1)*sizeof(PetscInt));CHKERRQ(ierr); 34416ad4291fSHong Zhang ierr = PetscMemcpy(c->compressedrow.rindex,a->compressedrow.rindex,i*sizeof(PetscInt));CHKERRQ(ierr); 344227ea64f8SHong Zhang } else { 344327ea64f8SHong Zhang c->compressedrow.use = PETSC_FALSE; 344427ea64f8SHong Zhang c->compressedrow.i = PETSC_NULL; 344527ea64f8SHong Zhang c->compressedrow.rindex = PETSC_NULL; 34466ad4291fSHong Zhang } 344788e51ccdSHong Zhang C->same_nonzero = A->same_nonzero; 34484846f1f5SKris Buschelman ierr = MatDuplicate_Inode(A,cpvalues,&C);CHKERRQ(ierr); 34494846f1f5SKris Buschelman 34507adad957SLisandro Dalcin ierr = PetscFListDuplicate(((PetscObject)A)->qlist,&((PetscObject)C)->qlist);CHKERRQ(ierr); 34513a40ed3dSBarry Smith PetscFunctionReturn(0); 345217ab2063SBarry Smith } 345317ab2063SBarry Smith 34544a2ae208SSatish Balay #undef __FUNCT__ 3455b24902e0SBarry Smith #define __FUNCT__ "MatDuplicate_SeqAIJ" 3456b24902e0SBarry Smith PetscErrorCode MatDuplicate_SeqAIJ(Mat A,MatDuplicateOption cpvalues,Mat *B) 3457b24902e0SBarry Smith { 3458b24902e0SBarry Smith PetscErrorCode ierr; 3459d0f46423SBarry Smith PetscInt n = A->rmap->n; 3460b24902e0SBarry Smith 3461b24902e0SBarry Smith PetscFunctionBegin; 3462b24902e0SBarry Smith ierr = MatCreate(((PetscObject)A)->comm,B);CHKERRQ(ierr); 3463b24902e0SBarry Smith ierr = MatSetSizes(*B,n,n,n,n);CHKERRQ(ierr); 3464b24902e0SBarry Smith ierr = MatSetType(*B,MATSEQAIJ);CHKERRQ(ierr); 3465719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqAIJ(*B,A,cpvalues);CHKERRQ(ierr); 3466b24902e0SBarry Smith PetscFunctionReturn(0); 3467b24902e0SBarry Smith } 3468b24902e0SBarry Smith 3469b24902e0SBarry Smith #undef __FUNCT__ 34704a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqAIJ" 3471a313700dSBarry Smith PetscErrorCode MatLoad_SeqAIJ(PetscViewer viewer, const MatType type,Mat *A) 347217ab2063SBarry Smith { 3473416022c9SBarry Smith Mat_SeqAIJ *a; 3474416022c9SBarry Smith Mat B; 34756849ba73SBarry Smith PetscErrorCode ierr; 34763c601197SSatish Balay PetscInt i,sum,nz,header[4],*rowlengths = 0,M,N; 347738baddfdSBarry Smith int fd; 347838baddfdSBarry Smith PetscMPIInt size; 3479bcd2baecSBarry Smith MPI_Comm comm; 348017ab2063SBarry Smith 34813a40ed3dSBarry Smith PetscFunctionBegin; 3482e864ced6SBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 3483d132466eSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 348429bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_SIZ,"view must have one processor"); 3485b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 34860752156aSBarry Smith ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 3487552e946dSBarry Smith if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"not matrix object in file"); 348817ab2063SBarry Smith M = header[1]; N = header[2]; nz = header[3]; 348917ab2063SBarry Smith 3490d64ed03dSBarry Smith if (nz < 0) { 349129bbc08cSBarry Smith SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Matrix stored in special format on disk,cannot load as SeqAIJ"); 3492d64ed03dSBarry Smith } 3493d64ed03dSBarry Smith 349417ab2063SBarry Smith /* read in row lengths */ 349597f1f81fSBarry Smith ierr = PetscMalloc(M*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 34960752156aSBarry Smith ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 349717ab2063SBarry Smith 34983c601197SSatish Balay /* check if sum of rowlengths is same as nz */ 34993c601197SSatish Balay for (i=0,sum=0; i< M; i++) sum +=rowlengths[i]; 35003c601197SSatish Balay if (sum != nz) SETERRQ2(PETSC_ERR_FILE_READ,"Inconsistant matrix data in file. no-nonzeros = %d, sum-row-lengths = %d\n",nz,sum); 35013c601197SSatish Balay 350217ab2063SBarry Smith /* create our matrix */ 3503f69a0ea3SMatthew Knepley ierr = MatCreate(comm,&B);CHKERRQ(ierr); 3504f69a0ea3SMatthew Knepley ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 3505b3a1e11cSKris Buschelman ierr = MatSetType(B,type);CHKERRQ(ierr); 3506ab93d7beSBarry Smith ierr = MatSeqAIJSetPreallocation_SeqAIJ(B,0,rowlengths);CHKERRQ(ierr); 3507416022c9SBarry Smith a = (Mat_SeqAIJ*)B->data; 350817ab2063SBarry Smith 35090752156aSBarry Smith ierr = PetscBinaryRead(fd,a->j,nz,PETSC_INT);CHKERRQ(ierr); 351017ab2063SBarry Smith 351117ab2063SBarry Smith /* read in nonzero values */ 35120752156aSBarry Smith ierr = PetscBinaryRead(fd,a->a,nz,PETSC_SCALAR);CHKERRQ(ierr); 351317ab2063SBarry Smith 351417ab2063SBarry Smith /* set matrix "i" values */ 3515efb16452SHong Zhang a->i[0] = 0; 351617ab2063SBarry Smith for (i=1; i<= M; i++) { 3517416022c9SBarry Smith a->i[i] = a->i[i-1] + rowlengths[i-1]; 3518416022c9SBarry Smith a->ilen[i-1] = rowlengths[i-1]; 351917ab2063SBarry Smith } 3520606d414cSSatish Balay ierr = PetscFree(rowlengths);CHKERRQ(ierr); 352117ab2063SBarry Smith 35226d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 35236d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 3524b3a1e11cSKris Buschelman *A = B; 35253a40ed3dSBarry Smith PetscFunctionReturn(0); 352617ab2063SBarry Smith } 352717ab2063SBarry Smith 35284a2ae208SSatish Balay #undef __FUNCT__ 3529b9617806SBarry Smith #define __FUNCT__ "MatEqual_SeqAIJ" 3530dfbe8321SBarry Smith PetscErrorCode MatEqual_SeqAIJ(Mat A,Mat B,PetscTruth* flg) 35317264ac53SSatish Balay { 35327264ac53SSatish Balay Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data,*b = (Mat_SeqAIJ *)B->data; 3533dfbe8321SBarry Smith PetscErrorCode ierr; 35347264ac53SSatish Balay 35353a40ed3dSBarry Smith PetscFunctionBegin; 3536bfeeae90SHong Zhang /* If the matrix dimensions are not equal,or no of nonzeros */ 3537d0f46423SBarry Smith if ((A->rmap->n != B->rmap->n) || (A->cmap->n != B->cmap->n) ||(a->nz != b->nz)) { 3538ca44d042SBarry Smith *flg = PETSC_FALSE; 3539ca44d042SBarry Smith PetscFunctionReturn(0); 3540bcd2baecSBarry Smith } 35417264ac53SSatish Balay 35427264ac53SSatish Balay /* if the a->i are the same */ 3543d0f46423SBarry Smith ierr = PetscMemcmp(a->i,b->i,(A->rmap->n+1)*sizeof(PetscInt),flg);CHKERRQ(ierr); 3544abc0a331SBarry Smith if (!*flg) PetscFunctionReturn(0); 35457264ac53SSatish Balay 35467264ac53SSatish Balay /* if a->j are the same */ 354797f1f81fSBarry Smith ierr = PetscMemcmp(a->j,b->j,(a->nz)*sizeof(PetscInt),flg);CHKERRQ(ierr); 3548abc0a331SBarry Smith if (!*flg) PetscFunctionReturn(0); 3549bcd2baecSBarry Smith 3550bcd2baecSBarry Smith /* if a->a are the same */ 355187828ca2SBarry Smith ierr = PetscMemcmp(a->a,b->a,(a->nz)*sizeof(PetscScalar),flg);CHKERRQ(ierr); 35520f5bd95cSBarry Smith 35533a40ed3dSBarry Smith PetscFunctionReturn(0); 35547264ac53SSatish Balay 35557264ac53SSatish Balay } 355636db0b34SBarry Smith 35574a2ae208SSatish Balay #undef __FUNCT__ 35584a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqAIJWithArrays" 355905869f15SSatish Balay /*@ 356036db0b34SBarry Smith MatCreateSeqAIJWithArrays - Creates an sequential AIJ matrix using matrix elements (in CSR format) 356136db0b34SBarry Smith provided by the user. 356236db0b34SBarry Smith 3563c75a6043SHong Zhang Collective on MPI_Comm 356436db0b34SBarry Smith 356536db0b34SBarry Smith Input Parameters: 356636db0b34SBarry Smith + comm - must be an MPI communicator of size 1 356736db0b34SBarry Smith . m - number of rows 356836db0b34SBarry Smith . n - number of columns 356936db0b34SBarry Smith . i - row indices 357036db0b34SBarry Smith . j - column indices 357136db0b34SBarry Smith - a - matrix values 357236db0b34SBarry Smith 357336db0b34SBarry Smith Output Parameter: 357436db0b34SBarry Smith . mat - the matrix 357536db0b34SBarry Smith 357636db0b34SBarry Smith Level: intermediate 357736db0b34SBarry Smith 357836db0b34SBarry Smith Notes: 35790551d7c0SBarry Smith The i, j, and a arrays are not copied by this routine, the user must free these arrays 358036db0b34SBarry Smith once the matrix is destroyed 358136db0b34SBarry Smith 358236db0b34SBarry Smith You cannot set new nonzero locations into this matrix, that will generate an error. 358336db0b34SBarry Smith 3584bfeeae90SHong Zhang The i and j indices are 0 based 358536db0b34SBarry Smith 3586a4552177SSatish Balay The format which is used for the sparse matrix input, is equivalent to a 3587a4552177SSatish Balay row-major ordering.. i.e for the following matrix, the input data expected is 3588a4552177SSatish Balay as shown: 3589a4552177SSatish Balay 3590a4552177SSatish Balay 1 0 0 3591a4552177SSatish Balay 2 0 3 3592a4552177SSatish Balay 4 5 6 3593a4552177SSatish Balay 3594a4552177SSatish Balay i = {0,1,3,6} [size = nrow+1 = 3+1] 35959985e31cSBarry Smith j = {0,0,2,0,1,2} [size = nz = 6]; values must be sorted for each row 3596a4552177SSatish Balay v = {1,2,3,4,5,6} [size = nz = 6] 3597a4552177SSatish Balay 35989985e31cSBarry Smith 35992fb0ec9aSBarry Smith .seealso: MatCreate(), MatCreateMPIAIJ(), MatCreateSeqAIJ(), MatCreateMPIAIJWithArrays(), MatMPIAIJSetPreallocationCSR() 360036db0b34SBarry Smith 360136db0b34SBarry Smith @*/ 3602a77337e4SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqAIJWithArrays(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt* i,PetscInt*j,PetscScalar *a,Mat *mat) 360336db0b34SBarry Smith { 3604dfbe8321SBarry Smith PetscErrorCode ierr; 3605cbcfb4deSHong Zhang PetscInt ii; 360636db0b34SBarry Smith Mat_SeqAIJ *aij; 3607cbcfb4deSHong Zhang #if defined(PETSC_USE_DEBUG) 3608cbcfb4deSHong Zhang PetscInt jj; 3609cbcfb4deSHong Zhang #endif 361036db0b34SBarry Smith 361136db0b34SBarry Smith PetscFunctionBegin; 3612a96a251dSBarry Smith if (i[0]) { 3613634064b4SBarry Smith SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"i (row indices) must start with 0"); 361436db0b34SBarry Smith } 3615f69a0ea3SMatthew Knepley ierr = MatCreate(comm,mat);CHKERRQ(ierr); 3616f69a0ea3SMatthew Knepley ierr = MatSetSizes(*mat,m,n,m,n);CHKERRQ(ierr); 3617ab93d7beSBarry Smith ierr = MatSetType(*mat,MATSEQAIJ);CHKERRQ(ierr); 3618ab93d7beSBarry Smith ierr = MatSeqAIJSetPreallocation_SeqAIJ(*mat,MAT_SKIP_ALLOCATION,0);CHKERRQ(ierr); 3619ab93d7beSBarry Smith aij = (Mat_SeqAIJ*)(*mat)->data; 3620ab93d7beSBarry Smith ierr = PetscMalloc2(m,PetscInt,&aij->imax,m,PetscInt,&aij->ilen);CHKERRQ(ierr); 3621ab93d7beSBarry Smith 362236db0b34SBarry Smith aij->i = i; 362336db0b34SBarry Smith aij->j = j; 362436db0b34SBarry Smith aij->a = a; 362536db0b34SBarry Smith aij->singlemalloc = PETSC_FALSE; 362636db0b34SBarry Smith aij->nonew = -1; /*this indicates that inserting a new value in the matrix that generates a new nonzero is an error*/ 3627e6b907acSBarry Smith aij->free_a = PETSC_FALSE; 3628e6b907acSBarry Smith aij->free_ij = PETSC_FALSE; 362936db0b34SBarry Smith 363036db0b34SBarry Smith for (ii=0; ii<m; ii++) { 363136db0b34SBarry Smith aij->ilen[ii] = aij->imax[ii] = i[ii+1] - i[ii]; 36322515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 363379a5c55eSBarry Smith if (i[ii+1] - i[ii] < 0) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Negative row length in i (row indices) row = %d length = %d",ii,i[ii+1] - i[ii]); 36349985e31cSBarry Smith for (jj=i[ii]+1; jj<i[ii+1]; jj++) { 36359985e31cSBarry Smith if (j[jj] < j[jj-1]) SETERRQ3(PETSC_ERR_ARG_OUTOFRANGE,"Column entry number %D (actual colum %D) in row %D is not sorted",jj-i[ii],j[jj],ii); 36369985e31cSBarry Smith if (j[jj] == j[jj]-1) SETERRQ3(PETSC_ERR_ARG_OUTOFRANGE,"Column entry number %D (actual colum %D) in row %D is identical to previous entry",jj-i[ii],j[jj],ii); 36379985e31cSBarry Smith } 363836db0b34SBarry Smith #endif 363936db0b34SBarry Smith } 36402515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 364136db0b34SBarry Smith for (ii=0; ii<aij->i[m]; ii++) { 364279a5c55eSBarry Smith if (j[ii] < 0) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Negative column index at location = %d index = %d",ii,j[ii]); 364379a5c55eSBarry Smith if (j[ii] > n - 1) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column index to large at location = %d index = %d",ii,j[ii]); 364436db0b34SBarry Smith } 364536db0b34SBarry Smith #endif 364636db0b34SBarry Smith 3647b65db4caSBarry Smith ierr = MatAssemblyBegin(*mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 3648b65db4caSBarry Smith ierr = MatAssemblyEnd(*mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 364936db0b34SBarry Smith PetscFunctionReturn(0); 365036db0b34SBarry Smith } 365136db0b34SBarry Smith 3652cc8ba8e1SBarry Smith #undef __FUNCT__ 3653ee4f033dSBarry Smith #define __FUNCT__ "MatSetColoring_SeqAIJ" 3654dfbe8321SBarry Smith PetscErrorCode MatSetColoring_SeqAIJ(Mat A,ISColoring coloring) 3655cc8ba8e1SBarry Smith { 3656dfbe8321SBarry Smith PetscErrorCode ierr; 3657cc8ba8e1SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 365836db0b34SBarry Smith 3659cc8ba8e1SBarry Smith PetscFunctionBegin; 36608ee2e534SBarry Smith if (coloring->ctype == IS_COLORING_GLOBAL) { 3661cc8ba8e1SBarry Smith ierr = ISColoringReference(coloring);CHKERRQ(ierr); 3662cc8ba8e1SBarry Smith a->coloring = coloring; 366312c595b3SBarry Smith } else if (coloring->ctype == IS_COLORING_GHOSTED) { 366497f1f81fSBarry Smith PetscInt i,*larray; 366512c595b3SBarry Smith ISColoring ocoloring; 366608b6dcc0SBarry Smith ISColoringValue *colors; 366712c595b3SBarry Smith 366812c595b3SBarry Smith /* set coloring for diagonal portion */ 3669d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),&larray);CHKERRQ(ierr); 3670d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 367112c595b3SBarry Smith larray[i] = i; 367212c595b3SBarry Smith } 3673d0f46423SBarry Smith ierr = ISGlobalToLocalMappingApply(A->mapping,IS_GTOLM_MASK,A->cmap->n,larray,PETSC_NULL,larray);CHKERRQ(ierr); 3674d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(ISColoringValue),&colors);CHKERRQ(ierr); 3675d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 367612c595b3SBarry Smith colors[i] = coloring->colors[larray[i]]; 367712c595b3SBarry Smith } 367812c595b3SBarry Smith ierr = PetscFree(larray);CHKERRQ(ierr); 3679d0f46423SBarry Smith ierr = ISColoringCreate(PETSC_COMM_SELF,coloring->n,A->cmap->n,colors,&ocoloring);CHKERRQ(ierr); 368012c595b3SBarry Smith a->coloring = ocoloring; 368112c595b3SBarry Smith } 3682cc8ba8e1SBarry Smith PetscFunctionReturn(0); 3683cc8ba8e1SBarry Smith } 3684cc8ba8e1SBarry Smith 3685dcf5cc72SBarry Smith #if defined(PETSC_HAVE_ADIC) 3686ee4f033dSBarry Smith EXTERN_C_BEGIN 368729c1e371SBarry Smith #include "adic/ad_utils.h" 3688ee4f033dSBarry Smith EXTERN_C_END 3689cc8ba8e1SBarry Smith 3690cc8ba8e1SBarry Smith #undef __FUNCT__ 3691ee4f033dSBarry Smith #define __FUNCT__ "MatSetValuesAdic_SeqAIJ" 3692dfbe8321SBarry Smith PetscErrorCode MatSetValuesAdic_SeqAIJ(Mat A,void *advalues) 3693cc8ba8e1SBarry Smith { 3694cc8ba8e1SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 3695d0f46423SBarry Smith PetscInt m = A->rmap->n,*ii = a->i,*jj = a->j,nz,i,j,nlen; 36964440f671SBarry Smith PetscScalar *v = a->a,*values = ((PetscScalar*)advalues)+1; 369708b6dcc0SBarry Smith ISColoringValue *color; 3698cc8ba8e1SBarry Smith 3699cc8ba8e1SBarry Smith PetscFunctionBegin; 3700e005ede5SBarry Smith if (!a->coloring) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Coloring not set for matrix"); 37014440f671SBarry Smith nlen = PetscADGetDerivTypeSize()/sizeof(PetscScalar); 3702cc8ba8e1SBarry Smith color = a->coloring->colors; 3703cc8ba8e1SBarry Smith /* loop over rows */ 3704cc8ba8e1SBarry Smith for (i=0; i<m; i++) { 3705cc8ba8e1SBarry Smith nz = ii[i+1] - ii[i]; 3706cc8ba8e1SBarry Smith /* loop over columns putting computed value into matrix */ 3707cc8ba8e1SBarry Smith for (j=0; j<nz; j++) { 3708cc8ba8e1SBarry Smith *v++ = values[color[*jj++]]; 3709cc8ba8e1SBarry Smith } 37104440f671SBarry Smith values += nlen; /* jump to next row of derivatives */ 3711ee4f033dSBarry Smith } 3712ee4f033dSBarry Smith PetscFunctionReturn(0); 3713ee4f033dSBarry Smith } 3714ee4f033dSBarry Smith #endif 3715ee4f033dSBarry Smith 3716ee4f033dSBarry Smith #undef __FUNCT__ 3717ee4f033dSBarry Smith #define __FUNCT__ "MatSetValuesAdifor_SeqAIJ" 371897f1f81fSBarry Smith PetscErrorCode MatSetValuesAdifor_SeqAIJ(Mat A,PetscInt nl,void *advalues) 3719ee4f033dSBarry Smith { 3720ee4f033dSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 3721d0f46423SBarry Smith PetscInt m = A->rmap->n,*ii = a->i,*jj = a->j,nz,i,j; 372254f21887SBarry Smith MatScalar *v = a->a; 372354f21887SBarry Smith PetscScalar *values = (PetscScalar *)advalues; 372408b6dcc0SBarry Smith ISColoringValue *color; 3725ee4f033dSBarry Smith 3726ee4f033dSBarry Smith PetscFunctionBegin; 3727e005ede5SBarry Smith if (!a->coloring) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Coloring not set for matrix"); 3728ee4f033dSBarry Smith color = a->coloring->colors; 3729ee4f033dSBarry Smith /* loop over rows */ 3730ee4f033dSBarry Smith for (i=0; i<m; i++) { 3731ee4f033dSBarry Smith nz = ii[i+1] - ii[i]; 3732ee4f033dSBarry Smith /* loop over columns putting computed value into matrix */ 3733ee4f033dSBarry Smith for (j=0; j<nz; j++) { 3734ee4f033dSBarry Smith *v++ = values[color[*jj++]]; 3735ee4f033dSBarry Smith } 3736ee4f033dSBarry Smith values += nl; /* jump to next row of derivatives */ 3737cc8ba8e1SBarry Smith } 3738cc8ba8e1SBarry Smith PetscFunctionReturn(0); 3739cc8ba8e1SBarry Smith } 374036db0b34SBarry Smith 374181824310SBarry Smith /* 374281824310SBarry Smith Special version for direct calls from Fortran 374381824310SBarry Smith */ 374481824310SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 374581824310SBarry Smith #define matsetvaluesseqaij_ MATSETVALUESSEQAIJ 374681824310SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 374781824310SBarry Smith #define matsetvaluesseqaij_ matsetvaluesseqaij 374881824310SBarry Smith #endif 374981824310SBarry Smith 375081824310SBarry Smith /* Change these macros so can be used in void function */ 375181824310SBarry Smith #undef CHKERRQ 37527adad957SLisandro Dalcin #define CHKERRQ(ierr) CHKERRABORT(((PetscObject)A)->comm,ierr) 375381824310SBarry Smith #undef SETERRQ2 37547adad957SLisandro Dalcin #define SETERRQ2(ierr,b,c,d) CHKERRABORT(((PetscObject)A)->comm,ierr) 375581824310SBarry Smith 375681824310SBarry Smith EXTERN_C_BEGIN 375781824310SBarry Smith #undef __FUNCT__ 375881824310SBarry Smith #define __FUNCT__ "matsetvaluesseqaij_" 37591f6cc5b2SSatish Balay void PETSC_STDCALL matsetvaluesseqaij_(Mat *AA,PetscInt *mm,const PetscInt im[],PetscInt *nn,const PetscInt in[],const PetscScalar v[],InsertMode *isis, PetscErrorCode *_ierr) 376081824310SBarry Smith { 376181824310SBarry Smith Mat A = *AA; 376281824310SBarry Smith PetscInt m = *mm, n = *nn; 376381824310SBarry Smith InsertMode is = *isis; 376481824310SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 376581824310SBarry Smith PetscInt *rp,k,low,high,t,ii,row,nrow,i,col,l,rmax,N; 376681824310SBarry Smith PetscInt *imax,*ai,*ailen; 376781824310SBarry Smith PetscErrorCode ierr; 376881824310SBarry Smith PetscInt *aj,nonew = a->nonew,lastcol = -1; 376954f21887SBarry Smith MatScalar *ap,value,*aa; 3770edb03aefSBarry Smith PetscTruth ignorezeroentries = a->ignorezeroentries; 377181824310SBarry Smith PetscTruth roworiented = a->roworiented; 377281824310SBarry Smith 377381824310SBarry Smith PetscFunctionBegin; 3774d9e2c085SLisandro Dalcin ierr = MatPreallocated(A);CHKERRQ(ierr); 377581824310SBarry Smith imax = a->imax; 377681824310SBarry Smith ai = a->i; 377781824310SBarry Smith ailen = a->ilen; 377881824310SBarry Smith aj = a->j; 377981824310SBarry Smith aa = a->a; 378081824310SBarry Smith 378181824310SBarry Smith for (k=0; k<m; k++) { /* loop over added rows */ 378281824310SBarry Smith row = im[k]; 378381824310SBarry Smith if (row < 0) continue; 378481824310SBarry Smith #if defined(PETSC_USE_DEBUG) 3785d0f46423SBarry Smith if (row >= A->rmap->n) SETERRABORT(((PetscObject)A)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Row too large"); 378681824310SBarry Smith #endif 378781824310SBarry Smith rp = aj + ai[row]; ap = aa + ai[row]; 378881824310SBarry Smith rmax = imax[row]; nrow = ailen[row]; 378981824310SBarry Smith low = 0; 379081824310SBarry Smith high = nrow; 379181824310SBarry Smith for (l=0; l<n; l++) { /* loop over added columns */ 379281824310SBarry Smith if (in[l] < 0) continue; 379381824310SBarry Smith #if defined(PETSC_USE_DEBUG) 3794d0f46423SBarry Smith if (in[l] >= A->cmap->n) SETERRABORT(((PetscObject)A)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Column too large"); 379581824310SBarry Smith #endif 379681824310SBarry Smith col = in[l]; 379781824310SBarry Smith if (roworiented) { 379881824310SBarry Smith value = v[l + k*n]; 379981824310SBarry Smith } else { 380081824310SBarry Smith value = v[k + l*m]; 380181824310SBarry Smith } 380281824310SBarry Smith if (value == 0.0 && ignorezeroentries && (is == ADD_VALUES)) continue; 380381824310SBarry Smith 380481824310SBarry Smith if (col <= lastcol) low = 0; else high = nrow; 380581824310SBarry Smith lastcol = col; 380681824310SBarry Smith while (high-low > 5) { 380781824310SBarry Smith t = (low+high)/2; 380881824310SBarry Smith if (rp[t] > col) high = t; 380981824310SBarry Smith else low = t; 381081824310SBarry Smith } 381181824310SBarry Smith for (i=low; i<high; i++) { 381281824310SBarry Smith if (rp[i] > col) break; 381381824310SBarry Smith if (rp[i] == col) { 381481824310SBarry Smith if (is == ADD_VALUES) ap[i] += value; 381581824310SBarry Smith else ap[i] = value; 381681824310SBarry Smith goto noinsert; 381781824310SBarry Smith } 381881824310SBarry Smith } 381981824310SBarry Smith if (value == 0.0 && ignorezeroentries) goto noinsert; 382081824310SBarry Smith if (nonew == 1) goto noinsert; 38217adad957SLisandro Dalcin if (nonew == -1) SETERRABORT(((PetscObject)A)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Inserting a new nonzero in the matrix"); 3822d0f46423SBarry Smith MatSeqXAIJReallocateAIJ(A,A->rmap->n,1,nrow,row,col,rmax,aa,ai,aj,rp,ap,imax,nonew,MatScalar); 382381824310SBarry Smith N = nrow++ - 1; a->nz++; high++; 382481824310SBarry Smith /* shift up all the later entries in this row */ 382581824310SBarry Smith for (ii=N; ii>=i; ii--) { 382681824310SBarry Smith rp[ii+1] = rp[ii]; 382781824310SBarry Smith ap[ii+1] = ap[ii]; 382881824310SBarry Smith } 382981824310SBarry Smith rp[i] = col; 383081824310SBarry Smith ap[i] = value; 383181824310SBarry Smith noinsert:; 383281824310SBarry Smith low = i + 1; 383381824310SBarry Smith } 383481824310SBarry Smith ailen[row] = nrow; 383581824310SBarry Smith } 383681824310SBarry Smith A->same_nonzero = PETSC_FALSE; 383781824310SBarry Smith PetscFunctionReturnVoid(); 383881824310SBarry Smith } 383981824310SBarry Smith EXTERN_C_END 3840