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__ 126a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ" 138cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 146a63e612SBarry Smith { 156a63e612SBarry Smith Mat B; 166a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 176a63e612SBarry Smith PetscErrorCode ierr; 189399e1b8SMatthew G. Knepley PetscInt i, j; 199399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 209399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 216a63e612SBarry Smith 226a63e612SBarry Smith PetscFunctionBegin; 23ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 246a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 256a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 269399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 279399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 289399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 296a63e612SBarry Smith aa += a->lda; 306a63e612SBarry Smith } 319399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 329399e1b8SMatthew G. Knepley aa = a->v; 339399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 349399e1b8SMatthew G. Knepley PetscInt numRows = 0; 359399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 369399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 379399e1b8SMatthew G. Knepley aa += a->lda; 389399e1b8SMatthew G. Knepley } 399399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 406a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 416a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 426a63e612SBarry Smith 436a63e612SBarry Smith if (reuse == MAT_REUSE_MATRIX) { 446a63e612SBarry Smith ierr = MatHeaderReplace(A,B);CHKERRQ(ierr); 456a63e612SBarry Smith } else { 466a63e612SBarry Smith *newmat = B; 476a63e612SBarry Smith } 486a63e612SBarry Smith PetscFunctionReturn(0); 496a63e612SBarry Smith } 506a63e612SBarry Smith 514a2ae208SSatish Balay #undef __FUNCT__ 524a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 53f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 541987afe7SBarry Smith { 551987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 56f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 5713f74950SBarry Smith PetscInt j; 580805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 59efee365bSSatish Balay PetscErrorCode ierr; 603a40ed3dSBarry Smith 613a40ed3dSBarry Smith PetscFunctionBegin; 62c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 63c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 64c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 65c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 66a5ce6ee0Svictorle if (ldax>m || lday>m) { 67d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 688b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one)); 69a5ce6ee0Svictorle } 70a5ce6ee0Svictorle } else { 718b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one)); 72a5ce6ee0Svictorle } 73a3fa217bSJose E. Roman ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 740450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 753a40ed3dSBarry Smith PetscFunctionReturn(0); 761987afe7SBarry Smith } 771987afe7SBarry Smith 784a2ae208SSatish Balay #undef __FUNCT__ 794a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 80dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 81289bc588SBarry Smith { 82d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 833a40ed3dSBarry Smith 843a40ed3dSBarry Smith PetscFunctionBegin; 854e220ebcSLois Curfman McInnes info->block_size = 1.0; 864e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 876de62eeeSBarry Smith info->nz_used = (double)N; 886de62eeeSBarry Smith info->nz_unneeded = (double)0; 894e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 904e220ebcSLois Curfman McInnes info->mallocs = 0; 917adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 924e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 934e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 944e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 953a40ed3dSBarry Smith PetscFunctionReturn(0); 96289bc588SBarry Smith } 97289bc588SBarry Smith 984a2ae208SSatish Balay #undef __FUNCT__ 994a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 100f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 10180cd9d93SLois Curfman McInnes { 102273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 103f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 104efee365bSSatish Balay PetscErrorCode ierr; 105c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 10680cd9d93SLois Curfman McInnes 1073a40ed3dSBarry Smith PetscFunctionBegin; 108c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 109d0f46423SBarry Smith if (lda>A->rmap->n) { 110c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 111d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1128b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one)); 113a5ce6ee0Svictorle } 114a5ce6ee0Svictorle } else { 115c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 1168b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one)); 117a5ce6ee0Svictorle } 118efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 1193a40ed3dSBarry Smith PetscFunctionReturn(0); 12080cd9d93SLois Curfman McInnes } 12180cd9d93SLois Curfman McInnes 1221cbb95d3SBarry Smith #undef __FUNCT__ 1231cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 124ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 1251cbb95d3SBarry Smith { 1261cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 127d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 1281cbb95d3SBarry Smith PetscScalar *v = a->v; 1291cbb95d3SBarry Smith 1301cbb95d3SBarry Smith PetscFunctionBegin; 1311cbb95d3SBarry Smith *fl = PETSC_FALSE; 132d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 1331cbb95d3SBarry Smith N = a->lda; 1341cbb95d3SBarry Smith 1351cbb95d3SBarry Smith for (i=0; i<m; i++) { 1361cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 1371cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 1381cbb95d3SBarry Smith } 1391cbb95d3SBarry Smith } 1401cbb95d3SBarry Smith *fl = PETSC_TRUE; 1411cbb95d3SBarry Smith PetscFunctionReturn(0); 1421cbb95d3SBarry Smith } 1431cbb95d3SBarry Smith 144b24902e0SBarry Smith #undef __FUNCT__ 145b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 146719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 147b24902e0SBarry Smith { 148b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 149b24902e0SBarry Smith PetscErrorCode ierr; 150b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 151b24902e0SBarry Smith 152b24902e0SBarry Smith PetscFunctionBegin; 153aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 154aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 1550298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 156b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 157b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 158d0f46423SBarry Smith if (lda>A->rmap->n) { 159d0f46423SBarry Smith m = A->rmap->n; 160d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 161b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 162b24902e0SBarry Smith } 163b24902e0SBarry Smith } else { 164d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 165b24902e0SBarry Smith } 166b24902e0SBarry Smith } 167b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 168b24902e0SBarry Smith PetscFunctionReturn(0); 169b24902e0SBarry Smith } 170b24902e0SBarry Smith 1714a2ae208SSatish Balay #undef __FUNCT__ 1724a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 173dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 17402cad45dSBarry Smith { 1756849ba73SBarry Smith PetscErrorCode ierr; 17602cad45dSBarry Smith 1773a40ed3dSBarry Smith PetscFunctionBegin; 178ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 179d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1805c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 181719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 182b24902e0SBarry Smith PetscFunctionReturn(0); 183b24902e0SBarry Smith } 184b24902e0SBarry Smith 1856ee01492SSatish Balay 1860481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 187719d5645SBarry Smith 1884a2ae208SSatish Balay #undef __FUNCT__ 1894a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 1900481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 191289bc588SBarry Smith { 1924482741eSBarry Smith MatFactorInfo info; 193a093e273SMatthew Knepley PetscErrorCode ierr; 1943a40ed3dSBarry Smith 1953a40ed3dSBarry Smith PetscFunctionBegin; 196c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 197719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 1983a40ed3dSBarry Smith PetscFunctionReturn(0); 199289bc588SBarry Smith } 2006ee01492SSatish Balay 2010b4b3355SBarry Smith #undef __FUNCT__ 2024a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 203dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 204289bc588SBarry Smith { 205c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2066849ba73SBarry Smith PetscErrorCode ierr; 207*f1ceaac6SMatthew G. Knepley const PetscScalar *x; 208*f1ceaac6SMatthew G. Knepley PetscScalar *y; 209c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 21067e560aaSBarry Smith 2113a40ed3dSBarry Smith PetscFunctionBegin; 212c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 213*f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 2141ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 215d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 216d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 217ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 218e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 219ae7cfcebSSatish Balay #else 2208b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 221e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 222ae7cfcebSSatish Balay #endif 223d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 224ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 225e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 226ae7cfcebSSatish Balay #else 2278b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 228e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 229ae7cfcebSSatish Balay #endif 2302205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 231*f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 2321ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 233dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2343a40ed3dSBarry Smith PetscFunctionReturn(0); 235289bc588SBarry Smith } 2366ee01492SSatish Balay 2374a2ae208SSatish Balay #undef __FUNCT__ 23885e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 23985e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 24085e2c93fSHong Zhang { 24185e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 24285e2c93fSHong Zhang PetscErrorCode ierr; 24385e2c93fSHong Zhang PetscScalar *b,*x; 244efb80c78SLisandro Dalcin PetscInt n; 245783b601eSJed Brown PetscBLASInt nrhs,info,m; 246bda8bf91SBarry Smith PetscBool flg; 24785e2c93fSHong Zhang 24885e2c93fSHong Zhang PetscFunctionBegin; 249c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 2500298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 251ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 2520298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 253ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 254bda8bf91SBarry Smith 2550298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 256c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 2578c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 2588c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 25985e2c93fSHong Zhang 260f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 26185e2c93fSHong Zhang 26285e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 26385e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 26485e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 26585e2c93fSHong Zhang #else 2668b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 26785e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 26885e2c93fSHong Zhang #endif 26985e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 27085e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 27185e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 27285e2c93fSHong Zhang #else 2738b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 27485e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 27585e2c93fSHong Zhang #endif 2762205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 27785e2c93fSHong Zhang 2788c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 2798c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 28085e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 28185e2c93fSHong Zhang PetscFunctionReturn(0); 28285e2c93fSHong Zhang } 28385e2c93fSHong Zhang 28485e2c93fSHong Zhang #undef __FUNCT__ 2854a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 286dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 287da3a660dSBarry Smith { 288c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 289dfbe8321SBarry Smith PetscErrorCode ierr; 290*f1ceaac6SMatthew G. Knepley const PetscScalar *x; 291*f1ceaac6SMatthew G. Knepley PetscScalar *y; 292c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 29367e560aaSBarry Smith 2943a40ed3dSBarry Smith PetscFunctionBegin; 295c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 296*f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 2971ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 298d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 299752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 300da3a660dSBarry Smith if (mat->pivots) { 301ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 302e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 303ae7cfcebSSatish Balay #else 3048b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 305e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 306ae7cfcebSSatish Balay #endif 3077a97a34bSBarry Smith } else { 308ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 309e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 310ae7cfcebSSatish Balay #else 3118b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 312e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 313ae7cfcebSSatish Balay #endif 314da3a660dSBarry Smith } 315*f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 3161ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 317dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3183a40ed3dSBarry Smith PetscFunctionReturn(0); 319da3a660dSBarry Smith } 3206ee01492SSatish Balay 3214a2ae208SSatish Balay #undef __FUNCT__ 3224a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 323dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 324da3a660dSBarry Smith { 325c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 326dfbe8321SBarry Smith PetscErrorCode ierr; 327*f1ceaac6SMatthew G. Knepley const PetscScalar *x; 328*f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 329da3a660dSBarry Smith Vec tmp = 0; 330c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 33167e560aaSBarry Smith 3323a40ed3dSBarry Smith PetscFunctionBegin; 333c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 334*f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 3351ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 336d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 337da3a660dSBarry Smith if (yy == zz) { 33878b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 3393bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 34078b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 341da3a660dSBarry Smith } 342d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 343752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 344da3a660dSBarry Smith if (mat->pivots) { 345ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 346e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 347ae7cfcebSSatish Balay #else 3488b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 349e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 350ae7cfcebSSatish Balay #endif 351a8c6a408SBarry Smith } else { 352ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 353e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 354ae7cfcebSSatish Balay #else 3558b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 356e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 357ae7cfcebSSatish Balay #endif 358da3a660dSBarry Smith } 3596bf464f9SBarry Smith if (tmp) { 3606bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 3616bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 3626bf464f9SBarry Smith } else { 3636bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 3646bf464f9SBarry Smith } 365*f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 3661ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 367dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 3683a40ed3dSBarry Smith PetscFunctionReturn(0); 369da3a660dSBarry Smith } 37067e560aaSBarry Smith 3714a2ae208SSatish Balay #undef __FUNCT__ 3724a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 373dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 374da3a660dSBarry Smith { 375c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3766849ba73SBarry Smith PetscErrorCode ierr; 377*f1ceaac6SMatthew G. Knepley const PetscScalar *x; 378*f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 379da3a660dSBarry Smith Vec tmp; 380c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 38167e560aaSBarry Smith 3823a40ed3dSBarry Smith PetscFunctionBegin; 383c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 384d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 385*f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 3861ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 387da3a660dSBarry Smith if (yy == zz) { 38878b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 3893bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 39078b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 391da3a660dSBarry Smith } 392d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 393752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 394da3a660dSBarry Smith if (mat->pivots) { 395ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 396e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 397ae7cfcebSSatish Balay #else 3988b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 399e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 400ae7cfcebSSatish Balay #endif 4013a40ed3dSBarry Smith } else { 402ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 403e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 404ae7cfcebSSatish Balay #else 4058b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 406e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 407ae7cfcebSSatish Balay #endif 408da3a660dSBarry Smith } 40990f02eecSBarry Smith if (tmp) { 4102dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4116bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4123a40ed3dSBarry Smith } else { 4132dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 41490f02eecSBarry Smith } 415*f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4161ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 417dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4183a40ed3dSBarry Smith PetscFunctionReturn(0); 419da3a660dSBarry Smith } 420db4efbfdSBarry Smith 421db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 422db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 423db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 424db4efbfdSBarry Smith #undef __FUNCT__ 425db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 4260481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 427db4efbfdSBarry Smith { 428db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 429db4efbfdSBarry Smith PetscFunctionBegin; 430e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 431db4efbfdSBarry Smith #else 432db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 433db4efbfdSBarry Smith PetscErrorCode ierr; 434db4efbfdSBarry Smith PetscBLASInt n,m,info; 435db4efbfdSBarry Smith 436db4efbfdSBarry Smith PetscFunctionBegin; 437c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 438c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 439db4efbfdSBarry Smith if (!mat->pivots) { 440854ce69bSBarry Smith ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr); 4413bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 442db4efbfdSBarry Smith } 443db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 4448e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4458b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 4468e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 4478e57ea43SSatish Balay 448e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 449e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 450db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 451db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 452db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 453db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 454d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 455db4efbfdSBarry Smith 456dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 457db4efbfdSBarry Smith #endif 458db4efbfdSBarry Smith PetscFunctionReturn(0); 459db4efbfdSBarry Smith } 460db4efbfdSBarry Smith 461db4efbfdSBarry Smith #undef __FUNCT__ 462db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 4630481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 464db4efbfdSBarry Smith { 465db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 466db4efbfdSBarry Smith PetscFunctionBegin; 467e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 468db4efbfdSBarry Smith #else 469db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 470db4efbfdSBarry Smith PetscErrorCode ierr; 471c5df96a5SBarry Smith PetscBLASInt info,n; 472db4efbfdSBarry Smith 473db4efbfdSBarry Smith PetscFunctionBegin; 474c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 475db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 476db4efbfdSBarry Smith 477db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 4788b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 479e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 480db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 481db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 482db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 483db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 484d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 4852205254eSKarl Rupp 486dc0b31edSSatish Balay ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 487db4efbfdSBarry Smith #endif 488db4efbfdSBarry Smith PetscFunctionReturn(0); 489db4efbfdSBarry Smith } 490db4efbfdSBarry Smith 491db4efbfdSBarry Smith 492db4efbfdSBarry Smith #undef __FUNCT__ 493db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 4940481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 495db4efbfdSBarry Smith { 496db4efbfdSBarry Smith PetscErrorCode ierr; 497db4efbfdSBarry Smith MatFactorInfo info; 498db4efbfdSBarry Smith 499db4efbfdSBarry Smith PetscFunctionBegin; 500db4efbfdSBarry Smith info.fill = 1.0; 5012205254eSKarl Rupp 502c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 503719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 504db4efbfdSBarry Smith PetscFunctionReturn(0); 505db4efbfdSBarry Smith } 506db4efbfdSBarry Smith 507db4efbfdSBarry Smith #undef __FUNCT__ 508db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 5090481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 510db4efbfdSBarry Smith { 511db4efbfdSBarry Smith PetscFunctionBegin; 512c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 5131bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 514719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 515db4efbfdSBarry Smith PetscFunctionReturn(0); 516db4efbfdSBarry Smith } 517db4efbfdSBarry Smith 518db4efbfdSBarry Smith #undef __FUNCT__ 519db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 5200481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 521db4efbfdSBarry Smith { 522db4efbfdSBarry Smith PetscFunctionBegin; 523b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 524c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 525719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 526db4efbfdSBarry Smith PetscFunctionReturn(0); 527db4efbfdSBarry Smith } 528db4efbfdSBarry Smith 529db4efbfdSBarry Smith #undef __FUNCT__ 530db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 5318cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 532db4efbfdSBarry Smith { 533db4efbfdSBarry Smith PetscErrorCode ierr; 534db4efbfdSBarry Smith 535db4efbfdSBarry Smith PetscFunctionBegin; 536ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 537db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 538db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 539db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 540db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 541db4efbfdSBarry Smith } else { 542db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 543db4efbfdSBarry Smith } 544d5f3da31SBarry Smith (*fact)->factortype = ftype; 545db4efbfdSBarry Smith PetscFunctionReturn(0); 546db4efbfdSBarry Smith } 547db4efbfdSBarry Smith 548289bc588SBarry Smith /* ------------------------------------------------------------------*/ 5494a2ae208SSatish Balay #undef __FUNCT__ 55041f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 55141f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 552289bc588SBarry Smith { 553c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 554d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 555d9ca1df4SBarry Smith const PetscScalar *b; 556dfbe8321SBarry Smith PetscErrorCode ierr; 557d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 558c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 559289bc588SBarry Smith 5603a40ed3dSBarry Smith PetscFunctionBegin; 561c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 562289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 56371044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 5642dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 565289bc588SBarry Smith } 5661ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 567d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 568b965ef7fSBarry Smith its = its*lits; 569e32f2f54SBarry 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); 570289bc588SBarry Smith while (its--) { 571fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 572289bc588SBarry Smith for (i=0; i<m; i++) { 5738b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 57455a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 575289bc588SBarry Smith } 576289bc588SBarry Smith } 577fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 578289bc588SBarry Smith for (i=m-1; i>=0; i--) { 5798b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 58055a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 581289bc588SBarry Smith } 582289bc588SBarry Smith } 583289bc588SBarry Smith } 584d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 5851ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5863a40ed3dSBarry Smith PetscFunctionReturn(0); 587289bc588SBarry Smith } 588289bc588SBarry Smith 589289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5904a2ae208SSatish Balay #undef __FUNCT__ 5914a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 592dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 593289bc588SBarry Smith { 594c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 595d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 596d9ca1df4SBarry Smith PetscScalar *y; 597dfbe8321SBarry Smith PetscErrorCode ierr; 5980805154bSBarry Smith PetscBLASInt m, n,_One=1; 599ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 6003a40ed3dSBarry Smith 6013a40ed3dSBarry Smith PetscFunctionBegin; 602c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 603c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 604d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 605d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6061ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6078b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 608d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6091ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 610dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 6113a40ed3dSBarry Smith PetscFunctionReturn(0); 612289bc588SBarry Smith } 613800995b7SMatthew Knepley 6144a2ae208SSatish Balay #undef __FUNCT__ 6154a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 616dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 617289bc588SBarry Smith { 618c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 619d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 620dfbe8321SBarry Smith PetscErrorCode ierr; 6210805154bSBarry Smith PetscBLASInt m, n, _One=1; 622d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 6233a40ed3dSBarry Smith 6243a40ed3dSBarry Smith PetscFunctionBegin; 625c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 626c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 627d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 628d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6291ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6308b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 631d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6321ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 633dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 6343a40ed3dSBarry Smith PetscFunctionReturn(0); 635289bc588SBarry Smith } 6366ee01492SSatish Balay 6374a2ae208SSatish Balay #undef __FUNCT__ 6384a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 639dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 640289bc588SBarry Smith { 641c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 642d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 643d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 644dfbe8321SBarry Smith PetscErrorCode ierr; 6450805154bSBarry Smith PetscBLASInt m, n, _One=1; 6463a40ed3dSBarry Smith 6473a40ed3dSBarry Smith PetscFunctionBegin; 648c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 649c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 650d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 651600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 652d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6531ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6548b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 655d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6561ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 657dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6583a40ed3dSBarry Smith PetscFunctionReturn(0); 659289bc588SBarry Smith } 6606ee01492SSatish Balay 6614a2ae208SSatish Balay #undef __FUNCT__ 6624a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 663dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 664289bc588SBarry Smith { 665c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 666d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 667d9ca1df4SBarry Smith PetscScalar *y; 668dfbe8321SBarry Smith PetscErrorCode ierr; 6690805154bSBarry Smith PetscBLASInt m, n, _One=1; 67087828ca2SBarry Smith PetscScalar _DOne=1.0; 6713a40ed3dSBarry Smith 6723a40ed3dSBarry Smith PetscFunctionBegin; 673c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 674c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 675d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 676600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 677d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6781ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6798b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 680d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6811ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 682dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6833a40ed3dSBarry Smith PetscFunctionReturn(0); 684289bc588SBarry Smith } 685289bc588SBarry Smith 686289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6874a2ae208SSatish Balay #undef __FUNCT__ 6884a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 68913f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 690289bc588SBarry Smith { 691c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 69287828ca2SBarry Smith PetscScalar *v; 6936849ba73SBarry Smith PetscErrorCode ierr; 69413f74950SBarry Smith PetscInt i; 69567e560aaSBarry Smith 6963a40ed3dSBarry Smith PetscFunctionBegin; 697d0f46423SBarry Smith *ncols = A->cmap->n; 698289bc588SBarry Smith if (cols) { 699854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 700d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 701289bc588SBarry Smith } 702289bc588SBarry Smith if (vals) { 703854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 704289bc588SBarry Smith v = mat->v + row; 705d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 706289bc588SBarry Smith } 7073a40ed3dSBarry Smith PetscFunctionReturn(0); 708289bc588SBarry Smith } 7096ee01492SSatish Balay 7104a2ae208SSatish Balay #undef __FUNCT__ 7114a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 71213f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 713289bc588SBarry Smith { 714dfbe8321SBarry Smith PetscErrorCode ierr; 7156e111a19SKarl Rupp 716606d414cSSatish Balay PetscFunctionBegin; 717606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 718606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 7193a40ed3dSBarry Smith PetscFunctionReturn(0); 720289bc588SBarry Smith } 721289bc588SBarry Smith /* ----------------------------------------------------------------*/ 7224a2ae208SSatish Balay #undef __FUNCT__ 7234a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 72413f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 725289bc588SBarry Smith { 726c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 72713f74950SBarry Smith PetscInt i,j,idx=0; 728d6dfbf8fSBarry Smith 7293a40ed3dSBarry Smith PetscFunctionBegin; 730289bc588SBarry Smith if (!mat->roworiented) { 731dbb450caSBarry Smith if (addv == INSERT_VALUES) { 732289bc588SBarry Smith for (j=0; j<n; j++) { 733cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7342515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 735e32f2f54SBarry 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); 73658804f6dSBarry Smith #endif 737289bc588SBarry Smith for (i=0; i<m; i++) { 738cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7392515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 740e32f2f54SBarry 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); 74158804f6dSBarry Smith #endif 742cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 743289bc588SBarry Smith } 744289bc588SBarry Smith } 7453a40ed3dSBarry Smith } else { 746289bc588SBarry Smith for (j=0; j<n; j++) { 747cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7482515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 749e32f2f54SBarry 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); 75058804f6dSBarry Smith #endif 751289bc588SBarry Smith for (i=0; i<m; i++) { 752cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7532515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 754e32f2f54SBarry 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); 75558804f6dSBarry Smith #endif 756cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 757289bc588SBarry Smith } 758289bc588SBarry Smith } 759289bc588SBarry Smith } 7603a40ed3dSBarry Smith } else { 761dbb450caSBarry Smith if (addv == INSERT_VALUES) { 762e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 763cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7642515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 765e32f2f54SBarry 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); 76658804f6dSBarry Smith #endif 767e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 768cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7692515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 770e32f2f54SBarry 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); 77158804f6dSBarry Smith #endif 772cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 773e8d4e0b9SBarry Smith } 774e8d4e0b9SBarry Smith } 7753a40ed3dSBarry Smith } else { 776289bc588SBarry Smith for (i=0; i<m; i++) { 777cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7782515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 779e32f2f54SBarry 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); 78058804f6dSBarry Smith #endif 781289bc588SBarry Smith for (j=0; j<n; j++) { 782cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7832515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 784e32f2f54SBarry 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); 78558804f6dSBarry Smith #endif 786cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 787289bc588SBarry Smith } 788289bc588SBarry Smith } 789289bc588SBarry Smith } 790e8d4e0b9SBarry Smith } 7913a40ed3dSBarry Smith PetscFunctionReturn(0); 792289bc588SBarry Smith } 793e8d4e0b9SBarry Smith 7944a2ae208SSatish Balay #undef __FUNCT__ 7954a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 79613f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 797ae80bb75SLois Curfman McInnes { 798ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 79913f74950SBarry Smith PetscInt i,j; 800ae80bb75SLois Curfman McInnes 8013a40ed3dSBarry Smith PetscFunctionBegin; 802ae80bb75SLois Curfman McInnes /* row-oriented output */ 803ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 80497e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 805e32f2f54SBarry 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); 806ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 8076f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 808e32f2f54SBarry 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); 80997e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 810ae80bb75SLois Curfman McInnes } 811ae80bb75SLois Curfman McInnes } 8123a40ed3dSBarry Smith PetscFunctionReturn(0); 813ae80bb75SLois Curfman McInnes } 814ae80bb75SLois Curfman McInnes 815289bc588SBarry Smith /* -----------------------------------------------------------------*/ 816289bc588SBarry Smith 8174a2ae208SSatish Balay #undef __FUNCT__ 8185bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 819112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 820aabbc4fbSShri Abhyankar { 821aabbc4fbSShri Abhyankar Mat_SeqDense *a; 822aabbc4fbSShri Abhyankar PetscErrorCode ierr; 823aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 824aabbc4fbSShri Abhyankar int fd; 825aabbc4fbSShri Abhyankar PetscMPIInt size; 826aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 827aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 828ce94432eSBarry Smith MPI_Comm comm; 829aabbc4fbSShri Abhyankar 830aabbc4fbSShri Abhyankar PetscFunctionBegin; 831ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 832aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 833aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 834aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 835aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 836aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 837aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 838aabbc4fbSShri Abhyankar 839aabbc4fbSShri Abhyankar /* set global size if not set already*/ 840aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 841aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 842aabbc4fbSShri Abhyankar } else { 843aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 844aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 845aabbc4fbSShri 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); 846aabbc4fbSShri Abhyankar } 8470298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 848aabbc4fbSShri Abhyankar 849aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 850aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 851aabbc4fbSShri Abhyankar v = a->v; 852aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 853aabbc4fbSShri Abhyankar from row major to column major */ 854854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 855aabbc4fbSShri Abhyankar /* read in nonzero values */ 856aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 857aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 858aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 859aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 860aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 861aabbc4fbSShri Abhyankar } 862aabbc4fbSShri Abhyankar } 863aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 864aabbc4fbSShri Abhyankar } else { 865aabbc4fbSShri Abhyankar /* read row lengths */ 866854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 867aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 868aabbc4fbSShri Abhyankar 869aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 870aabbc4fbSShri Abhyankar v = a->v; 871aabbc4fbSShri Abhyankar 872aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 873854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 874aabbc4fbSShri Abhyankar cols = scols; 875aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 876854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 877aabbc4fbSShri Abhyankar vals = svals; 878aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 879aabbc4fbSShri Abhyankar 880aabbc4fbSShri Abhyankar /* insert into matrix */ 881aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 882aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 883aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 884aabbc4fbSShri Abhyankar } 885aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 886aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 887aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 888aabbc4fbSShri Abhyankar } 889aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 890aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 891aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 892aabbc4fbSShri Abhyankar } 893aabbc4fbSShri Abhyankar 894aabbc4fbSShri Abhyankar #undef __FUNCT__ 8954a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 8966849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 897289bc588SBarry Smith { 898932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 899dfbe8321SBarry Smith PetscErrorCode ierr; 90013f74950SBarry Smith PetscInt i,j; 9012dcb1b2aSMatthew Knepley const char *name; 90287828ca2SBarry Smith PetscScalar *v; 903f3ef73ceSBarry Smith PetscViewerFormat format; 9045f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 905ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 9065f481a85SSatish Balay #endif 907932b0c3eSLois Curfman McInnes 9083a40ed3dSBarry Smith PetscFunctionBegin; 909b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 910456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 9113a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 912fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 913d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 914d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 91544cd7ae7SLois Curfman McInnes v = a->v + i; 91677431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 917d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 918aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 919329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 92057622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 921329f5518SBarry Smith } else if (PetscRealPart(*v)) { 92257622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 9236831982aSBarry Smith } 92480cd9d93SLois Curfman McInnes #else 9256831982aSBarry Smith if (*v) { 92657622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 9276831982aSBarry Smith } 92880cd9d93SLois Curfman McInnes #endif 9291b807ce4Svictorle v += a->lda; 93080cd9d93SLois Curfman McInnes } 931b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 93280cd9d93SLois Curfman McInnes } 933d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 9343a40ed3dSBarry Smith } else { 935d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 936aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 93747989497SBarry Smith /* determine if matrix has all real values */ 93847989497SBarry Smith v = a->v; 939d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 940ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 94147989497SBarry Smith } 94247989497SBarry Smith #endif 943fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 9443a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 945d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 946d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 947fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 948ffac6cdbSBarry Smith } 949ffac6cdbSBarry Smith 950d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 951932b0c3eSLois Curfman McInnes v = a->v + i; 952d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 953aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 95447989497SBarry Smith if (allreal) { 955c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 95647989497SBarry Smith } else { 957c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 95847989497SBarry Smith } 959289bc588SBarry Smith #else 960c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 961289bc588SBarry Smith #endif 9621b807ce4Svictorle v += a->lda; 963289bc588SBarry Smith } 964b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 965289bc588SBarry Smith } 966fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 967b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 968ffac6cdbSBarry Smith } 969d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 970da3a660dSBarry Smith } 971b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 9723a40ed3dSBarry Smith PetscFunctionReturn(0); 973289bc588SBarry Smith } 974289bc588SBarry Smith 9754a2ae208SSatish Balay #undef __FUNCT__ 9764a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 9776849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 978932b0c3eSLois Curfman McInnes { 979932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9806849ba73SBarry Smith PetscErrorCode ierr; 98113f74950SBarry Smith int fd; 982d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 983f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 984f4403165SShri Abhyankar PetscViewerFormat format; 985932b0c3eSLois Curfman McInnes 9863a40ed3dSBarry Smith PetscFunctionBegin; 987b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 98890ace30eSBarry Smith 989f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 990f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 991f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 992785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 9932205254eSKarl Rupp 994f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 995f4403165SShri Abhyankar col_lens[1] = m; 996f4403165SShri Abhyankar col_lens[2] = n; 997f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 9982205254eSKarl Rupp 999f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1000f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1001f4403165SShri Abhyankar 1002f4403165SShri Abhyankar /* write out matrix, by rows */ 1003854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1004f4403165SShri Abhyankar v = a->v; 1005f4403165SShri Abhyankar for (j=0; j<n; j++) { 1006f4403165SShri Abhyankar for (i=0; i<m; i++) { 1007f4403165SShri Abhyankar vals[j + i*n] = *v++; 1008f4403165SShri Abhyankar } 1009f4403165SShri Abhyankar } 1010f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1011f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1012f4403165SShri Abhyankar } else { 1013854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 10142205254eSKarl Rupp 10150700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1016932b0c3eSLois Curfman McInnes col_lens[1] = m; 1017932b0c3eSLois Curfman McInnes col_lens[2] = n; 1018932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1019932b0c3eSLois Curfman McInnes 1020932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1021932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 10226f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1023932b0c3eSLois Curfman McInnes 1024932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1025932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1026932b0c3eSLois Curfman McInnes ict = 0; 1027932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1028932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1029932b0c3eSLois Curfman McInnes } 10306f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1031606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1032932b0c3eSLois Curfman McInnes 1033932b0c3eSLois Curfman McInnes /* store nonzero values */ 1034854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1035932b0c3eSLois Curfman McInnes ict = 0; 1036932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1037932b0c3eSLois Curfman McInnes v = a->v + i; 1038932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 10391b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1040932b0c3eSLois Curfman McInnes } 1041932b0c3eSLois Curfman McInnes } 10426f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1043606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1044f4403165SShri Abhyankar } 10453a40ed3dSBarry Smith PetscFunctionReturn(0); 1046932b0c3eSLois Curfman McInnes } 1047932b0c3eSLois Curfman McInnes 10489804daf3SBarry Smith #include <petscdraw.h> 10494a2ae208SSatish Balay #undef __FUNCT__ 10504a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 1051dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1052f1af5d2fSBarry Smith { 1053f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1054f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10556849ba73SBarry Smith PetscErrorCode ierr; 1056d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 105787828ca2SBarry Smith PetscScalar *v = a->v; 1058b0a32e0cSBarry Smith PetscViewer viewer; 1059b0a32e0cSBarry Smith PetscDraw popup; 1060329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 1061f3ef73ceSBarry Smith PetscViewerFormat format; 1062f1af5d2fSBarry Smith 1063f1af5d2fSBarry Smith PetscFunctionBegin; 1064f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1065b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1066b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1067f1af5d2fSBarry Smith 1068f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1069fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1070f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1071b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1072f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1073f1af5d2fSBarry Smith x_l = j; 1074f1af5d2fSBarry Smith x_r = x_l + 1.0; 1075f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1076f1af5d2fSBarry Smith y_l = m - i - 1.0; 1077f1af5d2fSBarry Smith y_r = y_l + 1.0; 1078329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1079b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1080329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1081b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1082f1af5d2fSBarry Smith } else { 1083f1af5d2fSBarry Smith continue; 1084f1af5d2fSBarry Smith } 1085b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1086f1af5d2fSBarry Smith } 1087f1af5d2fSBarry Smith } 1088f1af5d2fSBarry Smith } else { 1089f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1090f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1091f1af5d2fSBarry Smith for (i = 0; i < m*n; i++) { 1092f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1093f1af5d2fSBarry Smith } 1094b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 1095b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1096b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 1097f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1098f1af5d2fSBarry Smith x_l = j; 1099f1af5d2fSBarry Smith x_r = x_l + 1.0; 1100f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1101f1af5d2fSBarry Smith y_l = m - i - 1.0; 1102f1af5d2fSBarry Smith y_r = y_l + 1.0; 1103b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 1104b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1105f1af5d2fSBarry Smith } 1106f1af5d2fSBarry Smith } 1107f1af5d2fSBarry Smith } 1108f1af5d2fSBarry Smith PetscFunctionReturn(0); 1109f1af5d2fSBarry Smith } 1110f1af5d2fSBarry Smith 11114a2ae208SSatish Balay #undef __FUNCT__ 11124a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1113dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1114f1af5d2fSBarry Smith { 1115b0a32e0cSBarry Smith PetscDraw draw; 1116ace3abfcSBarry Smith PetscBool isnull; 1117329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1118dfbe8321SBarry Smith PetscErrorCode ierr; 1119f1af5d2fSBarry Smith 1120f1af5d2fSBarry Smith PetscFunctionBegin; 1121b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1122b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1123abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1124f1af5d2fSBarry Smith 1125f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1126d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1127f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1128b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1129b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 11300298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1131f1af5d2fSBarry Smith PetscFunctionReturn(0); 1132f1af5d2fSBarry Smith } 1133f1af5d2fSBarry Smith 11344a2ae208SSatish Balay #undef __FUNCT__ 11354a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1136dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1137932b0c3eSLois Curfman McInnes { 1138dfbe8321SBarry Smith PetscErrorCode ierr; 1139ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1140932b0c3eSLois Curfman McInnes 11413a40ed3dSBarry Smith PetscFunctionBegin; 1142251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1143251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1144251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 11450f5bd95cSBarry Smith 1146c45a1595SBarry Smith if (iascii) { 1147c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 11480f5bd95cSBarry Smith } else if (isbinary) { 11493a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1150f1af5d2fSBarry Smith } else if (isdraw) { 1151f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1152932b0c3eSLois Curfman McInnes } 11533a40ed3dSBarry Smith PetscFunctionReturn(0); 1154932b0c3eSLois Curfman McInnes } 1155289bc588SBarry Smith 11564a2ae208SSatish Balay #undef __FUNCT__ 11574a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1158dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1159289bc588SBarry Smith { 1160ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1161dfbe8321SBarry Smith PetscErrorCode ierr; 116290f02eecSBarry Smith 11633a40ed3dSBarry Smith PetscFunctionBegin; 1164aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1165d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1166a5a9c739SBarry Smith #endif 116705b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 11686857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1169bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1170dbd8c25aSHong Zhang 1171dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1172bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1173bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 11748baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 11758baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 11768baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 11778baccfbdSHong Zhang #endif 1178bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1179bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1180bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1181bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 11823bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 11833bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 11843bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 11853a40ed3dSBarry Smith PetscFunctionReturn(0); 1186289bc588SBarry Smith } 1187289bc588SBarry Smith 11884a2ae208SSatish Balay #undef __FUNCT__ 11894a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1190fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1191289bc588SBarry Smith { 1192c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 11936849ba73SBarry Smith PetscErrorCode ierr; 119413f74950SBarry Smith PetscInt k,j,m,n,M; 119587828ca2SBarry Smith PetscScalar *v,tmp; 119648b35521SBarry Smith 11973a40ed3dSBarry Smith PetscFunctionBegin; 1198d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1199e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1200e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1201e7e72b3dSBarry Smith else { 1202d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1203289bc588SBarry Smith for (k=0; k<j; k++) { 12041b807ce4Svictorle tmp = v[j + k*M]; 12051b807ce4Svictorle v[j + k*M] = v[k + j*M]; 12061b807ce4Svictorle v[k + j*M] = tmp; 1207289bc588SBarry Smith } 1208289bc588SBarry Smith } 1209d64ed03dSBarry Smith } 12103a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1211d3e5ee88SLois Curfman McInnes Mat tmat; 1212ec8511deSBarry Smith Mat_SeqDense *tmatd; 121387828ca2SBarry Smith PetscScalar *v2; 1214ea709b57SSatish Balay 1215fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1216ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1217d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 12187adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 12190298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1220fc4dec0aSBarry Smith } else { 1221fc4dec0aSBarry Smith tmat = *matout; 1222fc4dec0aSBarry Smith } 1223ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 12240de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1225d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 12261b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1227d3e5ee88SLois Curfman McInnes } 12286d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 12296d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1230d3e5ee88SLois Curfman McInnes *matout = tmat; 123148b35521SBarry Smith } 12323a40ed3dSBarry Smith PetscFunctionReturn(0); 1233289bc588SBarry Smith } 1234289bc588SBarry Smith 12354a2ae208SSatish Balay #undef __FUNCT__ 12364a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1237ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1238289bc588SBarry Smith { 1239c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1240c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 124113f74950SBarry Smith PetscInt i,j; 1242a2ea699eSBarry Smith PetscScalar *v1,*v2; 12439ea5d5aeSSatish Balay 12443a40ed3dSBarry Smith PetscFunctionBegin; 1245d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1246d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1247d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 12481b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1249d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 12503a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 12511b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 12521b807ce4Svictorle } 1253289bc588SBarry Smith } 125477c4ece6SBarry Smith *flg = PETSC_TRUE; 12553a40ed3dSBarry Smith PetscFunctionReturn(0); 1256289bc588SBarry Smith } 1257289bc588SBarry Smith 12584a2ae208SSatish Balay #undef __FUNCT__ 12594a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1260dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1261289bc588SBarry Smith { 1262c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1263dfbe8321SBarry Smith PetscErrorCode ierr; 126413f74950SBarry Smith PetscInt i,n,len; 126587828ca2SBarry Smith PetscScalar *x,zero = 0.0; 126644cd7ae7SLois Curfman McInnes 12673a40ed3dSBarry Smith PetscFunctionBegin; 12682dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 12697a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 12701ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1271d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1272e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 127344cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 12741b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1275289bc588SBarry Smith } 12761ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 12773a40ed3dSBarry Smith PetscFunctionReturn(0); 1278289bc588SBarry Smith } 1279289bc588SBarry Smith 12804a2ae208SSatish Balay #undef __FUNCT__ 12814a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1282dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1283289bc588SBarry Smith { 1284c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1285*f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1286*f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1287dfbe8321SBarry Smith PetscErrorCode ierr; 1288d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 128955659b69SBarry Smith 12903a40ed3dSBarry Smith PetscFunctionBegin; 129128988994SBarry Smith if (ll) { 12927a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1293*f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1294e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1295da3a660dSBarry Smith for (i=0; i<m; i++) { 1296da3a660dSBarry Smith x = l[i]; 1297da3a660dSBarry Smith v = mat->v + i; 1298da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1299da3a660dSBarry Smith } 1300*f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1301efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1302da3a660dSBarry Smith } 130328988994SBarry Smith if (rr) { 13047a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1305*f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1306e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1307da3a660dSBarry Smith for (i=0; i<n; i++) { 1308da3a660dSBarry Smith x = r[i]; 1309da3a660dSBarry Smith v = mat->v + i*m; 13102205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1311da3a660dSBarry Smith } 1312*f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1313efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1314da3a660dSBarry Smith } 13153a40ed3dSBarry Smith PetscFunctionReturn(0); 1316289bc588SBarry Smith } 1317289bc588SBarry Smith 13184a2ae208SSatish Balay #undef __FUNCT__ 13194a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1320dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1321289bc588SBarry Smith { 1322c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 132387828ca2SBarry Smith PetscScalar *v = mat->v; 1324329f5518SBarry Smith PetscReal sum = 0.0; 1325d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1326efee365bSSatish Balay PetscErrorCode ierr; 132755659b69SBarry Smith 13283a40ed3dSBarry Smith PetscFunctionBegin; 1329289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1330a5ce6ee0Svictorle if (lda>m) { 1331d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1332a5ce6ee0Svictorle v = mat->v+j*lda; 1333a5ce6ee0Svictorle for (i=0; i<m; i++) { 1334a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1335a5ce6ee0Svictorle } 1336a5ce6ee0Svictorle } 1337a5ce6ee0Svictorle } else { 1338d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1339329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1340289bc588SBarry Smith } 1341a5ce6ee0Svictorle } 13428f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1343dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13443a40ed3dSBarry Smith } else if (type == NORM_1) { 1345064f8208SBarry Smith *nrm = 0.0; 1346d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 13471b807ce4Svictorle v = mat->v + j*mat->lda; 1348289bc588SBarry Smith sum = 0.0; 1349d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 135033a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1351289bc588SBarry Smith } 1352064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1353289bc588SBarry Smith } 1354d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13553a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1356064f8208SBarry Smith *nrm = 0.0; 1357d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1358289bc588SBarry Smith v = mat->v + j; 1359289bc588SBarry Smith sum = 0.0; 1360d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 13611b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1362289bc588SBarry Smith } 1363064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1364289bc588SBarry Smith } 1365d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1366e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 13673a40ed3dSBarry Smith PetscFunctionReturn(0); 1368289bc588SBarry Smith } 1369289bc588SBarry Smith 13704a2ae208SSatish Balay #undef __FUNCT__ 13714a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1372ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1373289bc588SBarry Smith { 1374c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 137563ba0a88SBarry Smith PetscErrorCode ierr; 137667e560aaSBarry Smith 13773a40ed3dSBarry Smith PetscFunctionBegin; 1378b5a2b587SKris Buschelman switch (op) { 1379b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 13804e0d8c25SBarry Smith aij->roworiented = flg; 1381b5a2b587SKris Buschelman break; 1382512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1383b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 13843971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 13854e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 138613fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1387b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1388b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 13895021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 13905021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 13915021d80fSJed Brown break; 13925021d80fSJed Brown case MAT_SPD: 139377e54ba9SKris Buschelman case MAT_SYMMETRIC: 139477e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 13959a4540c5SBarry Smith case MAT_HERMITIAN: 13969a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 13975021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 139877e54ba9SKris Buschelman break; 1399b5a2b587SKris Buschelman default: 1400e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 14013a40ed3dSBarry Smith } 14023a40ed3dSBarry Smith PetscFunctionReturn(0); 1403289bc588SBarry Smith } 1404289bc588SBarry Smith 14054a2ae208SSatish Balay #undef __FUNCT__ 14064a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1407dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 14086f0a148fSBarry Smith { 1409ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 14106849ba73SBarry Smith PetscErrorCode ierr; 1411d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 14123a40ed3dSBarry Smith 14133a40ed3dSBarry Smith PetscFunctionBegin; 1414a5ce6ee0Svictorle if (lda>m) { 1415d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1416a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1417a5ce6ee0Svictorle } 1418a5ce6ee0Svictorle } else { 1419d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1420a5ce6ee0Svictorle } 14213a40ed3dSBarry Smith PetscFunctionReturn(0); 14226f0a148fSBarry Smith } 14236f0a148fSBarry Smith 14244a2ae208SSatish Balay #undef __FUNCT__ 14254a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 14262b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 14276f0a148fSBarry Smith { 142897b48c8fSBarry Smith PetscErrorCode ierr; 1429ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1430b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 143197b48c8fSBarry Smith PetscScalar *slot,*bb; 143297b48c8fSBarry Smith const PetscScalar *xx; 143355659b69SBarry Smith 14343a40ed3dSBarry Smith PetscFunctionBegin; 1435b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1436b9679d65SBarry Smith for (i=0; i<N; i++) { 1437b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1438b9679d65SBarry 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); 1439b9679d65SBarry Smith } 1440b9679d65SBarry Smith #endif 1441b9679d65SBarry Smith 144297b48c8fSBarry Smith /* fix right hand side if needed */ 144397b48c8fSBarry Smith if (x && b) { 144497b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 144597b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 14462205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 144797b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 144897b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 144997b48c8fSBarry Smith } 145097b48c8fSBarry Smith 14516f0a148fSBarry Smith for (i=0; i<N; i++) { 14526f0a148fSBarry Smith slot = l->v + rows[i]; 1453b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 14546f0a148fSBarry Smith } 1455f4df32b1SMatthew Knepley if (diag != 0.0) { 1456b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 14576f0a148fSBarry Smith for (i=0; i<N; i++) { 1458b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1459f4df32b1SMatthew Knepley *slot = diag; 14606f0a148fSBarry Smith } 14616f0a148fSBarry Smith } 14623a40ed3dSBarry Smith PetscFunctionReturn(0); 14636f0a148fSBarry Smith } 1464557bce09SLois Curfman McInnes 14654a2ae208SSatish Balay #undef __FUNCT__ 14668c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 14678c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 146864e87e97SBarry Smith { 1469c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14703a40ed3dSBarry Smith 14713a40ed3dSBarry Smith PetscFunctionBegin; 1472e32f2f54SBarry 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"); 147364e87e97SBarry Smith *array = mat->v; 14743a40ed3dSBarry Smith PetscFunctionReturn(0); 147564e87e97SBarry Smith } 14760754003eSLois Curfman McInnes 14774a2ae208SSatish Balay #undef __FUNCT__ 14788c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 14798c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1480ff14e315SSatish Balay { 14813a40ed3dSBarry Smith PetscFunctionBegin; 148209b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 14833a40ed3dSBarry Smith PetscFunctionReturn(0); 1484ff14e315SSatish Balay } 14850754003eSLois Curfman McInnes 14864a2ae208SSatish Balay #undef __FUNCT__ 14878c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1488dec5eb66SMatthew G Knepley /*@C 14898c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 149073a71a0fSBarry Smith 149173a71a0fSBarry Smith Not Collective 149273a71a0fSBarry Smith 149373a71a0fSBarry Smith Input Parameter: 1494579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 149573a71a0fSBarry Smith 149673a71a0fSBarry Smith Output Parameter: 149773a71a0fSBarry Smith . array - pointer to the data 149873a71a0fSBarry Smith 149973a71a0fSBarry Smith Level: intermediate 150073a71a0fSBarry Smith 15018c778c55SBarry Smith .seealso: MatDenseRestoreArray() 150273a71a0fSBarry Smith @*/ 15038c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 150473a71a0fSBarry Smith { 150573a71a0fSBarry Smith PetscErrorCode ierr; 150673a71a0fSBarry Smith 150773a71a0fSBarry Smith PetscFunctionBegin; 15088c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 150973a71a0fSBarry Smith PetscFunctionReturn(0); 151073a71a0fSBarry Smith } 151173a71a0fSBarry Smith 151273a71a0fSBarry Smith #undef __FUNCT__ 15138c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1514dec5eb66SMatthew G Knepley /*@C 1515579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 151673a71a0fSBarry Smith 151773a71a0fSBarry Smith Not Collective 151873a71a0fSBarry Smith 151973a71a0fSBarry Smith Input Parameters: 1520579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 152173a71a0fSBarry Smith . array - pointer to the data 152273a71a0fSBarry Smith 152373a71a0fSBarry Smith Level: intermediate 152473a71a0fSBarry Smith 15258c778c55SBarry Smith .seealso: MatDenseGetArray() 152673a71a0fSBarry Smith @*/ 15278c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 152873a71a0fSBarry Smith { 152973a71a0fSBarry Smith PetscErrorCode ierr; 153073a71a0fSBarry Smith 153173a71a0fSBarry Smith PetscFunctionBegin; 15328c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 153373a71a0fSBarry Smith PetscFunctionReturn(0); 153473a71a0fSBarry Smith } 153573a71a0fSBarry Smith 153673a71a0fSBarry Smith #undef __FUNCT__ 15374a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 153813f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 15390754003eSLois Curfman McInnes { 1540c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15416849ba73SBarry Smith PetscErrorCode ierr; 15425d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 15435d0c19d7SBarry Smith const PetscInt *irow,*icol; 154487828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 15450754003eSLois Curfman McInnes Mat newmat; 15460754003eSLois Curfman McInnes 15473a40ed3dSBarry Smith PetscFunctionBegin; 154878b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 154978b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1550e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1551e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 15520754003eSLois Curfman McInnes 1553182d2002SSatish Balay /* Check submatrixcall */ 1554182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 155513f74950SBarry Smith PetscInt n_cols,n_rows; 1556182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 155721a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1558f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1559c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 156021a2c019SBarry Smith } 1561182d2002SSatish Balay newmat = *B; 1562182d2002SSatish Balay } else { 15630754003eSLois Curfman McInnes /* Create and fill new matrix */ 1564ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1565f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 15667adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15670298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1568182d2002SSatish Balay } 1569182d2002SSatish Balay 1570182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1571182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1572182d2002SSatish Balay 1573182d2002SSatish Balay for (i=0; i<ncols; i++) { 15746de62eeeSBarry Smith av = v + mat->lda*icol[i]; 15752205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 15760754003eSLois Curfman McInnes } 1577182d2002SSatish Balay 1578182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 15796d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15806d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15810754003eSLois Curfman McInnes 15820754003eSLois Curfman McInnes /* Free work space */ 158378b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 158478b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1585182d2002SSatish Balay *B = newmat; 15863a40ed3dSBarry Smith PetscFunctionReturn(0); 15870754003eSLois Curfman McInnes } 15880754003eSLois Curfman McInnes 15894a2ae208SSatish Balay #undef __FUNCT__ 15904a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 159113f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1592905e6a2fSBarry Smith { 15936849ba73SBarry Smith PetscErrorCode ierr; 159413f74950SBarry Smith PetscInt i; 1595905e6a2fSBarry Smith 15963a40ed3dSBarry Smith PetscFunctionBegin; 1597905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1598854ce69bSBarry Smith ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr); 1599905e6a2fSBarry Smith } 1600905e6a2fSBarry Smith 1601905e6a2fSBarry Smith for (i=0; i<n; i++) { 16026a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1603905e6a2fSBarry Smith } 16043a40ed3dSBarry Smith PetscFunctionReturn(0); 1605905e6a2fSBarry Smith } 1606905e6a2fSBarry Smith 16074a2ae208SSatish Balay #undef __FUNCT__ 1608c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1609c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1610c0aa2d19SHong Zhang { 1611c0aa2d19SHong Zhang PetscFunctionBegin; 1612c0aa2d19SHong Zhang PetscFunctionReturn(0); 1613c0aa2d19SHong Zhang } 1614c0aa2d19SHong Zhang 1615c0aa2d19SHong Zhang #undef __FUNCT__ 1616c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1617c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1618c0aa2d19SHong Zhang { 1619c0aa2d19SHong Zhang PetscFunctionBegin; 1620c0aa2d19SHong Zhang PetscFunctionReturn(0); 1621c0aa2d19SHong Zhang } 1622c0aa2d19SHong Zhang 1623c0aa2d19SHong Zhang #undef __FUNCT__ 16244a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1625dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 16264b0e389bSBarry Smith { 16274b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 16286849ba73SBarry Smith PetscErrorCode ierr; 1629d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 16303a40ed3dSBarry Smith 16313a40ed3dSBarry Smith PetscFunctionBegin; 163233f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 163333f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1634cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 16353a40ed3dSBarry Smith PetscFunctionReturn(0); 16363a40ed3dSBarry Smith } 1637e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1638a5ce6ee0Svictorle if (lda1>m || lda2>m) { 16390dbb7854Svictorle for (j=0; j<n; j++) { 1640a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1641a5ce6ee0Svictorle } 1642a5ce6ee0Svictorle } else { 1643d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1644a5ce6ee0Svictorle } 1645273d9f13SBarry Smith PetscFunctionReturn(0); 1646273d9f13SBarry Smith } 1647273d9f13SBarry Smith 16484a2ae208SSatish Balay #undef __FUNCT__ 16494994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 16504994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A) 1651273d9f13SBarry Smith { 1652dfbe8321SBarry Smith PetscErrorCode ierr; 1653273d9f13SBarry Smith 1654273d9f13SBarry Smith PetscFunctionBegin; 1655273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 16563a40ed3dSBarry Smith PetscFunctionReturn(0); 16574b0e389bSBarry Smith } 16584b0e389bSBarry Smith 1659284134d9SBarry Smith #undef __FUNCT__ 1660ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1661ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1662ba337c44SJed Brown { 1663ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1664ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1665ba337c44SJed Brown PetscScalar *aa = a->v; 1666ba337c44SJed Brown 1667ba337c44SJed Brown PetscFunctionBegin; 1668ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1669ba337c44SJed Brown PetscFunctionReturn(0); 1670ba337c44SJed Brown } 1671ba337c44SJed Brown 1672ba337c44SJed Brown #undef __FUNCT__ 1673ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1674ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1675ba337c44SJed Brown { 1676ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1677ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1678ba337c44SJed Brown PetscScalar *aa = a->v; 1679ba337c44SJed Brown 1680ba337c44SJed Brown PetscFunctionBegin; 1681ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1682ba337c44SJed Brown PetscFunctionReturn(0); 1683ba337c44SJed Brown } 1684ba337c44SJed Brown 1685ba337c44SJed Brown #undef __FUNCT__ 1686ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1687ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1688ba337c44SJed Brown { 1689ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1690ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1691ba337c44SJed Brown PetscScalar *aa = a->v; 1692ba337c44SJed Brown 1693ba337c44SJed Brown PetscFunctionBegin; 1694ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1695ba337c44SJed Brown PetscFunctionReturn(0); 1696ba337c44SJed Brown } 1697284134d9SBarry Smith 1698a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1699a9fe9ddaSSatish Balay #undef __FUNCT__ 1700a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1701a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1702a9fe9ddaSSatish Balay { 1703a9fe9ddaSSatish Balay PetscErrorCode ierr; 1704a9fe9ddaSSatish Balay 1705a9fe9ddaSSatish Balay PetscFunctionBegin; 1706a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 17073ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1708a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 17093ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1710a9fe9ddaSSatish Balay } 17113ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1712a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 17133ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1714a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1715a9fe9ddaSSatish Balay } 1716a9fe9ddaSSatish Balay 1717a9fe9ddaSSatish Balay #undef __FUNCT__ 1718a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1719a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1720a9fe9ddaSSatish Balay { 1721ee16a9a1SHong Zhang PetscErrorCode ierr; 1722d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1723ee16a9a1SHong Zhang Mat Cmat; 1724a9fe9ddaSSatish Balay 1725ee16a9a1SHong Zhang PetscFunctionBegin; 1726e32f2f54SBarry 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); 1727ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1728ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1729ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 17300298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1731d73949e8SHong Zhang 1732ee16a9a1SHong Zhang *C = Cmat; 1733ee16a9a1SHong Zhang PetscFunctionReturn(0); 1734ee16a9a1SHong Zhang } 1735a9fe9ddaSSatish Balay 173698a3b096SSatish Balay #undef __FUNCT__ 1737a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1738a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1739a9fe9ddaSSatish Balay { 1740a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1741a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1742a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17430805154bSBarry Smith PetscBLASInt m,n,k; 1744a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1745c5df96a5SBarry Smith PetscErrorCode ierr; 1746a9fe9ddaSSatish Balay 1747a9fe9ddaSSatish Balay PetscFunctionBegin; 1748c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1749c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1750c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 17518b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1752a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1753a9fe9ddaSSatish Balay } 1754a9fe9ddaSSatish Balay 1755a9fe9ddaSSatish Balay #undef __FUNCT__ 175675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 175775648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1758a9fe9ddaSSatish Balay { 1759a9fe9ddaSSatish Balay PetscErrorCode ierr; 1760a9fe9ddaSSatish Balay 1761a9fe9ddaSSatish Balay PetscFunctionBegin; 1762a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 17633ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 176475648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 17653ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1766a9fe9ddaSSatish Balay } 17673ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 176875648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 17693ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1770a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1771a9fe9ddaSSatish Balay } 1772a9fe9ddaSSatish Balay 1773a9fe9ddaSSatish Balay #undef __FUNCT__ 177475648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 177575648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1776a9fe9ddaSSatish Balay { 1777ee16a9a1SHong Zhang PetscErrorCode ierr; 1778d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1779ee16a9a1SHong Zhang Mat Cmat; 1780a9fe9ddaSSatish Balay 1781ee16a9a1SHong Zhang PetscFunctionBegin; 1782e32f2f54SBarry 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); 1783ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1784ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1785ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 17860298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 17872205254eSKarl Rupp 1788ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 17892205254eSKarl Rupp 1790ee16a9a1SHong Zhang *C = Cmat; 1791ee16a9a1SHong Zhang PetscFunctionReturn(0); 1792ee16a9a1SHong Zhang } 1793a9fe9ddaSSatish Balay 1794a9fe9ddaSSatish Balay #undef __FUNCT__ 179575648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 179675648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1797a9fe9ddaSSatish Balay { 1798a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1799a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1800a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 18010805154bSBarry Smith PetscBLASInt m,n,k; 1802a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1803c5df96a5SBarry Smith PetscErrorCode ierr; 1804a9fe9ddaSSatish Balay 1805a9fe9ddaSSatish Balay PetscFunctionBegin; 1806c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1807c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1808c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 18092fbe02b9SBarry Smith /* 18102fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 18112fbe02b9SBarry Smith */ 18128b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1813a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1814a9fe9ddaSSatish Balay } 1815985db425SBarry Smith 1816985db425SBarry Smith #undef __FUNCT__ 1817985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1818985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1819985db425SBarry Smith { 1820985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1821985db425SBarry Smith PetscErrorCode ierr; 1822d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1823985db425SBarry Smith PetscScalar *x; 1824985db425SBarry Smith MatScalar *aa = a->v; 1825985db425SBarry Smith 1826985db425SBarry Smith PetscFunctionBegin; 1827e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1828985db425SBarry Smith 1829985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1830985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1831985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1832e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1833985db425SBarry Smith for (i=0; i<m; i++) { 1834985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1835985db425SBarry Smith for (j=1; j<n; j++) { 1836985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1837985db425SBarry Smith } 1838985db425SBarry Smith } 1839985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1840985db425SBarry Smith PetscFunctionReturn(0); 1841985db425SBarry Smith } 1842985db425SBarry Smith 1843985db425SBarry Smith #undef __FUNCT__ 1844985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1845985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1846985db425SBarry Smith { 1847985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1848985db425SBarry Smith PetscErrorCode ierr; 1849d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1850985db425SBarry Smith PetscScalar *x; 1851985db425SBarry Smith PetscReal atmp; 1852985db425SBarry Smith MatScalar *aa = a->v; 1853985db425SBarry Smith 1854985db425SBarry Smith PetscFunctionBegin; 1855e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1856985db425SBarry Smith 1857985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1858985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1859985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1860e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1861985db425SBarry Smith for (i=0; i<m; i++) { 18629189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1863985db425SBarry Smith for (j=1; j<n; j++) { 1864985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1865985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1866985db425SBarry Smith } 1867985db425SBarry Smith } 1868985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1869985db425SBarry Smith PetscFunctionReturn(0); 1870985db425SBarry Smith } 1871985db425SBarry Smith 1872985db425SBarry Smith #undef __FUNCT__ 1873985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1874985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1875985db425SBarry Smith { 1876985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1877985db425SBarry Smith PetscErrorCode ierr; 1878d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1879985db425SBarry Smith PetscScalar *x; 1880985db425SBarry Smith MatScalar *aa = a->v; 1881985db425SBarry Smith 1882985db425SBarry Smith PetscFunctionBegin; 1883e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1884985db425SBarry Smith 1885985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1886985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1887985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1888e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1889985db425SBarry Smith for (i=0; i<m; i++) { 1890985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1891985db425SBarry Smith for (j=1; j<n; j++) { 1892985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1893985db425SBarry Smith } 1894985db425SBarry Smith } 1895985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1896985db425SBarry Smith PetscFunctionReturn(0); 1897985db425SBarry Smith } 1898985db425SBarry Smith 18998d0534beSBarry Smith #undef __FUNCT__ 19008d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 19018d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 19028d0534beSBarry Smith { 19038d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 19048d0534beSBarry Smith PetscErrorCode ierr; 19058d0534beSBarry Smith PetscScalar *x; 19068d0534beSBarry Smith 19078d0534beSBarry Smith PetscFunctionBegin; 1908e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 19098d0534beSBarry Smith 19108d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1911d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 19128d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 19138d0534beSBarry Smith PetscFunctionReturn(0); 19148d0534beSBarry Smith } 19158d0534beSBarry Smith 19160716a85fSBarry Smith 19170716a85fSBarry Smith #undef __FUNCT__ 19180716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 19190716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 19200716a85fSBarry Smith { 19210716a85fSBarry Smith PetscErrorCode ierr; 19220716a85fSBarry Smith PetscInt i,j,m,n; 19230716a85fSBarry Smith PetscScalar *a; 19240716a85fSBarry Smith 19250716a85fSBarry Smith PetscFunctionBegin; 19260716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 19270716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 19288c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 19290716a85fSBarry Smith if (type == NORM_2) { 19300716a85fSBarry Smith for (i=0; i<n; i++) { 19310716a85fSBarry Smith for (j=0; j<m; j++) { 19320716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 19330716a85fSBarry Smith } 19340716a85fSBarry Smith a += m; 19350716a85fSBarry Smith } 19360716a85fSBarry Smith } else if (type == NORM_1) { 19370716a85fSBarry Smith for (i=0; i<n; i++) { 19380716a85fSBarry Smith for (j=0; j<m; j++) { 19390716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 19400716a85fSBarry Smith } 19410716a85fSBarry Smith a += m; 19420716a85fSBarry Smith } 19430716a85fSBarry Smith } else if (type == NORM_INFINITY) { 19440716a85fSBarry Smith for (i=0; i<n; i++) { 19450716a85fSBarry Smith for (j=0; j<m; j++) { 19460716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 19470716a85fSBarry Smith } 19480716a85fSBarry Smith a += m; 19490716a85fSBarry Smith } 1950ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 19518c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 19520716a85fSBarry Smith if (type == NORM_2) { 19538f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 19540716a85fSBarry Smith } 19550716a85fSBarry Smith PetscFunctionReturn(0); 19560716a85fSBarry Smith } 19570716a85fSBarry Smith 195873a71a0fSBarry Smith #undef __FUNCT__ 195973a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 196073a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 196173a71a0fSBarry Smith { 196273a71a0fSBarry Smith PetscErrorCode ierr; 196373a71a0fSBarry Smith PetscScalar *a; 196473a71a0fSBarry Smith PetscInt m,n,i; 196573a71a0fSBarry Smith 196673a71a0fSBarry Smith PetscFunctionBegin; 196773a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 19688c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 196973a71a0fSBarry Smith for (i=0; i<m*n; i++) { 197073a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 197173a71a0fSBarry Smith } 19728c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 197373a71a0fSBarry Smith PetscFunctionReturn(0); 197473a71a0fSBarry Smith } 197573a71a0fSBarry Smith 197673a71a0fSBarry Smith 1977289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1978a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 1979905e6a2fSBarry Smith MatGetRow_SeqDense, 1980905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1981905e6a2fSBarry Smith MatMult_SeqDense, 198297304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 19837c922b88SBarry Smith MatMultTranspose_SeqDense, 19847c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1985db4efbfdSBarry Smith 0, 1986db4efbfdSBarry Smith 0, 1987db4efbfdSBarry Smith 0, 1988db4efbfdSBarry Smith /* 10*/ 0, 1989905e6a2fSBarry Smith MatLUFactor_SeqDense, 1990905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 199141f059aeSBarry Smith MatSOR_SeqDense, 1992ec8511deSBarry Smith MatTranspose_SeqDense, 199397304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 1994905e6a2fSBarry Smith MatEqual_SeqDense, 1995905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1996905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1997905e6a2fSBarry Smith MatNorm_SeqDense, 1998c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 1999c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2000905e6a2fSBarry Smith MatSetOption_SeqDense, 2001905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2002d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2003db4efbfdSBarry Smith 0, 2004db4efbfdSBarry Smith 0, 2005db4efbfdSBarry Smith 0, 2006db4efbfdSBarry Smith 0, 20074994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2008273d9f13SBarry Smith 0, 2009905e6a2fSBarry Smith 0, 201073a71a0fSBarry Smith 0, 201173a71a0fSBarry Smith 0, 2012d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2013a5ae1ecdSBarry Smith 0, 2014a5ae1ecdSBarry Smith 0, 2015a5ae1ecdSBarry Smith 0, 2016a5ae1ecdSBarry Smith 0, 2017d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2018a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2019a5ae1ecdSBarry Smith 0, 20204b0e389bSBarry Smith MatGetValues_SeqDense, 2021a5ae1ecdSBarry Smith MatCopy_SeqDense, 2022d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2023a5ae1ecdSBarry Smith MatScale_SeqDense, 2024a5ae1ecdSBarry Smith 0, 2025a5ae1ecdSBarry Smith 0, 2026a5ae1ecdSBarry Smith 0, 202773a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2028a5ae1ecdSBarry Smith 0, 2029a5ae1ecdSBarry Smith 0, 2030a5ae1ecdSBarry Smith 0, 2031a5ae1ecdSBarry Smith 0, 2032d519adbfSMatthew Knepley /* 54*/ 0, 2033a5ae1ecdSBarry Smith 0, 2034a5ae1ecdSBarry Smith 0, 2035a5ae1ecdSBarry Smith 0, 2036a5ae1ecdSBarry Smith 0, 2037d519adbfSMatthew Knepley /* 59*/ 0, 2038e03a110bSBarry Smith MatDestroy_SeqDense, 2039e03a110bSBarry Smith MatView_SeqDense, 2040357abbc8SBarry Smith 0, 204197304618SKris Buschelman 0, 2042d519adbfSMatthew Knepley /* 64*/ 0, 204397304618SKris Buschelman 0, 204497304618SKris Buschelman 0, 204597304618SKris Buschelman 0, 204697304618SKris Buschelman 0, 2047d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 204897304618SKris Buschelman 0, 204997304618SKris Buschelman 0, 205097304618SKris Buschelman 0, 205197304618SKris Buschelman 0, 2052d519adbfSMatthew Knepley /* 74*/ 0, 205397304618SKris Buschelman 0, 205497304618SKris Buschelman 0, 205597304618SKris Buschelman 0, 205697304618SKris Buschelman 0, 2057d519adbfSMatthew Knepley /* 79*/ 0, 205897304618SKris Buschelman 0, 205997304618SKris Buschelman 0, 206097304618SKris Buschelman 0, 20615bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2062865e5f61SKris Buschelman 0, 20631cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2064865e5f61SKris Buschelman 0, 2065865e5f61SKris Buschelman 0, 2066865e5f61SKris Buschelman 0, 2067d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2068a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2069a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2070865e5f61SKris Buschelman 0, 2071865e5f61SKris Buschelman 0, 2072d519adbfSMatthew Knepley /* 94*/ 0, 20735df89d91SHong Zhang 0, 20745df89d91SHong Zhang 0, 20755df89d91SHong Zhang 0, 2076284134d9SBarry Smith 0, 2077d519adbfSMatthew Knepley /* 99*/ 0, 2078284134d9SBarry Smith 0, 2079284134d9SBarry Smith 0, 2080ba337c44SJed Brown MatConjugate_SeqDense, 2081f73d5cc4SBarry Smith 0, 2082ba337c44SJed Brown /*104*/ 0, 2083ba337c44SJed Brown MatRealPart_SeqDense, 2084ba337c44SJed Brown MatImaginaryPart_SeqDense, 2085985db425SBarry Smith 0, 2086985db425SBarry Smith 0, 208785e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2088985db425SBarry Smith 0, 20898d0534beSBarry Smith MatGetRowMin_SeqDense, 2090aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 2091aabbc4fbSShri Abhyankar 0, 2092aabbc4fbSShri Abhyankar /*114*/ 0, 2093aabbc4fbSShri Abhyankar 0, 2094aabbc4fbSShri Abhyankar 0, 2095aabbc4fbSShri Abhyankar 0, 2096aabbc4fbSShri Abhyankar 0, 2097aabbc4fbSShri Abhyankar /*119*/ 0, 2098aabbc4fbSShri Abhyankar 0, 2099aabbc4fbSShri Abhyankar 0, 21000716a85fSBarry Smith 0, 21010716a85fSBarry Smith 0, 21020716a85fSBarry Smith /*124*/ 0, 21035df89d91SHong Zhang MatGetColumnNorms_SeqDense, 21045df89d91SHong Zhang 0, 21055df89d91SHong Zhang 0, 21065df89d91SHong Zhang 0, 21075df89d91SHong Zhang /*129*/ 0, 210875648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 210975648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 211075648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 21113964eb88SJed Brown 0, 21123964eb88SJed Brown /*134*/ 0, 21133964eb88SJed Brown 0, 21143964eb88SJed Brown 0, 21153964eb88SJed Brown 0, 21163964eb88SJed Brown 0, 21173964eb88SJed Brown /*139*/ 0, 2118f9426fe0SMark Adams 0, 21193964eb88SJed Brown 0 2120985db425SBarry Smith }; 212190ace30eSBarry Smith 21224a2ae208SSatish Balay #undef __FUNCT__ 21234a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 21244b828684SBarry Smith /*@C 2125fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2126d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2127d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2128289bc588SBarry Smith 2129db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2130db81eaa0SLois Curfman McInnes 213120563c6bSBarry Smith Input Parameters: 2132db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 21330c775827SLois Curfman McInnes . m - number of rows 213418f449edSLois Curfman McInnes . n - number of columns 21350298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2136dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 213720563c6bSBarry Smith 213820563c6bSBarry Smith Output Parameter: 213944cd7ae7SLois Curfman McInnes . A - the matrix 214020563c6bSBarry Smith 2141b259b22eSLois Curfman McInnes Notes: 214218f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 214318f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 21440298fd71SBarry Smith set data=NULL. 214518f449edSLois Curfman McInnes 2146027ccd11SLois Curfman McInnes Level: intermediate 2147027ccd11SLois Curfman McInnes 2148dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2149d65003e9SLois Curfman McInnes 215069b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 215120563c6bSBarry Smith @*/ 21527087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2153289bc588SBarry Smith { 2154dfbe8321SBarry Smith PetscErrorCode ierr; 21553b2fbd54SBarry Smith 21563a40ed3dSBarry Smith PetscFunctionBegin; 2157f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2158f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2159273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2160273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2161273d9f13SBarry Smith PetscFunctionReturn(0); 2162273d9f13SBarry Smith } 2163273d9f13SBarry Smith 21644a2ae208SSatish Balay #undef __FUNCT__ 2165afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2166273d9f13SBarry Smith /*@C 2167273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2168273d9f13SBarry Smith 2169273d9f13SBarry Smith Collective on MPI_Comm 2170273d9f13SBarry Smith 2171273d9f13SBarry Smith Input Parameters: 21721c4f3114SJed Brown + B - the matrix 21730298fd71SBarry Smith - data - the array (or NULL) 2174273d9f13SBarry Smith 2175273d9f13SBarry Smith Notes: 2176273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2177273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2178284134d9SBarry Smith need not call this routine. 2179273d9f13SBarry Smith 2180273d9f13SBarry Smith Level: intermediate 2181273d9f13SBarry Smith 2182273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2183273d9f13SBarry Smith 218469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2185867c911aSBarry Smith 2186273d9f13SBarry Smith @*/ 21877087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2188273d9f13SBarry Smith { 21894ac538c5SBarry Smith PetscErrorCode ierr; 2190a23d5eceSKris Buschelman 2191a23d5eceSKris Buschelman PetscFunctionBegin; 21924ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2193a23d5eceSKris Buschelman PetscFunctionReturn(0); 2194a23d5eceSKris Buschelman } 2195a23d5eceSKris Buschelman 2196a23d5eceSKris Buschelman #undef __FUNCT__ 2197afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 21987087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2199a23d5eceSKris Buschelman { 2200273d9f13SBarry Smith Mat_SeqDense *b; 2201dfbe8321SBarry Smith PetscErrorCode ierr; 2202273d9f13SBarry Smith 2203273d9f13SBarry Smith PetscFunctionBegin; 2204273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2205a868139aSShri Abhyankar 220634ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 220734ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 220834ef9618SShri Abhyankar 2209273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 221086d161a7SShri Abhyankar b->Mmax = B->rmap->n; 221186d161a7SShri Abhyankar b->Nmax = B->cmap->n; 221286d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 221386d161a7SShri Abhyankar 22149e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 22159e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2216e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 22173bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 22182205254eSKarl Rupp 22199e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2220273d9f13SBarry Smith } else { /* user-allocated storage */ 22219e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2222273d9f13SBarry Smith b->v = data; 2223273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2224273d9f13SBarry Smith } 22250450473dSBarry Smith B->assembled = PETSC_TRUE; 2226273d9f13SBarry Smith PetscFunctionReturn(0); 2227273d9f13SBarry Smith } 2228273d9f13SBarry Smith 222965b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 22301b807ce4Svictorle #undef __FUNCT__ 22318baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 22328baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 22338baccfbdSHong Zhang { 2234d77f618aSHong Zhang Mat mat_elemental; 2235d77f618aSHong Zhang PetscErrorCode ierr; 2236d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2237d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2238d77f618aSHong Zhang 22398baccfbdSHong Zhang PetscFunctionBegin; 2240d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2241d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2242d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2243d77f618aSHong Zhang k = 0; 2244d77f618aSHong Zhang for (j=0; j<N; j++) { 2245d77f618aSHong Zhang cols[j] = j; 2246d77f618aSHong Zhang for (i=0; i<M; i++) { 2247d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2248d77f618aSHong Zhang } 2249d77f618aSHong Zhang } 2250d77f618aSHong Zhang for (i=0; i<M; i++) { 2251d77f618aSHong Zhang rows[i] = i; 2252d77f618aSHong Zhang } 2253d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2254d77f618aSHong Zhang 2255d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2256d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2257d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2258d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2259d77f618aSHong Zhang 2260d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2261d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2262d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2263d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2264d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2265d77f618aSHong Zhang 2266d77f618aSHong Zhang if (reuse == MAT_REUSE_MATRIX) { 2267d77f618aSHong Zhang ierr = MatHeaderReplace(A,mat_elemental);CHKERRQ(ierr); 2268d77f618aSHong Zhang } else { 2269d77f618aSHong Zhang *newmat = mat_elemental; 2270d77f618aSHong Zhang } 22718baccfbdSHong Zhang PetscFunctionReturn(0); 22728baccfbdSHong Zhang } 227365b80a83SHong Zhang #endif 22748baccfbdSHong Zhang 22758baccfbdSHong Zhang #undef __FUNCT__ 22761b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 22771b807ce4Svictorle /*@C 22781b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 22791b807ce4Svictorle 22801b807ce4Svictorle Input parameter: 22811b807ce4Svictorle + A - the matrix 22821b807ce4Svictorle - lda - the leading dimension 22831b807ce4Svictorle 22841b807ce4Svictorle Notes: 2285867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 22861b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 22871b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 22881b807ce4Svictorle 22891b807ce4Svictorle Level: intermediate 22901b807ce4Svictorle 22911b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 22921b807ce4Svictorle 2293284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2294867c911aSBarry Smith 22951b807ce4Svictorle @*/ 22967087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 22971b807ce4Svictorle { 22981b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 229921a2c019SBarry Smith 23001b807ce4Svictorle PetscFunctionBegin; 2301e32f2f54SBarry 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); 23021b807ce4Svictorle b->lda = lda; 230321a2c019SBarry Smith b->changelda = PETSC_FALSE; 230421a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 23051b807ce4Svictorle PetscFunctionReturn(0); 23061b807ce4Svictorle } 23071b807ce4Svictorle 23080bad9183SKris Buschelman /*MC 2309fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 23100bad9183SKris Buschelman 23110bad9183SKris Buschelman Options Database Keys: 23120bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 23130bad9183SKris Buschelman 23140bad9183SKris Buschelman Level: beginner 23150bad9183SKris Buschelman 231689665df3SBarry Smith .seealso: MatCreateSeqDense() 231789665df3SBarry Smith 23180bad9183SKris Buschelman M*/ 23190bad9183SKris Buschelman 23204a2ae208SSatish Balay #undef __FUNCT__ 23214a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 23228cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2323273d9f13SBarry Smith { 2324273d9f13SBarry Smith Mat_SeqDense *b; 2325dfbe8321SBarry Smith PetscErrorCode ierr; 23267c334f02SBarry Smith PetscMPIInt size; 2327273d9f13SBarry Smith 2328273d9f13SBarry Smith PetscFunctionBegin; 2329ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2330e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 233155659b69SBarry Smith 2332b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2333549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 233444cd7ae7SLois Curfman McInnes B->data = (void*)b; 233518f449edSLois Curfman McInnes 233644cd7ae7SLois Curfman McInnes b->pivots = 0; 2337273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2338273d9f13SBarry Smith b->v = 0; 233921a2c019SBarry Smith b->changelda = PETSC_FALSE; 23404e220ebcSLois Curfman McInnes 2341bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2342bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2343bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 23448baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 23458baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 23468baccfbdSHong Zhang #endif 2347bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2348bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2349bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2350bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 23513bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 23523bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 23533bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 235417667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 23553a40ed3dSBarry Smith PetscFunctionReturn(0); 2356289bc588SBarry Smith } 2357