1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 10b2573a8aSBarry Smith 116a63e612SBarry Smith #undef __FUNCT__ 12b49cda9fSStefano Zampini #define __FUNCT__ "MatConvert_SeqAIJ_SeqDense" 13b49cda9fSStefano Zampini PETSC_EXTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 14b49cda9fSStefano Zampini { 15b49cda9fSStefano Zampini Mat B; 16b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 17b49cda9fSStefano Zampini Mat_SeqDense *b; 18b49cda9fSStefano Zampini PetscErrorCode ierr; 19b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 20b49cda9fSStefano Zampini MatScalar *av=a->a; 21b49cda9fSStefano Zampini 22b49cda9fSStefano Zampini PetscFunctionBegin; 23b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 24b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 25b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 26b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 27b49cda9fSStefano Zampini 28b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 29b49cda9fSStefano Zampini for (i=0; i<m; i++) { 30b49cda9fSStefano Zampini PetscInt j; 31b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 32b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 33b49cda9fSStefano Zampini aj++; 34b49cda9fSStefano Zampini av++; 35b49cda9fSStefano Zampini } 36b49cda9fSStefano Zampini ai++; 37b49cda9fSStefano Zampini } 38b49cda9fSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 39b49cda9fSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 40b49cda9fSStefano Zampini 41b49cda9fSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 42b49cda9fSStefano Zampini ierr = MatHeaderReplace(A,B);CHKERRQ(ierr); 43b49cda9fSStefano Zampini } else { 44b49cda9fSStefano Zampini *newmat = B; 45b49cda9fSStefano Zampini } 46b49cda9fSStefano Zampini PetscFunctionReturn(0); 47b49cda9fSStefano Zampini } 48b49cda9fSStefano Zampini 49b49cda9fSStefano Zampini #undef __FUNCT__ 506a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ" 518cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 526a63e612SBarry Smith { 536a63e612SBarry Smith Mat B; 546a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 556a63e612SBarry Smith PetscErrorCode ierr; 569399e1b8SMatthew G. Knepley PetscInt i, j; 579399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 589399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 596a63e612SBarry Smith 606a63e612SBarry Smith PetscFunctionBegin; 61ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 626a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 636a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 649399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 659399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 669399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 676a63e612SBarry Smith aa += a->lda; 686a63e612SBarry Smith } 699399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 709399e1b8SMatthew G. Knepley aa = a->v; 719399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 729399e1b8SMatthew G. Knepley PetscInt numRows = 0; 739399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 749399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 759399e1b8SMatthew G. Knepley aa += a->lda; 769399e1b8SMatthew G. Knepley } 779399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 786a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 796a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 806a63e612SBarry Smith 816a63e612SBarry Smith if (reuse == MAT_REUSE_MATRIX) { 826a63e612SBarry Smith ierr = MatHeaderReplace(A,B);CHKERRQ(ierr); 836a63e612SBarry Smith } else { 846a63e612SBarry Smith *newmat = B; 856a63e612SBarry Smith } 866a63e612SBarry Smith PetscFunctionReturn(0); 876a63e612SBarry Smith } 886a63e612SBarry Smith 894a2ae208SSatish Balay #undef __FUNCT__ 904a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 91f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 921987afe7SBarry Smith { 931987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 94f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 9513f74950SBarry Smith PetscInt j; 960805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 97efee365bSSatish Balay PetscErrorCode ierr; 983a40ed3dSBarry Smith 993a40ed3dSBarry Smith PetscFunctionBegin; 100c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 101c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 102c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 103c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 104a5ce6ee0Svictorle if (ldax>m || lday>m) { 105d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 1068b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one)); 107a5ce6ee0Svictorle } 108a5ce6ee0Svictorle } else { 1098b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one)); 110a5ce6ee0Svictorle } 111a3fa217bSJose E. Roman ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 1120450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 1133a40ed3dSBarry Smith PetscFunctionReturn(0); 1141987afe7SBarry Smith } 1151987afe7SBarry Smith 1164a2ae208SSatish Balay #undef __FUNCT__ 1174a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 118dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 119289bc588SBarry Smith { 120d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 1213a40ed3dSBarry Smith 1223a40ed3dSBarry Smith PetscFunctionBegin; 1234e220ebcSLois Curfman McInnes info->block_size = 1.0; 1244e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 1256de62eeeSBarry Smith info->nz_used = (double)N; 1266de62eeeSBarry Smith info->nz_unneeded = (double)0; 1274e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 1284e220ebcSLois Curfman McInnes info->mallocs = 0; 1297adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 1304e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 1314e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 1324e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 1333a40ed3dSBarry Smith PetscFunctionReturn(0); 134289bc588SBarry Smith } 135289bc588SBarry Smith 1364a2ae208SSatish Balay #undef __FUNCT__ 1374a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 138f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 13980cd9d93SLois Curfman McInnes { 140273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 141f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 142efee365bSSatish Balay PetscErrorCode ierr; 143c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 14480cd9d93SLois Curfman McInnes 1453a40ed3dSBarry Smith PetscFunctionBegin; 146c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 147d0f46423SBarry Smith if (lda>A->rmap->n) { 148c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 149d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1508b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one)); 151a5ce6ee0Svictorle } 152a5ce6ee0Svictorle } else { 153c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 1548b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one)); 155a5ce6ee0Svictorle } 156efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 1573a40ed3dSBarry Smith PetscFunctionReturn(0); 15880cd9d93SLois Curfman McInnes } 15980cd9d93SLois Curfman McInnes 1601cbb95d3SBarry Smith #undef __FUNCT__ 1611cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 162ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 1631cbb95d3SBarry Smith { 1641cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 165d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 1661cbb95d3SBarry Smith PetscScalar *v = a->v; 1671cbb95d3SBarry Smith 1681cbb95d3SBarry Smith PetscFunctionBegin; 1691cbb95d3SBarry Smith *fl = PETSC_FALSE; 170d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 1711cbb95d3SBarry Smith N = a->lda; 1721cbb95d3SBarry Smith 1731cbb95d3SBarry Smith for (i=0; i<m; i++) { 1741cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 1751cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 1761cbb95d3SBarry Smith } 1771cbb95d3SBarry Smith } 1781cbb95d3SBarry Smith *fl = PETSC_TRUE; 1791cbb95d3SBarry Smith PetscFunctionReturn(0); 1801cbb95d3SBarry Smith } 1811cbb95d3SBarry Smith 182b24902e0SBarry Smith #undef __FUNCT__ 183b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 184719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 185b24902e0SBarry Smith { 186b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 187b24902e0SBarry Smith PetscErrorCode ierr; 188b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 189b24902e0SBarry Smith 190b24902e0SBarry Smith PetscFunctionBegin; 191aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 192aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 1930298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 194b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 195b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 196d0f46423SBarry Smith if (lda>A->rmap->n) { 197d0f46423SBarry Smith m = A->rmap->n; 198d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 199b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 200b24902e0SBarry Smith } 201b24902e0SBarry Smith } else { 202d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 203b24902e0SBarry Smith } 204b24902e0SBarry Smith } 205b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 206b24902e0SBarry Smith PetscFunctionReturn(0); 207b24902e0SBarry Smith } 208b24902e0SBarry Smith 2094a2ae208SSatish Balay #undef __FUNCT__ 2104a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 211dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 21202cad45dSBarry Smith { 2136849ba73SBarry Smith PetscErrorCode ierr; 21402cad45dSBarry Smith 2153a40ed3dSBarry Smith PetscFunctionBegin; 216ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 217d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 2185c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 219719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 220b24902e0SBarry Smith PetscFunctionReturn(0); 221b24902e0SBarry Smith } 222b24902e0SBarry Smith 2236ee01492SSatish Balay 2240481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 225719d5645SBarry Smith 2264a2ae208SSatish Balay #undef __FUNCT__ 2274a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 2280481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 229289bc588SBarry Smith { 2304482741eSBarry Smith MatFactorInfo info; 231a093e273SMatthew Knepley PetscErrorCode ierr; 2323a40ed3dSBarry Smith 2333a40ed3dSBarry Smith PetscFunctionBegin; 234c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 235719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 2363a40ed3dSBarry Smith PetscFunctionReturn(0); 237289bc588SBarry Smith } 2386ee01492SSatish Balay 2390b4b3355SBarry Smith #undef __FUNCT__ 2404a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 241dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 242289bc588SBarry Smith { 243c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2446849ba73SBarry Smith PetscErrorCode ierr; 245f1ceaac6SMatthew G. Knepley const PetscScalar *x; 246f1ceaac6SMatthew G. Knepley PetscScalar *y; 247c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 24867e560aaSBarry Smith 2493a40ed3dSBarry Smith PetscFunctionBegin; 250c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 251f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 2521ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 253d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 254d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 255ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 256e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 257ae7cfcebSSatish Balay #else 2588b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 259e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 260ae7cfcebSSatish Balay #endif 261d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 262ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 263e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 264ae7cfcebSSatish Balay #else 2658b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 266e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 267ae7cfcebSSatish Balay #endif 2682205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 269f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 2701ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 271dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2723a40ed3dSBarry Smith PetscFunctionReturn(0); 273289bc588SBarry Smith } 2746ee01492SSatish Balay 2754a2ae208SSatish Balay #undef __FUNCT__ 27685e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 27785e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 27885e2c93fSHong Zhang { 27985e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 28085e2c93fSHong Zhang PetscErrorCode ierr; 28185e2c93fSHong Zhang PetscScalar *b,*x; 282efb80c78SLisandro Dalcin PetscInt n; 283783b601eSJed Brown PetscBLASInt nrhs,info,m; 284bda8bf91SBarry Smith PetscBool flg; 28585e2c93fSHong Zhang 28685e2c93fSHong Zhang PetscFunctionBegin; 287c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 2880298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 289ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 2900298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 291ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 292bda8bf91SBarry Smith 2930298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 294c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 2958c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 2968c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 29785e2c93fSHong Zhang 298f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 29985e2c93fSHong Zhang 30085e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 30185e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 30285e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 30385e2c93fSHong Zhang #else 3048b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 30585e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 30685e2c93fSHong Zhang #endif 30785e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 30885e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 30985e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 31085e2c93fSHong Zhang #else 3118b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 31285e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 31385e2c93fSHong Zhang #endif 3142205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 31585e2c93fSHong Zhang 3168c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 3178c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 31885e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 31985e2c93fSHong Zhang PetscFunctionReturn(0); 32085e2c93fSHong Zhang } 32185e2c93fSHong Zhang 32285e2c93fSHong Zhang #undef __FUNCT__ 3234a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 324dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 325da3a660dSBarry Smith { 326c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 327dfbe8321SBarry Smith PetscErrorCode ierr; 328f1ceaac6SMatthew G. Knepley const PetscScalar *x; 329f1ceaac6SMatthew G. Knepley PetscScalar *y; 330c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 33167e560aaSBarry Smith 3323a40ed3dSBarry Smith PetscFunctionBegin; 333c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 334f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 3351ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 336d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 337752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 338da3a660dSBarry Smith if (mat->pivots) { 339ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 340e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 341ae7cfcebSSatish Balay #else 3428b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 343e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 344ae7cfcebSSatish Balay #endif 3457a97a34bSBarry Smith } else { 346ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 347e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 348ae7cfcebSSatish Balay #else 3498b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 350e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 351ae7cfcebSSatish Balay #endif 352da3a660dSBarry Smith } 353f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 3541ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 355dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3563a40ed3dSBarry Smith PetscFunctionReturn(0); 357da3a660dSBarry Smith } 3586ee01492SSatish Balay 3594a2ae208SSatish Balay #undef __FUNCT__ 3604a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 361dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 362da3a660dSBarry Smith { 363c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 364dfbe8321SBarry Smith PetscErrorCode ierr; 365f1ceaac6SMatthew G. Knepley const PetscScalar *x; 366f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 367da3a660dSBarry Smith Vec tmp = 0; 368c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 36967e560aaSBarry Smith 3703a40ed3dSBarry Smith PetscFunctionBegin; 371c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 372f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 3731ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 374d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 375da3a660dSBarry Smith if (yy == zz) { 37678b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 3773bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 37878b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 379da3a660dSBarry Smith } 380d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 381752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 382da3a660dSBarry Smith if (mat->pivots) { 383ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 384e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 385ae7cfcebSSatish Balay #else 3868b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 387e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 388ae7cfcebSSatish Balay #endif 389a8c6a408SBarry Smith } else { 390ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 391e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 392ae7cfcebSSatish Balay #else 3938b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 394e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 395ae7cfcebSSatish Balay #endif 396da3a660dSBarry Smith } 3976bf464f9SBarry Smith if (tmp) { 3986bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 3996bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4006bf464f9SBarry Smith } else { 4016bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 4026bf464f9SBarry Smith } 403f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4041ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 405dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4063a40ed3dSBarry Smith PetscFunctionReturn(0); 407da3a660dSBarry Smith } 40867e560aaSBarry Smith 4094a2ae208SSatish Balay #undef __FUNCT__ 4104a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 411dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 412da3a660dSBarry Smith { 413c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4146849ba73SBarry Smith PetscErrorCode ierr; 415f1ceaac6SMatthew G. Knepley const PetscScalar *x; 416f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 417da3a660dSBarry Smith Vec tmp; 418c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 41967e560aaSBarry Smith 4203a40ed3dSBarry Smith PetscFunctionBegin; 421c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 422d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 423f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4241ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 425da3a660dSBarry Smith if (yy == zz) { 42678b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 4273bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 42878b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 429da3a660dSBarry Smith } 430d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 431752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 432da3a660dSBarry Smith if (mat->pivots) { 433ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 434e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 435ae7cfcebSSatish Balay #else 4368b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 437e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 438ae7cfcebSSatish Balay #endif 4393a40ed3dSBarry Smith } else { 440ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 441e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 442ae7cfcebSSatish Balay #else 4438b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 444e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 445ae7cfcebSSatish Balay #endif 446da3a660dSBarry Smith } 44790f02eecSBarry Smith if (tmp) { 4482dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4496bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4503a40ed3dSBarry Smith } else { 4512dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 45290f02eecSBarry Smith } 453f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4541ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 455dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4563a40ed3dSBarry Smith PetscFunctionReturn(0); 457da3a660dSBarry Smith } 458db4efbfdSBarry Smith 459db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 460db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 461db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 462db4efbfdSBarry Smith #undef __FUNCT__ 463db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 4640481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 465db4efbfdSBarry Smith { 466db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 467db4efbfdSBarry Smith PetscFunctionBegin; 468e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 469db4efbfdSBarry Smith #else 470db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 471db4efbfdSBarry Smith PetscErrorCode ierr; 472db4efbfdSBarry Smith PetscBLASInt n,m,info; 473db4efbfdSBarry Smith 474db4efbfdSBarry Smith PetscFunctionBegin; 475c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 476c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 477db4efbfdSBarry Smith if (!mat->pivots) { 478854ce69bSBarry Smith ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr); 4793bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 480db4efbfdSBarry Smith } 481db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 4828e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4838b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 4848e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 4858e57ea43SSatish Balay 486e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 487e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 488db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 489db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 490db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 491db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 492d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 493db4efbfdSBarry Smith 494dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 495db4efbfdSBarry Smith #endif 496db4efbfdSBarry Smith PetscFunctionReturn(0); 497db4efbfdSBarry Smith } 498db4efbfdSBarry Smith 499db4efbfdSBarry Smith #undef __FUNCT__ 500db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 5010481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 502db4efbfdSBarry Smith { 503db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 504db4efbfdSBarry Smith PetscFunctionBegin; 505e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 506db4efbfdSBarry Smith #else 507db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 508db4efbfdSBarry Smith PetscErrorCode ierr; 509c5df96a5SBarry Smith PetscBLASInt info,n; 510db4efbfdSBarry Smith 511db4efbfdSBarry Smith PetscFunctionBegin; 512c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 513db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 514db4efbfdSBarry Smith 515db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5168b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 517e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 518db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 519db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 520db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 521db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 522d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 5232205254eSKarl Rupp 524eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 525db4efbfdSBarry Smith #endif 526db4efbfdSBarry Smith PetscFunctionReturn(0); 527db4efbfdSBarry Smith } 528db4efbfdSBarry Smith 529db4efbfdSBarry Smith 530db4efbfdSBarry Smith #undef __FUNCT__ 531db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 5320481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 533db4efbfdSBarry Smith { 534db4efbfdSBarry Smith PetscErrorCode ierr; 535db4efbfdSBarry Smith MatFactorInfo info; 536db4efbfdSBarry Smith 537db4efbfdSBarry Smith PetscFunctionBegin; 538db4efbfdSBarry Smith info.fill = 1.0; 5392205254eSKarl Rupp 540c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 541719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 542db4efbfdSBarry Smith PetscFunctionReturn(0); 543db4efbfdSBarry Smith } 544db4efbfdSBarry Smith 545db4efbfdSBarry Smith #undef __FUNCT__ 546db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 5470481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 548db4efbfdSBarry Smith { 549db4efbfdSBarry Smith PetscFunctionBegin; 550c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 5511bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 552719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 553db4efbfdSBarry Smith PetscFunctionReturn(0); 554db4efbfdSBarry Smith } 555db4efbfdSBarry Smith 556db4efbfdSBarry Smith #undef __FUNCT__ 557db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 5580481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 559db4efbfdSBarry Smith { 560db4efbfdSBarry Smith PetscFunctionBegin; 561b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 562c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 563719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 564db4efbfdSBarry Smith PetscFunctionReturn(0); 565db4efbfdSBarry Smith } 566db4efbfdSBarry Smith 567db4efbfdSBarry Smith #undef __FUNCT__ 568db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 5698cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 570db4efbfdSBarry Smith { 571db4efbfdSBarry Smith PetscErrorCode ierr; 572db4efbfdSBarry Smith 573db4efbfdSBarry Smith PetscFunctionBegin; 574ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 575db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 576db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 577db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 578db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 579db4efbfdSBarry Smith } else { 580db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 581db4efbfdSBarry Smith } 582d5f3da31SBarry Smith (*fact)->factortype = ftype; 583db4efbfdSBarry Smith PetscFunctionReturn(0); 584db4efbfdSBarry Smith } 585db4efbfdSBarry Smith 586289bc588SBarry Smith /* ------------------------------------------------------------------*/ 5874a2ae208SSatish Balay #undef __FUNCT__ 58841f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 58941f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 590289bc588SBarry Smith { 591c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 592d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 593d9ca1df4SBarry Smith const PetscScalar *b; 594dfbe8321SBarry Smith PetscErrorCode ierr; 595d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 596c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 597289bc588SBarry Smith 5983a40ed3dSBarry Smith PetscFunctionBegin; 599c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 600289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 60171044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 6022dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 603289bc588SBarry Smith } 6041ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 605d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 606b965ef7fSBarry Smith its = its*lits; 607e32f2f54SBarry Smith if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 608289bc588SBarry Smith while (its--) { 609fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 610289bc588SBarry Smith for (i=0; i<m; i++) { 6118b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 61255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 613289bc588SBarry Smith } 614289bc588SBarry Smith } 615fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 616289bc588SBarry Smith for (i=m-1; i>=0; i--) { 6178b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 61855a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 619289bc588SBarry Smith } 620289bc588SBarry Smith } 621289bc588SBarry Smith } 622d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 6231ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6243a40ed3dSBarry Smith PetscFunctionReturn(0); 625289bc588SBarry Smith } 626289bc588SBarry Smith 627289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6284a2ae208SSatish Balay #undef __FUNCT__ 6294a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 630dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 631289bc588SBarry Smith { 632c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 633d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 634d9ca1df4SBarry Smith PetscScalar *y; 635dfbe8321SBarry Smith PetscErrorCode ierr; 6360805154bSBarry Smith PetscBLASInt m, n,_One=1; 637ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 6383a40ed3dSBarry Smith 6393a40ed3dSBarry Smith PetscFunctionBegin; 640c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 641c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 642d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 643d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6441ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6458b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 646d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6471ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 648dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 6493a40ed3dSBarry Smith PetscFunctionReturn(0); 650289bc588SBarry Smith } 651800995b7SMatthew Knepley 6524a2ae208SSatish Balay #undef __FUNCT__ 6534a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 654dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 655289bc588SBarry Smith { 656c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 657d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 658dfbe8321SBarry Smith PetscErrorCode ierr; 6590805154bSBarry Smith PetscBLASInt m, n, _One=1; 660d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 6613a40ed3dSBarry Smith 6623a40ed3dSBarry Smith PetscFunctionBegin; 663c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 664c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 665d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 666d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6671ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6688b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 669d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6701ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 671dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 6723a40ed3dSBarry Smith PetscFunctionReturn(0); 673289bc588SBarry Smith } 6746ee01492SSatish Balay 6754a2ae208SSatish Balay #undef __FUNCT__ 6764a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 677dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 678289bc588SBarry Smith { 679c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 680d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 681d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 682dfbe8321SBarry Smith PetscErrorCode ierr; 6830805154bSBarry Smith PetscBLASInt m, n, _One=1; 6843a40ed3dSBarry Smith 6853a40ed3dSBarry Smith PetscFunctionBegin; 686c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 687c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 688d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 689600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 690d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6911ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6928b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 693d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6941ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 695dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6963a40ed3dSBarry Smith PetscFunctionReturn(0); 697289bc588SBarry Smith } 6986ee01492SSatish Balay 6994a2ae208SSatish Balay #undef __FUNCT__ 7004a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 701dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 702289bc588SBarry Smith { 703c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 704d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 705d9ca1df4SBarry Smith PetscScalar *y; 706dfbe8321SBarry Smith PetscErrorCode ierr; 7070805154bSBarry Smith PetscBLASInt m, n, _One=1; 70887828ca2SBarry Smith PetscScalar _DOne=1.0; 7093a40ed3dSBarry Smith 7103a40ed3dSBarry Smith PetscFunctionBegin; 711c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 712c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 713d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 714600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 715d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7161ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7178b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 718d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7191ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 720dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 7213a40ed3dSBarry Smith PetscFunctionReturn(0); 722289bc588SBarry Smith } 723289bc588SBarry Smith 724289bc588SBarry Smith /* -----------------------------------------------------------------*/ 7254a2ae208SSatish Balay #undef __FUNCT__ 7264a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 72713f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 728289bc588SBarry Smith { 729c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 73087828ca2SBarry Smith PetscScalar *v; 7316849ba73SBarry Smith PetscErrorCode ierr; 73213f74950SBarry Smith PetscInt i; 73367e560aaSBarry Smith 7343a40ed3dSBarry Smith PetscFunctionBegin; 735d0f46423SBarry Smith *ncols = A->cmap->n; 736289bc588SBarry Smith if (cols) { 737854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 738d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 739289bc588SBarry Smith } 740289bc588SBarry Smith if (vals) { 741854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 742289bc588SBarry Smith v = mat->v + row; 743d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 744289bc588SBarry Smith } 7453a40ed3dSBarry Smith PetscFunctionReturn(0); 746289bc588SBarry Smith } 7476ee01492SSatish Balay 7484a2ae208SSatish Balay #undef __FUNCT__ 7494a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 75013f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 751289bc588SBarry Smith { 752dfbe8321SBarry Smith PetscErrorCode ierr; 7536e111a19SKarl Rupp 754606d414cSSatish Balay PetscFunctionBegin; 755606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 756606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 7573a40ed3dSBarry Smith PetscFunctionReturn(0); 758289bc588SBarry Smith } 759289bc588SBarry Smith /* ----------------------------------------------------------------*/ 7604a2ae208SSatish Balay #undef __FUNCT__ 7614a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 76213f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 763289bc588SBarry Smith { 764c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 76513f74950SBarry Smith PetscInt i,j,idx=0; 766d6dfbf8fSBarry Smith 7673a40ed3dSBarry Smith PetscFunctionBegin; 768289bc588SBarry Smith if (!mat->roworiented) { 769dbb450caSBarry Smith if (addv == INSERT_VALUES) { 770289bc588SBarry Smith for (j=0; j<n; j++) { 771cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7722515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 773e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 77458804f6dSBarry Smith #endif 775289bc588SBarry Smith for (i=0; i<m; i++) { 776cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7772515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 778e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 77958804f6dSBarry Smith #endif 780cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 781289bc588SBarry Smith } 782289bc588SBarry Smith } 7833a40ed3dSBarry Smith } else { 784289bc588SBarry Smith for (j=0; j<n; j++) { 785cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7862515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 787e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 78858804f6dSBarry Smith #endif 789289bc588SBarry Smith for (i=0; i<m; i++) { 790cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7912515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 792e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 79358804f6dSBarry Smith #endif 794cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 795289bc588SBarry Smith } 796289bc588SBarry Smith } 797289bc588SBarry Smith } 7983a40ed3dSBarry Smith } else { 799dbb450caSBarry Smith if (addv == INSERT_VALUES) { 800e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 801cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 8022515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 803e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 80458804f6dSBarry Smith #endif 805e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 806cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 8072515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 808e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 80958804f6dSBarry Smith #endif 810cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 811e8d4e0b9SBarry Smith } 812e8d4e0b9SBarry Smith } 8133a40ed3dSBarry Smith } else { 814289bc588SBarry Smith for (i=0; i<m; i++) { 815cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 8162515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 817e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 81858804f6dSBarry Smith #endif 819289bc588SBarry Smith for (j=0; j<n; j++) { 820cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 8212515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 822e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 82358804f6dSBarry Smith #endif 824cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 825289bc588SBarry Smith } 826289bc588SBarry Smith } 827289bc588SBarry Smith } 828e8d4e0b9SBarry Smith } 8293a40ed3dSBarry Smith PetscFunctionReturn(0); 830289bc588SBarry Smith } 831e8d4e0b9SBarry Smith 8324a2ae208SSatish Balay #undef __FUNCT__ 8334a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 83413f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 835ae80bb75SLois Curfman McInnes { 836ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 83713f74950SBarry Smith PetscInt i,j; 838ae80bb75SLois Curfman McInnes 8393a40ed3dSBarry Smith PetscFunctionBegin; 840ae80bb75SLois Curfman McInnes /* row-oriented output */ 841ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 84297e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 843e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n); 844ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 8456f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 846e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n); 84797e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 848ae80bb75SLois Curfman McInnes } 849ae80bb75SLois Curfman McInnes } 8503a40ed3dSBarry Smith PetscFunctionReturn(0); 851ae80bb75SLois Curfman McInnes } 852ae80bb75SLois Curfman McInnes 853289bc588SBarry Smith /* -----------------------------------------------------------------*/ 854289bc588SBarry Smith 8554a2ae208SSatish Balay #undef __FUNCT__ 8565bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 857112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 858aabbc4fbSShri Abhyankar { 859aabbc4fbSShri Abhyankar Mat_SeqDense *a; 860aabbc4fbSShri Abhyankar PetscErrorCode ierr; 861aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 862aabbc4fbSShri Abhyankar int fd; 863aabbc4fbSShri Abhyankar PetscMPIInt size; 864aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 865aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 866ce94432eSBarry Smith MPI_Comm comm; 867aabbc4fbSShri Abhyankar 868aabbc4fbSShri Abhyankar PetscFunctionBegin; 869c98fd787SBarry Smith /* force binary viewer to load .info file if it has not yet done so */ 870c98fd787SBarry Smith ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 871ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 872aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 873aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 874aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 875aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 876aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 877aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 878aabbc4fbSShri Abhyankar 879aabbc4fbSShri Abhyankar /* set global size if not set already*/ 880aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 881aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 882aabbc4fbSShri Abhyankar } else { 883aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 884aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 885aabbc4fbSShri Abhyankar if (M != grows || N != gcols) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different length (%d, %d) than the input matrix (%d, %d)",M,N,grows,gcols); 886aabbc4fbSShri Abhyankar } 887e6324fbbSBarry Smith a = (Mat_SeqDense*)newmat->data; 888e6324fbbSBarry Smith if (!a->user_alloc) { 8890298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 890e6324fbbSBarry Smith } 891aabbc4fbSShri Abhyankar 892aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 893aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 894aabbc4fbSShri Abhyankar v = a->v; 895aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 896aabbc4fbSShri Abhyankar from row major to column major */ 897854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 898aabbc4fbSShri Abhyankar /* read in nonzero values */ 899aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 900aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 901aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 902aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 903aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 904aabbc4fbSShri Abhyankar } 905aabbc4fbSShri Abhyankar } 906aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 907aabbc4fbSShri Abhyankar } else { 908aabbc4fbSShri Abhyankar /* read row lengths */ 909854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 910aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 911aabbc4fbSShri Abhyankar 912aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 913aabbc4fbSShri Abhyankar v = a->v; 914aabbc4fbSShri Abhyankar 915aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 916854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 917aabbc4fbSShri Abhyankar cols = scols; 918aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 919854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 920aabbc4fbSShri Abhyankar vals = svals; 921aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 922aabbc4fbSShri Abhyankar 923aabbc4fbSShri Abhyankar /* insert into matrix */ 924aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 925aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 926aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 927aabbc4fbSShri Abhyankar } 928aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 929aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 930aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 931aabbc4fbSShri Abhyankar } 932aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 933aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 934aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 935aabbc4fbSShri Abhyankar } 936aabbc4fbSShri Abhyankar 937aabbc4fbSShri Abhyankar #undef __FUNCT__ 9384a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 9396849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 940289bc588SBarry Smith { 941932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 942dfbe8321SBarry Smith PetscErrorCode ierr; 94313f74950SBarry Smith PetscInt i,j; 9442dcb1b2aSMatthew Knepley const char *name; 94587828ca2SBarry Smith PetscScalar *v; 946f3ef73ceSBarry Smith PetscViewerFormat format; 9475f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 948ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 9495f481a85SSatish Balay #endif 950932b0c3eSLois Curfman McInnes 9513a40ed3dSBarry Smith PetscFunctionBegin; 952b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 953456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 9543a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 955fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 956d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 957d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 95844cd7ae7SLois Curfman McInnes v = a->v + i; 95977431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 960d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 961aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 962329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 96357622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 964329f5518SBarry Smith } else if (PetscRealPart(*v)) { 96557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 9666831982aSBarry Smith } 96780cd9d93SLois Curfman McInnes #else 9686831982aSBarry Smith if (*v) { 96957622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 9706831982aSBarry Smith } 97180cd9d93SLois Curfman McInnes #endif 9721b807ce4Svictorle v += a->lda; 97380cd9d93SLois Curfman McInnes } 974b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 97580cd9d93SLois Curfman McInnes } 976d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 9773a40ed3dSBarry Smith } else { 978d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 979aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 98047989497SBarry Smith /* determine if matrix has all real values */ 98147989497SBarry Smith v = a->v; 982d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 983ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 98447989497SBarry Smith } 98547989497SBarry Smith #endif 986fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 9873a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 988d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 989d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 990fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 991ffac6cdbSBarry Smith } 992ffac6cdbSBarry Smith 993d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 994932b0c3eSLois Curfman McInnes v = a->v + i; 995d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 996aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 99747989497SBarry Smith if (allreal) { 998c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 99947989497SBarry Smith } else { 1000c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 100147989497SBarry Smith } 1002289bc588SBarry Smith #else 1003c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1004289bc588SBarry Smith #endif 10051b807ce4Svictorle v += a->lda; 1006289bc588SBarry Smith } 1007b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1008289bc588SBarry Smith } 1009fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1010b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1011ffac6cdbSBarry Smith } 1012d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1013da3a660dSBarry Smith } 1014b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 10153a40ed3dSBarry Smith PetscFunctionReturn(0); 1016289bc588SBarry Smith } 1017289bc588SBarry Smith 10184a2ae208SSatish Balay #undef __FUNCT__ 10194a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 10206849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 1021932b0c3eSLois Curfman McInnes { 1022932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10236849ba73SBarry Smith PetscErrorCode ierr; 102413f74950SBarry Smith int fd; 1025d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 1026f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 1027f4403165SShri Abhyankar PetscViewerFormat format; 1028932b0c3eSLois Curfman McInnes 10293a40ed3dSBarry Smith PetscFunctionBegin; 1030b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 103190ace30eSBarry Smith 1032f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1033f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 1034f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 1035785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 10362205254eSKarl Rupp 1037f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 1038f4403165SShri Abhyankar col_lens[1] = m; 1039f4403165SShri Abhyankar col_lens[2] = n; 1040f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 10412205254eSKarl Rupp 1042f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1043f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1044f4403165SShri Abhyankar 1045f4403165SShri Abhyankar /* write out matrix, by rows */ 1046854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1047f4403165SShri Abhyankar v = a->v; 1048f4403165SShri Abhyankar for (j=0; j<n; j++) { 1049f4403165SShri Abhyankar for (i=0; i<m; i++) { 1050f4403165SShri Abhyankar vals[j + i*n] = *v++; 1051f4403165SShri Abhyankar } 1052f4403165SShri Abhyankar } 1053f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1054f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1055f4403165SShri Abhyankar } else { 1056854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 10572205254eSKarl Rupp 10580700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1059932b0c3eSLois Curfman McInnes col_lens[1] = m; 1060932b0c3eSLois Curfman McInnes col_lens[2] = n; 1061932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1062932b0c3eSLois Curfman McInnes 1063932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1064932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 10656f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1066932b0c3eSLois Curfman McInnes 1067932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1068932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1069932b0c3eSLois Curfman McInnes ict = 0; 1070932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1071932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1072932b0c3eSLois Curfman McInnes } 10736f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1074606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1075932b0c3eSLois Curfman McInnes 1076932b0c3eSLois Curfman McInnes /* store nonzero values */ 1077854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1078932b0c3eSLois Curfman McInnes ict = 0; 1079932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1080932b0c3eSLois Curfman McInnes v = a->v + i; 1081932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 10821b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1083932b0c3eSLois Curfman McInnes } 1084932b0c3eSLois Curfman McInnes } 10856f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1086606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1087f4403165SShri Abhyankar } 10883a40ed3dSBarry Smith PetscFunctionReturn(0); 1089932b0c3eSLois Curfman McInnes } 1090932b0c3eSLois Curfman McInnes 10919804daf3SBarry Smith #include <petscdraw.h> 10924a2ae208SSatish Balay #undef __FUNCT__ 10934a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 1094dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1095f1af5d2fSBarry Smith { 1096f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1097f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10986849ba73SBarry Smith PetscErrorCode ierr; 1099d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 110087828ca2SBarry Smith PetscScalar *v = a->v; 1101b0a32e0cSBarry Smith PetscViewer viewer; 1102b0a32e0cSBarry Smith PetscDraw popup; 1103329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 1104f3ef73ceSBarry Smith PetscViewerFormat format; 1105f1af5d2fSBarry Smith 1106f1af5d2fSBarry Smith PetscFunctionBegin; 1107f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1108b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1109b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1110f1af5d2fSBarry Smith 1111f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1112fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1113f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1114b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1115f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1116f1af5d2fSBarry Smith x_l = j; 1117f1af5d2fSBarry Smith x_r = x_l + 1.0; 1118f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1119f1af5d2fSBarry Smith y_l = m - i - 1.0; 1120f1af5d2fSBarry Smith y_r = y_l + 1.0; 1121329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1122b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1123329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1124b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1125f1af5d2fSBarry Smith } else { 1126f1af5d2fSBarry Smith continue; 1127f1af5d2fSBarry Smith } 1128b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1129f1af5d2fSBarry Smith } 1130f1af5d2fSBarry Smith } 1131f1af5d2fSBarry Smith } else { 1132f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1133f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1134f1af5d2fSBarry Smith for (i = 0; i < m*n; i++) { 1135f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1136f1af5d2fSBarry Smith } 1137b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 1138b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1139b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 1140f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1141f1af5d2fSBarry Smith x_l = j; 1142f1af5d2fSBarry Smith x_r = x_l + 1.0; 1143f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1144f1af5d2fSBarry Smith y_l = m - i - 1.0; 1145f1af5d2fSBarry Smith y_r = y_l + 1.0; 1146b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 1147b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1148f1af5d2fSBarry Smith } 1149f1af5d2fSBarry Smith } 1150f1af5d2fSBarry Smith } 1151f1af5d2fSBarry Smith PetscFunctionReturn(0); 1152f1af5d2fSBarry Smith } 1153f1af5d2fSBarry Smith 11544a2ae208SSatish Balay #undef __FUNCT__ 11554a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1156dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1157f1af5d2fSBarry Smith { 1158b0a32e0cSBarry Smith PetscDraw draw; 1159ace3abfcSBarry Smith PetscBool isnull; 1160329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1161dfbe8321SBarry Smith PetscErrorCode ierr; 1162f1af5d2fSBarry Smith 1163f1af5d2fSBarry Smith PetscFunctionBegin; 1164b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1165b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1166abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1167f1af5d2fSBarry Smith 1168f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1169d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1170f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1171b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1172b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 11730298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1174f1af5d2fSBarry Smith PetscFunctionReturn(0); 1175f1af5d2fSBarry Smith } 1176f1af5d2fSBarry Smith 11774a2ae208SSatish Balay #undef __FUNCT__ 11784a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1179dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1180932b0c3eSLois Curfman McInnes { 1181dfbe8321SBarry Smith PetscErrorCode ierr; 1182ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1183932b0c3eSLois Curfman McInnes 11843a40ed3dSBarry Smith PetscFunctionBegin; 1185251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1186251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1187251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 11880f5bd95cSBarry Smith 1189c45a1595SBarry Smith if (iascii) { 1190c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 11910f5bd95cSBarry Smith } else if (isbinary) { 11923a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1193f1af5d2fSBarry Smith } else if (isdraw) { 1194f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1195932b0c3eSLois Curfman McInnes } 11963a40ed3dSBarry Smith PetscFunctionReturn(0); 1197932b0c3eSLois Curfman McInnes } 1198289bc588SBarry Smith 11994a2ae208SSatish Balay #undef __FUNCT__ 12004a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1201dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1202289bc588SBarry Smith { 1203ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1204dfbe8321SBarry Smith PetscErrorCode ierr; 120590f02eecSBarry Smith 12063a40ed3dSBarry Smith PetscFunctionBegin; 1207aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1208d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1209a5a9c739SBarry Smith #endif 121005b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 12116857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1212bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1213dbd8c25aSHong Zhang 1214dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1215bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1216bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 12178baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 12188baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 12198baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 12208baccfbdSHong Zhang #endif 1221bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1222bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1223bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1224bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12253bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12263bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12273bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12283a40ed3dSBarry Smith PetscFunctionReturn(0); 1229289bc588SBarry Smith } 1230289bc588SBarry Smith 12314a2ae208SSatish Balay #undef __FUNCT__ 12324a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1233fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1234289bc588SBarry Smith { 1235c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 12366849ba73SBarry Smith PetscErrorCode ierr; 123713f74950SBarry Smith PetscInt k,j,m,n,M; 123887828ca2SBarry Smith PetscScalar *v,tmp; 123948b35521SBarry Smith 12403a40ed3dSBarry Smith PetscFunctionBegin; 1241d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1242e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1243e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1244e7e72b3dSBarry Smith else { 1245d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1246289bc588SBarry Smith for (k=0; k<j; k++) { 12471b807ce4Svictorle tmp = v[j + k*M]; 12481b807ce4Svictorle v[j + k*M] = v[k + j*M]; 12491b807ce4Svictorle v[k + j*M] = tmp; 1250289bc588SBarry Smith } 1251289bc588SBarry Smith } 1252d64ed03dSBarry Smith } 12533a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1254d3e5ee88SLois Curfman McInnes Mat tmat; 1255ec8511deSBarry Smith Mat_SeqDense *tmatd; 125687828ca2SBarry Smith PetscScalar *v2; 1257*af36a384SStefano Zampini PetscInt M2; 1258ea709b57SSatish Balay 1259fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1260ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1261d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 12627adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 12630298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1264fc4dec0aSBarry Smith } else { 1265fc4dec0aSBarry Smith tmat = *matout; 1266fc4dec0aSBarry Smith } 1267ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1268*af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1269d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1270*af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1271d3e5ee88SLois Curfman McInnes } 12726d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 12736d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1274d3e5ee88SLois Curfman McInnes *matout = tmat; 127548b35521SBarry Smith } 12763a40ed3dSBarry Smith PetscFunctionReturn(0); 1277289bc588SBarry Smith } 1278289bc588SBarry Smith 12794a2ae208SSatish Balay #undef __FUNCT__ 12804a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1281ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1282289bc588SBarry Smith { 1283c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1284c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 128513f74950SBarry Smith PetscInt i,j; 1286a2ea699eSBarry Smith PetscScalar *v1,*v2; 12879ea5d5aeSSatish Balay 12883a40ed3dSBarry Smith PetscFunctionBegin; 1289d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1290d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1291d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 12921b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1293d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 12943a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 12951b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 12961b807ce4Svictorle } 1297289bc588SBarry Smith } 129877c4ece6SBarry Smith *flg = PETSC_TRUE; 12993a40ed3dSBarry Smith PetscFunctionReturn(0); 1300289bc588SBarry Smith } 1301289bc588SBarry Smith 13024a2ae208SSatish Balay #undef __FUNCT__ 13034a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1304dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1305289bc588SBarry Smith { 1306c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1307dfbe8321SBarry Smith PetscErrorCode ierr; 130813f74950SBarry Smith PetscInt i,n,len; 130987828ca2SBarry Smith PetscScalar *x,zero = 0.0; 131044cd7ae7SLois Curfman McInnes 13113a40ed3dSBarry Smith PetscFunctionBegin; 13122dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 13137a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 13141ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1315d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1316e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 131744cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 13181b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1319289bc588SBarry Smith } 13201ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 13213a40ed3dSBarry Smith PetscFunctionReturn(0); 1322289bc588SBarry Smith } 1323289bc588SBarry Smith 13244a2ae208SSatish Balay #undef __FUNCT__ 13254a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1326dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1327289bc588SBarry Smith { 1328c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1329f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1330f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1331dfbe8321SBarry Smith PetscErrorCode ierr; 1332d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 133355659b69SBarry Smith 13343a40ed3dSBarry Smith PetscFunctionBegin; 133528988994SBarry Smith if (ll) { 13367a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1337f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1338e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1339da3a660dSBarry Smith for (i=0; i<m; i++) { 1340da3a660dSBarry Smith x = l[i]; 1341da3a660dSBarry Smith v = mat->v + i; 1342da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1343da3a660dSBarry Smith } 1344f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1345eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1346da3a660dSBarry Smith } 134728988994SBarry Smith if (rr) { 13487a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1349f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1350e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1351da3a660dSBarry Smith for (i=0; i<n; i++) { 1352da3a660dSBarry Smith x = r[i]; 1353da3a660dSBarry Smith v = mat->v + i*m; 13542205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1355da3a660dSBarry Smith } 1356f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1357eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1358da3a660dSBarry Smith } 13593a40ed3dSBarry Smith PetscFunctionReturn(0); 1360289bc588SBarry Smith } 1361289bc588SBarry Smith 13624a2ae208SSatish Balay #undef __FUNCT__ 13634a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1364dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1365289bc588SBarry Smith { 1366c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 136787828ca2SBarry Smith PetscScalar *v = mat->v; 1368329f5518SBarry Smith PetscReal sum = 0.0; 1369d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1370efee365bSSatish Balay PetscErrorCode ierr; 137155659b69SBarry Smith 13723a40ed3dSBarry Smith PetscFunctionBegin; 1373289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1374a5ce6ee0Svictorle if (lda>m) { 1375d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1376a5ce6ee0Svictorle v = mat->v+j*lda; 1377a5ce6ee0Svictorle for (i=0; i<m; i++) { 1378a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1379a5ce6ee0Svictorle } 1380a5ce6ee0Svictorle } 1381a5ce6ee0Svictorle } else { 1382d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1383329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1384289bc588SBarry Smith } 1385a5ce6ee0Svictorle } 13868f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1387dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13883a40ed3dSBarry Smith } else if (type == NORM_1) { 1389064f8208SBarry Smith *nrm = 0.0; 1390d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 13911b807ce4Svictorle v = mat->v + j*mat->lda; 1392289bc588SBarry Smith sum = 0.0; 1393d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 139433a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1395289bc588SBarry Smith } 1396064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1397289bc588SBarry Smith } 1398eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13993a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1400064f8208SBarry Smith *nrm = 0.0; 1401d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1402289bc588SBarry Smith v = mat->v + j; 1403289bc588SBarry Smith sum = 0.0; 1404d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 14051b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1406289bc588SBarry Smith } 1407064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1408289bc588SBarry Smith } 1409eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1410e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 14113a40ed3dSBarry Smith PetscFunctionReturn(0); 1412289bc588SBarry Smith } 1413289bc588SBarry Smith 14144a2ae208SSatish Balay #undef __FUNCT__ 14154a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1416ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1417289bc588SBarry Smith { 1418c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 141963ba0a88SBarry Smith PetscErrorCode ierr; 142067e560aaSBarry Smith 14213a40ed3dSBarry Smith PetscFunctionBegin; 1422b5a2b587SKris Buschelman switch (op) { 1423b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 14244e0d8c25SBarry Smith aij->roworiented = flg; 1425b5a2b587SKris Buschelman break; 1426512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1427b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 14283971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 14294e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 143013fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1431b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1432b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 14335021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 14345021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 14355021d80fSJed Brown break; 14365021d80fSJed Brown case MAT_SPD: 143777e54ba9SKris Buschelman case MAT_SYMMETRIC: 143877e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 14399a4540c5SBarry Smith case MAT_HERMITIAN: 14409a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 14415021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 144277e54ba9SKris Buschelman break; 1443b5a2b587SKris Buschelman default: 1444e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 14453a40ed3dSBarry Smith } 14463a40ed3dSBarry Smith PetscFunctionReturn(0); 1447289bc588SBarry Smith } 1448289bc588SBarry Smith 14494a2ae208SSatish Balay #undef __FUNCT__ 14504a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1451dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 14526f0a148fSBarry Smith { 1453ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 14546849ba73SBarry Smith PetscErrorCode ierr; 1455d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 14563a40ed3dSBarry Smith 14573a40ed3dSBarry Smith PetscFunctionBegin; 1458a5ce6ee0Svictorle if (lda>m) { 1459d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1460a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1461a5ce6ee0Svictorle } 1462a5ce6ee0Svictorle } else { 1463d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1464a5ce6ee0Svictorle } 14653a40ed3dSBarry Smith PetscFunctionReturn(0); 14666f0a148fSBarry Smith } 14676f0a148fSBarry Smith 14684a2ae208SSatish Balay #undef __FUNCT__ 14694a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 14702b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 14716f0a148fSBarry Smith { 147297b48c8fSBarry Smith PetscErrorCode ierr; 1473ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1474b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 147597b48c8fSBarry Smith PetscScalar *slot,*bb; 147697b48c8fSBarry Smith const PetscScalar *xx; 147755659b69SBarry Smith 14783a40ed3dSBarry Smith PetscFunctionBegin; 1479b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1480b9679d65SBarry Smith for (i=0; i<N; i++) { 1481b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1482b9679d65SBarry Smith if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n); 1483b9679d65SBarry Smith } 1484b9679d65SBarry Smith #endif 1485b9679d65SBarry Smith 148697b48c8fSBarry Smith /* fix right hand side if needed */ 148797b48c8fSBarry Smith if (x && b) { 148897b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 148997b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 14902205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 149197b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 149297b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 149397b48c8fSBarry Smith } 149497b48c8fSBarry Smith 14956f0a148fSBarry Smith for (i=0; i<N; i++) { 14966f0a148fSBarry Smith slot = l->v + rows[i]; 1497b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 14986f0a148fSBarry Smith } 1499f4df32b1SMatthew Knepley if (diag != 0.0) { 1500b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 15016f0a148fSBarry Smith for (i=0; i<N; i++) { 1502b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1503f4df32b1SMatthew Knepley *slot = diag; 15046f0a148fSBarry Smith } 15056f0a148fSBarry Smith } 15063a40ed3dSBarry Smith PetscFunctionReturn(0); 15076f0a148fSBarry Smith } 1508557bce09SLois Curfman McInnes 15094a2ae208SSatish Balay #undef __FUNCT__ 15108c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 15118c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 151264e87e97SBarry Smith { 1513c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15143a40ed3dSBarry Smith 15153a40ed3dSBarry Smith PetscFunctionBegin; 1516e32f2f54SBarry Smith if (mat->lda != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows"); 151764e87e97SBarry Smith *array = mat->v; 15183a40ed3dSBarry Smith PetscFunctionReturn(0); 151964e87e97SBarry Smith } 15200754003eSLois Curfman McInnes 15214a2ae208SSatish Balay #undef __FUNCT__ 15228c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 15238c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1524ff14e315SSatish Balay { 15253a40ed3dSBarry Smith PetscFunctionBegin; 152609b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 15273a40ed3dSBarry Smith PetscFunctionReturn(0); 1528ff14e315SSatish Balay } 15290754003eSLois Curfman McInnes 15304a2ae208SSatish Balay #undef __FUNCT__ 15318c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1532dec5eb66SMatthew G Knepley /*@C 15338c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 153473a71a0fSBarry Smith 153573a71a0fSBarry Smith Not Collective 153673a71a0fSBarry Smith 153773a71a0fSBarry Smith Input Parameter: 1538579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 153973a71a0fSBarry Smith 154073a71a0fSBarry Smith Output Parameter: 154173a71a0fSBarry Smith . array - pointer to the data 154273a71a0fSBarry Smith 154373a71a0fSBarry Smith Level: intermediate 154473a71a0fSBarry Smith 15458c778c55SBarry Smith .seealso: MatDenseRestoreArray() 154673a71a0fSBarry Smith @*/ 15478c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 154873a71a0fSBarry Smith { 154973a71a0fSBarry Smith PetscErrorCode ierr; 155073a71a0fSBarry Smith 155173a71a0fSBarry Smith PetscFunctionBegin; 15528c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 155373a71a0fSBarry Smith PetscFunctionReturn(0); 155473a71a0fSBarry Smith } 155573a71a0fSBarry Smith 155673a71a0fSBarry Smith #undef __FUNCT__ 15578c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1558dec5eb66SMatthew G Knepley /*@C 1559579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 156073a71a0fSBarry Smith 156173a71a0fSBarry Smith Not Collective 156273a71a0fSBarry Smith 156373a71a0fSBarry Smith Input Parameters: 1564579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 156573a71a0fSBarry Smith . array - pointer to the data 156673a71a0fSBarry Smith 156773a71a0fSBarry Smith Level: intermediate 156873a71a0fSBarry Smith 15698c778c55SBarry Smith .seealso: MatDenseGetArray() 157073a71a0fSBarry Smith @*/ 15718c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 157273a71a0fSBarry Smith { 157373a71a0fSBarry Smith PetscErrorCode ierr; 157473a71a0fSBarry Smith 157573a71a0fSBarry Smith PetscFunctionBegin; 15768c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 157773a71a0fSBarry Smith PetscFunctionReturn(0); 157873a71a0fSBarry Smith } 157973a71a0fSBarry Smith 158073a71a0fSBarry Smith #undef __FUNCT__ 15814a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 158213f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 15830754003eSLois Curfman McInnes { 1584c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15856849ba73SBarry Smith PetscErrorCode ierr; 15865d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 15875d0c19d7SBarry Smith const PetscInt *irow,*icol; 158887828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 15890754003eSLois Curfman McInnes Mat newmat; 15900754003eSLois Curfman McInnes 15913a40ed3dSBarry Smith PetscFunctionBegin; 159278b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 159378b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1594e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1595e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 15960754003eSLois Curfman McInnes 1597182d2002SSatish Balay /* Check submatrixcall */ 1598182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 159913f74950SBarry Smith PetscInt n_cols,n_rows; 1600182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 160121a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1602f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1603c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 160421a2c019SBarry Smith } 1605182d2002SSatish Balay newmat = *B; 1606182d2002SSatish Balay } else { 16070754003eSLois Curfman McInnes /* Create and fill new matrix */ 1608ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1609f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 16107adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 16110298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1612182d2002SSatish Balay } 1613182d2002SSatish Balay 1614182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1615182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1616182d2002SSatish Balay 1617182d2002SSatish Balay for (i=0; i<ncols; i++) { 16186de62eeeSBarry Smith av = v + mat->lda*icol[i]; 16192205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 16200754003eSLois Curfman McInnes } 1621182d2002SSatish Balay 1622182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 16236d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16246d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16250754003eSLois Curfman McInnes 16260754003eSLois Curfman McInnes /* Free work space */ 162778b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 162878b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1629182d2002SSatish Balay *B = newmat; 16303a40ed3dSBarry Smith PetscFunctionReturn(0); 16310754003eSLois Curfman McInnes } 16320754003eSLois Curfman McInnes 16334a2ae208SSatish Balay #undef __FUNCT__ 16344a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 163513f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1636905e6a2fSBarry Smith { 16376849ba73SBarry Smith PetscErrorCode ierr; 163813f74950SBarry Smith PetscInt i; 1639905e6a2fSBarry Smith 16403a40ed3dSBarry Smith PetscFunctionBegin; 1641905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1642854ce69bSBarry Smith ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr); 1643905e6a2fSBarry Smith } 1644905e6a2fSBarry Smith 1645905e6a2fSBarry Smith for (i=0; i<n; i++) { 16466a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1647905e6a2fSBarry Smith } 16483a40ed3dSBarry Smith PetscFunctionReturn(0); 1649905e6a2fSBarry Smith } 1650905e6a2fSBarry Smith 16514a2ae208SSatish Balay #undef __FUNCT__ 1652c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1653c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1654c0aa2d19SHong Zhang { 1655c0aa2d19SHong Zhang PetscFunctionBegin; 1656c0aa2d19SHong Zhang PetscFunctionReturn(0); 1657c0aa2d19SHong Zhang } 1658c0aa2d19SHong Zhang 1659c0aa2d19SHong Zhang #undef __FUNCT__ 1660c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1661c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1662c0aa2d19SHong Zhang { 1663c0aa2d19SHong Zhang PetscFunctionBegin; 1664c0aa2d19SHong Zhang PetscFunctionReturn(0); 1665c0aa2d19SHong Zhang } 1666c0aa2d19SHong Zhang 1667c0aa2d19SHong Zhang #undef __FUNCT__ 16684a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1669dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 16704b0e389bSBarry Smith { 16714b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 16726849ba73SBarry Smith PetscErrorCode ierr; 1673d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 16743a40ed3dSBarry Smith 16753a40ed3dSBarry Smith PetscFunctionBegin; 167633f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 167733f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1678cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 16793a40ed3dSBarry Smith PetscFunctionReturn(0); 16803a40ed3dSBarry Smith } 1681e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1682a5ce6ee0Svictorle if (lda1>m || lda2>m) { 16830dbb7854Svictorle for (j=0; j<n; j++) { 1684a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1685a5ce6ee0Svictorle } 1686a5ce6ee0Svictorle } else { 1687d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1688a5ce6ee0Svictorle } 1689273d9f13SBarry Smith PetscFunctionReturn(0); 1690273d9f13SBarry Smith } 1691273d9f13SBarry Smith 16924a2ae208SSatish Balay #undef __FUNCT__ 16934994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 16944994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A) 1695273d9f13SBarry Smith { 1696dfbe8321SBarry Smith PetscErrorCode ierr; 1697273d9f13SBarry Smith 1698273d9f13SBarry Smith PetscFunctionBegin; 1699273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 17003a40ed3dSBarry Smith PetscFunctionReturn(0); 17014b0e389bSBarry Smith } 17024b0e389bSBarry Smith 1703284134d9SBarry Smith #undef __FUNCT__ 1704ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1705ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1706ba337c44SJed Brown { 1707ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1708ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1709ba337c44SJed Brown PetscScalar *aa = a->v; 1710ba337c44SJed Brown 1711ba337c44SJed Brown PetscFunctionBegin; 1712ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1713ba337c44SJed Brown PetscFunctionReturn(0); 1714ba337c44SJed Brown } 1715ba337c44SJed Brown 1716ba337c44SJed Brown #undef __FUNCT__ 1717ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1718ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1719ba337c44SJed Brown { 1720ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1721ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1722ba337c44SJed Brown PetscScalar *aa = a->v; 1723ba337c44SJed Brown 1724ba337c44SJed Brown PetscFunctionBegin; 1725ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1726ba337c44SJed Brown PetscFunctionReturn(0); 1727ba337c44SJed Brown } 1728ba337c44SJed Brown 1729ba337c44SJed Brown #undef __FUNCT__ 1730ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1731ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1732ba337c44SJed Brown { 1733ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1734ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1735ba337c44SJed Brown PetscScalar *aa = a->v; 1736ba337c44SJed Brown 1737ba337c44SJed Brown PetscFunctionBegin; 1738ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1739ba337c44SJed Brown PetscFunctionReturn(0); 1740ba337c44SJed Brown } 1741284134d9SBarry Smith 1742a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1743a9fe9ddaSSatish Balay #undef __FUNCT__ 1744a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1745a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1746a9fe9ddaSSatish Balay { 1747a9fe9ddaSSatish Balay PetscErrorCode ierr; 1748a9fe9ddaSSatish Balay 1749a9fe9ddaSSatish Balay PetscFunctionBegin; 1750a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 17513ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1752a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 17533ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1754a9fe9ddaSSatish Balay } 17553ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1756a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 17573ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1758a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1759a9fe9ddaSSatish Balay } 1760a9fe9ddaSSatish Balay 1761a9fe9ddaSSatish Balay #undef __FUNCT__ 1762a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1763a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1764a9fe9ddaSSatish Balay { 1765ee16a9a1SHong Zhang PetscErrorCode ierr; 1766d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1767ee16a9a1SHong Zhang Mat Cmat; 1768a9fe9ddaSSatish Balay 1769ee16a9a1SHong Zhang PetscFunctionBegin; 1770e32f2f54SBarry Smith if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n); 1771ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1772ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1773ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 17740298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1775d73949e8SHong Zhang 1776ee16a9a1SHong Zhang *C = Cmat; 1777ee16a9a1SHong Zhang PetscFunctionReturn(0); 1778ee16a9a1SHong Zhang } 1779a9fe9ddaSSatish Balay 178098a3b096SSatish Balay #undef __FUNCT__ 1781a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1782a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1783a9fe9ddaSSatish Balay { 1784a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1785a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1786a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17870805154bSBarry Smith PetscBLASInt m,n,k; 1788a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1789c5df96a5SBarry Smith PetscErrorCode ierr; 1790a9fe9ddaSSatish Balay 1791a9fe9ddaSSatish Balay PetscFunctionBegin; 1792c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1793c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1794c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 17958b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1796a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1797a9fe9ddaSSatish Balay } 1798a9fe9ddaSSatish Balay 1799a9fe9ddaSSatish Balay #undef __FUNCT__ 180075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 180175648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1802a9fe9ddaSSatish Balay { 1803a9fe9ddaSSatish Balay PetscErrorCode ierr; 1804a9fe9ddaSSatish Balay 1805a9fe9ddaSSatish Balay PetscFunctionBegin; 1806a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18073ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 180875648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18093ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1810a9fe9ddaSSatish Balay } 18113ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 181275648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18133ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1814a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1815a9fe9ddaSSatish Balay } 1816a9fe9ddaSSatish Balay 1817a9fe9ddaSSatish Balay #undef __FUNCT__ 181875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 181975648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1820a9fe9ddaSSatish Balay { 1821ee16a9a1SHong Zhang PetscErrorCode ierr; 1822d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1823ee16a9a1SHong Zhang Mat Cmat; 1824a9fe9ddaSSatish Balay 1825ee16a9a1SHong Zhang PetscFunctionBegin; 1826e32f2f54SBarry Smith if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n); 1827ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1828ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1829ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18300298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 18312205254eSKarl Rupp 1832ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 18332205254eSKarl Rupp 1834ee16a9a1SHong Zhang *C = Cmat; 1835ee16a9a1SHong Zhang PetscFunctionReturn(0); 1836ee16a9a1SHong Zhang } 1837a9fe9ddaSSatish Balay 1838a9fe9ddaSSatish Balay #undef __FUNCT__ 183975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 184075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1841a9fe9ddaSSatish Balay { 1842a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1843a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1844a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 18450805154bSBarry Smith PetscBLASInt m,n,k; 1846a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1847c5df96a5SBarry Smith PetscErrorCode ierr; 1848a9fe9ddaSSatish Balay 1849a9fe9ddaSSatish Balay PetscFunctionBegin; 1850c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1851c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1852c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 18532fbe02b9SBarry Smith /* 18542fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 18552fbe02b9SBarry Smith */ 18568b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1857a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1858a9fe9ddaSSatish Balay } 1859985db425SBarry Smith 1860985db425SBarry Smith #undef __FUNCT__ 1861985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1862985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1863985db425SBarry Smith { 1864985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1865985db425SBarry Smith PetscErrorCode ierr; 1866d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1867985db425SBarry Smith PetscScalar *x; 1868985db425SBarry Smith MatScalar *aa = a->v; 1869985db425SBarry Smith 1870985db425SBarry Smith PetscFunctionBegin; 1871e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1872985db425SBarry Smith 1873985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1874985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1875985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1876e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1877985db425SBarry Smith for (i=0; i<m; i++) { 1878985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1879985db425SBarry Smith for (j=1; j<n; j++) { 1880985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1881985db425SBarry Smith } 1882985db425SBarry Smith } 1883985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1884985db425SBarry Smith PetscFunctionReturn(0); 1885985db425SBarry Smith } 1886985db425SBarry Smith 1887985db425SBarry Smith #undef __FUNCT__ 1888985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1889985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1890985db425SBarry Smith { 1891985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1892985db425SBarry Smith PetscErrorCode ierr; 1893d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1894985db425SBarry Smith PetscScalar *x; 1895985db425SBarry Smith PetscReal atmp; 1896985db425SBarry Smith MatScalar *aa = a->v; 1897985db425SBarry Smith 1898985db425SBarry Smith PetscFunctionBegin; 1899e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1900985db425SBarry Smith 1901985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1902985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1903985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1904e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1905985db425SBarry Smith for (i=0; i<m; i++) { 19069189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1907985db425SBarry Smith for (j=1; j<n; j++) { 1908985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1909985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1910985db425SBarry Smith } 1911985db425SBarry Smith } 1912985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1913985db425SBarry Smith PetscFunctionReturn(0); 1914985db425SBarry Smith } 1915985db425SBarry Smith 1916985db425SBarry Smith #undef __FUNCT__ 1917985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1918985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1919985db425SBarry Smith { 1920985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1921985db425SBarry Smith PetscErrorCode ierr; 1922d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1923985db425SBarry Smith PetscScalar *x; 1924985db425SBarry Smith MatScalar *aa = a->v; 1925985db425SBarry Smith 1926985db425SBarry Smith PetscFunctionBegin; 1927e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1928985db425SBarry Smith 1929985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1930985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1931985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1932e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1933985db425SBarry Smith for (i=0; i<m; i++) { 1934985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1935985db425SBarry Smith for (j=1; j<n; j++) { 1936985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1937985db425SBarry Smith } 1938985db425SBarry Smith } 1939985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1940985db425SBarry Smith PetscFunctionReturn(0); 1941985db425SBarry Smith } 1942985db425SBarry Smith 19438d0534beSBarry Smith #undef __FUNCT__ 19448d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 19458d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 19468d0534beSBarry Smith { 19478d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 19488d0534beSBarry Smith PetscErrorCode ierr; 19498d0534beSBarry Smith PetscScalar *x; 19508d0534beSBarry Smith 19518d0534beSBarry Smith PetscFunctionBegin; 1952e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 19538d0534beSBarry Smith 19548d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1955d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 19568d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 19578d0534beSBarry Smith PetscFunctionReturn(0); 19588d0534beSBarry Smith } 19598d0534beSBarry Smith 19600716a85fSBarry Smith 19610716a85fSBarry Smith #undef __FUNCT__ 19620716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 19630716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 19640716a85fSBarry Smith { 19650716a85fSBarry Smith PetscErrorCode ierr; 19660716a85fSBarry Smith PetscInt i,j,m,n; 19670716a85fSBarry Smith PetscScalar *a; 19680716a85fSBarry Smith 19690716a85fSBarry Smith PetscFunctionBegin; 19700716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 19710716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 19728c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 19730716a85fSBarry Smith if (type == NORM_2) { 19740716a85fSBarry Smith for (i=0; i<n; i++) { 19750716a85fSBarry Smith for (j=0; j<m; j++) { 19760716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 19770716a85fSBarry Smith } 19780716a85fSBarry Smith a += m; 19790716a85fSBarry Smith } 19800716a85fSBarry Smith } else if (type == NORM_1) { 19810716a85fSBarry Smith for (i=0; i<n; i++) { 19820716a85fSBarry Smith for (j=0; j<m; j++) { 19830716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 19840716a85fSBarry Smith } 19850716a85fSBarry Smith a += m; 19860716a85fSBarry Smith } 19870716a85fSBarry Smith } else if (type == NORM_INFINITY) { 19880716a85fSBarry Smith for (i=0; i<n; i++) { 19890716a85fSBarry Smith for (j=0; j<m; j++) { 19900716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 19910716a85fSBarry Smith } 19920716a85fSBarry Smith a += m; 19930716a85fSBarry Smith } 1994ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 19958c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 19960716a85fSBarry Smith if (type == NORM_2) { 19978f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 19980716a85fSBarry Smith } 19990716a85fSBarry Smith PetscFunctionReturn(0); 20000716a85fSBarry Smith } 20010716a85fSBarry Smith 200273a71a0fSBarry Smith #undef __FUNCT__ 200373a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 200473a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 200573a71a0fSBarry Smith { 200673a71a0fSBarry Smith PetscErrorCode ierr; 200773a71a0fSBarry Smith PetscScalar *a; 200873a71a0fSBarry Smith PetscInt m,n,i; 200973a71a0fSBarry Smith 201073a71a0fSBarry Smith PetscFunctionBegin; 201173a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 20128c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 201373a71a0fSBarry Smith for (i=0; i<m*n; i++) { 201473a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 201573a71a0fSBarry Smith } 20168c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 201773a71a0fSBarry Smith PetscFunctionReturn(0); 201873a71a0fSBarry Smith } 201973a71a0fSBarry Smith 202073a71a0fSBarry Smith 2021289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2022a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2023905e6a2fSBarry Smith MatGetRow_SeqDense, 2024905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2025905e6a2fSBarry Smith MatMult_SeqDense, 202697304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 20277c922b88SBarry Smith MatMultTranspose_SeqDense, 20287c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2029db4efbfdSBarry Smith 0, 2030db4efbfdSBarry Smith 0, 2031db4efbfdSBarry Smith 0, 2032db4efbfdSBarry Smith /* 10*/ 0, 2033905e6a2fSBarry Smith MatLUFactor_SeqDense, 2034905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 203541f059aeSBarry Smith MatSOR_SeqDense, 2036ec8511deSBarry Smith MatTranspose_SeqDense, 203797304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2038905e6a2fSBarry Smith MatEqual_SeqDense, 2039905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2040905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2041905e6a2fSBarry Smith MatNorm_SeqDense, 2042c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2043c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2044905e6a2fSBarry Smith MatSetOption_SeqDense, 2045905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2046d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2047db4efbfdSBarry Smith 0, 2048db4efbfdSBarry Smith 0, 2049db4efbfdSBarry Smith 0, 2050db4efbfdSBarry Smith 0, 20514994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2052273d9f13SBarry Smith 0, 2053905e6a2fSBarry Smith 0, 205473a71a0fSBarry Smith 0, 205573a71a0fSBarry Smith 0, 2056d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2057a5ae1ecdSBarry Smith 0, 2058a5ae1ecdSBarry Smith 0, 2059a5ae1ecdSBarry Smith 0, 2060a5ae1ecdSBarry Smith 0, 2061d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2062a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2063a5ae1ecdSBarry Smith 0, 20644b0e389bSBarry Smith MatGetValues_SeqDense, 2065a5ae1ecdSBarry Smith MatCopy_SeqDense, 2066d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2067a5ae1ecdSBarry Smith MatScale_SeqDense, 20687d68702bSBarry Smith MatShift_Basic, 2069a5ae1ecdSBarry Smith 0, 2070a5ae1ecdSBarry Smith 0, 207173a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2072a5ae1ecdSBarry Smith 0, 2073a5ae1ecdSBarry Smith 0, 2074a5ae1ecdSBarry Smith 0, 2075a5ae1ecdSBarry Smith 0, 2076d519adbfSMatthew Knepley /* 54*/ 0, 2077a5ae1ecdSBarry Smith 0, 2078a5ae1ecdSBarry Smith 0, 2079a5ae1ecdSBarry Smith 0, 2080a5ae1ecdSBarry Smith 0, 2081d519adbfSMatthew Knepley /* 59*/ 0, 2082e03a110bSBarry Smith MatDestroy_SeqDense, 2083e03a110bSBarry Smith MatView_SeqDense, 2084357abbc8SBarry Smith 0, 208597304618SKris Buschelman 0, 2086d519adbfSMatthew Knepley /* 64*/ 0, 208797304618SKris Buschelman 0, 208897304618SKris Buschelman 0, 208997304618SKris Buschelman 0, 209097304618SKris Buschelman 0, 2091d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 209297304618SKris Buschelman 0, 209397304618SKris Buschelman 0, 209497304618SKris Buschelman 0, 209597304618SKris Buschelman 0, 2096d519adbfSMatthew Knepley /* 74*/ 0, 209797304618SKris Buschelman 0, 209897304618SKris Buschelman 0, 209997304618SKris Buschelman 0, 210097304618SKris Buschelman 0, 2101d519adbfSMatthew Knepley /* 79*/ 0, 210297304618SKris Buschelman 0, 210397304618SKris Buschelman 0, 210497304618SKris Buschelman 0, 21055bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2106865e5f61SKris Buschelman 0, 21071cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2108865e5f61SKris Buschelman 0, 2109865e5f61SKris Buschelman 0, 2110865e5f61SKris Buschelman 0, 2111d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2112a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2113a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2114865e5f61SKris Buschelman 0, 2115865e5f61SKris Buschelman 0, 2116d519adbfSMatthew Knepley /* 94*/ 0, 21175df89d91SHong Zhang 0, 21185df89d91SHong Zhang 0, 21195df89d91SHong Zhang 0, 2120284134d9SBarry Smith 0, 2121d519adbfSMatthew Knepley /* 99*/ 0, 2122284134d9SBarry Smith 0, 2123284134d9SBarry Smith 0, 2124ba337c44SJed Brown MatConjugate_SeqDense, 2125f73d5cc4SBarry Smith 0, 2126ba337c44SJed Brown /*104*/ 0, 2127ba337c44SJed Brown MatRealPart_SeqDense, 2128ba337c44SJed Brown MatImaginaryPart_SeqDense, 2129985db425SBarry Smith 0, 2130985db425SBarry Smith 0, 213185e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2132985db425SBarry Smith 0, 21338d0534beSBarry Smith MatGetRowMin_SeqDense, 2134aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 2135aabbc4fbSShri Abhyankar 0, 2136aabbc4fbSShri Abhyankar /*114*/ 0, 2137aabbc4fbSShri Abhyankar 0, 2138aabbc4fbSShri Abhyankar 0, 2139aabbc4fbSShri Abhyankar 0, 2140aabbc4fbSShri Abhyankar 0, 2141aabbc4fbSShri Abhyankar /*119*/ 0, 2142aabbc4fbSShri Abhyankar 0, 2143aabbc4fbSShri Abhyankar 0, 21440716a85fSBarry Smith 0, 21450716a85fSBarry Smith 0, 21460716a85fSBarry Smith /*124*/ 0, 21475df89d91SHong Zhang MatGetColumnNorms_SeqDense, 21485df89d91SHong Zhang 0, 21495df89d91SHong Zhang 0, 21505df89d91SHong Zhang 0, 21515df89d91SHong Zhang /*129*/ 0, 215275648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 215375648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 215475648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 21553964eb88SJed Brown 0, 21563964eb88SJed Brown /*134*/ 0, 21573964eb88SJed Brown 0, 21583964eb88SJed Brown 0, 21593964eb88SJed Brown 0, 21603964eb88SJed Brown 0, 21613964eb88SJed Brown /*139*/ 0, 2162f9426fe0SMark Adams 0, 21633964eb88SJed Brown 0 2164985db425SBarry Smith }; 216590ace30eSBarry Smith 21664a2ae208SSatish Balay #undef __FUNCT__ 21674a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 21684b828684SBarry Smith /*@C 2169fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2170d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2171d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2172289bc588SBarry Smith 2173db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2174db81eaa0SLois Curfman McInnes 217520563c6bSBarry Smith Input Parameters: 2176db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 21770c775827SLois Curfman McInnes . m - number of rows 217818f449edSLois Curfman McInnes . n - number of columns 21790298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2180dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 218120563c6bSBarry Smith 218220563c6bSBarry Smith Output Parameter: 218344cd7ae7SLois Curfman McInnes . A - the matrix 218420563c6bSBarry Smith 2185b259b22eSLois Curfman McInnes Notes: 218618f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 218718f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 21880298fd71SBarry Smith set data=NULL. 218918f449edSLois Curfman McInnes 2190027ccd11SLois Curfman McInnes Level: intermediate 2191027ccd11SLois Curfman McInnes 2192dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2193d65003e9SLois Curfman McInnes 219469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 219520563c6bSBarry Smith @*/ 21967087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2197289bc588SBarry Smith { 2198dfbe8321SBarry Smith PetscErrorCode ierr; 21993b2fbd54SBarry Smith 22003a40ed3dSBarry Smith PetscFunctionBegin; 2201f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2202f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2203273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2204273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2205273d9f13SBarry Smith PetscFunctionReturn(0); 2206273d9f13SBarry Smith } 2207273d9f13SBarry Smith 22084a2ae208SSatish Balay #undef __FUNCT__ 2209afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2210273d9f13SBarry Smith /*@C 2211273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2212273d9f13SBarry Smith 2213273d9f13SBarry Smith Collective on MPI_Comm 2214273d9f13SBarry Smith 2215273d9f13SBarry Smith Input Parameters: 22161c4f3114SJed Brown + B - the matrix 22170298fd71SBarry Smith - data - the array (or NULL) 2218273d9f13SBarry Smith 2219273d9f13SBarry Smith Notes: 2220273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2221273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2222284134d9SBarry Smith need not call this routine. 2223273d9f13SBarry Smith 2224273d9f13SBarry Smith Level: intermediate 2225273d9f13SBarry Smith 2226273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2227273d9f13SBarry Smith 222869b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2229867c911aSBarry Smith 2230273d9f13SBarry Smith @*/ 22317087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2232273d9f13SBarry Smith { 22334ac538c5SBarry Smith PetscErrorCode ierr; 2234a23d5eceSKris Buschelman 2235a23d5eceSKris Buschelman PetscFunctionBegin; 22364ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2237a23d5eceSKris Buschelman PetscFunctionReturn(0); 2238a23d5eceSKris Buschelman } 2239a23d5eceSKris Buschelman 2240a23d5eceSKris Buschelman #undef __FUNCT__ 2241afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 22427087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2243a23d5eceSKris Buschelman { 2244273d9f13SBarry Smith Mat_SeqDense *b; 2245dfbe8321SBarry Smith PetscErrorCode ierr; 2246273d9f13SBarry Smith 2247273d9f13SBarry Smith PetscFunctionBegin; 2248273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2249a868139aSShri Abhyankar 225034ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 225134ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 225234ef9618SShri Abhyankar 2253273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 225486d161a7SShri Abhyankar b->Mmax = B->rmap->n; 225586d161a7SShri Abhyankar b->Nmax = B->cmap->n; 225686d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 225786d161a7SShri Abhyankar 22589e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 22599e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2260e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 22613bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 22622205254eSKarl Rupp 22639e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2264273d9f13SBarry Smith } else { /* user-allocated storage */ 22659e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2266273d9f13SBarry Smith b->v = data; 2267273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2268273d9f13SBarry Smith } 22690450473dSBarry Smith B->assembled = PETSC_TRUE; 2270273d9f13SBarry Smith PetscFunctionReturn(0); 2271273d9f13SBarry Smith } 2272273d9f13SBarry Smith 227365b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 22741b807ce4Svictorle #undef __FUNCT__ 22758baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 22768baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 22778baccfbdSHong Zhang { 2278d77f618aSHong Zhang Mat mat_elemental; 2279d77f618aSHong Zhang PetscErrorCode ierr; 2280d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2281d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2282d77f618aSHong Zhang 22838baccfbdSHong Zhang PetscFunctionBegin; 2284d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2285d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2286d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2287d77f618aSHong Zhang k = 0; 2288d77f618aSHong Zhang for (j=0; j<N; j++) { 2289d77f618aSHong Zhang cols[j] = j; 2290d77f618aSHong Zhang for (i=0; i<M; i++) { 2291d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2292d77f618aSHong Zhang } 2293d77f618aSHong Zhang } 2294d77f618aSHong Zhang for (i=0; i<M; i++) { 2295d77f618aSHong Zhang rows[i] = i; 2296d77f618aSHong Zhang } 2297d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2298d77f618aSHong Zhang 2299d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2300d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2301d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2302d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2303d77f618aSHong Zhang 2304d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2305d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2306d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2307d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2308d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2309d77f618aSHong Zhang 2310d77f618aSHong Zhang if (reuse == MAT_REUSE_MATRIX) { 2311d77f618aSHong Zhang ierr = MatHeaderReplace(A,mat_elemental);CHKERRQ(ierr); 2312d77f618aSHong Zhang } else { 2313d77f618aSHong Zhang *newmat = mat_elemental; 2314d77f618aSHong Zhang } 23158baccfbdSHong Zhang PetscFunctionReturn(0); 23168baccfbdSHong Zhang } 231765b80a83SHong Zhang #endif 23188baccfbdSHong Zhang 23198baccfbdSHong Zhang #undef __FUNCT__ 23201b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 23211b807ce4Svictorle /*@C 23221b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 23231b807ce4Svictorle 23241b807ce4Svictorle Input parameter: 23251b807ce4Svictorle + A - the matrix 23261b807ce4Svictorle - lda - the leading dimension 23271b807ce4Svictorle 23281b807ce4Svictorle Notes: 2329867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 23301b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 23311b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 23321b807ce4Svictorle 23331b807ce4Svictorle Level: intermediate 23341b807ce4Svictorle 23351b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 23361b807ce4Svictorle 2337284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2338867c911aSBarry Smith 23391b807ce4Svictorle @*/ 23407087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 23411b807ce4Svictorle { 23421b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 234321a2c019SBarry Smith 23441b807ce4Svictorle PetscFunctionBegin; 2345e32f2f54SBarry Smith if (lda < B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n); 23461b807ce4Svictorle b->lda = lda; 234721a2c019SBarry Smith b->changelda = PETSC_FALSE; 234821a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 23491b807ce4Svictorle PetscFunctionReturn(0); 23501b807ce4Svictorle } 23511b807ce4Svictorle 23520bad9183SKris Buschelman /*MC 2353fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 23540bad9183SKris Buschelman 23550bad9183SKris Buschelman Options Database Keys: 23560bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 23570bad9183SKris Buschelman 23580bad9183SKris Buschelman Level: beginner 23590bad9183SKris Buschelman 236089665df3SBarry Smith .seealso: MatCreateSeqDense() 236189665df3SBarry Smith 23620bad9183SKris Buschelman M*/ 23630bad9183SKris Buschelman 23644a2ae208SSatish Balay #undef __FUNCT__ 23654a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 23668cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2367273d9f13SBarry Smith { 2368273d9f13SBarry Smith Mat_SeqDense *b; 2369dfbe8321SBarry Smith PetscErrorCode ierr; 23707c334f02SBarry Smith PetscMPIInt size; 2371273d9f13SBarry Smith 2372273d9f13SBarry Smith PetscFunctionBegin; 2373ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2374e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 237555659b69SBarry Smith 2376b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2377549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 237844cd7ae7SLois Curfman McInnes B->data = (void*)b; 237918f449edSLois Curfman McInnes 238044cd7ae7SLois Curfman McInnes b->pivots = 0; 2381273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2382273d9f13SBarry Smith b->v = 0; 238321a2c019SBarry Smith b->changelda = PETSC_FALSE; 23844e220ebcSLois Curfman McInnes 2385bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2386bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2387bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 23888baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 23898baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 23908baccfbdSHong Zhang #endif 2391bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2392bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2393bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2394bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 23953bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 23963bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 23973bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 239817667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 23993a40ed3dSBarry Smith PetscFunctionReturn(0); 2400289bc588SBarry Smith } 2401